1 /* messages.c - error reporter -
2 Copyright (C) 1987-2014 Free Software Foundation, Inc.
3 This file is part of GAS, the GNU Assembler.
5 GAS is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3, or (at your option)
10 GAS is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GAS; see the file COPYING. If not, write to the Free
17 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
22 static void identify (char *);
23 static void as_show_where (void);
24 static void as_warn_internal (char *, unsigned int, char *);
25 static void as_bad_internal (char *, unsigned int, char *);
27 /* Despite the rest of the comments in this file, (FIXME-SOON),
28 here is the current scheme for error messages etc:
30 as_fatal() is used when gas is quite confused and
31 continuing the assembly is pointless. In this case we
32 exit immediately with error status.
34 as_bad() is used to mark errors that result in what we
35 presume to be a useless object file. Say, we ignored
36 something that might have been vital. If we see any of
37 these, assembly will continue to the end of the source,
38 no object file will be produced, and we will terminate
39 with error status. The new option, -Z, tells us to
40 produce an object file anyway but we still exit with
41 error status. The assumption here is that you don't want
42 this object file but we could be wrong.
44 as_warn() is used when we have an error from which we
45 have a plausible error recovery. eg, masking the top
46 bits of a constant that is longer than will fit in the
47 destination. In this case we will continue to assemble
48 the source, although we may have made a bad assumption,
49 and we will produce an object file and return normal exit
50 status (ie, no error). The new option -X tells us to
51 treat all as_warn() errors as as_bad() errors. That is,
52 no object file will be produced and we will exit with
53 error status. The idea here is that we don't kill an
54 entire make because of an error that we knew how to
55 correct. On the other hand, sometimes you might want to
56 stop the make at these points.
58 as_tsktsk() is used when we see a minor error for which
59 our error recovery action is almost certainly correct.
60 In this case, we print a message and then assembly
61 continues as though no error occurred. */
66 static int identified;
79 fprintf (stderr, "%s: ", file);
80 fprintf (stderr, _("Assembler messages:\n"));
83 /* The number of warnings issued. */
84 static int warning_count;
92 /* Nonzero if we've hit a 'bad error', and should not write an obj file,
93 and exit with a nonzero error code. */
95 static int error_count;
103 /* Print the current location to stderr. */
111 as_where (&file, &line);
116 fprintf (stderr, "%s:%u: ", file, line);
118 fprintf (stderr, "%s: ", file);
122 /* Send to stderr a string as a warning, and locate warning
124 Please only use this for when we have some recovery action.
125 Please explain in string (which may have '\n's) what recovery was
129 as_tsktsk (const char *format, ...)
134 va_start (args, format);
135 vfprintf (stderr, format, args);
137 (void) putc ('\n', stderr);
140 /* The common portion of as_warn and as_warn_where. */
143 as_warn_internal (char *file, unsigned int line, char *buffer)
148 as_where (&file, &line);
154 fprintf (stderr, "%s:%u: ", file, line);
156 fprintf (stderr, "%s: ", file);
158 fprintf (stderr, _("Warning: "));
159 fputs (buffer, stderr);
160 (void) putc ('\n', stderr);
162 listing_warning (buffer);
166 /* Send to stderr a string as a warning, and locate warning
168 Please only use this for when we have some recovery action.
169 Please explain in string (which may have '\n's) what recovery was
173 as_warn (const char *format, ...)
178 if (!flag_no_warnings)
180 va_start (args, format);
181 vsnprintf (buffer, sizeof (buffer), format, args);
183 as_warn_internal ((char *) NULL, 0, buffer);
187 /* Like as_bad but the file name and line number are passed in.
188 Unfortunately, we have to repeat the function in order to handle
189 the varargs correctly and portably. */
192 as_warn_where (char *file, unsigned int line, const char *format, ...)
197 if (!flag_no_warnings)
199 va_start (args, format);
200 vsnprintf (buffer, sizeof (buffer), format, args);
202 as_warn_internal (file, line, buffer);
206 /* The common portion of as_bad and as_bad_where. */
209 as_bad_internal (char *file, unsigned int line, char *buffer)
214 as_where (&file, &line);
220 fprintf (stderr, "%s:%u: ", file, line);
222 fprintf (stderr, "%s: ", file);
224 fprintf (stderr, _("Error: "));
225 fputs (buffer, stderr);
226 (void) putc ('\n', stderr);
228 listing_error (buffer);
232 /* Send to stderr a string as a warning, and locate warning in input
233 file(s). Please us when there is no recovery, but we want to
234 continue processing but not produce an object file.
235 Please explain in string (which may have '\n's) what recovery was
239 as_bad (const char *format, ...)
244 va_start (args, format);
245 vsnprintf (buffer, sizeof (buffer), format, args);
248 as_bad_internal ((char *) NULL, 0, buffer);
251 /* Like as_bad but the file name and line number are passed in.
252 Unfortunately, we have to repeat the function in order to handle
253 the varargs correctly and portably. */
256 as_bad_where (char *file, unsigned int line, const char *format, ...)
261 va_start (args, format);
262 vsnprintf (buffer, sizeof (buffer), format, args);
265 as_bad_internal (file, line, buffer);
268 /* Send to stderr a string as a fatal message, and print location of
269 error in input file(s).
270 Please only use this for when we DON'T have some recovery action.
271 It xexit()s with a warning status. */
274 as_fatal (const char *format, ...)
279 va_start (args, format);
280 fprintf (stderr, _("Fatal error: "));
281 vfprintf (stderr, format, args);
282 (void) putc ('\n', stderr);
284 /* Delete the output file, if it exists. This will prevent make from
285 thinking that a file was created and hence does not need rebuilding. */
286 if (out_file_name != NULL)
287 unlink_if_ordinary (out_file_name);
288 xexit (EXIT_FAILURE);
291 /* Indicate assertion failure.
292 Arguments: Filename, line number, optional function name. */
295 as_assert (const char *file, int line, const char *fn)
298 fprintf (stderr, _("Internal error!\n"));
300 fprintf (stderr, _("Assertion failure in %s at %s line %d.\n"),
303 fprintf (stderr, _("Assertion failure at %s line %d.\n"), file, line);
304 fprintf (stderr, _("Please report this bug.\n"));
305 xexit (EXIT_FAILURE);
308 /* as_abort: Print a friendly message saying how totally hosed we are,
309 and exit without producing a core file. */
312 as_abort (const char *file, int line, const char *fn)
316 fprintf (stderr, _("Internal error, aborting at %s line %d in %s\n"),
319 fprintf (stderr, _("Internal error, aborting at %s line %d\n"),
321 fprintf (stderr, _("Please report this bug.\n"));
322 xexit (EXIT_FAILURE);
325 /* Support routines. */
328 sprint_value (char *buf, valueT val)
330 if (sizeof (val) <= sizeof (long))
332 sprintf (buf, "%ld", (long) val);
335 if (sizeof (val) <= sizeof (bfd_vma))
337 sprintf_vma (buf, val);
343 #define HEX_MAX_THRESHOLD 1024
344 #define HEX_MIN_THRESHOLD -(HEX_MAX_THRESHOLD)
347 as_internal_value_out_of_range (char * prefix,
360 if (val >= min && val <= max)
362 addressT right = max & -max;
367 /* xgettext:c-format */
368 err = _("%s out of domain (%d is not a multiple of %d)");
370 as_bad_where (file, line, err,
371 prefix, (int) val, (int) right);
373 as_warn_where (file, line, err,
374 prefix, (int) val, (int) right);
378 if ( val < HEX_MAX_THRESHOLD
379 && min < HEX_MAX_THRESHOLD
380 && max < HEX_MAX_THRESHOLD
381 && val > HEX_MIN_THRESHOLD
382 && min > HEX_MIN_THRESHOLD
383 && max > HEX_MIN_THRESHOLD)
385 /* xgettext:c-format */
386 err = _("%s out of range (%d is not between %d and %d)");
389 as_bad_where (file, line, err,
390 prefix, (int) val, (int) min, (int) max);
392 as_warn_where (file, line, err,
393 prefix, (int) val, (int) min, (int) max);
397 char val_buf [sizeof (val) * 3 + 2];
398 char min_buf [sizeof (val) * 3 + 2];
399 char max_buf [sizeof (val) * 3 + 2];
401 if (sizeof (val) > sizeof (bfd_vma))
404 sprintf_vma (val_buf, (bfd_vma) val);
405 sprintf_vma (min_buf, (bfd_vma) min);
406 sprintf_vma (max_buf, (bfd_vma) max);
408 /* xgettext:c-format. */
409 err = _("%s out of range (0x%s is not between 0x%s and 0x%s)");
412 as_bad_where (file, line, err, prefix, val_buf, min_buf, max_buf);
414 as_warn_where (file, line, err, prefix, val_buf, min_buf, max_buf);
419 as_warn_value_out_of_range (char * prefix,
426 as_internal_value_out_of_range (prefix, value, min, max, file, line, 0);
430 as_bad_value_out_of_range (char * prefix,
437 as_internal_value_out_of_range (prefix, value, min, max, file, line, 1);