X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fmessages.c;h=42f51341df51f4f07e77a5cffa3131e7ac7b0210;hb=c488923f169eed9ac1f7cb8e7d15e53eee97681d;hp=cabe3f45212f2a31c819c9f4339c375f6c4e8405;hpb=1d63ba3ba05bc523b8c982284508d55bb6e591ed;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/messages.c b/gas/messages.c index cabe3f4521..42f51341df 100644 --- a/gas/messages.c +++ b/gas/messages.c @@ -1,34 +1,51 @@ /* messages.c - error reporter - - Copyright (C) 1987, 1991 Free Software Foundation, Inc. - + Copyright (C) 1987, 91, 92, 93, 94, 95, 96, 97, 1998 + 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) any later version. - + GAS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include /* define stderr */ -#include + 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. */ #include "as.h" -#ifndef NO_STDARG +#include +#ifdef HAVE_ERRNO_H +#include +#endif + +#ifdef USE_STDARG #include -#else -#ifndef NO_VARARGS +#endif + +#ifdef USE_VARARGS #include -#endif /* NO_VARARGS */ -#endif /* NO_STDARG */ +#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 *)); /* * Despite the rest of the comments in this file, (FIXME-SOON), @@ -68,349 +85,456 @@ * continues as though no error occurred. */ -/* - ERRORS - - JF: this is now bogus. We now print more standard error messages - that try to look like everyone else's. - - We print the error message 1st, beginning in column 1. - All ancillary info starts in column 2 on lines after the - key error text. - We try to print a location in logical and physical file - just after the main error text. - Caller then prints any appendices after that, begining all - lines with at least 1 space. - - Optionally, we may die. - There is no need for a trailing '\n' in your error text format - because we supply one. - - as_warn(fmt,args) Like fprintf(stderr,fmt,args) but also call errwhere(). - - as_fatal(fmt,args) Like as_warn() but exit with a fatal status. - - */ - -static int warning_count = 0; /* Count of number of warnings issued */ - -int had_warnings() { - return(warning_count); -} /* had_err() */ +static void +identify (file) + char *file; +{ + static int identified; + if (identified) + return; + identified++; + + if (!file) + { + unsigned int x; + as_where (&file, &x); + } + + if (file) + fprintf (stderr, "%s: ", file); + fprintf (stderr, _("Assembler messages:\n")); +} + +static int warning_count; /* Count of number of warnings issued */ + +int +had_warnings () +{ + return (warning_count); +} /* Nonzero if we've hit a 'bad error', and should not write an obj file, and exit with a nonzero error code */ -static int error_count = 0; +static int error_count; + +int +had_errors () +{ + return (error_count); +} + +/* Print the current location to stderr. */ -int had_errors() { - return(error_count); -} /* had_errors() */ +static void +as_show_where () +{ + char *file; + unsigned int line; + as_where (&file, &line); + identify (file); + if (file) + fprintf (stderr, "%s:%u: ", file, line); +} /* * a s _ p e r r o r * * Like perror(3), but with more info. */ -void as_perror(gripe, filename) -char *gripe; /* Unpunctuated error theme. */ -char *filename; + +void +as_perror (gripe, filename) + const char *gripe; /* Unpunctuated error theme. */ + const char *filename; { - extern int sys_nerr; - extern char *sys_errlist[]; - - as_where(); - fprintf(stderr,gripe,filename); - - if (errno > sys_nerr) - fprintf(stderr, "Unknown error #%d.\n", errno); - else - fprintf(stderr, "%s.\n", sys_errlist[errno]); - errno = 0; /* After reporting, clear it. */ -} /* as_perror() */ + 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 +} /* * a s _ t s k t s k () * - * Send to stderr a string (with bell) (JF: Bell is obnoxious!) as a warning, and locate warning + * 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. * Please explain in string (which may have '\n's) what recovery was done. */ -#ifndef NO_STDARG -void as_tsktsk(Format) -const char *Format; -{ - va_list args; - - as_where(); - va_start(args, Format); - vfprintf(stderr, Format, args); - va_end(args); - (void) putc('\n', stderr); -} /* as_tsktsk() */ -#else -#ifndef NO_VARARGS -void as_tsktsk(Format,va_alist) -char *Format; -va_dcl +#ifdef USE_STDARG +void +as_tsktsk (const char *format,...) { - va_list args; - - as_where(); - va_start(args); - vfprintf(stderr, Format, args); - va_end(args); - (void) putc('\n', stderr); -} /* as_tsktsk() */ + va_list args; + + as_show_where (); + va_start (args, format); + vfprintf (stderr, format, args); + va_end (args); + (void) putc ('\n', stderr); +} /* as_tsktsk() */ #else -/*VARARGS1 */ -as_tsktsk(Format,args) -char *Format; +void +as_tsktsk (format, va_alist) + const char *format; + va_dcl { - as_where(); - _doprnt (Format, &args, stderr); - (void)putc ('\n', stderr); - /* as_where(); */ -} /* as_tsktsk */ -#endif /* not NO_VARARGS */ + va_list args; + + as_show_where (); + va_start (args); + vfprintf (stderr, format, args); + va_end (args); + (void) putc ('\n', stderr); +} /* as_tsktsk() */ #endif /* not NO_STDARG */ -#ifdef DONTDEF -void as_tsktsk(Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an) -char *format; +/* 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_where(); - fprintf(stderr,Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an); - (void)putc('\n',stderr); -} /* as_tsktsk() */ + ++warning_count; + + if (file == NULL) + as_where (&file, &line); + + identify (file); + if (file) + fprintf (stderr, "%s:%u: ", file, line); + fprintf (stderr, _("Warning: ")); + fputs (buffer, stderr); + (void) putc ('\n', stderr); +#ifndef NO_LISTING + listing_warning (buffer); #endif +} + /* * a s _ w a r n () * - * Send to stderr a string (with bell) (JF: Bell is obnoxious!) as a warning, and locate warning + * 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. * Please explain in string (which may have '\n's) what recovery was done. */ -#ifndef NO_STDARG -void as_warn(Format) -const char *Format; +#ifdef USE_STDARG +void +as_warn (const char *format,...) { - va_list args; - char buffer[200]; - - if(!flagseen['W']) { - ++warning_count; - as_where(); - va_start(args, Format); - fprintf(stderr,"Warning: "); - vsprintf(buffer, Format, args); - fprintf(stderr, buffer); -#ifndef NO_LISTING - listing_warning(buffer); -#endif - va_end(args); - (void) putc('\n', stderr); - } -} /* as_warn() */ + va_list args; + char buffer[2000]; + + if (!flag_no_warnings) + { + va_start (args, format); + vsprintf (buffer, format, args); + va_end (args); + as_warn_internal ((char *) NULL, 0, buffer); + } +} /* as_warn() */ #else -#ifndef NO_VARARGS -void as_warn(Format,va_alist) -char *Format; -va_dcl +/*VARARGS1 */ +void +as_warn (format, va_alist) + const char *format; + va_dcl { - va_list args; - char buffer[200]; - - if(!flagseen['W']) { - ++warning_count; - as_where(); - va_start(args); - fprintf(stderr,"Warning: "); - vsprintf(buffer, Format, args); - fprintf(stderr,buffer); -#ifndef NO_LISTING - listing_warning(buffer); -#endif - va_end(args); - (void) putc('\n', stderr); - } -} /* as_warn() */ + va_list args; + char buffer[2000]; + + if (!flag_no_warnings) + { + va_start (args); + vsprintf (buffer, format, args); + va_end (args); + as_warn_internal ((char *) NULL, 0, buffer); + } +} /* as_warn() */ +#endif /* not NO_STDARG */ + +/* as_warn_where, like as_bad but the file name and line number are + passed in. Unfortunately, we have to repeat the function in order + to handle the varargs correctly and portably. */ + +#ifdef USE_STDARG +void +as_warn_where (char *file, unsigned int line, const char *format,...) +{ + va_list args; + char buffer[2000]; + + if (!flag_no_warnings) + { + va_start (args, format); + vsprintf (buffer, format, args); + va_end (args); + as_warn_internal (file, line, buffer); + } +} /* as_warn() */ #else /*VARARGS1 */ -as_warn(Format,args) -char *Format; +void +as_warn_where (file, line, format, va_alist) + char *file; + unsigned int line; + const char *format; + va_dcl { - /* -W supresses warning messages. */ - if (! flagseen ['W']) { - ++warning_count; - as_where(); - _doprnt (Format, &args, stderr); - (void)putc ('\n', stderr); - /* as_where(); */ - } -} /* as_warn() */ -#endif /* not NO_VARARGS */ + va_list args; + char buffer[2000]; + + if (!flag_no_warnings) + { + va_start (args); + vsprintf (buffer, format, args); + va_end (args); + as_warn_internal (file, line, buffer); + } +} /* as_warn() */ #endif /* not NO_STDARG */ -#ifdef DONTDEF -void as_warn(Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an) -char *format; +/* 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; { - if(!flagseen['W']) { - ++warning_count; - as_where(); - fprintf(stderr,Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an); - (void)putc('\n',stderr); - } -} /* as_warn() */ + ++error_count; + + if (file == NULL) + as_where (&file, &line); + + identify (file); + if (file) + fprintf (stderr, "%s:%u: ", file, line); + fprintf (stderr, _("Error: ")); + fputs (buffer, stderr); + (void) putc ('\n', stderr); +#ifndef NO_LISTING + listing_error (buffer); #endif +} + /* * a s _ b a d () * - * Send to stderr a string (with bell) (JF: Bell is obnoxious!) as a warning, - * and locate warning in input file(s). + * Send to stderr a string as a warning, and locate warning in input file(s). * Please us when there is no recovery, but we want to continue processing * but not produce an object file. * Please explain in string (which may have '\n's) what recovery was done. */ -#ifndef NO_STDARG -void as_bad(Format) -const char *Format; -{ - va_list args; - char buffer[200]; - - ++error_count; - as_where(); - va_start(args, Format); - fprintf(stderr,"Error: "); - - vsprintf(buffer, Format, args); - fprintf(stderr,buffer); -#ifndef NO_LISTING - listing_error(buffer); -#endif - va_end(args); - (void) putc('\n', stderr); -} /* as_bad() */ -#else -#ifndef NO_VARARGS -void as_bad(Format,va_alist) -char *Format; -va_dcl +#ifdef USE_STDARG +void +as_bad (const char *format,...) { - va_list args; - char buffer[200]; - - ++error_count; - as_where(); - va_start(args); - vsprintf(buffer, Format, args); - fprintf(stderr,buffer); -#ifndef NO_LISTING - listing_error(buffer); -#endif - - va_end(args); - (void) putc('\n', stderr); -} /* as_bad() */ + va_list args; + char buffer[2000]; + + va_start (args, format); + vsprintf (buffer, format, args); + va_end (args); + + as_bad_internal ((char *) NULL, 0, buffer); +} + #else /*VARARGS1 */ -as_bad(Format,args) -char *Format; +void +as_bad (format, va_alist) + const char *format; + va_dcl { - ++error_count; - - as_where(); - fprintf(stderr,"Error: "); - _doprnt (Format, &args, stderr); - (void)putc ('\n', stderr); - /* as_where(); */ -} /* as_bad() */ -#endif /* not NO_VARARGS */ + va_list args; + char buffer[2000]; + + va_start (args); + vsprintf (buffer, format, args); + va_end (args); + + as_bad_internal ((char *) NULL, 0, buffer); +} #endif /* not NO_STDARG */ -#ifdef DONTDEF -void as_bad(Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an) -char *format; +/* as_bad_where, like as_bad but the file name and line number are + passed in. Unfortunately, we have to repeat the function in order + to handle the varargs correctly and portably. */ + +#ifdef USE_STDARG +void +as_bad_where (char *file, unsigned int line, const char *format,...) { - ++error_count; - as_where(); - fprintf(stderr,Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an); - (void)putc('\n',stderr); -} /* as_bad() */ -#endif + va_list args; + char buffer[2000]; + + va_start (args, format); + vsprintf (buffer, format, args); + va_end (args); + + as_bad_internal (file, line, buffer); +} + +#else +/*VARARGS1 */ +void +as_bad_where (file, line, format, va_alist) + char *file; + unsigned int line; + const char *format; + va_dcl +{ + va_list args; + char buffer[2000]; + + va_start (args); + vsprintf (buffer, format, args); + va_end (args); + + as_bad_internal (file, line, buffer); +} +#endif /* not NO_STDARG */ /* * a s _ f a t a l () * - * Send to stderr a string (with bell) (JF: Bell is obnoxious!) as a fatal - * message, and locate stdsource in input file(s). + * Send to stderr a string as a fatal message, and print location of error in + * input file(s). * Please only use this for when we DON'T have some recovery action. - * It exit()s with a warning status. + * It xexit()s with a warning status. */ -#ifndef NO_STDARG -void as_fatal(Format) -const char *Format; -{ - va_list args; - - as_where(); - va_start(args, Format); - fprintf (stderr, "FATAL:"); - vfprintf(stderr, Format, args); - (void) putc('\n', stderr); - va_end(args); - exit(33); -} /* as_fatal() */ -#else -#ifndef NO_VARARGS -void as_fatal(Format,va_alist) -char *Format; -va_dcl +#ifdef USE_STDARG +void +as_fatal (const char *format,...) { - va_list args; - - as_where(); - va_start(args); - fprintf (stderr, "FATAL:"); - vfprintf(stderr, Format, args); - (void) putc('\n', stderr); - va_end(args); - exit(33); -} /* as_fatal() */ + va_list args; + + as_show_where (); + va_start (args, format); + fprintf (stderr, _("Fatal error: ")); + vfprintf (stderr, format, args); + (void) putc ('\n', stderr); + va_end (args); + xexit (EXIT_FAILURE); +} /* as_fatal() */ #else -/*VARARGS1 */ -as_fatal(Format, args) -char *Format; +/*VARARGS1*/ +void +as_fatal (format, va_alist) + char *format; + va_dcl { - as_where(); - fprintf(stderr,"FATAL:"); - _doprnt (Format, &args, stderr); - (void)putc ('\n', stderr); - /* as_where(); */ - exit(33); /* What is a good exit status? */ -} /* as_fatal() */ -#endif /* not NO_VARARGS */ + va_list args; + + as_show_where (); + va_start (args); + fprintf (stderr, _("Fatal error: ")); + vfprintf (stderr, format, args); + (void) putc ('\n', stderr); + va_end (args); + xexit (EXIT_FAILURE); +} /* as_fatal() */ #endif /* not NO_STDARG */ -#ifdef DONTDEF -void as_fatal(Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an) -char *Format; +/* + * as_assert: Indicate assertion failure. + * Arguments: Filename, line number, optional function name. + */ + +void +as_assert (file, line, fn) + const char *file, *fn; + int line; +{ + as_show_where (); + fprintf (stderr, _("Internal error!\n")); + if (fn) + fprintf (stderr, _("Assertion failure in %s at %s line %d.\n"), + fn, file, line); + else + fprintf (stderr, _("Assertion failure at %s line %d.\n"), file, line); + fprintf (stderr, _("Please report this bug.\n")); + xexit (EXIT_FAILURE); +} + +/* as_abort: Print a friendly message saying how totally hosed we are, + and exit without producing a core file. */ +void +as_abort (file, line, fn) + const char *file, *fn; + int line; +{ + as_show_where (); + if (fn) + fprintf (stderr, _("Internal error, aborting at %s line %d in %s\n"), + file, line, fn); + else + fprintf (stderr, _("Internal error, aborting at %s line %d\n"), + file, line); + fprintf (stderr, _("Please report this bug.\n")); + xexit (EXIT_FAILURE); +} + +/* Support routines. */ + +void +fprint_value (file, val) + FILE *file; + valueT val; +{ + if (sizeof (val) <= sizeof (long)) + { + fprintf (file, "%ld", (long) val); + return; + } +#ifdef BFD_ASSEMBLER + if (sizeof (val) <= sizeof (bfd_vma)) + { + fprintf_vma (file, val); + return; + } +#endif + abort (); +} + +void +sprint_value (buf, val) + char *buf; + valueT val; { - as_where(); - fprintf (stderr, "FATAL:"); - fprintf(stderr, Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an); - (void) putc('\n', stderr); - exit(33); -} /* as_fatal() */ + if (sizeof (val) <= sizeof (long)) + { + sprintf (buf, "%ld", (long) val); + return; + } +#ifdef BFD_ASSEMBLER + if (sizeof (val) <= sizeof (bfd_vma)) + { + sprintf_vma (buf, val); + return; + } #endif + abort (); +} -/* end: messages.c */ +/* end of messages.c */