common.opt: Add debug switches.
* common.opt: Add debug switches. * flags.h (use_gnu_debug_info_extensions): Boolify. * opts.c (write_symbols, debug_info_level, use_gnu_debug_info_extensions): Move from toplev.c. (set_debug_level): New. (common_handle_options): Handle debug switches. (print_help): Display target options directly. * toplev.c (debug_hooks): Don't initialize. (write_symbols, debug_info_level, use_gnu_debug_info_extensions): Move to opts.c. (debug_args, display_help, decode_g_option): Remove. (process_options): Set no debug if level zero here, and no-debug-hooks. Error here if impossible debug format selected. * toplev.h (display_help, decode_g_option): Remove. testsuite: * lib/gcc-dg.exp: Update for diagnostic change. From-SVN: r70253
This commit is contained in:
parent
7daaf8fa80
commit
df38ffef8c
@ -1,3 +1,20 @@
|
||||
2003-08-08 Neil Booth <neil@daikokuya.co.uk>
|
||||
|
||||
* common.opt: Add debug switches.
|
||||
* flags.h (use_gnu_debug_info_extensions): Boolify.
|
||||
* opts.c (write_symbols, debug_info_level,
|
||||
use_gnu_debug_info_extensions): Move from toplev.c.
|
||||
(set_debug_level): New.
|
||||
(common_handle_options): Handle debug switches.
|
||||
(print_help): Display target options directly.
|
||||
* toplev.c (debug_hooks): Don't initialize.
|
||||
(write_symbols, debug_info_level,
|
||||
use_gnu_debug_info_extensions): Move to opts.c.
|
||||
(debug_args, display_help, decode_g_option): Remove.
|
||||
(process_options): Set no debug if level zero here,
|
||||
and no-debug-hooks. Error here if impossible debug format selected.
|
||||
* toplev.h (display_help, decode_g_option): Remove.
|
||||
|
||||
2003-08-08 Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
* tree.c (get_file_function_name_long): Fix size of alloca() area.
|
||||
|
@ -709,6 +709,47 @@ Put zero initialized data in the bss section
|
||||
|
||||
g
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in default format
|
||||
|
||||
gcoff
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in COFF format
|
||||
|
||||
gdwarf
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in DWARF v1 format
|
||||
|
||||
gdwarf+
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in extended DWARF v1 format
|
||||
|
||||
gdwarf-2
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in DWARF v2 format
|
||||
|
||||
ggdb
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in default extended format
|
||||
|
||||
gstabs
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in STABS format
|
||||
|
||||
gstabs+
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in extended STABS format
|
||||
|
||||
gvms
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in VMS format
|
||||
|
||||
gxcoff
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in XCOFF format
|
||||
|
||||
gxcoff+
|
||||
Common JoinedOrMissing
|
||||
Generate debug information in extended XCOFF format
|
||||
|
||||
m
|
||||
Common Joined
|
||||
|
@ -55,7 +55,7 @@ extern enum debug_info_level debug_info_level;
|
||||
|
||||
/* Nonzero means use GNU-only extensions in the generated symbolic
|
||||
debugging information. */
|
||||
extern int use_gnu_debug_info_extensions;
|
||||
extern bool use_gnu_debug_info_extensions;
|
||||
|
||||
/* Nonzero means emit debugging information only for symbols which are used. */
|
||||
extern int flag_debug_only_used_symbols;
|
||||
|
113
gcc/opts.c
113
gcc/opts.c
@ -128,6 +128,20 @@ bool warn_unused_value;
|
||||
/* Hack for cooperation between set_Wunused and set_Wextra. */
|
||||
static bool maybe_warn_unused_parameter;
|
||||
|
||||
/* Type(s) of debugging information we are producing (if any). See
|
||||
flags.h for the definitions of the different possible types of
|
||||
debugging information. */
|
||||
enum debug_info_type write_symbols = NO_DEBUG;
|
||||
|
||||
/* Level of debugging information we are producing. See flags.h for
|
||||
the definitions of the different possible levels. */
|
||||
enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
|
||||
|
||||
/* Nonzero means use GNU-only extensions in the generated symbolic
|
||||
debugging information. Currently, this only has an effect when
|
||||
write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
|
||||
bool use_gnu_debug_info_extensions;
|
||||
|
||||
/* Columns of --help display. */
|
||||
static unsigned int columns = 80;
|
||||
|
||||
@ -152,6 +166,8 @@ static void print_help (void);
|
||||
static void print_param_help (void);
|
||||
static void print_filtered_help (unsigned int flag);
|
||||
static unsigned int print_switch (const char *text, unsigned int indent);
|
||||
static void set_debug_level (enum debug_info_type type, int extended,
|
||||
const char *arg);
|
||||
|
||||
/* Perform a binary search to find which option the command-line INPUT
|
||||
matches. Returns its index in the option array, and N_OPTS
|
||||
@ -1383,7 +1399,46 @@ common_handle_option (size_t scode, const char *arg,
|
||||
break;
|
||||
|
||||
case OPT_g:
|
||||
decode_g_option (arg);
|
||||
set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
|
||||
break;
|
||||
|
||||
case OPT_gcoff:
|
||||
set_debug_level (SDB_DEBUG, false, arg);
|
||||
break;
|
||||
|
||||
case OPT_gdwarf:
|
||||
if (*arg)
|
||||
{
|
||||
error ("use -gdwarf -gN for DWARF v1 level N, "
|
||||
"and -gdwarf-2 for DWARF v2" );
|
||||
break;
|
||||
}
|
||||
|
||||
/* Fall through. */
|
||||
case OPT_gdwarf_:
|
||||
set_debug_level (DWARF_DEBUG, code == OPT_gdwarf_, arg);
|
||||
break;
|
||||
|
||||
case OPT_gdwarf_2:
|
||||
set_debug_level (DWARF2_DEBUG, false, arg);
|
||||
break;
|
||||
|
||||
case OPT_ggdb:
|
||||
set_debug_level (NO_DEBUG, 2, arg);
|
||||
break;
|
||||
|
||||
case OPT_gstabs:
|
||||
case OPT_gstabs_:
|
||||
set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
|
||||
break;
|
||||
|
||||
case OPT_gvms:
|
||||
set_debug_level (VMS_DEBUG, false, arg);
|
||||
break;
|
||||
|
||||
case OPT_gxcoff:
|
||||
case OPT_gxcoff_:
|
||||
set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
|
||||
break;
|
||||
|
||||
case OPT_m:
|
||||
@ -1505,6 +1560,60 @@ fast_math_flags_set_p (void)
|
||||
&& !flag_errno_math);
|
||||
}
|
||||
|
||||
/* Handle a debug output -g switch. EXTENDED is true or false to support
|
||||
extended output (2 is special and means "-ggdb" was given). */
|
||||
static void
|
||||
set_debug_level (enum debug_info_type type, int extended, const char *arg)
|
||||
{
|
||||
static bool type_explicit;
|
||||
|
||||
use_gnu_debug_info_extensions = extended;
|
||||
|
||||
if (type == NO_DEBUG)
|
||||
{
|
||||
if (write_symbols == NO_DEBUG)
|
||||
{
|
||||
write_symbols = PREFERRED_DEBUGGING_TYPE;
|
||||
|
||||
if (extended == 2)
|
||||
{
|
||||
#ifdef DWARF2_DEBUGGING_INFO
|
||||
write_symbols = DWARF2_DEBUG;
|
||||
#elif defined DBX_DEBUGGING_INFO
|
||||
write_symbols = DBX_DEBUG;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (write_symbols == NO_DEBUG)
|
||||
warning ("target system does not support debug output");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Does it conflict with an already selected type? */
|
||||
if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
|
||||
error ("debug format \"%s\" conflicts with prior selection",
|
||||
debug_type_names[type]);
|
||||
write_symbols = type;
|
||||
type_explicit = true;
|
||||
}
|
||||
|
||||
/* A debug flag without a level defaults to level 2. */
|
||||
if (*arg == '\0')
|
||||
{
|
||||
if (!debug_info_level)
|
||||
debug_info_level = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_info_level = integral_argument (arg);
|
||||
if (debug_info_level == (unsigned int) -1)
|
||||
error ("unrecognised debug output level \"%s\"", arg);
|
||||
else if (debug_info_level > 3)
|
||||
error ("debug output level %s is too high", arg);
|
||||
}
|
||||
}
|
||||
|
||||
/* Output --help text. */
|
||||
static void
|
||||
print_help (void)
|
||||
@ -1532,7 +1641,7 @@ print_help (void)
|
||||
print_filtered_help (1U << i);
|
||||
}
|
||||
|
||||
display_help ();
|
||||
display_target_options ();
|
||||
}
|
||||
|
||||
/* Print the help for --param. */
|
||||
|
@ -1,3 +1,7 @@
|
||||
2003-08-08 Neil Booth <neil@daikokuya.co.uk>
|
||||
|
||||
* lib/gcc-dg.exp: Update for diagnostic change.
|
||||
|
||||
2003-08-07 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
|
||||
|
||||
PR c++/5767
|
||||
|
@ -199,7 +199,7 @@ proc gcc-dg-debug-runtest { target_compile trivial opt_opts testcases } {
|
||||
set comp_output [$target_compile \
|
||||
"$srcdir/$subdir/$trivial" "trivial.S" assembly \
|
||||
"additional_flags=$type"]
|
||||
if { ! [string match "*: unknown or unsupported -g option*" \
|
||||
if { ! [string match "*: target system does not support the * debug format*" \
|
||||
$comp_output] } {
|
||||
foreach level {1 "" 3} {
|
||||
lappend DEBUG_TORTURE_OPTIONS [list "${type}${level}"]
|
||||
|
214
gcc/toplev.c
214
gcc/toplev.c
@ -221,7 +221,7 @@ int target_flags_explicit;
|
||||
|
||||
/* Debug hooks - dependent upon command line options. */
|
||||
|
||||
const struct gcc_debug_hooks *debug_hooks = &do_nothing_debug_hooks;
|
||||
const struct gcc_debug_hooks *debug_hooks;
|
||||
|
||||
/* Describes a dump file. */
|
||||
|
||||
@ -355,21 +355,6 @@ enum graph_dump_types graph_dump_format;
|
||||
|
||||
const char *asm_file_name;
|
||||
|
||||
/* Type(s) of debugging information we are producing (if any).
|
||||
See flags.h for the definitions of the different possible
|
||||
types of debugging information. */
|
||||
enum debug_info_type write_symbols = NO_DEBUG;
|
||||
|
||||
/* Level of debugging information we are producing. See flags.h
|
||||
for the definitions of the different possible levels. */
|
||||
enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
|
||||
|
||||
/* Nonzero means use GNU-only extensions in the generated symbolic
|
||||
debugging information. */
|
||||
/* Currently, this only has an effect when write_symbols is set to
|
||||
DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
|
||||
int use_gnu_debug_info_extensions = 0;
|
||||
|
||||
/* Nonzero means do optimizations. -O.
|
||||
Particular numeric values stand for particular amounts of optimization;
|
||||
thus, -O2 stores 2 here. However, the optimizations beyond the basic
|
||||
@ -984,46 +969,6 @@ int align_functions_log;
|
||||
minimum function alignment. Zero means no alignment is forced. */
|
||||
int force_align_functions_log;
|
||||
|
||||
/* Table of supported debugging formats. */
|
||||
static const struct
|
||||
{
|
||||
const char *const arg;
|
||||
/* Since PREFERRED_DEBUGGING_TYPE isn't necessarily a
|
||||
constant expression, we use NO_DEBUG in its place. */
|
||||
const enum debug_info_type debug_type;
|
||||
const int use_extensions_p;
|
||||
const char *const description;
|
||||
} *da,
|
||||
debug_args[] =
|
||||
{
|
||||
{ "", NO_DEBUG, DEFAULT_GDB_EXTENSIONS,
|
||||
N_("Generate debugging info in default format") },
|
||||
{ "gdb", NO_DEBUG, 1, N_("Generate debugging info in default extended format") },
|
||||
#ifdef DBX_DEBUGGING_INFO
|
||||
{ "stabs", DBX_DEBUG, 0, N_("Generate STABS format debug info") },
|
||||
{ "stabs+", DBX_DEBUG, 1, N_("Generate extended STABS format debug info") },
|
||||
#endif
|
||||
#ifdef DWARF_DEBUGGING_INFO
|
||||
{ "dwarf", DWARF_DEBUG, 0, N_("Generate DWARF-1 format debug info") },
|
||||
{ "dwarf+", DWARF_DEBUG, 1,
|
||||
N_("Generate extended DWARF-1 format debug info") },
|
||||
#endif
|
||||
#ifdef DWARF2_DEBUGGING_INFO
|
||||
{ "dwarf-2", DWARF2_DEBUG, 0, N_("Generate DWARF-2 debug info") },
|
||||
#endif
|
||||
#ifdef XCOFF_DEBUGGING_INFO
|
||||
{ "xcoff", XCOFF_DEBUG, 0, N_("Generate XCOFF format debug info") },
|
||||
{ "xcoff+", XCOFF_DEBUG, 1, N_("Generate extended XCOFF format debug info") },
|
||||
#endif
|
||||
#ifdef SDB_DEBUGGING_INFO
|
||||
{ "coff", SDB_DEBUG, 0, N_("Generate COFF format debug info") },
|
||||
#endif
|
||||
#ifdef VMS_DEBUGGING_INFO
|
||||
{ "vms", VMS_DEBUG, 0, N_("Generate VMS format debug info") },
|
||||
#endif
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char *const string;
|
||||
@ -3620,22 +3565,6 @@ rest_of_compilation (tree decl)
|
||||
timevar_pop (TV_REST_OF_COMPILATION);
|
||||
}
|
||||
|
||||
/* Display help for generic options. */
|
||||
void
|
||||
display_help (void)
|
||||
{
|
||||
unsigned long i;
|
||||
|
||||
for (i = ARRAY_SIZE (debug_args); i--;)
|
||||
{
|
||||
if (debug_args[i].description != NULL)
|
||||
printf (" -g%-21s %s\n",
|
||||
debug_args[i].arg, _(debug_args[i].description));
|
||||
}
|
||||
|
||||
display_target_options ();
|
||||
}
|
||||
|
||||
/* Display help for target options. */
|
||||
void
|
||||
display_target_options (void)
|
||||
@ -3769,124 +3698,6 @@ const char *const debug_type_names[] =
|
||||
"none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff", "vms"
|
||||
};
|
||||
|
||||
/* Parse a -g... command line switch. ARG is the value after the -g.
|
||||
It is safe to access 'ARG - 2' to generate the full switch name.
|
||||
Return the number of strings consumed. */
|
||||
|
||||
void
|
||||
decode_g_option (const char *arg)
|
||||
{
|
||||
static unsigned level = 0;
|
||||
/* A lot of code assumes write_symbols == NO_DEBUG if the
|
||||
debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
|
||||
of what debugging type has been selected). This records the
|
||||
selected type. It is an error to specify more than one
|
||||
debugging type. */
|
||||
static enum debug_info_type selected_debug_type = NO_DEBUG;
|
||||
/* Nonzero if debugging format has been explicitly set.
|
||||
-g and -ggdb don't explicitly set the debugging format so
|
||||
-gdwarf -g3 is equivalent to -gdwarf3. */
|
||||
static int type_explicitly_set_p = 0;
|
||||
|
||||
/* The maximum admissible debug level value. */
|
||||
static const unsigned max_debug_level = 3;
|
||||
|
||||
/* Look up ARG in the table. */
|
||||
for (da = debug_args; da->arg; da++)
|
||||
{
|
||||
const int da_len = strlen (da->arg);
|
||||
|
||||
if (da_len == 0 || ! strncmp (arg, da->arg, da_len))
|
||||
{
|
||||
enum debug_info_type type = da->debug_type;
|
||||
const char *p = arg + da_len;
|
||||
|
||||
if (*p && ! ISDIGIT (*p))
|
||||
continue;
|
||||
|
||||
/* A debug flag without a level defaults to level 2.
|
||||
Note we do not want to call read_integral_parameter
|
||||
for that case since it will call atoi which
|
||||
will return zero.
|
||||
|
||||
??? We may want to generalize the interface to
|
||||
read_integral_parameter to better handle this case
|
||||
if this case shows up often. */
|
||||
if (*p)
|
||||
level = read_integral_parameter (p, 0, max_debug_level + 1);
|
||||
else
|
||||
level = (level == 0) ? 2 : level;
|
||||
|
||||
if (da_len > 1 && *p && !strncmp (arg, "dwarf", da_len))
|
||||
{
|
||||
error ("use -gdwarf -g%d for DWARF v1, level %d",
|
||||
level, level);
|
||||
if (level == 2)
|
||||
error ("use -gdwarf-2 for DWARF v2");
|
||||
}
|
||||
|
||||
if (level > max_debug_level)
|
||||
{
|
||||
warning ("\
|
||||
ignoring option `%s' due to invalid debug level specification",
|
||||
arg - 2);
|
||||
level = debug_info_level;
|
||||
}
|
||||
|
||||
if (type == NO_DEBUG)
|
||||
{
|
||||
type = PREFERRED_DEBUGGING_TYPE;
|
||||
|
||||
if (da_len > 1 && strncmp (arg, "gdb", da_len) == 0)
|
||||
{
|
||||
#ifdef DWARF2_DEBUGGING_INFO
|
||||
type = DWARF2_DEBUG;
|
||||
#else
|
||||
#ifdef DBX_DEBUGGING_INFO
|
||||
type = DBX_DEBUG;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (type == NO_DEBUG)
|
||||
warning ("`%s': unknown or unsupported -g option", arg - 2);
|
||||
|
||||
/* Does it conflict with an already selected type? */
|
||||
if (type_explicitly_set_p
|
||||
/* -g/-ggdb don't conflict with anything. */
|
||||
&& da->debug_type != NO_DEBUG
|
||||
&& type != selected_debug_type)
|
||||
warning ("`%s' ignored, conflicts with `-g%s'",
|
||||
arg - 2, debug_type_names[(int) selected_debug_type]);
|
||||
else
|
||||
{
|
||||
/* If the format has already been set, -g/-ggdb
|
||||
only change the debug level. */
|
||||
if (type_explicitly_set_p && da->debug_type == NO_DEBUG)
|
||||
/* Don't change debugging type. */
|
||||
;
|
||||
else
|
||||
{
|
||||
selected_debug_type = type;
|
||||
type_explicitly_set_p = da->debug_type != NO_DEBUG;
|
||||
}
|
||||
|
||||
write_symbols = (level == 0
|
||||
? NO_DEBUG
|
||||
: selected_debug_type);
|
||||
use_gnu_debug_info_extensions = da->use_extensions_p;
|
||||
debug_info_level = (enum debug_info_level) level;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (! da->arg)
|
||||
warning ("`-g%s': unknown or unsupported -g option", arg);
|
||||
}
|
||||
|
||||
/* Decode -m switches. */
|
||||
/* Decode the switch -mNAME. */
|
||||
|
||||
@ -4336,32 +4147,42 @@ process_options (void)
|
||||
profile_flag = 0;
|
||||
}
|
||||
|
||||
/* A lot of code assumes write_symbols == NO_DEBUG if the debugging
|
||||
level is 0. */
|
||||
if (debug_info_level == DINFO_LEVEL_NONE)
|
||||
write_symbols = NO_DEBUG;
|
||||
|
||||
/* Now we know write_symbols, set up the debug hooks based on it.
|
||||
By default we do nothing for debug output. */
|
||||
if (write_symbols == NO_DEBUG)
|
||||
debug_hooks = &do_nothing_debug_hooks;
|
||||
#if defined(DBX_DEBUGGING_INFO)
|
||||
if (write_symbols == DBX_DEBUG)
|
||||
else if (write_symbols == DBX_DEBUG)
|
||||
debug_hooks = &dbx_debug_hooks;
|
||||
#endif
|
||||
#if defined(XCOFF_DEBUGGING_INFO)
|
||||
if (write_symbols == XCOFF_DEBUG)
|
||||
else if (write_symbols == XCOFF_DEBUG)
|
||||
debug_hooks = &xcoff_debug_hooks;
|
||||
#endif
|
||||
#ifdef SDB_DEBUGGING_INFO
|
||||
if (write_symbols == SDB_DEBUG)
|
||||
else if (write_symbols == SDB_DEBUG)
|
||||
debug_hooks = &sdb_debug_hooks;
|
||||
#endif
|
||||
#ifdef DWARF_DEBUGGING_INFO
|
||||
if (write_symbols == DWARF_DEBUG)
|
||||
else if (write_symbols == DWARF_DEBUG)
|
||||
debug_hooks = &dwarf_debug_hooks;
|
||||
#endif
|
||||
#ifdef DWARF2_DEBUGGING_INFO
|
||||
if (write_symbols == DWARF2_DEBUG)
|
||||
else if (write_symbols == DWARF2_DEBUG)
|
||||
debug_hooks = &dwarf2_debug_hooks;
|
||||
#endif
|
||||
#ifdef VMS_DEBUGGING_INFO
|
||||
if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
|
||||
else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
|
||||
debug_hooks = &vmsdbg_debug_hooks;
|
||||
#endif
|
||||
else
|
||||
error ("target system does not support the \"%s\" debug format",
|
||||
debug_type_names[write_symbols]);
|
||||
|
||||
/* If auxiliary info generation is desired, open the output file.
|
||||
This goes in the same directory as the source file--unlike
|
||||
@ -4603,7 +4424,6 @@ do_compile (void)
|
||||
}
|
||||
|
||||
/* Entry point of cc1, cc1plus, jc1, f771, etc.
|
||||
Decode command args, then call compile_file.
|
||||
Exit code is FATAL_EXIT_CODE if can't open files or if there were
|
||||
any errors, or SUCCESS_EXIT_CODE if compilation succeeded.
|
||||
|
||||
|
@ -123,7 +123,6 @@ extern int flag_ssa_dce;
|
||||
extern int time_report;
|
||||
extern int flag_new_regalloc;
|
||||
|
||||
extern void display_help (void);
|
||||
extern void display_target_options (void);
|
||||
extern void print_version (FILE *, const char *);
|
||||
extern void set_target_switch (const char *);
|
||||
@ -139,9 +138,6 @@ extern void set_fast_math_flags (int);
|
||||
/* Handle -d switch. */
|
||||
extern void decode_d_option (const char *);
|
||||
|
||||
/* Handle -g switch. */
|
||||
extern void decode_g_option (const char *);
|
||||
|
||||
/* Return true iff flags are set as if -ffast-math. */
|
||||
extern bool fast_math_flags_set_p (void);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user