bfd/
[binutils.git] / gas / messages.c
blob21381b47e968a6cd8b627ebbcc2f0b729390481f
1 /* messages.c - error reporter -
2 Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001,
3 2003, 2004, 2005, 2006
4 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS 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.
12 GAS 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.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
22 #include "as.h"
24 static void identify (char *);
25 static void as_show_where (void);
26 static void as_warn_internal (char *, unsigned int, char *);
27 static void as_bad_internal (char *, unsigned int, char *);
29 /* Despite the rest of the comments in this file, (FIXME-SOON),
30 here is the current scheme for error messages etc:
32 as_fatal() is used when gas is quite confused and
33 continuing the assembly is pointless. In this case we
34 exit immediately with error status.
36 as_bad() is used to mark errors that result in what we
37 presume to be a useless object file. Say, we ignored
38 something that might have been vital. If we see any of
39 these, assembly will continue to the end of the source,
40 no object file will be produced, and we will terminate
41 with error status. The new option, -Z, tells us to
42 produce an object file anyway but we still exit with
43 error status. The assumption here is that you don't want
44 this object file but we could be wrong.
46 as_warn() is used when we have an error from which we
47 have a plausible error recovery. eg, masking the top
48 bits of a constant that is longer than will fit in the
49 destination. In this case we will continue to assemble
50 the source, although we may have made a bad assumption,
51 and we will produce an object file and return normal exit
52 status (ie, no error). The new option -X tells us to
53 treat all as_warn() errors as as_bad() errors. That is,
54 no object file will be produced and we will exit with
55 error status. The idea here is that we don't kill an
56 entire make because of an error that we knew how to
57 correct. On the other hand, sometimes you might want to
58 stop the make at these points.
60 as_tsktsk() is used when we see a minor error for which
61 our error recovery action is almost certainly correct.
62 In this case, we print a message and then assembly
63 continues as though no error occurred. */
65 static void
66 identify (char *file)
68 static int identified;
70 if (identified)
71 return;
72 identified++;
74 if (!file)
76 unsigned int x;
77 as_where (&file, &x);
80 if (file)
81 fprintf (stderr, "%s: ", file);
82 fprintf (stderr, _("Assembler messages:\n"));
85 /* The number of warnings issued. */
86 static int warning_count;
88 int
89 had_warnings (void)
91 return warning_count;
94 /* Nonzero if we've hit a 'bad error', and should not write an obj file,
95 and exit with a nonzero error code. */
97 static int error_count;
99 int
100 had_errors (void)
102 return error_count;
105 /* Print the current location to stderr. */
107 static void
108 as_show_where (void)
110 char *file;
111 unsigned int line;
113 as_where (&file, &line);
114 identify (file);
115 if (file)
116 fprintf (stderr, "%s:%u: ", file, line);
119 /* Send to stderr a string as a warning, and locate warning
120 in input file(s).
121 Please only use this for when we have some recovery action.
122 Please explain in string (which may have '\n's) what recovery was
123 done. */
125 #ifdef USE_STDARG
126 void
127 as_tsktsk (const char *format, ...)
129 va_list args;
131 as_show_where ();
132 va_start (args, format);
133 vfprintf (stderr, format, args);
134 va_end (args);
135 (void) putc ('\n', stderr);
137 #else
138 void
139 as_tsktsk (format, va_alist)
140 const char *format;
141 va_dcl
143 va_list args;
145 as_show_where ();
146 va_start (args);
147 vfprintf (stderr, format, args);
148 va_end (args);
149 (void) putc ('\n', stderr);
151 #endif /* not NO_STDARG */
153 /* The common portion of as_warn and as_warn_where. */
155 static void
156 as_warn_internal (char *file, unsigned int line, char *buffer)
158 ++warning_count;
160 if (file == NULL)
161 as_where (&file, &line);
163 identify (file);
164 if (file)
165 fprintf (stderr, "%s:%u: ", file, line);
166 fprintf (stderr, _("Warning: "));
167 fputs (buffer, stderr);
168 (void) putc ('\n', stderr);
169 #ifndef NO_LISTING
170 listing_warning (buffer);
171 #endif
174 /* Send to stderr a string as a warning, and locate warning
175 in input file(s).
176 Please only use this for when we have some recovery action.
177 Please explain in string (which may have '\n's) what recovery was
178 done. */
180 #ifdef USE_STDARG
181 void
182 as_warn (const char *format, ...)
184 va_list args;
185 char buffer[2000];
187 if (!flag_no_warnings)
189 va_start (args, format);
190 vsnprintf (buffer, sizeof (buffer), format, args);
191 va_end (args);
192 as_warn_internal ((char *) NULL, 0, buffer);
195 #else
196 void
197 as_warn (format, va_alist)
198 const char *format;
199 va_dcl
201 va_list args;
202 char buffer[2000];
204 if (!flag_no_warnings)
206 va_start (args);
207 vsnprintf (buffer, sizeof (buffer), format, args);
208 va_end (args);
209 as_warn_internal ((char *) NULL, 0, buffer);
212 #endif /* not NO_STDARG */
214 /* Like as_bad but the file name and line number are passed in.
215 Unfortunately, we have to repeat the function in order to handle
216 the varargs correctly and portably. */
218 #ifdef USE_STDARG
219 void
220 as_warn_where (char *file, unsigned int line, const char *format, ...)
222 va_list args;
223 char buffer[2000];
225 if (!flag_no_warnings)
227 va_start (args, format);
228 vsnprintf (buffer, sizeof (buffer), format, args);
229 va_end (args);
230 as_warn_internal (file, line, buffer);
233 #else
234 void
235 as_warn_where (file, line, format, va_alist)
236 char *file;
237 unsigned int line;
238 const char *format;
239 va_dcl
241 va_list args;
242 char buffer[2000];
244 if (!flag_no_warnings)
246 va_start (args);
247 vsnprintf (buffer, sizeof (buffer), format, args);
248 va_end (args);
249 as_warn_internal (file, line, buffer);
252 #endif /* not NO_STDARG */
254 /* The common portion of as_bad and as_bad_where. */
256 static void
257 as_bad_internal (char *file, unsigned int line, char *buffer)
259 ++error_count;
261 if (file == NULL)
262 as_where (&file, &line);
264 identify (file);
265 if (file)
266 fprintf (stderr, "%s:%u: ", file, line);
267 fprintf (stderr, _("Error: "));
268 fputs (buffer, stderr);
269 (void) putc ('\n', stderr);
270 #ifndef NO_LISTING
271 listing_error (buffer);
272 #endif
275 /* Send to stderr a string as a warning, and locate warning in input
276 file(s). Please us when there is no recovery, but we want to
277 continue processing but not produce an object file.
278 Please explain in string (which may have '\n's) what recovery was
279 done. */
281 #ifdef USE_STDARG
282 void
283 as_bad (const char *format, ...)
285 va_list args;
286 char buffer[2000];
288 va_start (args, format);
289 vsnprintf (buffer, sizeof (buffer), format, args);
290 va_end (args);
292 as_bad_internal ((char *) NULL, 0, buffer);
295 #else
296 void
297 as_bad (format, va_alist)
298 const char *format;
299 va_dcl
301 va_list args;
302 char buffer[2000];
304 va_start (args);
305 vsnprintf (buffer, sizeof (buffer), format, args);
306 va_end (args);
308 as_bad_internal ((char *) NULL, 0, buffer);
310 #endif /* not NO_STDARG */
312 /* Like as_bad but the file name and line number are passed in.
313 Unfortunately, we have to repeat the function in order to handle
314 the varargs correctly and portably. */
316 #ifdef USE_STDARG
317 void
318 as_bad_where (char *file, unsigned int line, const char *format, ...)
320 va_list args;
321 char buffer[2000];
323 va_start (args, format);
324 vsnprintf (buffer, sizeof (buffer), format, args);
325 va_end (args);
327 as_bad_internal (file, line, buffer);
330 #else
331 void
332 as_bad_where (file, line, format, va_alist)
333 char *file;
334 unsigned int line;
335 const char *format;
336 va_dcl
338 va_list args;
339 char buffer[2000];
341 va_start (args);
342 vsnprintf (buffer, sizeof (buffer), format, args);
343 va_end (args);
345 as_bad_internal (file, line, buffer);
347 #endif /* not NO_STDARG */
349 /* Send to stderr a string as a fatal message, and print location of
350 error in input file(s).
351 Please only use this for when we DON'T have some recovery action.
352 It xexit()s with a warning status. */
354 #ifdef USE_STDARG
355 void
356 as_fatal (const char *format, ...)
358 va_list args;
360 as_show_where ();
361 va_start (args, format);
362 fprintf (stderr, _("Fatal error: "));
363 vfprintf (stderr, format, args);
364 (void) putc ('\n', stderr);
365 va_end (args);
366 /* Delete the output file, if it exists. This will prevent make from
367 thinking that a file was created and hence does not need rebuilding. */
368 if (out_file_name != NULL)
369 unlink_if_ordinary (out_file_name);
370 xexit (EXIT_FAILURE);
372 #else
373 void
374 as_fatal (format, va_alist)
375 char *format;
376 va_dcl
378 va_list args;
380 as_show_where ();
381 va_start (args);
382 fprintf (stderr, _("Fatal error: "));
383 vfprintf (stderr, format, args);
384 (void) putc ('\n', stderr);
385 va_end (args);
386 xexit (EXIT_FAILURE);
388 #endif /* not NO_STDARG */
390 /* Indicate assertion failure.
391 Arguments: Filename, line number, optional function name. */
393 void
394 as_assert (const char *file, int line, const char *fn)
396 as_show_where ();
397 fprintf (stderr, _("Internal error!\n"));
398 if (fn)
399 fprintf (stderr, _("Assertion failure in %s at %s line %d.\n"),
400 fn, file, line);
401 else
402 fprintf (stderr, _("Assertion failure at %s line %d.\n"), file, line);
403 fprintf (stderr, _("Please report this bug.\n"));
404 xexit (EXIT_FAILURE);
407 /* as_abort: Print a friendly message saying how totally hosed we are,
408 and exit without producing a core file. */
410 void
411 as_abort (const char *file, int line, const char *fn)
413 as_show_where ();
414 if (fn)
415 fprintf (stderr, _("Internal error, aborting at %s line %d in %s\n"),
416 file, line, fn);
417 else
418 fprintf (stderr, _("Internal error, aborting at %s line %d\n"),
419 file, line);
420 fprintf (stderr, _("Please report this bug.\n"));
421 xexit (EXIT_FAILURE);
424 /* Support routines. */
426 void
427 sprint_value (char *buf, valueT val)
429 if (sizeof (val) <= sizeof (long))
431 sprintf (buf, "%ld", (long) val);
432 return;
434 if (sizeof (val) <= sizeof (bfd_vma))
436 sprintf_vma (buf, val);
437 return;
439 abort ();
442 #define HEX_MAX_THRESHOLD 1024
443 #define HEX_MIN_THRESHOLD -(HEX_MAX_THRESHOLD)
445 static void
446 as_internal_value_out_of_range (char * prefix,
447 offsetT val,
448 offsetT min,
449 offsetT max,
450 char * file,
451 unsigned line,
452 int bad)
454 const char * err;
456 if (prefix == NULL)
457 prefix = "";
459 if ( val < HEX_MAX_THRESHOLD
460 && min < HEX_MAX_THRESHOLD
461 && max < HEX_MAX_THRESHOLD
462 && val > HEX_MIN_THRESHOLD
463 && min > HEX_MIN_THRESHOLD
464 && max > HEX_MIN_THRESHOLD)
466 /* xgettext:c-format */
467 err = _("%s out of range (%d is not between %d and %d)");
469 if (bad)
470 as_bad_where (file, line, err,
471 prefix, (int) val, (int) min, (int) max);
472 else
473 as_warn_where (file, line, err,
474 prefix, (int) val, (int) min, (int) max);
476 else
478 char val_buf [sizeof (val) * 3 + 2];
479 char min_buf [sizeof (val) * 3 + 2];
480 char max_buf [sizeof (val) * 3 + 2];
482 if (sizeof (val) > sizeof (bfd_vma))
483 abort ();
485 sprintf_vma (val_buf, val);
486 sprintf_vma (min_buf, min);
487 sprintf_vma (max_buf, max);
489 /* xgettext:c-format. */
490 err = _("%s out of range (0x%s is not between 0x%s and 0x%s)");
492 if (bad)
493 as_bad_where (file, line, err, prefix, val_buf, min_buf, max_buf);
494 else
495 as_warn_where (file, line, err, prefix, val_buf, min_buf, max_buf);
499 void
500 as_warn_value_out_of_range (char * prefix,
501 offsetT value,
502 offsetT min,
503 offsetT max,
504 char * file,
505 unsigned line)
507 as_internal_value_out_of_range (prefix, value, min, max, file, line, 0);
510 void
511 as_bad_value_out_of_range (char * prefix,
512 offsetT value,
513 offsetT min,
514 offsetT max,
515 char * file,
516 unsigned line)
518 as_internal_value_out_of_range (prefix, value, min, max, file, line, 1);