diagnostic.c (context_as_prefix): Export.

* diagnostic.c (context_as_prefix): Export.
	(need_error_newline): Remove.
	(lang_diagnostic_starter, lang_diagnostic_finalizer): New objects.
	(error_module_changed, record_last_error_module,
	error_function_changed, record_last_error_function): New functions.
	(initialize_diagnostics): Default intialize
	lang_diagnostic_starter, lang_diagnostic_finalizer.
	(init_output_buffer): Tweak.
	(file_name_as_prefix): New function.
	(announce_function, default_print_error_function,
	report_error_function, set_diagnostic_context): Tweak.

cp/
	* lex.c (lang_init_options): Default diagnostic message maximum
	length to 80, when line-wrapping.

From-SVN: r35836
This commit is contained in:
Gabriel Dos Reis 2000-08-21 10:14:18 +00:00
parent 056b68414e
commit 24805e803b
5 changed files with 98 additions and 20 deletions

View File

@ -1,3 +1,17 @@
2000-08-21 Gabriel Dos Reis <gdr@merlin.codesourcery.com>
* diagnostic.c (context_as_prefix): Export.
(need_error_newline): Remove.
(lang_diagnostic_starter, lang_diagnostic_finalizer): New objects.
(error_module_changed, record_last_error_module,
error_function_changed, record_last_error_function): New functions.
(initialize_diagnostics): Default intialize
lang_diagnostic_starter, lang_diagnostic_finalizer.
(init_output_buffer): Tweak.
(file_name_as_prefix): New function.
(announce_function, default_print_error_function,
report_error_function, set_diagnostic_context): Tweak.
2000-08-21 Richard Earnshaw <rearnsha@arm.com>
* flow.c (init_propagate_block_info): Handle SUBREG in a jump

View File

@ -1,3 +1,8 @@
2000-08-21 Gabriel Dos Reis <gdr@codesourcery.com>
* lex.c (lang_init_options): Default diagnostic message maximum
length to 80, when line-wrapping.
2000-08-20 Mark Mitchell <mark@codesourcery.com>
* class.c (build_vtbl_initializer): Clear the entire

View File

@ -385,8 +385,9 @@ lang_init_options ()
flag_exceptions = 1;
/* Mark as "unspecified". */
flag_bounds_check = -1;
/* By default wrap lines at 72 characters. */
diagnostic_message_length_per_line = 72;
/* By default wrap lines at 80 characters. Is getenv ("COLUMNS")
preferable? */
diagnostic_message_length_per_line = 80;
/* By default, emit location information once for every
diagnostic message. */
set_message_prefixing_rule (DIAGNOSTICS_SHOW_PREFIX_ONCE);

View File

