if_vtnet - No need to use the taskqueue to run vtnet_update_link_status().
[dragonfly.git] / contrib / binutils-2.25 / gas / messages.c
blob2865c9dab5157ebe85df2b00a2c34c74f32bef80
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)
8 any later version.
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
18 02110-1301, USA. */
20 #include "as.h"
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. */
63 static void
64 identify (char *file)
66 static int identified;
68 if (identified)
69 return;
70 identified++;
72 if (!file)
74 unsigned int x;
75 as_where (&file, &x);
78 if (file)
79 fprintf (stderr, "%s: ", file);
80 fprintf (stderr, _("Assembler messages:\n"));
83 /* The number of warnings issued. */
84 static int warning_count;
86 int
87 had_warnings (void)
89 return 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;
97 int
98 had_errors (void)
100 return error_count;
103 /* Print the current location to stderr. */
105 static void
106 as_show_where (void)
108 char *file;
109 unsigned int line;
111 as_where (&file, &line);
112 identify (file);
113 if (file)
115 if (line != 0)
116 fprintf (stderr, "%s:%u: ", file, line);
117 else
118 fprintf (stderr, "%s: ", file);
122 /* Send to stderr a string as a warning, and locate warning
123 in input file(s).
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
126 done. */
128 void
129 as_tsktsk (const char *format, ...)
131 va_list args;
133 as_show_where ();
134 va_start (args, format);
135 vfprintf (stderr, format, args);
136 va_end (args);
137 (void) putc ('\n', stderr);
140 /* The common portion of as_warn and as_warn_where. */
142 static void
143 as_warn_internal (char *file, unsigned int line, char *buffer)
145 ++warning_count;
147 if (file == NULL)
148 as_where (&file, &line);
150 identify (file);
151 if (file)
153 if (line != 0)
154 fprintf (stderr, "%s:%u: %s%s\n", file, line, _("Warning: "), buffer);
155 else
156 fprintf (stderr, "%s: %s%s\n", file, _("Warning: "), buffer);
158 else
159 fprintf (stderr, "%s%s\n", _("Warning: "), buffer);
160 #ifndef NO_LISTING
161 listing_warning (buffer);
162 #endif
165 /* Send to stderr a string as a warning, and locate warning
166 in input file(s).
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
169 done. */
171 void
172 as_warn (const char *format, ...)
174 va_list args;
175 char buffer[2000];
177 if (!flag_no_warnings)
179 va_start (args, format);
180 vsnprintf (buffer, sizeof (buffer), format, args);
181 va_end (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. */
190 void
191 as_warn_where (char *file, unsigned int line, const char *format, ...)
193 va_list args;
194 char buffer[2000];
196 if (!flag_no_warnings)
198 va_start (args, format);
199 vsnprintf (buffer, sizeof (buffer), format, args);
200 va_end (args);
201 as_warn_internal (file, line, buffer);
205 /* The common portion of as_bad and as_bad_where. */
207 static void
208 as_bad_internal (char *file, unsigned int line, char *buffer)
210 ++error_count;
212 if (file == NULL)
213 as_where (&file, &line);
215 identify (file);
216 if (file)
218 if (line != 0)
219 fprintf (stderr, "%s:%u: %s%s\n", file, line, _("Error: "), buffer);
220 else
221 fprintf (stderr, "%s: %s%s\n", file, _("Error: "), buffer);
223 else
224 fprintf (stderr, "%s%s\n", _("Error: "), buffer);
225 #ifndef NO_LISTING
226 listing_error (buffer);
227 #endif
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
234 done. */
236 void
237 as_bad (const char *format, ...)
239 va_list args;
240 char buffer[2000];
242 va_start (args, format);
243 vsnprintf (buffer, sizeof (buffer), format, args);
244 va_end (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. */
253 void
254 as_bad_where (char *file, unsigned int line, const char *format, ...)
256 va_list args;
257 char buffer[2000];
259 va_start (args, format);
260 vsnprintf (buffer, sizeof (buffer), format, args);
261 va_end (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. */
271 void
272 as_fatal (const char *format, ...)
274 va_list args;
276 as_show_where ();
277 va_start (args, format);
278 fprintf (stderr, _("Fatal error: "));
279 vfprintf (stderr, format, args);
280 (void) putc ('\n', stderr);
281 va_end (args);
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. */
292 void
293 as_assert (const char *file, int line, const char *fn)
295 as_show_where ();
296 fprintf (stderr, _("Internal error!\n"));
297 if (fn)
298 fprintf (stderr, _("Assertion failure in %s at %s line %d.\n"),
299 fn, file, line);
300 else
301 fprintf (stderr, _("Assertion failure at %s line %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. */
309 void
310 as_abort (const char *file, int line, const char *fn)
312 as_show_where ();
313 if (fn)
314 fprintf (stderr, _("Internal error, aborting at %s line %d in %s\n"),
315 file, line, fn);
316 else
317 fprintf (stderr, _("Internal error, aborting at %s line %d\n"),
318 file, line);
319 fprintf (stderr, _("Please report this bug.\n"));
320 xexit (EXIT_FAILURE);
323 /* Support routines. */
325 void
326 sprint_value (char *buf, valueT val)
328 if (sizeof (val) <= sizeof (long))
330 sprintf (buf, "%ld", (long) val);
331 return;
333 if (sizeof (val) <= sizeof (bfd_vma))
335 sprintf_vma (buf, val);
336 return;
338 abort ();
341 #define HEX_MAX_THRESHOLD 1024
342 #define HEX_MIN_THRESHOLD -(HEX_MAX_THRESHOLD)
344 static void
345 as_internal_value_out_of_range (char * prefix,
346 offsetT val,
347 offsetT min,
348 offsetT max,
349 char * file,
350 unsigned line,
351 int bad)
353 const char * err;
355 if (prefix == NULL)
356 prefix = "";
358 if (val >= min && val <= max)
360 addressT right = max & -max;
362 if (max <= 1)
363 abort ();
365 /* xgettext:c-format */
366 err = _("%s out of domain (%d is not a multiple of %d)");
367 if (bad)
368 as_bad_where (file, line, err,
369 prefix, (int) val, (int) right);
370 else
371 as_warn_where (file, line, err,
372 prefix, (int) val, (int) right);
373 return;
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)");
386 if (bad)
387 as_bad_where (file, line, err,
388 prefix, (int) val, (int) min, (int) max);
389 else
390 as_warn_where (file, line, err,
391 prefix, (int) val, (int) min, (int) max);
393 else
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))
400 abort ();
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)");
409 if (bad)
410 as_bad_where (file, line, err, prefix, val_buf, min_buf, max_buf);
411 else
412 as_warn_where (file, line, err, prefix, val_buf, min_buf, max_buf);
416 void
417 as_warn_value_out_of_range (char * prefix,
418 offsetT value,
419 offsetT min,
420 offsetT max,
421 char * file,
422 unsigned line)
424 as_internal_value_out_of_range (prefix, value, min, max, file, line, 0);
427 void
428 as_bad_value_out_of_range (char * prefix,
429 offsetT value,
430 offsetT min,
431 offsetT max,
432 char * file,
433 unsigned line)
435 as_internal_value_out_of_range (prefix, value, min, max, file, line, 1);