1 /* messages.c - error reporter -
2 Copyright (C) 1987-2016 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 (const char *);
23 static void as_show_where (void);
24 static void as_warn_internal (const char *, unsigned int, char *);
25 static void as_bad_internal (const 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. */
64 identify (const char *file)
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 file = as_where (&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 (const char *file, unsigned int line, char *buffer)
148 file = as_where (&line);
154 fprintf (stderr, "%s:%u: %s%s\n", file, line, _("Warning: "), buffer);
156 fprintf (stderr, "%s: %s%s\n", file, _("Warning: "), buffer);
159 fprintf (stderr, "%s%s\n", _("Warning: "), buffer);
161 listing_warning (buffer);
165 /* Send to stderr a string as a warning, and locate warning
167 Please only use this for when we have some recovery action.
168 Please explain in string (which may have '\n's) what recovery was
172 as_warn (const char *format, ...)
177 if (!flag_no_warnings)
179 va_start (args, format);
180 vsnprintf (buffer, sizeof (buffer), format, args);
182 as_warn_internal ((char *) NULL, 0, buffer);
186 /* Like as_bad but the file name and line number are passed in.
187 Unfortunately, we have to repeat the function in order to handle
188 the varargs correctly and portably. */
191 as_warn_where (const char *file, unsigned int line, const char *format, ...)
196 if (!flag_no_warnings)
198 va_start (args, format);
199 vsnprintf (buffer, sizeof (buffer), format, args);
201 as_warn_internal (file, line, buffer);
205 /* The common portion of as_bad and as_bad_where. */
208 as_bad_internal (const char *file, unsigned int line, char *buffer)
213 file = as_where (&line);
219 fprintf (stderr, "%s:%u: %s%s\n", file, line, _("Error: "), buffer);
221 fprintf (stderr, "%s: %s%s\n", file, _("Error: "), buffer);
224 fprintf (stderr, "%s%s\n", _("Error: "), buffer);
226 listing_error (buffer);
230 /* Send to stderr a string as a warning, and locate warning in input
231 file(s). Please us when there is no recovery, but we want to
232 continue processing but not produce an object file.
233 Please explain in string (which may have '\n's) what recovery was
237 as_bad (const char *format, ...)
242 va_start (args, format);
243 vsnprintf (buffer, sizeof (buffer), format, args);
246 as_bad_internal ((char *) NULL, 0, buffer);
249 /* Like as_bad but the file name and line number are passed in.
250 Unfortunately, we have to repeat the function in order to handle
251 the varargs correctly and portably. */
254 as_bad_where (const char *file, unsigned int line, const char *format, ...)
259 va_start (args, format);
260 vsnprintf (buffer, sizeof (buffer), format, args);
263 as_bad_internal (file, line, buffer);
266 /* Send to stderr a string as a fatal message, and print location of
267 error in input file(s).
268 Please only use this for when we DON'T have some recovery action.
269 It xexit()s with a warning status. */
272 as_fatal (const char *format, ...)
277 va_start (args, format);
278 fprintf (stderr, _("Fatal error: "));
279 vfprintf (stderr, format, args);
280 (void) putc ('\n', stderr);
282 /* Delete the output file, if it exists. This will prevent make from
283 thinking that a file was created and hence does not need rebuilding. */
284 if (out_file_name != NULL)
285 unlink_if_ordinary (out_file_name);
286 xexit (EXIT_FAILURE);
289 /* Indicate assertion failure.
290 Arguments: Filename, line number, optional function name. */
293 as_assert (const char *file, int line, const char *fn)
296 fprintf (stderr, _("Internal error!\n"));
298 fprintf (stderr, _("Assertion failure in %s at %s:%d.\n"),
301 fprintf (stderr, _("Assertion failure at %s:%d.\n"), file, line);
302 fprintf (stderr, _("Please report this bug.\n"));
303 xexit (EXIT_FAILURE);
306 /* as_abort: Print a friendly message saying how totally hosed we are,
307 and exit without producing a core file. */
310 as_abort (const char *file, int line, const char *fn)
314 fprintf (stderr, _("Internal error, aborting at %s:%d in %s\n"),
317 fprintf (stderr, _("Internal error, aborting at %s:%d\n"),
319 fprintf (stderr, _("Please report this bug.\n"));
320 xexit (EXIT_FAILURE);
323 /* Support routines. */
326 sprint_value (char *buf, valueT val)
328 if (sizeof (val) <= sizeof (long))
330 sprintf (buf, "%ld", (long) val);
333 if (sizeof (val) <= sizeof (bfd_vma))
335 sprintf_vma (buf, val);
341 #define HEX_MAX_THRESHOLD 1024
342 #define HEX_MIN_THRESHOLD -(HEX_MAX_THRESHOLD)
345 as_internal_value_out_of_range (const char * prefix,
358 if (val >= min && val <= max)
360 addressT right = max & -max;
365 /* xgettext:c-format */
366 err = _("%s out of domain (%d is not a multiple of %d)");
368 as_bad_where (file, line, err,
369 prefix, (int) val, (int) right);
371 as_warn_where (file, line, err,
372 prefix, (int) val, (int) right);
376 if ( val < HEX_MAX_THRESHOLD
377 && min < HEX_MAX_THRESHOLD
378 && max < HEX_MAX_THRESHOLD
379 && val > HEX_MIN_THRESHOLD
380 && min > HEX_MIN_THRESHOLD
381 && max > HEX_MIN_THRESHOLD)
383 /* xgettext:c-format */
384 err = _("%s out of range (%d is not between %d and %d)");
387 as_bad_where (file, line, err,
388 prefix, (int) val, (int) min, (int) max);
390 as_warn_where (file, line, err,
391 prefix, (int) val, (int) min, (int) max);
395 char val_buf [sizeof (val) * 3 + 2];
396 char min_buf [sizeof (val) * 3 + 2];
397 char max_buf [sizeof (val) * 3 + 2];
399 if (sizeof (val) > sizeof (bfd_vma))
402 sprintf_vma (val_buf, (bfd_vma) val);
403 sprintf_vma (min_buf, (bfd_vma) min);
404 sprintf_vma (max_buf, (bfd_vma) max);
406 /* xgettext:c-format. */
407 err = _("%s out of range (0x%s is not between 0x%s and 0x%s)");
410 as_bad_where (file, line, err, prefix, val_buf, min_buf, max_buf);
412 as_warn_where (file, line, err, prefix, val_buf, min_buf, max_buf);
417 as_warn_value_out_of_range (char * prefix,
424 as_internal_value_out_of_range (prefix, value, min, max, file, line, 0);
428 as_bad_value_out_of_range (char * prefix,
435 as_internal_value_out_of_range (prefix, value, min, max, file, line, 1);