1 /* messages.c - error reporter -
2 Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001
3 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
36 #if !defined (USE_STDARG) && !defined (USE_VARARGS)
40 typedef int * va_list;
41 #define va_start(ARGS) ARGS = &REST
45 static void identify (char *);
46 static void as_show_where (void);
47 static void as_warn_internal (char *, unsigned int, char *);
48 static void as_bad_internal (char *, unsigned int, char *);
50 /* Despite the rest of the comments in this file, (FIXME-SOON),
51 * here is the current scheme for error messages etc:
53 * as_fatal() is used when gas is quite confused and
54 * continuing the assembly is pointless. In this case we
55 * exit immediately with error status.
57 * as_bad() is used to mark errors that result in what we
58 * presume to be a useless object file. Say, we ignored
59 * something that might have been vital. If we see any of
60 * these, assembly will continue to the end of the source,
61 * no object file will be produced, and we will terminate
62 * with error status. The new option, -Z, tells us to
63 * produce an object file anyway but we still exit with
64 * error status. The assumption here is that you don't want
65 * this object file but we could be wrong.
67 * as_warn() is used when we have an error from which we
68 * have a plausible error recovery. eg, masking the top
69 * bits of a constant that is longer than will fit in the
70 * destination. In this case we will continue to assemble
71 * the source, although we may have made a bad assumption,
72 * and we will produce an object file and return normal exit
73 * status (ie, no error). The new option -X tells us to
74 * treat all as_warn() errors as as_bad() errors. That is,
75 * no object file will be produced and we will exit with
76 * error status. The idea here is that we don't kill an
77 * entire make because of an error that we knew how to
78 * correct. On the other hand, sometimes you might want to
79 * stop the make at these points.
81 * as_tsktsk() is used when we see a minor error for which
82 * our error recovery action is almost certainly correct.
83 * In this case, we print a message and then assembly
84 * continues as though no error occurred.
90 static int identified
;
102 fprintf (stderr
, "%s: ", file
);
103 fprintf (stderr
, _("Assembler messages:\n"));
106 /* The number of warnings issued. */
107 static int warning_count
;
112 return (warning_count
);
115 /* Nonzero if we've hit a 'bad error', and should not write an obj file,
116 and exit with a nonzero error code. */
118 static int error_count
;
123 return (error_count
);
126 /* Print the current location to stderr. */
134 as_where (&file
, &line
);
137 fprintf (stderr
, "%s:%u: ", file
, line
);
140 /* Like perror(3), but with more info. */
143 as_perror (const char *gripe
, /* Unpunctuated error theme. */
144 const char *filename
)
149 fprintf (stderr
, gripe
, filename
);
151 errtxt
= bfd_errmsg (bfd_get_error ());
153 errtxt
= xstrerror (errno
);
155 fprintf (stderr
, ": %s\n", errtxt
);
158 bfd_set_error (bfd_error_no_error
);
162 /* Send to stderr a string as a warning, and locate warning
164 Please only use this for when we have some recovery action.
165 Please explain in string (which may have '\n's) what recovery was
170 as_tsktsk (const char *format
, ...)
175 va_start (args
, format
);
176 vfprintf (stderr
, format
, args
);
178 (void) putc ('\n', stderr
);
182 as_tsktsk (format
, va_alist
)
190 vfprintf (stderr
, format
, args
);
192 (void) putc ('\n', stderr
);
194 #endif /* not NO_STDARG */
196 /* The common portion of as_warn and as_warn_where. */
199 as_warn_internal (char *file
, unsigned int line
, char *buffer
)
204 as_where (&file
, &line
);
208 fprintf (stderr
, "%s:%u: ", file
, line
);
209 fprintf (stderr
, _("Warning: "));
210 fputs (buffer
, stderr
);
211 (void) putc ('\n', stderr
);
213 listing_warning (buffer
);
217 /* Send to stderr a string as a warning, and locate warning
219 Please only use this for when we have some recovery action.
220 Please explain in string (which may have '\n's) what recovery was
225 as_warn (const char *format
, ...)
230 if (!flag_no_warnings
)
232 va_start (args
, format
);
233 vsprintf (buffer
, format
, args
);
235 as_warn_internal ((char *) NULL
, 0, buffer
);
240 as_warn (format
, va_alist
)
247 if (!flag_no_warnings
)
250 vsprintf (buffer
, format
, args
);
252 as_warn_internal ((char *) NULL
, 0, buffer
);
255 #endif /* not NO_STDARG */
257 /* Like as_bad but the file name and line number are passed in.
258 Unfortunately, we have to repeat the function in order to handle
259 the varargs correctly and portably. */
263 as_warn_where (char *file
, unsigned int line
, const char *format
, ...)
268 if (!flag_no_warnings
)
270 va_start (args
, format
);
271 vsprintf (buffer
, format
, args
);
273 as_warn_internal (file
, line
, buffer
);
278 as_warn_where (file
, line
, format
, va_alist
)
287 if (!flag_no_warnings
)
290 vsprintf (buffer
, format
, args
);
292 as_warn_internal (file
, line
, buffer
);
295 #endif /* not NO_STDARG */
297 /* The common portion of as_bad and as_bad_where. */
300 as_bad_internal (char *file
, unsigned int line
, char *buffer
)
305 as_where (&file
, &line
);
309 fprintf (stderr
, "%s:%u: ", file
, line
);
310 fprintf (stderr
, _("Error: "));
311 fputs (buffer
, stderr
);
312 (void) putc ('\n', stderr
);
314 listing_error (buffer
);
318 /* Send to stderr a string as a warning, and locate warning in input
319 file(s). Please us when there is no recovery, but we want to
320 continue processing but not produce an object file.
321 Please explain in string (which may have '\n's) what recovery was
326 as_bad (const char *format
, ...)
331 va_start (args
, format
);
332 vsprintf (buffer
, format
, args
);
335 as_bad_internal ((char *) NULL
, 0, buffer
);
340 as_bad (format
, va_alist
)
348 vsprintf (buffer
, format
, args
);
351 as_bad_internal ((char *) NULL
, 0, buffer
);
353 #endif /* not NO_STDARG */
355 /* Like as_bad but the file name and line number are passed in.
356 Unfortunately, we have to repeat the function in order to handle
357 the varargs correctly and portably. */
361 as_bad_where (char *file
, unsigned int line
, const char *format
, ...)
366 va_start (args
, format
);
367 vsprintf (buffer
, format
, args
);
370 as_bad_internal (file
, line
, buffer
);
375 as_bad_where (file
, line
, format
, va_alist
)
385 vsprintf (buffer
, format
, args
);
388 as_bad_internal (file
, line
, buffer
);
390 #endif /* not NO_STDARG */
392 /* Send to stderr a string as a fatal message, and print location of
393 error in input file(s).
394 Please only use this for when we DON'T have some recovery action.
395 It xexit()s with a warning status. */
399 as_fatal (const char *format
, ...)
404 va_start (args
, format
);
405 fprintf (stderr
, _("Fatal error: "));
406 vfprintf (stderr
, format
, args
);
407 (void) putc ('\n', stderr
);
409 /* Delete the output file, if it exists. This will prevent make from
410 thinking that a file was created and hence does not need rebuilding. */
411 if (out_file_name
!= NULL
)
412 unlink (out_file_name
);
413 xexit (EXIT_FAILURE
);
417 as_fatal (format
, va_alist
)
425 fprintf (stderr
, _("Fatal error: "));
426 vfprintf (stderr
, format
, args
);
427 (void) putc ('\n', stderr
);
429 xexit (EXIT_FAILURE
);
431 #endif /* not NO_STDARG */
433 /* Indicate assertion failure.
434 Arguments: Filename, line number, optional function name. */
437 as_assert (const char *file
, int line
, const char *fn
)
440 fprintf (stderr
, _("Internal error!\n"));
442 fprintf (stderr
, _("Assertion failure in %s at %s line %d.\n"),
445 fprintf (stderr
, _("Assertion failure at %s line %d.\n"), file
, line
);
446 fprintf (stderr
, _("Please report this bug.\n"));
447 xexit (EXIT_FAILURE
);
450 /* as_abort: Print a friendly message saying how totally hosed we are,
451 and exit without producing a core file. */
454 as_abort (const char *file
, int line
, const char *fn
)
458 fprintf (stderr
, _("Internal error, aborting at %s line %d in %s\n"),
461 fprintf (stderr
, _("Internal error, aborting at %s line %d\n"),
463 fprintf (stderr
, _("Please report this bug.\n"));
464 xexit (EXIT_FAILURE
);
467 /* Support routines. */
470 fprint_value (FILE *file
, valueT val
)
472 if (sizeof (val
) <= sizeof (long))
474 fprintf (file
, "%ld", (long) val
);
478 if (sizeof (val
) <= sizeof (bfd_vma
))
480 fprintf_vma (file
, val
);
488 sprint_value (char *buf
, valueT val
)
490 if (sizeof (val
) <= sizeof (long))
492 sprintf (buf
, "%ld", (long) val
);
496 if (sizeof (val
) <= sizeof (bfd_vma
))
498 sprintf_vma (buf
, val
);