summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/lex.c5
-rw-r--r--gcc/diagnostic.c76
-rw-r--r--gcc/diagnostic.h18
5 files changed, 98 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 53d0e6cc12a..231a2bdc027 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 18449d117d5..55f3111f4f0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index fd9276b60a9..964bd569cf1 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -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);
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index ce0bb10d188..7124ecd58e3 100644
--- a/gcc/diagnostic.c
+++ b/gcc/diagnostic.c
@@ -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
diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h
index 07beb4b4458..e3450ce46ed 100644
--- a/gcc/diagnostic.h
+++ b/gcc/diagnostic.h
@@ -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__ */