OSDN Git Service

update copyrights
[pf3gnuchains/gcc-fork.git] / gcc / diagnostic.c
1 /* Language-independent diagnostic subroutines for the GNU C compiler
2    Copyright (C) 1999, 2000 Free Software Foundation, Inc.
3    Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22
23 /* This file implements the language independent aspect of diagnostic
24    message module.  */
25
26 #include "config.h"
27 #undef FLOAT /* This is for hpux. They should change hpux.  */
28 #undef FFS  /* Some systems define this in param.h.  */
29 #include "system.h"
30
31 #include "tree.h"
32 #include "rtl.h"
33 #include "tm_p.h"
34 #include "flags.h"
35 #include "input.h"
36 #include "insn-attr.h"
37 #include "insn-codes.h"
38 #include "insn-config.h"
39 #include "toplev.h"
40 #include "intl.h"
41 #include "diagnostic.h"
42
43 #define obstack_chunk_alloc xmalloc
44 #define obstack_chunk_free  free
45
46 #define output_formatted_integer(BUFFER, FORMAT, INTEGER) \
47   do {                                                    \
48     sprintf (digit_buffer, FORMAT, INTEGER);              \
49     output_add_string (BUFFER, digit_buffer);             \
50   } while (0)
51
52 #define output_text_length(BUFFER) (BUFFER)->line_length
53 #define is_starting_newline(BUFFER) (output_text_length (BUFFER) == 0)
54 #define output_prefix(BUFFER) (BUFFER)->state.prefix
55 #define line_wrap_cutoff(BUFFER) (BUFFER)->state.maximum_length
56 #define ideal_line_wrap_cutoff(BUFFER) (BUFFER)->state.ideal_maximum_length
57 #define prefix_was_emitted_for(BUFFER) (BUFFER)->state.emitted_prefix_p
58 #define prefixing_policy(BUFFER) (BUFFER)->state.prefixing_rule
59 #define output_buffer_ptr_to_format_args(BUFFER) (BUFFER)->state.format_args
60
61 #define diagnostic_args output_buffer_ptr_to_format_args (diagnostic_buffer)
62 #define diagnostic_msg output_buffer_text_cursor (diagnostic_buffer)
63
64 /* Prototypes. */
65 static void finish_diagnostic PARAMS ((void));
66 static void output_do_verbatim PARAMS ((output_buffer *,
67                                         const char *, va_list *));
68 static void output_to_stream PARAMS ((output_buffer *, FILE *));
69 static void output_format PARAMS ((output_buffer *));
70 static void output_indent PARAMS ((output_buffer *));
71
72 static char *vbuild_message_string PARAMS ((const char *, va_list))
73      ATTRIBUTE_PRINTF (1, 0);
74 static char *build_message_string PARAMS ((const char *, ...))
75      ATTRIBUTE_PRINTF_1;
76 static void output_do_printf PARAMS ((output_buffer *, const char *))
77      ATTRIBUTE_PRINTF (2, 0);
78 static void format_with_decl PARAMS ((output_buffer *, tree));
79 static void file_and_line_for_asm PARAMS ((rtx, const char **, int *));
80 static void diagnostic_for_asm PARAMS ((rtx, const char *, va_list *, int));
81 static void diagnostic_for_decl PARAMS ((tree, const char *, va_list *, int));
82 static void vnotice PARAMS ((FILE *, const char *, va_list))
83      ATTRIBUTE_PRINTF (2, 0);
84 static void set_real_maximum_length PARAMS ((output_buffer *));
85                                           
86 static void output_unsigned_decimal PARAMS ((output_buffer *, unsigned int));
87 static void output_long_decimal PARAMS ((output_buffer *, long int));
88 static void output_long_unsigned_decimal PARAMS ((output_buffer *,
89                                                   long unsigned int));
90 static void output_octal PARAMS ((output_buffer *, unsigned int));
91 static void output_long_octal PARAMS ((output_buffer *, unsigned long int));
92 static void output_hexadecimal PARAMS ((output_buffer *, unsigned int));
93 static void output_long_hexadecimal PARAMS ((output_buffer *,
94                                              unsigned long int));
95 static void output_append_r PARAMS ((output_buffer *, const char *, int));
96 static void wrap_text PARAMS ((output_buffer *, const char *, const char *));
97 static void maybe_wrap_text PARAMS ((output_buffer *, const char *,
98                                      const char *));
99 static void clear_diagnostic_info PARAMS ((output_buffer *));
100
101 static void default_diagnostic_starter PARAMS ((output_buffer *,
102                                                 diagnostic_context *));
103 static void default_diagnostic_finalizer PARAMS ((output_buffer *,
104                                                   diagnostic_context *));
105
106 static void error_recursion PARAMS ((void)) ATTRIBUTE_NORETURN;
107 static const char *trim_filename PARAMS ((const char *));
108
109 extern int rtl_dump_and_exit;
110 extern int inhibit_warnings;
111 extern int warnings_are_errors;
112 extern int warningcount;
113 extern int errorcount;
114
115 /* Front-end specific tree formatter, if non-NULL.  */
116 printer_fn lang_printer = NULL;
117
118 /* This must be large enough to hold any printed integer or
119    floating-point value.  */
120 static char digit_buffer[128];
121
122 /* An output_buffer surrogate for stderr.  */
123 static output_buffer global_output_buffer;
124 output_buffer *diagnostic_buffer = &global_output_buffer;
125
126 /* Function of last error message;
127    more generally, function such that if next error message is in it
128    then we don't have to mention the function name.  */
129 static tree last_error_function = NULL;
130
131 /* Used to detect when input_file_stack has changed since last described.  */
132 static int last_error_tick;
133
134 /* Called by report_error_function to print out function name.
135    Default may be overridden by language front-ends.  */
136
137 void (*print_error_function) PARAMS ((const char *)) =
138   default_print_error_function;
139
140 /* Hooks for language specific diagnostic messages pager and finalizer.  */
141 diagnostic_starter_fn lang_diagnostic_starter;
142 diagnostic_finalizer_fn lang_diagnostic_finalizer;
143
144 /* Maximum characters per line in automatic line wrapping mode.
145    Zero means don't wrap lines. */
146
147 int diagnostic_message_length_per_line;
148
149 /* Used to control every diagnostic message formatting.  Front-ends should
150    call set_message_prefixing_rule to set up their policies.  */
151 static int current_prefixing_rule;
152
153 /* Prevent recursion into the error handler.  */
154 static int diagnostic_lock;
155
156 \f
157 /* Return truthvalue if current input file is different from the most recent
158    file involved in a diagnostic message.  */
159
160 int
161 error_module_changed ()
162 {
163   return last_error_tick != input_file_stack_tick;
164 }
165
166 /* Remember current file as being the most recent file involved in a
167    diagnostic message.  */
168
169 void
170 record_last_error_module ()
171 {
172   last_error_tick = input_file_stack_tick;
173 }
174
175 /* Same as error_module_changed, but for function.  */
176
177 int
178 error_function_changed ()
179 {
180   return last_error_function != current_function_decl;
181 }
182
183 /* Same as record_last_error_module, but for function.  */
184
185 void
186 record_last_error_function ()
187 {
188   last_error_function = current_function_decl;
189 }
190
191 /* Initialize the diagnostic message outputting machinery.  */
192
193 void
194 initialize_diagnostics ()
195 {
196   /* By default, we don't line-wrap messages.  */
197   diagnostic_message_length_per_line = 0;
198   set_message_prefixing_rule (DIAGNOSTICS_SHOW_PREFIX_ONCE);
199
200   /* Proceed to actual initialization.  */
201   default_initialize_buffer (diagnostic_buffer);
202
203   lang_diagnostic_starter = default_diagnostic_starter;
204   lang_diagnostic_finalizer = default_diagnostic_finalizer;
205 }
206
207 void
208 set_message_prefixing_rule (rule)
209      int rule;
210 {
211   current_prefixing_rule = rule;
212 }
213
214 /* Returns true if BUFFER is in line-wrappind mode.  */
215
216 int
217 output_is_line_wrapping (buffer)
218      output_buffer *buffer;
219 {
220   return ideal_line_wrap_cutoff (buffer) > 0;
221 }
222
223 /* Return BUFFER's prefix.  */
224
225 const char *
226 output_get_prefix (buffer)
227      const output_buffer *buffer;
228 {
229   return output_prefix (buffer);
230 }
231
232 /* Subroutine of output_set_maximum_length.  Set up BUFFER's
233    internal maximum characters per line.  */
234
235 static void
236 set_real_maximum_length (buffer)
237      output_buffer *buffer;
238 {
239   /* If we're told not to wrap lines then do the obvious thing.  In case
240    we'll emit prefix only once per diagnostic message, it is appropriate
241   not to increase unncessarily the line-length cut-off.  */
242   if (! output_is_line_wrapping (buffer)
243       || prefixing_policy (buffer) == DIAGNOSTICS_SHOW_PREFIX_ONCE
244       || prefixing_policy (buffer) == DIAGNOSTICS_SHOW_PREFIX_NEVER)
245     line_wrap_cutoff (buffer) = ideal_line_wrap_cutoff (buffer);
246   else
247     {
248       int prefix_length =
249         output_prefix (buffer) ? strlen (output_prefix (buffer)) : 0;
250       /* If the prefix is ridiculously too long, output at least
251          32 characters.  */
252       if (ideal_line_wrap_cutoff (buffer) - prefix_length < 32)
253         line_wrap_cutoff (buffer) = ideal_line_wrap_cutoff (buffer) + 32;
254       else
255         line_wrap_cutoff (buffer) = ideal_line_wrap_cutoff (buffer);
256     }
257 }
258
259 /* Sets the number of maximum characters per line BUFFER can output
260    in line-wrapping mode.  A LENGTH value 0 suppresses line-wrapping.  */
261
262 void
263 output_set_maximum_length (buffer, length)
264      output_buffer *buffer;
265      int length;
266 {
267  ideal_line_wrap_cutoff (buffer) = length;
268   set_real_maximum_length (buffer);
269 }
270
271 /* Sets BUFFER's PREFIX.  */
272
273 void
274 output_set_prefix (buffer, prefix)
275      output_buffer *buffer;
276      const char *prefix;
277 {
278   output_prefix (buffer) = prefix;
279   set_real_maximum_length (buffer);
280   prefix_was_emitted_for (buffer) = 0;
281   output_indentation (buffer) = 0;
282 }
283
284 /*  Return a pointer to the last character emitted in the output
285     BUFFER area.  A NULL pointer means no character available.  */
286 const char *
287 output_last_position (buffer)
288      const output_buffer *buffer;
289 {
290   const char *p = NULL;
291   
292   if (obstack_base (&buffer->obstack) != obstack_next_free (&buffer->obstack))
293     p = ((const char *) obstack_next_free (&buffer->obstack)) - 1;
294   return p;
295 }
296
297 /* Free BUFFER's prefix, a previously malloc'd string.  */
298
299 void
300 output_destroy_prefix (buffer)
301      output_buffer *buffer;
302 {
303   if (output_prefix (buffer) != NULL)
304     {
305       free ((char *) output_prefix (buffer));
306       output_prefix (buffer) = NULL;
307     }
308 }
309
310 /* Zero out any text output so far in BUFFER.  */
311
312 void
313 output_clear_message_text (buffer)
314      output_buffer *buffer;
315 {
316   obstack_free (&buffer->obstack, obstack_base (&buffer->obstack));
317   output_text_length (buffer) = 0;
318 }
319
320 /* Zero out any diagnostic data used so far by BUFFER.  */
321
322 static void
323 clear_diagnostic_info (buffer)
324      output_buffer *buffer;
325 {
326   output_buffer_text_cursor (buffer) = NULL;
327   output_buffer_ptr_to_format_args (buffer) = NULL;
328   prefix_was_emitted_for (buffer) = 0;
329   output_indentation (buffer) = 0;
330 }
331
332 /* Construct an output BUFFER with PREFIX and of MAXIMUM_LENGTH
333    characters per line.  */
334
335 void
336 init_output_buffer (buffer, prefix, maximum_length)
337      output_buffer *buffer;
338      const char *prefix;
339      int maximum_length;
340 {
341   memset (buffer, 0, sizeof (output_buffer));
342   obstack_init (&buffer->obstack);
343   ideal_line_wrap_cutoff (buffer) = maximum_length;
344   prefixing_policy (buffer) = current_prefixing_rule;
345   output_set_prefix (buffer, prefix);
346   output_text_length (buffer) = 0;
347   clear_diagnostic_info (buffer);  
348 }
349
350 /* Initialize BUFFER with a NULL prefix and current diagnostic message
351    length cutoff.  */
352
353 void
354 default_initialize_buffer (buffer)
355      output_buffer *buffer;
356 {
357   init_output_buffer (buffer, NULL, diagnostic_message_length_per_line);
358 }
359
360 /* Recompute diagnostic_buffer's attributes to reflect any change
361    in diagnostic formatting global options.  */
362
363 void
364 reshape_diagnostic_buffer ()
365 {
366   ideal_line_wrap_cutoff (diagnostic_buffer) =
367     diagnostic_message_length_per_line;
368   prefixing_policy (diagnostic_buffer) = current_prefixing_rule;
369   set_real_maximum_length (diagnostic_buffer);
370 }
371
372 /* Reinitialize BUFFER.  */
373
374 void
375 output_clear (buffer)
376      output_buffer *buffer;
377 {
378   output_clear_message_text (buffer);
379   clear_diagnostic_info (buffer);
380 }
381
382 /* Finishes constructing a NULL-terminated character string representing
383    the BUFFERed message.  */
384
385 const char *
386 output_finalize_message (buffer)
387      output_buffer *buffer;
388 {
389   obstack_1grow (&buffer->obstack, '\0');
390   return output_message_text (buffer);
391 }
392
393 void
394 flush_diagnostic_buffer ()
395 {
396   output_to_stream (diagnostic_buffer, stderr);
397   fflush (stderr);
398 }
399
400 /* Return the amount of characters BUFFER can accept to
401    make a full line.  */
402
403 int
404 output_space_left (buffer)
405      const output_buffer *buffer;
406 {
407   return line_wrap_cutoff (buffer) - output_text_length (buffer);
408 }
409
410 /* Write out BUFFER's prefix.  */
411
412 void
413 output_emit_prefix (buffer)
414      output_buffer *buffer;
415 {
416   if (output_prefix (buffer) != NULL)
417     {
418       switch (prefixing_policy (buffer))
419         {
420         default:
421         case DIAGNOSTICS_SHOW_PREFIX_NEVER:
422           break;
423
424         case DIAGNOSTICS_SHOW_PREFIX_ONCE:
425           if (prefix_was_emitted_for (buffer))
426             {
427               output_indent (buffer);
428               break;
429             }
430           output_indentation (buffer) += 3;          
431           /* Fall through.  */
432
433         case DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE:
434           {
435             int prefix_length = strlen (output_prefix (buffer));
436             output_append_r (buffer, output_prefix (buffer), prefix_length);
437             prefix_was_emitted_for (buffer) = 1;
438           }
439           break;
440         }
441     }
442 }
443
444 /* Have BUFFER start a new line.  */
445
446 void
447 output_add_newline (buffer)
448      output_buffer *buffer;
449 {
450   obstack_1grow (&buffer->obstack, '\n');
451   output_text_length (buffer) = 0;
452 }
453
454 /* Appends a character to BUFFER.  */
455
456 void
457 output_add_character (buffer, c)
458      output_buffer *buffer;
459      int c;
460 {
461   if (output_is_line_wrapping (buffer) && output_space_left (buffer) <= 0)
462     output_add_newline (buffer);
463   obstack_1grow (&buffer->obstack, c);
464   ++output_text_length (buffer);
465 }
466
467 /* Adds a space to BUFFER.  */
468
469 void
470 output_add_space (buffer)
471      output_buffer *buffer;
472 {
473   if (output_is_line_wrapping (buffer) && output_space_left (buffer) <= 0)
474     {
475       output_add_newline (buffer);
476       return;
477     }
478   obstack_1grow (&buffer->obstack, ' ');
479   ++output_text_length (buffer);
480 }
481
482 /* These functions format an INTEGER into BUFFER as suggested by their
483    names.  */
484
485 void
486 output_decimal (buffer, i)
487      output_buffer *buffer;
488      int i;
489 {
490   output_formatted_integer (buffer, "%d", i);
491 }
492
493 static void
494 output_long_decimal (buffer, i)
495      output_buffer *buffer;
496      long int i;
497 {
498   output_formatted_integer (buffer, "%ld", i);
499 }
500
501 static void
502 output_unsigned_decimal (buffer, i)
503      output_buffer *buffer;
504      unsigned int i;
505 {
506   output_formatted_integer (buffer, "%u", i);
507 }
508
509 static void
510 output_long_unsigned_decimal (buffer, i)
511      output_buffer *buffer;
512      long unsigned int i;
513 {
514   output_formatted_integer (buffer, "%lu", i);
515 }
516
517 static void
518 output_octal (buffer, i)
519      output_buffer *buffer;
520      unsigned int i;
521 {
522   output_formatted_integer (buffer, "%o", i);
523 }
524
525 static void
526 output_long_octal (buffer, i)
527      output_buffer *buffer;
528      unsigned long int i;
529 {
530   output_formatted_integer (buffer, "%lo", i);
531 }
532
533 static void
534 output_hexadecimal (buffer, i)
535      output_buffer *buffer;
536      unsigned int i;
537 {
538   output_formatted_integer (buffer, "%x", i);
539 }
540
541 static void
542 output_long_hexadecimal (buffer, i)
543      output_buffer *buffer;
544      unsigned long int i;
545 {
546   output_formatted_integer (buffer, "%lx", i);
547 }
548
549 /* Append to BUFFER a string specified by its STARTING character
550    and LENGTH.  */
551
552 static void
553 output_append_r (buffer, start, length)
554      output_buffer *buffer;
555      const char *start;
556      int length;
557 {
558   obstack_grow (&buffer->obstack, start, length);
559   output_text_length (buffer) += length;
560 }
561
562 /* Append a string deliminated by START and END to BUFFER.  No wrapping is
563    done.  However, if beginning a new line then emit output_prefix (BUFFER)
564    and skip any leading whitespace if appropriate.  The caller must ensure
565    that it is safe to do so.  */
566
567 void
568 output_append (buffer, start, end)
569      output_buffer *buffer;
570      const char *start;
571      const char *end;
572 {
573   /* Emit prefix and skip whitespace if we're starting a new line.  */
574   if (is_starting_newline (buffer))
575     {
576       output_emit_prefix (buffer);
577       if (output_is_line_wrapping (buffer))
578         while (start != end && *start == ' ')
579           ++start;
580     }
581   output_append_r (buffer, start, end - start);
582 }
583
584 static void
585 output_indent (buffer)
586      output_buffer *buffer;
587 {
588   int n = output_indentation (buffer);
589   int i;
590
591   for (i = 0; i < n; ++i)
592     output_add_character (buffer, ' ');
593 }
594
595 /* Wrap a text delimited by START and END into BUFFER.  */
596
597 static void
598 wrap_text (buffer, start, end)
599      output_buffer *buffer;
600      const char *start;
601      const char *end;
602 {
603   int is_wrapping = output_is_line_wrapping (buffer);
604   
605   while (start != end)
606     {
607       /* Dump anything bodered by whitespaces.  */ 
608       {
609         const char *p = start;
610         while (p != end && *p != ' ' && *p != '\n')
611           ++p;
612         if (is_wrapping && p - start >= output_space_left (buffer))
613           output_add_newline (buffer);
614         output_append (buffer, start, p);
615         start = p;
616       }
617
618       if (start != end && *start == ' ')
619         {
620           output_add_space (buffer);
621           ++start;
622         }
623       if (start != end && *start == '\n')
624         {
625           output_add_newline (buffer);
626           ++start;
627         }
628     }
629 }
630
631 /* Same as wrap_text but wrap text only when in line-wrapping mode.  */
632
633 static void
634 maybe_wrap_text (buffer, start, end)
635      output_buffer *buffer;
636      const char *start;
637      const char *end;
638 {
639   if (output_is_line_wrapping (buffer))
640     wrap_text (buffer, start, end);
641   else
642     output_append (buffer, start, end);
643 }
644
645
646 /* Append a STRING to BUFFER; the STRING might be line-wrapped if in
647    appropriate mode.  */
648
649 void
650 output_add_string (buffer, str)
651      output_buffer *buffer;
652      const char *str;
653 {
654   maybe_wrap_text (buffer, str, str + (str ? strlen (str) : 0));
655 }
656
657 /* Flush the content of BUFFER onto FILE and reinitialize BUFFER.  */
658
659 static void
660 output_to_stream (buffer, file)
661      output_buffer *buffer;
662      FILE *file;
663 {
664   const char *text = output_finalize_message (buffer);
665   fputs (text, file);
666   output_clear_message_text (buffer);
667 }
668
669 /* Format a message pointed to by output_buffer_text_cursor (BUFFER) using
670    output_buffer_format_args (BUFFER) as appropriate.  The following format
671    specifiers are recognized as being language independent:
672    %d, %i: (signed) integer in base ten.
673    %u: unsigned integer in base ten.
674    %o: unsigned integer in base eight.
675    %x: unsigned integer in base sixteen.
676    %ld, %li, %lo, %lu, %lx: long versions of the above.
677    %c: character.
678    %s: string.
679    %%: `%'.
680    %*.s: a substring the length of which is specified by an integer.  */
681
682 static void
683 output_format (buffer)
684      output_buffer *buffer;
685 {
686   for (; *output_buffer_text_cursor (buffer);
687        ++output_buffer_text_cursor (buffer))
688     {
689       int long_integer = 0;
690
691       /* Ignore text.  */
692       {
693         const char *p = output_buffer_text_cursor (buffer);
694         while (*p && *p != '%')
695           ++p;
696         wrap_text (buffer, output_buffer_text_cursor (buffer), p);
697         output_buffer_text_cursor (buffer) = p;
698       }
699
700       if (!*output_buffer_text_cursor (buffer))
701         break;
702
703       /* We got a '%'.  Let's see what happens. Record whether we're
704          parsing a long integer format specifier.  */
705       if (*++output_buffer_text_cursor (buffer) == 'l')
706         {
707           long_integer = 1;
708           ++output_buffer_text_cursor (buffer);
709         }
710
711       /* Handle %c, %d, %i, %ld, %li, %lo, %lu, %lx, %o, %s, %u,
712          %x, %.*s; %%.  And nothing else.  Front-ends should install
713          printers to grok language specific format specifiers.  */
714       switch (*output_buffer_text_cursor (buffer))
715         {
716         case 'c':
717           output_add_character
718             (buffer, va_arg (output_buffer_format_args (buffer), int));
719           break;
720           
721         case 'd':
722         case 'i':
723           if (long_integer)
724             output_long_decimal
725               (buffer, va_arg (output_buffer_format_args (buffer), long int));
726           else
727             output_decimal
728               (buffer, va_arg (output_buffer_format_args (buffer), int));
729           break;
730
731         case 'o':
732           if (long_integer)
733             output_long_octal (buffer,
734                                va_arg (output_buffer_format_args (buffer),
735                                        unsigned long int));
736           else
737             output_octal (buffer,
738                           va_arg (output_buffer_format_args (buffer),
739                                   unsigned int));
740           break;
741
742         case 's':
743           output_add_string (buffer,
744                              va_arg (output_buffer_format_args (buffer),
745                                      const char *));
746           break;
747
748         case 'u':
749           if (long_integer)
750             output_long_unsigned_decimal
751               (buffer, va_arg (output_buffer_format_args (buffer),
752                                long unsigned int));
753           else
754             output_unsigned_decimal
755               (buffer, va_arg (output_buffer_format_args (buffer),
756                                unsigned int));
757           break;
758           
759         case 'x':
760           if (long_integer)
761             output_long_hexadecimal
762               (buffer, va_arg (output_buffer_format_args (buffer),
763                                unsigned long int));
764           else
765             output_hexadecimal
766               (buffer, va_arg (output_buffer_format_args (buffer),
767                                unsigned int));
768           break;
769
770         case '%':
771           output_add_character (buffer, '%');
772           break;
773
774         case '.':
775           {
776             int n;
777             const char *s;
778             /* We handle no precision specifier but `%.*s'.  */
779             if (*++output_buffer_text_cursor (buffer) != '*')
780               abort ();
781             else if (*++output_buffer_text_cursor (buffer) != 's')
782               abort();
783             n = va_arg (output_buffer_format_args (buffer), int);
784             s = va_arg (output_buffer_format_args (buffer), const char *);
785             output_append (buffer, s, s + n);
786           }
787           break;
788
789         default:
790           if (! lang_printer || !(*lang_printer) (buffer))
791             {
792               /* Hmmm.  The front-end failed to install a format translator
793                  but called us with an unrecognized format.  Sorry.  */
794               abort ();
795             }
796         }
797     }
798 }
799
800 static char *
801 vbuild_message_string (msgid, ap)
802      const char *msgid;
803      va_list ap;
804 {
805   char *str;
806
807   vasprintf (&str, msgid, ap);
808   return str;
809 }
810
811 /*  Return a malloc'd string containing MSGID formatted a la
812     printf.  The caller is reponsible for freeing the memory.  */
813
814 static char *
815 build_message_string VPARAMS ((const char *msgid, ...))
816 {
817 #ifndef ANSI_PROTOTYPES
818   const char *msgid;
819 #endif
820   va_list ap;
821   char *str;
822
823   VA_START (ap, msgid);
824
825 #ifndef ANSI_PROTOTYPES
826   msgid = va_arg (ap, const char *);
827 #endif
828
829   str = vbuild_message_string (msgid, ap);
830
831   va_end (ap);
832
833   return str;
834 }
835
836 /* Return a malloc'd string describing a location.  The caller is
837    responsible for freeing the memory.  */
838
839 char *
840 context_as_prefix (file, line, warn)
841      const char *file;
842      int line;
843      int warn;
844 {
845   if (file)
846     {
847       if (warn)
848         return build_message_string ("%s:%d: warning: ", file, line);
849       else
850         return build_message_string ("%s:%d: ", file, line);
851     }
852   else
853     {
854       if (warn)
855         return build_message_string ("%s: warning: ", progname);
856       else
857         return build_message_string ("%s: ", progname);
858     }
859 }
860
861 /* Same as context_as_prefix, but only the source FILE is given.  */
862
863 char *
864 file_name_as_prefix (f)
865      const char *f;
866 {
867   return build_message_string ("%s: ", f);
868 }
869
870 /* Format a MESSAGE into BUFFER.  Automatically wrap lines.  */
871
872 static void
873 output_do_printf (buffer, msgid)
874      output_buffer *buffer;
875      const char *msgid;
876 {
877   char *message = vbuild_message_string (msgid,
878                                          output_buffer_format_args (buffer));
879
880   wrap_text (buffer, message, message + strlen (message));
881   free (message);
882 }
883
884
885 /* Format a message into BUFFER a la printf.  */
886
887 void
888 output_printf VPARAMS ((struct output_buffer *buffer, const char *msgid, ...))
889 {
890 #ifndef ANSI_PROTOTYPES
891   struct output_buffer *buffer;
892   const char *msgid;
893 #endif
894   va_list ap;
895   va_list *old_args;
896
897   VA_START (ap, msgid);
898 #ifndef ANSI_PROTOTYPES
899   buffer = va_arg (ap, output_buffer *);
900   msgid = va_arg (ap, const char *);
901 #endif
902   old_args = output_buffer_ptr_to_format_args (buffer);
903   output_buffer_ptr_to_format_args (buffer) = &ap;
904   output_do_printf (buffer, msgid);
905   output_buffer_ptr_to_format_args (buffer) = old_args;
906   va_end (ap);
907 }
908
909 /* Print the message MSGID in FILE.  */
910
911 static void
912 vnotice (file, msgid, ap)
913      FILE *file;
914      const char *msgid;
915      va_list ap;
916 {
917   vfprintf (file, _(msgid), ap);
918 }
919
920 /* Print a message relevant to the given DECL.  */
921
922 static void
923 format_with_decl (buffer, decl)
924      output_buffer *buffer;
925      tree decl;
926 {
927   const char *p;
928   
929   /* Do magic to get around lack of varargs support for insertion
930      of arguments into existing list.  We know that the decl is first;
931      we ass_u_me that it will be printed with "%s".  */
932   for (p = output_buffer_text_cursor (buffer); *p; ++p)
933     {
934       if (*p == '%')
935         {
936           if (*(p + 1) == '%')
937             ++p;
938           else if (*(p + 1) != 's')
939             abort ();
940           else
941             break;
942         }
943     }
944
945   /* Print the left-hand substring.  */
946   maybe_wrap_text (buffer, output_buffer_text_cursor (buffer), p);
947   
948   if (*p == '%')                /* Print the name.  */
949     {
950       const char *n = (DECL_NAME (decl)
951                  ? (*decl_printable_name) (decl, 2)
952                  : _("((anonymous))"));
953       output_add_string (buffer, n);
954       while (*p)
955         {
956           ++p;
957           if (ISALPHA (*(p - 1) & 0xFF))
958             break;
959         }
960     }
961
962   if (*p)                       /* Print the rest of the message.  */
963     {
964       output_buffer_text_cursor (buffer) = p;
965       output_format (buffer);
966     }
967 }
968
969 /* Figure file and line of the given INSN.  */
970
971 static void
972 file_and_line_for_asm (insn, pfile, pline)
973      rtx insn;
974      const char **pfile;
975      int *pline;
976 {
977   rtx body = PATTERN (insn);
978   rtx asmop;
979
980   /* Find the (or one of the) ASM_OPERANDS in the insn.  */
981   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
982     asmop = SET_SRC (body);
983   else if (GET_CODE (body) == ASM_OPERANDS)
984     asmop = body;
985   else if (GET_CODE (body) == PARALLEL
986            && GET_CODE (XVECEXP (body, 0, 0)) == SET)
987     asmop = SET_SRC (XVECEXP (body, 0, 0));
988   else if (GET_CODE (body) == PARALLEL
989            && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
990     asmop = XVECEXP (body, 0, 0);
991   else
992     asmop = NULL;
993
994   if (asmop)
995     {
996       *pfile = ASM_OPERANDS_SOURCE_FILE (asmop);
997       *pline = ASM_OPERANDS_SOURCE_LINE (asmop);
998     }
999   else
1000     {
1001       *pfile = input_filename;
1002       *pline = lineno;
1003     }
1004 }
1005
1006 /* Report a diagnostic MESSAGE (an errror or a WARNING) at the line number
1007    of the insn INSN.  This is used only when INSN is an `asm' with operands,
1008    and each ASM_OPERANDS records its own source file and line.  */
1009
1010 static void
1011 diagnostic_for_asm (insn, msg, args_ptr, warn)
1012      rtx insn;
1013      const char *msg;
1014      va_list *args_ptr;
1015      int warn;
1016 {
1017   diagnostic_context dc;
1018
1019   set_diagnostic_context (&dc, msg, args_ptr, NULL, 0, warn);
1020   file_and_line_for_asm (insn, &diagnostic_file_location (&dc),
1021                          &diagnostic_line_location (&dc));
1022   report_diagnostic (&dc);
1023 }
1024
1025 /* Report a diagnostic MESSAGE at the declaration DECL.
1026    MSG is a format string which uses %s to substitute the declaration
1027    name; subsequent substitutions are a la output_format.  */
1028
1029 static void
1030 diagnostic_for_decl (decl, msg, args_ptr, warn)
1031      tree decl;
1032      const char *msg;
1033      va_list *args_ptr;
1034      int warn;
1035 {
1036   output_state os;
1037
1038   if (diagnostic_lock++)
1039     error_recursion ();
1040
1041   if (count_error (warn))
1042     {
1043       os = output_buffer_state (diagnostic_buffer);
1044       report_error_function (DECL_SOURCE_FILE (decl));
1045       output_set_prefix
1046         (diagnostic_buffer, context_as_prefix
1047          (DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl), warn));
1048       output_buffer_ptr_to_format_args (diagnostic_buffer) = args_ptr;
1049       output_buffer_text_cursor (diagnostic_buffer) = msg;
1050       format_with_decl (diagnostic_buffer, decl);
1051       finish_diagnostic ();
1052       output_destroy_prefix (diagnostic_buffer);
1053   
1054       output_buffer_state (diagnostic_buffer) = os;
1055     }
1056   diagnostic_lock--;
1057 }
1058
1059 \f
1060 /* Count an error or warning.  Return 1 if the message should be printed.  */
1061
1062 int
1063 count_error (warningp)
1064      int warningp;
1065 {
1066   if (warningp
1067       && (inhibit_warnings
1068           || (in_system_header && !warn_system_headers)))
1069     return 0;
1070
1071   if (warningp && !warnings_are_errors)
1072     warningcount++;
1073   else
1074     {
1075       static int warning_message = 0;
1076
1077       if (warningp && !warning_message)
1078         {
1079           verbatim ("%s: warnings being treated as errors\n", progname);
1080           warning_message = 1;
1081         }
1082       errorcount++;
1083     }
1084
1085   return 1;
1086 }
1087
1088 /* Print a diagnistic MSGID on FILE.  */
1089
1090 void
1091 fnotice VPARAMS ((FILE *file, const char *msgid, ...))
1092 {
1093 #ifndef ANSI_PROTOTYPES
1094   FILE *file;
1095   const char *msgid;
1096 #endif
1097   va_list ap;
1098
1099   VA_START (ap, msgid);
1100
1101 #ifndef ANSI_PROTOTYPES
1102   file = va_arg (ap, FILE *);
1103   msgid = va_arg (ap, const char *);
1104 #endif
1105
1106   vnotice (file, msgid, ap);
1107   va_end (ap);
1108 }
1109
1110
1111 /* Print a fatal error message.  NAME is the text.
1112    Also include a system error message based on `errno'.  */
1113
1114 void
1115 pfatal_with_name (name)
1116   const char *name;
1117 {
1118   fprintf (stderr, "%s: ", progname);
1119   perror (name);
1120   exit (FATAL_EXIT_CODE);
1121 }
1122
1123 void
1124 fatal_io_error (name)
1125   const char *name;
1126 {
1127   verbatim ("%s: %s: I/O error\n", progname, name);
1128   exit (FATAL_EXIT_CODE);
1129 }
1130
1131 /* Issue a pedantic warning MSGID.  */
1132
1133 void
1134 pedwarn VPARAMS ((const char *msgid, ...))
1135 {
1136 #ifndef ANSI_PROTOTYPES
1137   const char *msgid;
1138 #endif
1139   va_list ap;
1140   diagnostic_context dc;
1141
1142   VA_START (ap, msgid);
1143
1144 #ifndef ANSI_PROTOTYPES
1145   msgid = va_arg (ap, const char *);
1146 #endif
1147
1148   set_diagnostic_context
1149     (&dc, msgid, &ap, input_filename, lineno, !flag_pedantic_errors);
1150   report_diagnostic (&dc);
1151   va_end (ap);
1152 }
1153
1154 /* Issue a pedantic waring about DECL.  */
1155
1156 void
1157 pedwarn_with_decl VPARAMS ((tree decl, const char *msgid, ...))
1158 {
1159 #ifndef ANSI_PROTOTYPES
1160   tree decl;
1161   const char *msgid;
1162 #endif
1163   va_list ap;
1164
1165   VA_START (ap, msgid);
1166
1167 #ifndef ANSI_PROTOTYPES
1168   decl = va_arg (ap, tree);
1169   msgid = va_arg (ap, const char *);
1170 #endif
1171   /* We don't want -pedantic-errors to cause the compilation to fail from
1172      "errors" in system header files.  Sometimes fixincludes can't fix what's
1173      broken (eg: unsigned char bitfields - fixing it may change the alignment
1174      which will cause programs to mysteriously fail because the C library
1175      or kernel uses the original layout).  There's no point in issuing a
1176      warning either, it's just unnecessary noise.  */
1177   if (!DECL_IN_SYSTEM_HEADER (decl))
1178     diagnostic_for_decl (decl, msgid, &ap, !flag_pedantic_errors);
1179   va_end (ap);
1180 }
1181
1182 /* Same as above but within the context FILE and LINE. */
1183
1184 void
1185 pedwarn_with_file_and_line VPARAMS ((const char *file, int line,
1186                                      const char *msgid, ...))
1187 {
1188 #ifndef ANSI_PROTOTYPES
1189   const char *file;
1190   int line;
1191   const char *msgid;
1192 #endif
1193   va_list ap;
1194   diagnostic_context dc;
1195
1196   VA_START (ap, msgid);
1197
1198 #ifndef ANSI_PROTOTYPES
1199   file = va_arg (ap, const char *);
1200   line = va_arg (ap, int);
1201   msgid = va_arg (ap, const char *);
1202 #endif
1203
1204   set_diagnostic_context (&dc, msgid, &ap, file, line, !flag_pedantic_errors);
1205   report_diagnostic (&dc);
1206   va_end (ap);
1207 }
1208
1209 /* Just apologize with MSGID.  */
1210
1211 void
1212 sorry VPARAMS ((const char *msgid, ...))
1213 {
1214 #ifndef ANSI_PROTOTYPES
1215   const char *msgid;
1216 #endif
1217   va_list ap;
1218   output_state os;
1219
1220   os = output_buffer_state (diagnostic_buffer);
1221   VA_START (ap, msgid);
1222
1223 #ifndef ANSI_PROTOTYPES
1224   msgid = va_arg (ap, const char *);
1225 #endif
1226   ++sorrycount;
1227   output_set_prefix
1228     (diagnostic_buffer, context_as_prefix (input_filename, lineno, 0));
1229   output_printf (diagnostic_buffer, "sorry, not implemented: ");
1230   output_buffer_ptr_to_format_args (diagnostic_buffer) = &ap;
1231   output_buffer_text_cursor (diagnostic_buffer) = msgid;
1232   output_format (diagnostic_buffer);
1233   finish_diagnostic ();
1234   output_buffer_state (diagnostic_buffer) = os;
1235   va_end (ap);
1236 }
1237
1238 /* Called when the start of a function definition is parsed,
1239    this function prints on stderr the name of the function.  */
1240
1241 void
1242 announce_function (decl)
1243      tree decl;
1244 {
1245   if (! quiet_flag)
1246     {
1247       if (rtl_dump_and_exit)
1248         verbatim ("%s ", IDENTIFIER_POINTER (DECL_NAME (decl)));
1249       else
1250         verbatim (" %s", (*decl_printable_name) (decl, 2));
1251       fflush (stderr);
1252       output_needs_newline (diagnostic_buffer) = 1;
1253       record_last_error_function ();
1254     }
1255 }
1256
1257 /* The default function to print out name of current function that caused
1258    an error.  */
1259
1260 void
1261 default_print_error_function (file)
1262   const char *file;
1263 {
1264   if (error_function_changed ())
1265     {
1266       char *prefix = file ? build_message_string ("%s: ", file) : NULL;
1267       output_state os;
1268
1269       os = output_buffer_state (diagnostic_buffer);
1270       output_set_prefix (diagnostic_buffer, prefix);
1271       
1272       if (current_function_decl == NULL)
1273           output_add_string (diagnostic_buffer, "At top level:");
1274       else
1275         {
1276           if (TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
1277             output_printf
1278               (diagnostic_buffer, "In method `%s':",
1279                (*decl_printable_name) (current_function_decl, 2));
1280           else
1281             output_printf
1282               (diagnostic_buffer, "In function `%s':",
1283                (*decl_printable_name) (current_function_decl, 2));
1284         }
1285       output_add_newline (diagnostic_buffer);
1286
1287       record_last_error_function ();
1288       output_to_stream (diagnostic_buffer, stderr);
1289       output_buffer_state (diagnostic_buffer) = os;
1290       free ((char*) prefix);
1291     }
1292 }
1293
1294 /* Prints out, if necessary, the name of the current function
1295   that caused an error.  Called from all error and warning functions.
1296   We ignore the FILE parameter, as it cannot be relied upon.  */
1297
1298 void
1299 report_error_function (file)
1300   const char *file ATTRIBUTE_UNUSED;
1301 {
1302   report_problematic_module (diagnostic_buffer);
1303   (*print_error_function) (input_filename);
1304 }
1305
1306 void
1307 error_with_file_and_line VPARAMS ((const char *file, int line,
1308                                    const char *msgid, ...))
1309 {
1310 #ifndef ANSI_PROTOTYPES
1311   const char *file;
1312   int line;
1313   const char *msgid;
1314 #endif
1315   va_list ap;
1316   diagnostic_context dc;
1317
1318   VA_START (ap, msgid);
1319
1320 #ifndef ANSI_PROTOTYPES
1321   file = va_arg (ap, const char *);
1322   line = va_arg (ap, int);
1323   msgid = va_arg (ap, const char *);
1324 #endif
1325
1326   set_diagnostic_context (&dc, msgid, &ap, file, line, /* warn = */ 0);
1327   report_diagnostic (&dc);
1328   va_end (ap);
1329 }
1330
1331 void
1332 error_with_decl VPARAMS ((tree decl, const char *msgid, ...))
1333 {
1334 #ifndef ANSI_PROTOTYPES
1335   tree decl;
1336   const char *msgid;
1337 #endif
1338   va_list ap;
1339
1340   VA_START (ap, msgid);
1341
1342 #ifndef ANSI_PROTOTYPES
1343   decl = va_arg (ap, tree);
1344   msgid = va_arg (ap, const char *);
1345 #endif
1346
1347   diagnostic_for_decl (decl, msgid, &ap, /* warn = */ 0);
1348   va_end (ap);
1349 }
1350
1351 void
1352 error_for_asm VPARAMS ((rtx insn, const char *msgid, ...))
1353 {
1354 #ifndef ANSI_PROTOTYPES
1355   rtx insn;
1356   const char *msgid;
1357 #endif
1358   va_list ap;
1359
1360   VA_START (ap, msgid);
1361
1362 #ifndef ANSI_PROTOTYPES
1363   insn = va_arg (ap, rtx);
1364   msgid = va_arg (ap, const char *);
1365 #endif
1366
1367   diagnostic_for_asm (insn, msgid, &ap, /* warn = */ 0);
1368   va_end (ap);
1369 }
1370
1371 void
1372 error VPARAMS ((const char *msgid, ...))
1373 {
1374 #ifndef ANSI_PROTOTYPES
1375   const char *msgid;
1376 #endif
1377   va_list ap;
1378   diagnostic_context dc;
1379
1380   VA_START (ap, msgid);
1381
1382 #ifndef ANSI_PROTOTYPES
1383   msgid = va_arg (ap, const char *);
1384 #endif
1385
1386   set_diagnostic_context
1387     (&dc, msgid, &ap, input_filename, lineno, /* warn = */ 0);
1388   report_diagnostic (&dc);
1389   va_end (ap);
1390 }
1391
1392 /* Report a fatal error at the current line number.  Allow a front end to
1393    intercept the message.  */
1394
1395 static void (*fatal_function) PARAMS((const char *, va_list *));
1396
1397 /* Set the function to call when a fatal error occurs.  */
1398
1399 void
1400 set_fatal_function (f)
1401      void (*f) PARAMS ((const char *, va_list *));
1402 {
1403   fatal_function = f;
1404 }
1405
1406 void
1407 fatal VPARAMS ((const char *msgid, ...))
1408 {
1409 #ifndef ANSI_PROTOTYPES
1410   const char *msgid;
1411 #endif
1412   va_list ap;
1413   diagnostic_context dc;
1414
1415   VA_START (ap, msgid);
1416
1417 #ifndef ANSI_PROTOTYPES
1418   msgid = va_arg (ap, const char *);
1419 #endif
1420
1421   if (errorcount > 1 || sorrycount > 0)
1422     {
1423       fprintf (stderr, "confused by earlier errors, bailing out\n");
1424       exit (FATAL_EXIT_CODE);
1425     }
1426
1427   if (fatal_function != 0)
1428     (*fatal_function) (_(msgid), &ap);
1429   
1430   set_diagnostic_context
1431     (&dc, msgid, &ap, input_filename, lineno, /* warn = */0);
1432   report_diagnostic (&dc);
1433   va_end (ap);
1434
1435   fprintf
1436     (stderr, "Please submit a full bug report.\n See %s for instructions.\n",
1437      GCCBUGURL);
1438   exit (FATAL_EXIT_CODE);
1439 }
1440
1441 void
1442 _fatal_insn (msgid, insn, file, line, function)
1443      const char *msgid;
1444      rtx insn;
1445      const char *file;
1446      int line;
1447      const char *function;
1448 {
1449   error ("%s", msgid);
1450   debug_rtx (insn);
1451   fancy_abort (file, line, function);
1452 }
1453
1454 void
1455 _fatal_insn_not_found (insn, file, line, function)
1456      rtx insn;
1457      const char *file;
1458      int line;
1459      const char *function;
1460 {
1461   if (INSN_CODE (insn) < 0)
1462     _fatal_insn ("Unrecognizable insn:", insn, file, line, function);
1463   else
1464     _fatal_insn ("Insn does not satisfy its constraints:",
1465                 insn, file, line, function);
1466 }
1467
1468 void
1469 warning_with_file_and_line VPARAMS ((const char *file, int line,
1470                                      const char *msgid, ...))
1471 {
1472 #ifndef ANSI_PROTOTYPES
1473   const char *file;
1474   int line;
1475   const char *msgid;
1476 #endif
1477   va_list ap;
1478   diagnostic_context dc;
1479
1480   VA_START (ap, msgid);
1481
1482 #ifndef ANSI_PROTOTYPES
1483   file = va_arg (ap, const char *);
1484   line = va_arg (ap, int);
1485   msgid = va_arg (ap, const char *);
1486 #endif
1487
1488   set_diagnostic_context (&dc, msgid, &ap, file, line, /* warn = */ 1);
1489   report_diagnostic (&dc);
1490   va_end (ap);
1491 }
1492
1493 void
1494 warning_with_decl VPARAMS ((tree decl, const char *msgid, ...))
1495 {
1496 #ifndef ANSI_PROTOTYPES
1497   tree decl;
1498   const char *msgid;
1499 #endif
1500   va_list ap;
1501
1502   VA_START (ap, msgid);
1503
1504 #ifndef ANSI_PROTOTYPES
1505   decl = va_arg (ap, tree);
1506   msgid = va_arg (ap, const char *);
1507 #endif
1508
1509   diagnostic_for_decl (decl, msgid, &ap, /* warn = */ 1);
1510   va_end (ap);
1511 }
1512
1513 void
1514 warning_for_asm VPARAMS ((rtx insn, const char *msgid, ...))
1515 {
1516 #ifndef ANSI_PROTOTYPES
1517   rtx insn;
1518   const char *msgid;
1519 #endif
1520   va_list ap;
1521
1522   VA_START (ap, msgid);
1523
1524 #ifndef ANSI_PROTOTYPES
1525   insn = va_arg (ap, rtx);
1526   msgid = va_arg (ap, const char *);
1527 #endif
1528
1529   diagnostic_for_asm (insn, msgid, &ap, /* warn = */ 1);
1530   va_end (ap);
1531 }
1532
1533 void
1534 warning VPARAMS ((const char *msgid, ...))
1535 {
1536 #ifndef ANSI_PROTOTYPES
1537   const char *msgid;
1538 #endif
1539   va_list ap;
1540   diagnostic_context dc;
1541
1542   VA_START (ap, msgid);
1543
1544 #ifndef ANSI_PROTOTYPES
1545   msgid = va_arg (ap, const char *);
1546 #endif
1547
1548   set_diagnostic_context
1549     (&dc, msgid, &ap, input_filename, lineno, /* warn = */ 1);
1550   report_diagnostic (&dc);
1551   va_end (ap);
1552 }
1553
1554 /* Flush diagnostic_buffer content on stderr.  */
1555
1556 static void
1557 finish_diagnostic ()
1558 {
1559   output_to_stream (diagnostic_buffer, stderr);
1560   clear_diagnostic_info (diagnostic_buffer);
1561   fputc ('\n', stderr);
1562   fflush (stderr);
1563 }
1564
1565 /* Helper subroutine of output_verbatim and verbatim. Do the approriate
1566    settings needed by BUFFER for a verbatim formatting.  */
1567
1568 static void
1569 output_do_verbatim (buffer, msg, args_ptr)
1570      output_buffer *buffer;
1571      const char *msg;
1572      va_list *args_ptr;
1573 {
1574   output_state os;
1575
1576   os = output_buffer_state (buffer);
1577   output_prefix (buffer) = NULL;
1578   prefixing_policy (buffer) = DIAGNOSTICS_SHOW_PREFIX_NEVER;
1579   output_buffer_text_cursor (buffer) = msg;
1580   output_buffer_ptr_to_format_args (buffer) = args_ptr;
1581   output_set_maximum_length (buffer, 0);
1582   output_format (buffer);
1583   output_buffer_state (buffer) = os;
1584 }
1585
1586 /* Output MESSAGE verbatim into BUFFER.  */
1587
1588 void
1589 output_verbatim VPARAMS ((output_buffer *buffer, const char *msg, ...))
1590 {
1591 #ifndef ANSI_PROTOTYPES
1592   output_buffer *buffer;
1593   const char *msg;
1594 #endif
1595   va_list ap;
1596
1597   VA_START (ap, msg);
1598 #ifndef ANSI_PROTOTYPES
1599   buffer = va_arg (ap, output_buffer *);
1600   msg = va_arg (ap, const char *);
1601 #endif
1602   output_do_verbatim (buffer, msg, &ap);
1603   va_end (ap);
1604 }
1605
1606 /* Same as above but use diagnostic_buffer.  */
1607
1608 void
1609 verbatim VPARAMS ((const char *msg, ...))
1610 {
1611 #ifndef ANSI_PROTOTYPES
1612   const char *msg;
1613 #endif
1614   va_list ap;
1615
1616   VA_START (ap, msg);
1617 #ifndef ANSI_PROTOTYPES
1618   msg = va_arg (ap, const char *);
1619 #endif
1620   output_do_verbatim (diagnostic_buffer, msg, &ap);
1621   output_to_stream (diagnostic_buffer, stderr);
1622   va_end (ap);
1623 }
1624
1625 /* Report a diagnostic message (an error or a warning) as specified by
1626    DC.  This function is *the* subroutine in terms of which front-ends
1627    should implement their specific diagnostic handling modules.  The
1628    front-end independent format specifiers are exactly those described
1629    in the documentation of output_format.  */
1630
1631 void
1632 report_diagnostic (dc)
1633      diagnostic_context *dc;
1634 {
1635   output_state os;
1636
1637   if (diagnostic_lock++)
1638     error_recursion ();
1639
1640   if (count_error (diagnostic_is_warning (dc)))
1641     {
1642       os = output_buffer_state (diagnostic_buffer);
1643       diagnostic_msg = diagnostic_message (dc);
1644       diagnostic_args = diagnostic_argument_list (dc);
1645       (*diagnostic_starter (dc)) (diagnostic_buffer, dc);
1646       output_format (diagnostic_buffer);
1647       (*diagnostic_finalizer (dc)) (diagnostic_buffer, dc);
1648       finish_diagnostic ();
1649       output_buffer_state (diagnostic_buffer) = os;
1650     }
1651
1652   diagnostic_lock--;
1653 }
1654
1655 /* Inform the user that an error occurred while trying to report some
1656    other error.  This indicates catastrophic internal inconsistencies,
1657    so give up now.  But do try to flush out the previous error.  */
1658
1659 static void
1660 error_recursion ()
1661 {
1662   if (diagnostic_lock < 3)
1663     finish_diagnostic ();
1664
1665   fatal ("Internal compiler error: Error reporting routines re-entered.");
1666 }
1667
1668 /* Given a partial pathname as input, return another pathname that
1669    shares no directory elements with the pathname of __FILE__.  This
1670    is used by fancy_abort() to print `Internal compiler error in expr.c'
1671    instead of `Internal compiler error in ../../GCC/gcc/expr.c'.  */
1672
1673 static const char *
1674 trim_filename (name)
1675      const char *name;
1676 {
1677   static const char this_file[] = __FILE__;
1678   const char *p = name, *q = this_file;
1679
1680   /* First skip any "../" in each filename.  This allows us to give a proper
1681      reference to a file in a subdirectory.  */
1682   while (p[0] == '.' && p[1] == '.'
1683          && (p[2] == DIR_SEPARATOR
1684 #ifdef DIR_SEPARATOR_2
1685              || p[2] == DIR_SEPARATOR_2
1686 #endif
1687              ))
1688     p += 3;
1689
1690   while (q[0] == '.' && q[1] == '.'
1691          && (q[2] == DIR_SEPARATOR
1692 #ifdef DIR_SEPARATOR_2
1693              || p[2] == DIR_SEPARATOR_2
1694 #endif
1695              ))
1696     q += 3;
1697
1698   /* Now skip any parts the two filenames have in common.  */
1699   while (*p == *q && *p != 0 && *q != 0)
1700     p++, q++;
1701
1702   /* Now go backwards until the previous directory separator.  */
1703   while (p > name && p[-1] != DIR_SEPARATOR
1704 #ifdef DIR_SEPARATOR_2
1705          && p[-1] != DIR_SEPARATOR_2
1706 #endif
1707          )
1708     p--;
1709
1710   return p;
1711 }
1712
1713 /* Report an internal compiler error in a friendly manner and without
1714    dumping core.  */
1715
1716 void
1717 fancy_abort (file, line, function)
1718      const char *file;
1719      int line;
1720      const char *function;
1721 {
1722   fatal ("Internal compiler error in %s, at %s:%d",
1723          function, trim_filename (file), line);
1724 }
1725
1726 /* Setup DC for reporting a diagnostic MESSAGE (an error or a WARNING),
1727    using arguments pointed to by ARGS_PTR, issued at a location specified
1728    by FILE and LINE.  */
1729
1730 void
1731 set_diagnostic_context (dc, message, args_ptr, file, line, warn)
1732      diagnostic_context *dc;
1733      const char *message;
1734      va_list *args_ptr;
1735      const char *file;
1736      int line;
1737      int warn;
1738 {
1739   memset (dc, 0, sizeof (diagnostic_context));
1740   diagnostic_message (dc) = message;
1741   diagnostic_argument_list (dc) = args_ptr;
1742   diagnostic_file_location (dc) = file;
1743   diagnostic_line_location (dc) = line;
1744   diagnostic_is_warning (dc) = warn;
1745   diagnostic_starter (dc) = lang_diagnostic_starter;
1746   diagnostic_finalizer (dc) = lang_diagnostic_finalizer;
1747 }
1748
1749 void
1750 report_problematic_module (buffer)
1751      output_buffer *buffer;
1752 {
1753   struct file_stack *p;
1754
1755   if (output_needs_newline (buffer))
1756     {
1757       output_add_newline (buffer);
1758       output_needs_newline (buffer) = 0;
1759     }
1760
1761   if (input_file_stack && input_file_stack->next != 0
1762       && error_module_changed ())
1763     {
1764       for (p = input_file_stack->next; p; p = p->next)
1765         if (p == input_file_stack->next)
1766           output_verbatim
1767             (buffer, "In file included from %s:%d", p->name, p->line);
1768         else
1769           output_verbatim
1770             (buffer, ",\n                 from %s:%d", p->name, p->line);
1771       output_verbatim (buffer, ":\n");
1772       record_last_error_module ();
1773     }
1774 }
1775
1776 static void
1777 default_diagnostic_starter (buffer, dc)
1778      output_buffer *buffer;
1779      diagnostic_context *dc;
1780 {
1781   report_error_function (diagnostic_file_location (dc));
1782   output_set_prefix (buffer,
1783                      context_as_prefix (diagnostic_file_location (dc),
1784                                         diagnostic_line_location (dc),
1785                                         diagnostic_is_warning (dc)));
1786 }
1787
1788 static void
1789 default_diagnostic_finalizer (buffer, dc)
1790      output_buffer *buffer;
1791      diagnostic_context *dc __attribute__((__unused__));
1792 {
1793   output_destroy_prefix (buffer);
1794 }