X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fmessages.c;h=bbe181bbc9f5db5e8aaf6df3dda5977137036e35;hb=9d1416696615c74b8316739150d03ed7f95f2e11;hp=e85deec3bde11443a80ce7c726eed551f0d77cb8;hpb=2ee563b53258d390d7446e90a67f465d504ae44c;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/messages.c b/gas/messages.c index e85deec3bd..bbe181bbc9 100644 --- a/gas/messages.c +++ b/gas/messages.c @@ -1,11 +1,12 @@ /* messages.c - error reporter - - Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001 + Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001, + 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. GAS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) + the Free Software Foundation; either version 3, or (at your option) any later version. GAS is distributed in the hope that it will be useful, @@ -15,80 +16,57 @@ You should have received a copy of the GNU General Public License along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ #include "as.h" -#include -#ifdef HAVE_ERRNO_H -#include -#endif - -#ifdef USE_STDARG -#include -#endif - -#ifdef USE_VARARGS -#include -#endif - -#if !defined (USE_STDARG) && !defined (USE_VARARGS) -/* Roll our own. */ -#define va_alist REST -#define va_dcl -typedef int * va_list; -#define va_start(ARGS) ARGS = &REST -#define va_end(ARGS) -#endif - -static void identify PARAMS ((char *)); -static void as_show_where PARAMS ((void)); -static void as_warn_internal PARAMS ((char *, unsigned int, char *)); -static void as_bad_internal PARAMS ((char *, unsigned int, char *)); +static void identify (char *); +static void as_show_where (void); +static void as_warn_internal (char *, unsigned int, char *); +static void as_bad_internal (char *, unsigned int, char *); /* Despite the rest of the comments in this file, (FIXME-SOON), - * here is the current scheme for error messages etc: - * - * as_fatal() is used when gas is quite confused and - * continuing the assembly is pointless. In this case we - * exit immediately with error status. - * - * as_bad() is used to mark errors that result in what we - * presume to be a useless object file. Say, we ignored - * something that might have been vital. If we see any of - * these, assembly will continue to the end of the source, - * no object file will be produced, and we will terminate - * with error status. The new option, -Z, tells us to - * produce an object file anyway but we still exit with - * error status. The assumption here is that you don't want - * this object file but we could be wrong. - * - * as_warn() is used when we have an error from which we - * have a plausible error recovery. eg, masking the top - * bits of a constant that is longer than will fit in the - * destination. In this case we will continue to assemble - * the source, although we may have made a bad assumption, - * and we will produce an object file and return normal exit - * status (ie, no error). The new option -X tells us to - * treat all as_warn() errors as as_bad() errors. That is, - * no object file will be produced and we will exit with - * error status. The idea here is that we don't kill an - * entire make because of an error that we knew how to - * correct. On the other hand, sometimes you might want to - * stop the make at these points. - * - * as_tsktsk() is used when we see a minor error for which - * our error recovery action is almost certainly correct. - * In this case, we print a message and then assembly - * continues as though no error occurred. - */ + here is the current scheme for error messages etc: + + as_fatal() is used when gas is quite confused and + continuing the assembly is pointless. In this case we + exit immediately with error status. + + as_bad() is used to mark errors that result in what we + presume to be a useless object file. Say, we ignored + something that might have been vital. If we see any of + these, assembly will continue to the end of the source, + no object file will be produced, and we will terminate + with error status. The new option, -Z, tells us to + produce an object file anyway but we still exit with + error status. The assumption here is that you don't want + this object file but we could be wrong. + + as_warn() is used when we have an error from which we + have a plausible error recovery. eg, masking the top + bits of a constant that is longer than will fit in the + destination. In this case we will continue to assemble + the source, although we may have made a bad assumption, + and we will produce an object file and return normal exit + status (ie, no error). The new option -X tells us to + treat all as_warn() errors as as_bad() errors. That is, + no object file will be produced and we will exit with + error status. The idea here is that we don't kill an + entire make because of an error that we knew how to + correct. On the other hand, sometimes you might want to + stop the make at these points. + + as_tsktsk() is used when we see a minor error for which + our error recovery action is almost certainly correct. + In this case, we print a message and then assembly + continues as though no error occurred. */ static void -identify (file) - char *file; +identify (char *file) { static int identified; + if (identified) return; identified++; @@ -108,9 +86,9 @@ identify (file) static int warning_count; int -had_warnings () +had_warnings (void) { - return (warning_count); + return warning_count; } /* Nonzero if we've hit a 'bad error', and should not write an obj file, @@ -119,15 +97,15 @@ had_warnings () static int error_count; int -had_errors () +had_errors (void) { - return (error_count); + return error_count; } /* Print the current location to stderr. */ static void -as_show_where () +as_show_where (void) { char *file; unsigned int line; @@ -138,29 +116,6 @@ as_show_where () fprintf (stderr, "%s:%u: ", file, line); } -/* Like perror(3), but with more info. */ - -void -as_perror (gripe, filename) - const char *gripe; /* Unpunctuated error theme. */ - const char *filename; -{ - const char *errtxt; - - as_show_where (); - fprintf (stderr, gripe, filename); -#ifdef BFD_ASSEMBLER - errtxt = bfd_errmsg (bfd_get_error ()); -#else - errtxt = xstrerror (errno); -#endif - fprintf (stderr, ": %s\n", errtxt); - errno = 0; -#ifdef BFD_ASSEMBLER - bfd_set_error (bfd_error_no_error); -#endif -} - /* Send to stderr a string as a warning, and locate warning in input file(s). Please only use this for when we have some recovery action. @@ -198,10 +153,7 @@ as_tsktsk (format, va_alist) /* The common portion of as_warn and as_warn_where. */ static void -as_warn_internal (file, line, buffer) - char *file; - unsigned int line; - char *buffer; +as_warn_internal (char *file, unsigned int line, char *buffer) { ++warning_count; @@ -235,7 +187,7 @@ as_warn (const char *format, ...) if (!flag_no_warnings) { va_start (args, format); - vsprintf (buffer, format, args); + vsnprintf (buffer, sizeof (buffer), format, args); va_end (args); as_warn_internal ((char *) NULL, 0, buffer); } @@ -252,7 +204,7 @@ as_warn (format, va_alist) if (!flag_no_warnings) { va_start (args); - vsprintf (buffer, format, args); + vsnprintf (buffer, sizeof (buffer), format, args); va_end (args); as_warn_internal ((char *) NULL, 0, buffer); } @@ -273,7 +225,7 @@ as_warn_where (char *file, unsigned int line, const char *format, ...) if (!flag_no_warnings) { va_start (args, format); - vsprintf (buffer, format, args); + vsnprintf (buffer, sizeof (buffer), format, args); va_end (args); as_warn_internal (file, line, buffer); } @@ -292,7 +244,7 @@ as_warn_where (file, line, format, va_alist) if (!flag_no_warnings) { va_start (args); - vsprintf (buffer, format, args); + vsnprintf (buffer, sizeof (buffer), format, args); va_end (args); as_warn_internal (file, line, buffer); } @@ -302,10 +254,7 @@ as_warn_where (file, line, format, va_alist) /* The common portion of as_bad and as_bad_where. */ static void -as_bad_internal (file, line, buffer) - char *file; - unsigned int line; - char *buffer; +as_bad_internal (char *file, unsigned int line, char *buffer) { ++error_count; @@ -337,7 +286,7 @@ as_bad (const char *format, ...) char buffer[2000]; va_start (args, format); - vsprintf (buffer, format, args); + vsnprintf (buffer, sizeof (buffer), format, args); va_end (args); as_bad_internal ((char *) NULL, 0, buffer); @@ -353,7 +302,7 @@ as_bad (format, va_alist) char buffer[2000]; va_start (args); - vsprintf (buffer, format, args); + vsnprintf (buffer, sizeof (buffer), format, args); va_end (args); as_bad_internal ((char *) NULL, 0, buffer); @@ -372,7 +321,7 @@ as_bad_where (char *file, unsigned int line, const char *format, ...) char buffer[2000]; va_start (args, format); - vsprintf (buffer, format, args); + vsnprintf (buffer, sizeof (buffer), format, args); va_end (args); as_bad_internal (file, line, buffer); @@ -390,7 +339,7 @@ as_bad_where (file, line, format, va_alist) char buffer[2000]; va_start (args); - vsprintf (buffer, format, args); + vsnprintf (buffer, sizeof (buffer), format, args); va_end (args); as_bad_internal (file, line, buffer); @@ -417,7 +366,7 @@ as_fatal (const char *format, ...) /* Delete the output file, if it exists. This will prevent make from thinking that a file was created and hence does not need rebuilding. */ if (out_file_name != NULL) - unlink (out_file_name); + unlink_if_ordinary (out_file_name); xexit (EXIT_FAILURE); } #else @@ -442,9 +391,7 @@ as_fatal (format, va_alist) Arguments: Filename, line number, optional function name. */ void -as_assert (file, line, fn) - const char *file, *fn; - int line; +as_assert (const char *file, int line, const char *fn) { as_show_where (); fprintf (stderr, _("Internal error!\n")); @@ -461,9 +408,7 @@ as_assert (file, line, fn) and exit without producing a core file. */ void -as_abort (file, line, fn) - const char *file, *fn; - int line; +as_abort (const char *file, int line, const char *fn) { as_show_where (); if (fn) @@ -479,41 +424,114 @@ as_abort (file, line, fn) /* Support routines. */ void -fprint_value (file, val) - FILE *file; - valueT val; +sprint_value (char *buf, valueT val) { if (sizeof (val) <= sizeof (long)) { - fprintf (file, "%ld", (long) val); + sprintf (buf, "%ld", (long) val); return; } -#ifdef BFD_ASSEMBLER if (sizeof (val) <= sizeof (bfd_vma)) { - fprintf_vma (file, val); + sprintf_vma (buf, val); return; } -#endif abort (); } -void -sprint_value (buf, val) - char *buf; - valueT val; +#define HEX_MAX_THRESHOLD 1024 +#define HEX_MIN_THRESHOLD -(HEX_MAX_THRESHOLD) + +static void +as_internal_value_out_of_range (char * prefix, + offsetT val, + offsetT min, + offsetT max, + char * file, + unsigned line, + int bad) { - if (sizeof (val) <= sizeof (long)) + const char * err; + + if (prefix == NULL) + prefix = ""; + + if (val >= min && val <= max) { - sprintf (buf, "%ld", (long) val); + addressT right = max & -max; + + if (max <= 1) + abort (); + + /* xgettext:c-format */ + err = _("%s out of domain (%d is not a multiple of %d)"); + if (bad) + as_bad_where (file, line, err, + prefix, (int) val, (int) right); + else + as_warn_where (file, line, err, + prefix, (int) val, (int) right); return; } -#ifdef BFD_ASSEMBLER - if (sizeof (val) <= sizeof (bfd_vma)) + + if ( val < HEX_MAX_THRESHOLD + && min < HEX_MAX_THRESHOLD + && max < HEX_MAX_THRESHOLD + && val > HEX_MIN_THRESHOLD + && min > HEX_MIN_THRESHOLD + && max > HEX_MIN_THRESHOLD) { - sprintf_vma (buf, val); - return; + /* xgettext:c-format */ + err = _("%s out of range (%d is not between %d and %d)"); + + if (bad) + as_bad_where (file, line, err, + prefix, (int) val, (int) min, (int) max); + else + as_warn_where (file, line, err, + prefix, (int) val, (int) min, (int) max); } -#endif - abort (); + else + { + char val_buf [sizeof (val) * 3 + 2]; + char min_buf [sizeof (val) * 3 + 2]; + char max_buf [sizeof (val) * 3 + 2]; + + if (sizeof (val) > sizeof (bfd_vma)) + abort (); + + sprintf_vma (val_buf, val); + sprintf_vma (min_buf, min); + sprintf_vma (max_buf, max); + + /* xgettext:c-format. */ + err = _("%s out of range (0x%s is not between 0x%s and 0x%s)"); + + if (bad) + as_bad_where (file, line, err, prefix, val_buf, min_buf, max_buf); + else + as_warn_where (file, line, err, prefix, val_buf, min_buf, max_buf); + } +} + +void +as_warn_value_out_of_range (char * prefix, + offsetT value, + offsetT min, + offsetT max, + char * file, + unsigned line) +{ + as_internal_value_out_of_range (prefix, value, min, max, file, line, 0); +} + +void +as_bad_value_out_of_range (char * prefix, + offsetT value, + offsetT min, + offsetT max, + char * file, + unsigned line) +{ + as_internal_value_out_of_range (prefix, value, min, max, file, line, 1); }