@ -71,7 +71,6 @@ static void output_format PARAMS ((output_buffer *));
static char *vbuild_message_string PARAMS ((const char *, va_list));
static char *build_message_string PARAMS ((const char *, ...))
ATTRIBUTE_PRINTF_1;
static char *context_as_prefix PARAMS ((const char *, int, int));
static void output_do_printf PARAMS ((output_buffer *, const char *));
static void format_with_decl PARAMS ((output_buffer *, tree));
static void file_and_line_for_asm PARAMS ((rtx, const char **, int *));
@ -121,8 +120,6 @@ static char digit_buffer[128];
static output_buffer global_output_buffer;
output_buffer *diagnostic_buffer = &global_output_buffer;
static int need_error_newline;
/* Function of last error message;
more generally, function such that if next error message is in it
then we don't have to mention the function name. */
@ -137,6 +134,10 @@ static int last_error_tick;
void (*print_error_function) PARAMS ((const char *)) =
default_print_error_function;
/* Hooks for language specific diagnostic messages pager and finalizer. */
diagnostic_starter_fn lang_diagnostic_starter;
diagnostic_finalizer_fn lang_diagnostic_finalizer;
/* Maximum characters per line in automatic line wrapping mode.
Zero means don't wrap lines. */
@ -150,6 +151,36 @@ static int current_prefixing_rule;
static int diagnostic_lock;
/* Return truthvalue if current input file is different from the most recent
file involved in a diagnostic message. */
int
error_module_changed ()
{
return last_error_tick != input_file_stack_tick;
}
/* Remember current file as being the most recent file involved in a
diagnostic message. */
void
record_last_error_module ()
{
last_error_tick = input_file_stack_tick;
}
/* Same as error_module_changed, but for function. */
int
error_function_changed ()
{
return last_error_function != current_function_decl;
}
/* Same as record_last_error_module, but for function. */
void
record_last_error_function ()
{
last_error_function = current_function_decl;
}
/* Initialize the diagnostic message outputting machinery. */
void
@ -161,6 +192,9 @@ initialize_diagnostics ()
/* Proceed to actual initialization. */
default_initialize_buffer (diagnostic_buffer);
lang_diagnostic_starter = default_diagnostic_starter;
lang_diagnostic_finalizer = default_diagnostic_finalizer;
}
void
@ -278,6 +312,7 @@ init_output_buffer (buffer, prefix, maximum_length)
const char *prefix;
int maximum_length;
{
bzero (buffer, sizeof (output_buffer));
obstack_init (&buffer->obstack);
ideal_line_wrap_cutoff (buffer) = maximum_length;
prefixing_policy (buffer) = current_prefixing_rule;
@ -744,11 +779,9 @@ build_message_string VPARAMS ((const char *msgid, ...))
return str;
}
/* Return a malloc'd string describing a location. The caller is
responsible for freeing the memory. */
static char *
char *
context_as_prefix (file, line, warn)
const char *file;
int line;
@ -770,6 +803,14 @@ context_as_prefix (file, line, warn)
}
}
/* Same as context_as_prefix, but only the source FILE is given. */
char *
file_name_as_prefix (f)
const char *f;
{
return build_message_string ("%s: ", f);
}
/* Format a MESSAGE into BUFFER. Automatically wrap lines. */
static void
@ -1150,8 +1191,8 @@ announce_function (decl)
else
verbatim (" %s", (*decl_printable_name) (decl, 2));
fflush (stderr);
need_error_newline = 1;
last_error_function = current_function_decl;
output_needs_newline (diagnostic_buffer) = 1;
record_last_error_function ();
}
}
@ -1162,7 +1203,7 @@ void
default_print_error_function (file)
const char *file;
{
if (last_error_function != current_function_decl)
if (error_function_changed ())
{
char *prefix = file ? build_message_string ("%s: ", file) : NULL;
output_state os;
@ -1187,7 +1228,7 @@ default_print_error_function (file)
(*decl_printable_name) (current_function_decl, 2));
}
last_error_function = current_function_decl;
record_last_error_function ();
output_to_stream (diagnostic_buffer, stderr);
diagnostic_buffer->state = os;
free ((char*) prefix);
@ -1204,14 +1245,14 @@ report_error_function (file)
{
struct file_stack *p;
if (need_error_newline)
if (output_needs_newline (diagnostic_buffer))
{
verbatim ("\n");
need_error_newline = 0;
output_needs_newline (diagnostic_buffer) = 0;
}
if (input_file_stack && input_file_stack->next != 0
&& input_file_stack_tick != last_error_tick)
&& error_function_changed ())
{
for (p = input_file_stack->next; p; p = p->next)
if (p == input_file_stack->next)
@ -1219,7 +1260,7 @@ report_error_function (file)
else
verbatim (",\n from %s:%d", p->name, p->line);
verbatim (":\n");
last_error_tick = input_file_stack_tick;
record_last_error_function ();
}
(*print_error_function) (input_filename);
@ -1616,8 +1657,7 @@ See %s for instructions.",
/* Setup DC for reporting a diagnostic MESSAGE (an error of a WARNING),
using arguments pointed to by ARGS_PTR, issued at a location specified
by FILE and LINE. Front-ends may override the defaut diagnostic pager
and finalizer *after* this subroutine completes. */
by FILE and LINE. */
void
set_diagnostic_context (dc, message, args_ptr, file, line, warn)
diagnostic_context *dc;
@ -1633,8 +1673,8 @@ set_diagnostic_context (dc, message, args_ptr, file, line, warn)
diagnostic_file_location (dc) = file;
diagnostic_line_location (dc) = line;
diagnostic_is_warning (dc) = warn;
diagnostic_starter (dc) = default_diagnostic_starter;
diagnostic_finalizer (dc) = default_diagnostic_finalizer;
diagnostic_starter (dc) = lang_diagnostic_starter;
diagnostic_finalizer (dc) = lang_diagnostic_finalizer;
}
static void

View File

@ -27,6 +27,9 @@ Boston, MA 02111-1307, USA. */
/* Forward declarations. */
typedef struct output_buffer output_buffer;
typedef struct diagnostic_context diagnostic_context;
typedef void (*diagnostic_starter_fn) PARAMS ((output_buffer *,
diagnostic_context *));
typedef diagnostic_starter_fn diagnostic_finalizer_fn;
#define DIAGNOSTICS_SHOW_PREFIX_ONCE 0x0
#define DIAGNOSTICS_SHOW_PREFIX_NEVER 0x1
@ -50,6 +53,10 @@ typedef struct
int ideal_maximum_length;
/* Nonzero if current PREFIX was emitted at least once. */
int emitted_prefix_p;
/* Nonzero means one should emit a newline before outputing anything. */
int need_newline_p;
/* Tells how often current PREFIX should be emitted:
o DIAGNOSTICS_SHOW_PREFIX_NEVER: never - not yet supported;
o DIAGNOSTICS_SHOW_PREFIX_ONCE: emit current PREFIX only once;
@ -79,6 +86,7 @@ struct output_buffer
#define output_buffer_text_cursor(BUFFER) (BUFFER)->state.cursor
#define output_buffer_format_args(BUFFER) *((BUFFER)->state.format_args)
#define output_needs_newline(BUFFER) (BUFFER)->state.need_newline_p
/* This data structure bundles altogether any information relevent to
the context of a diagnostic message. */
@ -137,6 +145,9 @@ struct diagnostic_context
extern printer_fn lang_printer;
extern diagnostic_starter_fn lang_diagnostic_starter;
extern diagnostic_finalizer_fn lang_diagnostic_finalizer;
extern int diagnostic_message_length_per_line;
/* This output buffer is used by front-ends that directly output
@ -178,5 +189,12 @@ void set_message_prefixing_rule PARAMS ((int));
void output_verbatim PARAMS ((output_buffer *, const char *, ...))
ATTRIBUTE_PRINTF_2;
void verbatim PARAMS ((const char *, ...)) ATTRIBUTE_PRINTF_1;
char *context_as_prefix PARAMS ((const char *, int, int));
char *file_name_as_prefix PARAMS ((const char *));
int error_module_changed PARAMS ((void));
void record_last_error_module PARAMS ((void));
int error_function_changed PARAMS ((void));
void record_last_error_function PARAMS ((void));
#endif /* __GCC_DIAGNOSTIC_H__ */