Keep objfile original filename
gdb/ 2013-09-24 Jan Kratochvil <jan.kratochvil@redhat.com> Pass down original filename for objfile. * coffread.c (coff_symfile_read): Update symbol_file_add_separate call. * elfread.c (elf_symfile_read): Likewise. * jit.c (jit_object_close_impl): Update allocate_objfile call, no longer set ORIGINAL_NAME. (jit_bfd_try_read_symtab): Update symbol_file_add_from_bfd call. * jv-lang.c (get_dynamics_objfile): Update allocate_objfile call. * machoread.c (macho_add_oso_symfile): Add parameter name. Update symbol_file_add_from_bfd call. (macho_symfile_read_all_oso): Update two macho_add_oso_symfile calls. (macho_check_dsym): Add parameter filenamep. Change function comment. Set *filenamep. (macho_symfile_read): New variable dsym_filename. Update macho_check_dsym call. Use it for symbol_file_add_separate. * objfiles.c (allocate_objfile): Add parameter name. New comment for it. Use it for objfile->original_name. (objfile_name): Return OBFD's filename, if available. * objfiles.h (allocate_objfile): Add new parameter name. * solib.c (solib_read_symbols): Update symbol_file_add_from_bfd call. * symfile-mem.c (symbol_file_add_from_memory): Update symbol_file_add_from_bfd call. * symfile.c (read_symbols): Update symbol_file_add_separate call, new comment for it. (symbol_file_add_with_addrs): New parameter name, add function comment for it. Remove variable name. Update allocate_objfile call. (symbol_file_add_separate): New parameter name, add function comment for it. Update symbol_file_add_with_addrs call. (symbol_file_add_from_bfd): New parameter name. Update symbol_file_add_with_addrs call. (symbol_file_add): Update symbol_file_add_from_bfd call. (reread_symbols): New variable original_name. Save objfile->original_name by it. * symfile.h (symbol_file_add_from_bfd, symbol_file_add_separate): Add second parameter.
This commit is contained in:
parent
4262abfb98
commit
24ba069af8
@ -1,3 +1,40 @@
|
||||
2013-09-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Pass down original filename for objfile.
|
||||
* coffread.c (coff_symfile_read): Update symbol_file_add_separate call.
|
||||
* elfread.c (elf_symfile_read): Likewise.
|
||||
* jit.c (jit_object_close_impl): Update allocate_objfile call, no
|
||||
longer set ORIGINAL_NAME.
|
||||
(jit_bfd_try_read_symtab): Update symbol_file_add_from_bfd call.
|
||||
* jv-lang.c (get_dynamics_objfile): Update allocate_objfile call.
|
||||
* machoread.c (macho_add_oso_symfile): Add parameter name. Update
|
||||
symbol_file_add_from_bfd call.
|
||||
(macho_symfile_read_all_oso): Update two macho_add_oso_symfile calls.
|
||||
(macho_check_dsym): Add parameter filenamep. Change function comment.
|
||||
Set *filenamep.
|
||||
(macho_symfile_read): New variable dsym_filename. Update
|
||||
macho_check_dsym call. Use it for symbol_file_add_separate.
|
||||
* objfiles.c (allocate_objfile): Add parameter name. New comment for
|
||||
it. Use it for objfile->original_name.
|
||||
(objfile_name): Return OBFD's filename, if available.
|
||||
* objfiles.h (allocate_objfile): Add new parameter name.
|
||||
* solib.c (solib_read_symbols): Update symbol_file_add_from_bfd call.
|
||||
* symfile-mem.c (symbol_file_add_from_memory): Update
|
||||
symbol_file_add_from_bfd call.
|
||||
* symfile.c (read_symbols): Update symbol_file_add_separate call, new
|
||||
comment for it.
|
||||
(symbol_file_add_with_addrs): New parameter name, add function comment
|
||||
for it. Remove variable name. Update allocate_objfile call.
|
||||
(symbol_file_add_separate): New parameter name, add function comment
|
||||
for it. Update symbol_file_add_with_addrs call.
|
||||
(symbol_file_add_from_bfd): New parameter name. Update
|
||||
symbol_file_add_with_addrs call.
|
||||
(symbol_file_add): Update symbol_file_add_from_bfd call.
|
||||
(reread_symbols): New variable original_name. Save
|
||||
objfile->original_name by it.
|
||||
* symfile.h (symbol_file_add_from_bfd, symbol_file_add_separate): Add
|
||||
second parameter.
|
||||
|
||||
2013-09-24 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Code cleanup: Add objfile_name accessor function.
|
||||
|
@ -738,7 +738,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags)
|
||||
bfd *abfd = symfile_bfd_open (debugfile);
|
||||
|
||||
make_cleanup_bfd_unref (abfd);
|
||||
symbol_file_add_separate (abfd, symfile_flags, objfile);
|
||||
symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1458,7 +1458,7 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
|
||||
bfd *abfd = symfile_bfd_open (debugfile);
|
||||
|
||||
make_cleanup_bfd_unref (abfd);
|
||||
symbol_file_add_separate (abfd, symfile_flags, objfile);
|
||||
symbol_file_add_separate (abfd, debugfile, symfile_flags, objfile);
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
}
|
||||
|
@ -785,13 +785,11 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb,
|
||||
|
||||
priv_data = cb->priv_data;
|
||||
|
||||
objfile = allocate_objfile (NULL, 0);
|
||||
objfile = allocate_objfile (NULL, "<< JIT compiled code >>", 0);
|
||||
objfile->per_bfd->gdbarch = target_gdbarch ();
|
||||
|
||||
terminate_minimal_symbol_table (objfile);
|
||||
|
||||
objfile->original_name = "<< JIT compiled code >>";
|
||||
|
||||
j = NULL;
|
||||
for (i = obj->symtabs; i; i = j)
|
||||
{
|
||||
@ -927,7 +925,8 @@ JITed symbol file is not an object file, ignoring it.\n"));
|
||||
|
||||
/* This call does not take ownership of SAI. */
|
||||
make_cleanup_bfd_unref (nbfd);
|
||||
objfile = symbol_file_add_from_bfd (nbfd, 0, sai, OBJF_SHARED, NULL);
|
||||
objfile = symbol_file_add_from_bfd (nbfd, bfd_get_filename (nbfd), 0, sai,
|
||||
OBJF_SHARED, NULL);
|
||||
|
||||
do_cleanups (old_cleanups);
|
||||
add_objfile_entry (objfile, entry_addr);
|
||||
|
@ -118,7 +118,7 @@ get_dynamics_objfile (struct gdbarch *gdbarch)
|
||||
|
||||
/* Mark it as shared so that it is cleared when the inferior is
|
||||
re-run. */
|
||||
dynamics_objfile = allocate_objfile (NULL, OBJF_SHARED);
|
||||
dynamics_objfile = allocate_objfile (NULL, NULL, OBJF_SHARED);
|
||||
dynamics_objfile->per_bfd->gdbarch = gdbarch;
|
||||
|
||||
data = XCNEW (struct jv_per_objfile_data);
|
||||
|
@ -447,7 +447,7 @@ macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym)
|
||||
/* Add oso file OSO/ABFD as a symbol file. */
|
||||
|
||||
static void
|
||||
macho_add_oso_symfile (oso_el *oso, bfd *abfd,
|
||||
macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name,
|
||||
struct objfile *main_objfile, int symfile_flags)
|
||||
{
|
||||
int storage;
|
||||
@ -636,7 +636,7 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd,
|
||||
from symfile.c:symbol_file_add_with_addrs_or_offsets. */
|
||||
cleanup = make_cleanup_bfd_unref (abfd);
|
||||
symbol_file_add_from_bfd
|
||||
(abfd, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL,
|
||||
(abfd, name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL,
|
||||
main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED
|
||||
| OBJF_READNOW | OBJF_USERLOADED),
|
||||
main_objfile);
|
||||
@ -736,6 +736,7 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
|
||||
member_len))
|
||||
{
|
||||
macho_add_oso_symfile (oso2, member_bfd,
|
||||
bfd_get_filename (member_bfd),
|
||||
main_objfile, symfile_flags);
|
||||
oso2->name = NULL;
|
||||
break;
|
||||
@ -769,7 +770,8 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
|
||||
warning (_("`%s': can't open to read symbols: %s."), oso->name,
|
||||
bfd_errmsg (bfd_get_error ()));
|
||||
else
|
||||
macho_add_oso_symfile (oso, abfd, main_objfile, symfile_flags);
|
||||
macho_add_oso_symfile (oso, abfd, oso->name, main_objfile,
|
||||
symfile_flags);
|
||||
|
||||
ix++;
|
||||
}
|
||||
@ -785,11 +787,13 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
|
||||
executable name and the executable base name to get the DSYM file name. */
|
||||
#define DSYM_SUFFIX ".dSYM/Contents/Resources/DWARF/"
|
||||
|
||||
/* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it.
|
||||
Return NULL if no valid dsym file is found. */
|
||||
/* Check if a dsym file exists for OBJFILE. If so, returns a bfd for it
|
||||
and return *FILENAMEP with its original xmalloc-ated filename.
|
||||
Return NULL if no valid dsym file is found (FILENAMEP is not used in
|
||||
such case). */
|
||||
|
||||
static bfd *
|
||||
macho_check_dsym (struct objfile *objfile)
|
||||
macho_check_dsym (struct objfile *objfile, char **filenamep)
|
||||
{
|
||||
size_t name_len = strlen (objfile_name (objfile));
|
||||
size_t dsym_len = strlen (DSYM_SUFFIX);
|
||||
@ -842,6 +846,7 @@ macho_check_dsym (struct objfile *objfile)
|
||||
gdb_bfd_unref (dsym_bfd);
|
||||
return NULL;
|
||||
}
|
||||
*filenamep = xstrdup (dsym_filename);
|
||||
return dsym_bfd;
|
||||
}
|
||||
|
||||
@ -860,6 +865,8 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags)
|
||||
be in the executable. */
|
||||
if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
|
||||
{
|
||||
char *dsym_filename;
|
||||
|
||||
/* Process the normal symbol table first. */
|
||||
storage_needed = bfd_get_symtab_upper_bound (objfile->obfd);
|
||||
if (storage_needed < 0)
|
||||
@ -897,13 +904,15 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags)
|
||||
dwarf2_build_frame_info (objfile);
|
||||
|
||||
/* Check for DSYM file. */
|
||||
dsym_bfd = macho_check_dsym (objfile);
|
||||
dsym_bfd = macho_check_dsym (objfile, &dsym_filename);
|
||||
if (dsym_bfd != NULL)
|
||||
{
|
||||
int ix;
|
||||
oso_el *oso;
|
||||
struct bfd_section *asect, *dsect;
|
||||
|
||||
make_cleanup (xfree, dsym_filename);
|
||||
|
||||
if (mach_o_debug_level > 0)
|
||||
printf_unfiltered (_("dsym file found\n"));
|
||||
|
||||
@ -920,7 +929,8 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags)
|
||||
|
||||
/* Add the dsym file as a separate file. */
|
||||
make_cleanup_bfd_unref (dsym_bfd);
|
||||
symbol_file_add_separate (dsym_bfd, symfile_flags, objfile);
|
||||
symbol_file_add_separate (dsym_bfd, dsym_filename, symfile_flags,
|
||||
objfile);
|
||||
|
||||
/* Don't try to read dwarf2 from main file or shared libraries. */
|
||||
do_cleanups (old_chain);
|
||||
|
@ -248,6 +248,11 @@ build_objfile_section_table (struct objfile *objfile)
|
||||
into the list of all known objfiles, and return a pointer to the
|
||||
new objfile struct.
|
||||
|
||||
NAME should contain original non-canonicalized filename or other
|
||||
identifier as entered by user. If there is no better source use
|
||||
bfd_get_filename (ABFD). NAME may be NULL only if ABFD is NULL.
|
||||
NAME content is copied into returned objfile.
|
||||
|
||||
The FLAGS word contains various bits (OBJF_*) that can be taken as
|
||||
requests for specific operations. Other bits like OBJF_SHARED are
|
||||
simply copied through to the new objfile flags member. */
|
||||
@ -262,7 +267,7 @@ build_objfile_section_table (struct objfile *objfile)
|
||||
things in a consistent state even if abfd is NULL. */
|
||||
|
||||
struct objfile *
|
||||
allocate_objfile (bfd *abfd, int flags)
|
||||
allocate_objfile (bfd *abfd, const char *name, int flags)
|
||||
{
|
||||
struct objfile *objfile;
|
||||
|
||||
@ -279,20 +284,23 @@ allocate_objfile (bfd *abfd, int flags)
|
||||
that any data that is reference is saved in the per-objfile data
|
||||
region. */
|
||||
|
||||
if (name == NULL)
|
||||
{
|
||||
gdb_assert (abfd == NULL);
|
||||
name = "<<anonymous objfile>>";
|
||||
}
|
||||
objfile->original_name = obstack_copy0 (&objfile->objfile_obstack, name,
|
||||
strlen (name));
|
||||
|
||||
objfile->obfd = abfd;
|
||||
gdb_bfd_ref (abfd);
|
||||
if (abfd != NULL)
|
||||
{
|
||||
objfile->original_name = bfd_get_filename (abfd);
|
||||
objfile->mtime = bfd_get_mtime (abfd);
|
||||
|
||||
/* Build section table. */
|
||||
build_objfile_section_table (objfile);
|
||||
}
|
||||
else
|
||||
{
|
||||
objfile->original_name = "<<anonymous objfile>>";
|
||||
}
|
||||
|
||||
objfile->per_bfd = get_objfile_bfd_data (objfile, abfd);
|
||||
objfile->pspace = current_program_space;
|
||||
@ -1486,6 +1494,9 @@ default_iterate_over_objfiles_in_search_order
|
||||
const char *
|
||||
objfile_name (const struct objfile *objfile)
|
||||
{
|
||||
if (objfile->obfd != NULL)
|
||||
return bfd_get_filename (objfile->obfd);
|
||||
|
||||
return objfile->original_name;
|
||||
}
|
||||
|
||||
|
@ -431,7 +431,7 @@ struct objfile
|
||||
|
||||
/* Declarations for functions defined in objfiles.c */
|
||||
|
||||
extern struct objfile *allocate_objfile (bfd *, int);
|
||||
extern struct objfile *allocate_objfile (bfd *, const char *name, int);
|
||||
|
||||
extern struct gdbarch *get_objfile_arch (struct objfile *);
|
||||
|
||||
|
@ -610,7 +610,7 @@ solib_read_symbols (struct so_list *so, int flags)
|
||||
|
||||
sap = build_section_addr_info_from_section_table (so->sections,
|
||||
so->sections_end);
|
||||
so->objfile = symbol_file_add_from_bfd (so->abfd,
|
||||
so->objfile = symbol_file_add_from_bfd (so->abfd, so->so_name,
|
||||
flags, sap, OBJF_SHARED,
|
||||
NULL);
|
||||
so->objfile->addr_low = so->addr_low;
|
||||
|
@ -129,7 +129,8 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
|
||||
}
|
||||
sai->num_sections = i;
|
||||
|
||||
objf = symbol_file_add_from_bfd (nbfd, from_tty ? SYMFILE_VERBOSE : 0,
|
||||
objf = symbol_file_add_from_bfd (nbfd, bfd_get_filename (nbfd),
|
||||
from_tty ? SYMFILE_VERBOSE : 0,
|
||||
sai, OBJF_SHARED, NULL);
|
||||
|
||||
/* This might change our ideas about frames already looked at. */
|
||||
|
@ -839,7 +839,14 @@ read_symbols (struct objfile *objfile, int add_flags)
|
||||
struct cleanup *cleanup = make_cleanup_bfd_unref (abfd);
|
||||
|
||||
if (abfd != NULL)
|
||||
symbol_file_add_separate (abfd, add_flags, objfile);
|
||||
{
|
||||
/* find_separate_debug_file_in_section uses the same filename for the
|
||||
virtual section-as-bfd like the bfd filename containing the
|
||||
section. Therefore use also non-canonical name form for the same
|
||||
file containing the section. */
|
||||
symbol_file_add_separate (abfd, objfile->original_name, add_flags,
|
||||
objfile);
|
||||
}
|
||||
|
||||
do_cleanups (cleanup);
|
||||
}
|
||||
@ -1047,6 +1054,8 @@ new_symfile_objfile (struct objfile *objfile, int add_flags)
|
||||
ABFD is a BFD already open on the file, as from symfile_bfd_open.
|
||||
A new reference is acquired by this function.
|
||||
|
||||
For NAME description see allocate_objfile's definition.
|
||||
|
||||
ADD_FLAGS encodes verbosity, whether this is main symbol file or
|
||||
extra, such as dynamically loaded code, and what to do with breakpoins.
|
||||
|
||||
@ -1060,12 +1069,11 @@ new_symfile_objfile (struct objfile *objfile, int add_flags)
|
||||
Upon failure, jumps back to command level (never returns). */
|
||||
|
||||
static struct objfile *
|
||||
symbol_file_add_with_addrs (bfd *abfd, int add_flags,
|
||||
symbol_file_add_with_addrs (bfd *abfd, const char *name, int add_flags,
|
||||
struct section_addr_info *addrs,
|
||||
int flags, struct objfile *parent)
|
||||
{
|
||||
struct objfile *objfile;
|
||||
const char *name = bfd_get_filename (abfd);
|
||||
const int from_tty = add_flags & SYMFILE_VERBOSE;
|
||||
const int mainline = add_flags & SYMFILE_MAINLINE;
|
||||
const int should_print = ((from_tty || info_verbose)
|
||||
@ -1087,7 +1095,8 @@ symbol_file_add_with_addrs (bfd *abfd, int add_flags,
|
||||
&& !query (_("Load new symbol table from \"%s\"? "), name))
|
||||
error (_("Not confirmed."));
|
||||
|
||||
objfile = allocate_objfile (abfd, flags | (mainline ? OBJF_MAINLINE : 0));
|
||||
objfile = allocate_objfile (abfd, name,
|
||||
flags | (mainline ? OBJF_MAINLINE : 0));
|
||||
|
||||
if (parent)
|
||||
add_separate_debug_objfile (objfile, parent);
|
||||
@ -1160,10 +1169,12 @@ symbol_file_add_with_addrs (bfd *abfd, int add_flags,
|
||||
return (objfile);
|
||||
}
|
||||
|
||||
/* Add BFD as a separate debug file for OBJFILE. */
|
||||
/* Add BFD as a separate debug file for OBJFILE. For NAME description
|
||||
see allocate_objfile's definition. */
|
||||
|
||||
void
|
||||
symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile)
|
||||
symbol_file_add_separate (bfd *bfd, const char *name, int symfile_flags,
|
||||
struct objfile *objfile)
|
||||
{
|
||||
struct objfile *new_objfile;
|
||||
struct section_addr_info *sap;
|
||||
@ -1176,7 +1187,7 @@ symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile)
|
||||
my_cleanup = make_cleanup_free_section_addr_info (sap);
|
||||
|
||||
new_objfile = symbol_file_add_with_addrs
|
||||
(bfd, symfile_flags, sap,
|
||||
(bfd, name, symfile_flags, sap,
|
||||
objfile->flags & (OBJF_REORDERED | OBJF_SHARED | OBJF_READNOW
|
||||
| OBJF_USERLOADED),
|
||||
objfile);
|
||||
@ -1189,11 +1200,12 @@ symbol_file_add_separate (bfd *bfd, int symfile_flags, struct objfile *objfile)
|
||||
See symbol_file_add_with_addrs's comments for details. */
|
||||
|
||||
struct objfile *
|
||||
symbol_file_add_from_bfd (bfd *abfd, int add_flags,
|
||||
symbol_file_add_from_bfd (bfd *abfd, const char *name, int add_flags,
|
||||
struct section_addr_info *addrs,
|
||||
int flags, struct objfile *parent)
|
||||
{
|
||||
return symbol_file_add_with_addrs (abfd, add_flags, addrs, flags, parent);
|
||||
return symbol_file_add_with_addrs (abfd, name, add_flags, addrs, flags,
|
||||
parent);
|
||||
}
|
||||
|
||||
/* Process a symbol file, as either the main file or as a dynamically
|
||||
@ -1207,7 +1219,7 @@ symbol_file_add (const char *name, int add_flags,
|
||||
struct cleanup *cleanup = make_cleanup_bfd_unref (bfd);
|
||||
struct objfile *objf;
|
||||
|
||||
objf = symbol_file_add_from_bfd (bfd, add_flags, addrs, flags, NULL);
|
||||
objf = symbol_file_add_from_bfd (bfd, name, add_flags, addrs, flags, NULL);
|
||||
do_cleanups (cleanup);
|
||||
return objf;
|
||||
}
|
||||
@ -2372,6 +2384,7 @@ reread_symbols (void)
|
||||
struct cleanup *old_cleanups;
|
||||
struct section_offsets *offsets;
|
||||
int num_offsets;
|
||||
char *original_name;
|
||||
|
||||
printf_unfiltered (_("`%s' has changed; re-reading symbols.\n"),
|
||||
objfile_name (objfile));
|
||||
@ -2442,7 +2455,9 @@ reread_symbols (void)
|
||||
gdb_bfd_unref (obfd);
|
||||
}
|
||||
|
||||
objfile->original_name = bfd_get_filename (objfile->obfd);
|
||||
original_name = xstrdup (objfile->original_name);
|
||||
make_cleanup (xfree, original_name);
|
||||
|
||||
/* bfd_openr sets cacheable to true, which is what we want. */
|
||||
if (!bfd_check_format (objfile->obfd, bfd_object))
|
||||
error (_("Can't read symbols from %s: %s."), objfile_name (objfile),
|
||||
@ -2496,6 +2511,10 @@ reread_symbols (void)
|
||||
gdb_obstack.h specifies the alloc/dealloc functions. */
|
||||
obstack_init (&objfile->objfile_obstack);
|
||||
|
||||
objfile->original_name = obstack_copy0 (&objfile->objfile_obstack,
|
||||
original_name,
|
||||
strlen (original_name));
|
||||
|
||||
/* Reset the sym_fns pointer. The ELF reader can change it
|
||||
based on whether .gdb_index is present, and we need it to
|
||||
start over. PR symtab/15885 */
|
||||
|
@ -480,11 +480,12 @@ extern void new_symfile_objfile (struct objfile *, int);
|
||||
extern struct objfile *symbol_file_add (const char *, int,
|
||||
struct section_addr_info *, int);
|
||||
|
||||
extern struct objfile *symbol_file_add_from_bfd (bfd *, int,
|
||||
extern struct objfile *symbol_file_add_from_bfd (bfd *, const char *, int,
|
||||
struct section_addr_info *,
|
||||
int, struct objfile *parent);
|
||||
|
||||
extern void symbol_file_add_separate (bfd *, int, struct objfile *);
|
||||
extern void symbol_file_add_separate (bfd *, const char *, int,
|
||||
struct objfile *);
|
||||
|
||||
extern char *find_separate_debug_file_by_debuglink (struct objfile *);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user