projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git]
/
gas
/
messages.c
diff --git
a/gas/messages.c
b/gas/messages.c
index 9ea1bce26dcdfb0c8dca15cdfc02a783e14dc5cc..83bda87919931154a1716a4e8ba65e0688ae72f9 100644
(file)
--- a/
gas/messages.c
+++ b/
gas/messages.c
@@
-1,7
+1,5
@@
/* messages.c - error reporter -
/* messages.c - error reporter -
- Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001,
- 2003, 2004, 2005, 2006, 2007, 2008
- Free Software Foundation, Inc.
+ Copyright (C) 1987-2020 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
@@
-20,11
+18,19
@@
02110-1301, USA. */
#include "as.h"
02110-1301, USA. */
#include "as.h"
+#include <signal.h>
-static void identify (char *);
+/* If the system doesn't provide strsignal, we get it defined in
+ libiberty but no declaration is supplied. Because, reasons. */
+#if !defined (HAVE_STRSIGNAL) && !defined (strsignal)
+extern const char *strsignal (int);
+#endif
+
+static void identify (const char *);
static void as_show_where (void);
static void as_show_where (void);
-static void as_warn_internal (char *, unsigned int, char *);
-static void as_bad_internal (char *, unsigned int, char *);
+static void as_warn_internal (const char *, unsigned int, char *);
+static void as_bad_internal (const char *, unsigned int, char *);
+static void signal_crash (int) ATTRIBUTE_NORETURN;
/* Despite the rest of the comments in this file, (FIXME-SOON),
here is the current scheme for error messages etc:
/* Despite the rest of the comments in this file, (FIXME-SOON),
here is the current scheme for error messages etc:
@@
-60,10
+66,13
@@
static void as_bad_internal (char *, unsigned int, char *);
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
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. */
+ continues as though no error occurred.
+
+ as_abort () is used for logic failure (assert or abort, signal).
+*/
static void
static void
-identify (char *file)
+identify (c
onst c
har *file)
{
static int identified;
{
static int identified;
@@
-74,7
+83,7
@@
identify (char *file)
if (!file)
{
unsigned int x;
if (!file)
{
unsigned int x;
-
as_where (&file,
&x);
+
file = as_where (
&x);
}
if (file)
}
if (file)
@@
-107,13
+116,18
@@
had_errors (void)
static void
as_show_where (void)
{
static void
as_show_where (void)
{
- char *file;
+ c
onst c
har *file;
unsigned int line;
unsigned int line;
-
as_where (&file,
&line);
+
file = as_where (
&line);
identify (file);
if (file)
identify (file);
if (file)
- fprintf (stderr, "%s:%u: ", file, line);
+ {
+ if (line != 0)
+ fprintf (stderr, "%s:%u: ", file, line);
+ else
+ fprintf (stderr, "%s: ", file);
+ }
}
/* Send to stderr a string as a warning, and locate warning
}
/* Send to stderr a string as a warning, and locate warning
@@
-137,19
+151,23
@@
as_tsktsk (const char *format, ...)
/* The common portion of as_warn and as_warn_where. */
static void
/* The common portion of as_warn and as_warn_where. */
static void
-as_warn_internal (char *file, unsigned int line, char *buffer)
+as_warn_internal (c
onst c
har *file, unsigned int line, char *buffer)
{
++warning_count;
if (file == NULL)
{
++warning_count;
if (file == NULL)
-
as_where (&file,
&line);
+
file = as_where (
&line);
identify (file);
if (file)
identify (file);
if (file)
- fprintf (stderr, "%s:%u: ", file, line);
- fprintf (stderr, _("Warning: "));
- fputs (buffer, stderr);
- (void) putc ('\n', stderr);
+ {
+ if (line != 0)
+ fprintf (stderr, "%s:%u: %s%s\n", file, line, _("Warning: "), buffer);
+ else
+ fprintf (stderr, "%s: %s%s\n", file, _("Warning: "), buffer);
+ }
+ else
+ fprintf (stderr, "%s%s\n", _("Warning: "), buffer);
#ifndef NO_LISTING
listing_warning (buffer);
#endif
#ifndef NO_LISTING
listing_warning (buffer);
#endif
@@
-181,7
+199,7
@@
as_warn (const char *format, ...)
the varargs correctly and portably. */
void
the varargs correctly and portably. */
void
-as_warn_where (char *file, unsigned int line, const char *format, ...)
+as_warn_where (c
onst c
har *file, unsigned int line, const char *format, ...)
{
va_list args;
char buffer[2000];
{
va_list args;
char buffer[2000];
@@
-198,26
+216,30
@@
as_warn_where (char *file, unsigned int line, const char *format, ...)
/* The common portion of as_bad and as_bad_where. */
static void
/* The common portion of as_bad and as_bad_where. */
static void
-as_bad_internal (char *file, unsigned int line, char *buffer)
+as_bad_internal (c
onst c
har *file, unsigned int line, char *buffer)
{
++error_count;
if (file == NULL)
{
++error_count;
if (file == NULL)
-
as_where (&file,
&line);
+
file = as_where (
&line);
identify (file);
if (file)
identify (file);
if (file)
- fprintf (stderr, "%s:%u: ", file, line);
- fprintf (stderr, _("Error: "));
- fputs (buffer, stderr);
- (void) putc ('\n', stderr);
+ {
+ if (line != 0)
+ fprintf (stderr, "%s:%u: %s%s\n", file, line, _("Error: "), buffer);
+ else
+ fprintf (stderr, "%s: %s%s\n", file, _("Error: "), buffer);
+ }
+ else
+ fprintf (stderr, "%s%s\n", _("Error: "), buffer);
#ifndef NO_LISTING
listing_error (buffer);
#endif
}
/* Send to stderr a string as a warning, and locate warning in input
#ifndef NO_LISTING
listing_error (buffer);
#endif
}
/* 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
+ file(s). Please us
e
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. */
continue processing but not produce an object file.
Please explain in string (which may have '\n's) what recovery was
done. */
@@
-240,7
+262,7
@@
as_bad (const char *format, ...)
the varargs correctly and portably. */
void
the varargs correctly and portably. */
void
-as_bad_where (char *file, unsigned int line, const char *format, ...)
+as_bad_where (c
onst c
har *file, unsigned int line, const char *format, ...)
{
va_list args;
char buffer[2000];
{
va_list args;
char buffer[2000];
@@
-275,38
+297,61
@@
as_fatal (const char *format, ...)
xexit (EXIT_FAILURE);
}
xexit (EXIT_FAILURE);
}
-/* Indicate assertion failure.
- Arguments: Filename, line number, optional function name. */
+/* Indicate internal constency error.
+ Arguments: Filename, line number, optional function name.
+ FILENAME may be NULL, which we use for crash-via-signal. */
void
void
-as_a
sse
rt (const char *file, int line, const char *fn)
+as_a
bo
rt (const char *file, int line, const char *fn)
{
as_show_where ();
{
as_show_where ();
- fprintf (stderr, _("Internal error!\n"));
- if (fn)
- fprintf (stderr, _("Assertion failure in %s at %s line %d.\n"),
- fn, file, line);
+
+ if (!file)
+ fprintf (stderr, _("Internal error (%s).\n"), fn ? fn : "unknown");
+ else if (fn)
+ fprintf (stderr, _("Internal error in %s at %s:%d.\n"), fn, file, line);
else
else
- fprintf (stderr, _("Assertion failure at %s line %d.\n"), file, line);
+ fprintf (stderr, _("Internal error at %s:%d.\n"), file, line);
+
fprintf (stderr, _("Please report this bug.\n"));
fprintf (stderr, _("Please report this bug.\n"));
+
xexit (EXIT_FAILURE);
}
xexit (EXIT_FAILURE);
}
-/* as_abort: Print a friendly message saying how totally hosed we are,
- and exit without producing a core file. */
+/* Handler for fatal signals, such as SIGSEGV. */
+
+static void
+signal_crash (int signo)
+{
+ /* Reset, to prevent unbounded recursion. */
+ signal (signo, SIG_DFL);
+
+ as_abort (NULL, 0, strsignal (signo));
+}
+
+/* Register signal handlers, for less abrubt crashes. */
void
void
-
as_abort (const char *file, int line, const char *fn
)
+
signal_init (void
)
{
{
- 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);
+#ifdef SIGSEGV
+ signal (SIGSEGV, signal_crash);
+#endif
+#ifdef SIGILL
+ signal (SIGILL, signal_crash);
+#endif
+#ifdef SIGBUS
+ signal (SIGBUS, signal_crash);
+#endif
+#ifdef SIGABRT
+ signal (SIGABRT, signal_crash);
+#endif
+#if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT)
+ signal (SIGIOT, signal_crash);
+#endif
+#ifdef SIGFPE
+ signal (SIGFPE, signal_crash);
+#endif
}
/* Support routines. */
}
/* Support routines. */
@@
-331,13
+376,13
@@
sprint_value (char *buf, valueT val)
#define HEX_MIN_THRESHOLD -(HEX_MAX_THRESHOLD)
static void
#define HEX_MIN_THRESHOLD -(HEX_MAX_THRESHOLD)
static void
-as_internal_value_out_of_range (c
har *
prefix,
- offsetT
val,
- offsetT
min,
- offsetT
max,
- c
har *
file,
- unsigned
line,
- int
bad)
+as_internal_value_out_of_range (c
onst char *
prefix,
+ offsetT val,
+ offsetT min,
+ offsetT max,
+ c
onst char *
file,
+ unsigned line,
+ int bad)
{
const char * err;
{
const char * err;
@@
-352,13
+397,12
@@
as_internal_value_out_of_range (char * prefix,
abort ();
/* xgettext:c-format */
abort ();
/* xgettext:c-format */
- err = _("%s out of domain (%d is not a multiple of %d)");
+ err = _("%s out of domain (%" BFD_VMA_FMT "d is not a multiple of %" \
+ BFD_VMA_FMT "d)");
if (bad)
if (bad)
- as_bad_where (file, line, err,
- prefix, (int) val, (int) right);
+ as_bad_where (file, line, err, prefix, val, right);
else
else
- as_warn_where (file, line, err,
- prefix, (int) val, (int) right);
+ as_warn_where (file, line, err, prefix, val, right);
return;
}
return;
}
@@
-370,14
+414,13
@@
as_internal_value_out_of_range (char * prefix,
&& max > HEX_MIN_THRESHOLD)
{
/* xgettext:c-format */
&& max > HEX_MIN_THRESHOLD)
{
/* xgettext:c-format */
- err = _("%s out of range (%d is not between %d and %d)");
+ err = _("%s out of range (%" BFD_VMA_FMT "d is not between %" \
+ BFD_VMA_FMT "d and %" BFD_VMA_FMT "d)");
if (bad)
if (bad)
- as_bad_where (file, line, err,
- prefix, (int) val, (int) min, (int) max);
+ as_bad_where (file, line, err, prefix, val, min, max);
else
else
- as_warn_where (file, line, err,
- prefix, (int) val, (int) min, (int) max);
+ as_warn_where (file, line, err, prefix, val, min, max);
}
else
{
}
else
{
@@
-403,22
+446,22
@@
as_internal_value_out_of_range (char * prefix,
}
void
}
void
-as_warn_value_out_of_range (c
har *
prefix,
- offsetT
value,
- offsetT
min,
- offsetT
max,
- c
har *
file,
+as_warn_value_out_of_range (c
onst char *
prefix,
+ offsetT value,
+ offsetT min,
+ offsetT max,
+ c
onst char *
file,
unsigned line)
{
as_internal_value_out_of_range (prefix, value, min, max, file, line, 0);
}
void
unsigned line)
{
as_internal_value_out_of_range (prefix, value, min, max, file, line, 0);
}
void
-as_bad_value_out_of_range (c
har *
prefix,
- offsetT
value,
- offsetT
min,
- offsetT
max,
- c
har *
file,
+as_bad_value_out_of_range (c
onst char *
prefix,
+ offsetT value,
+ offsetT min,
+ offsetT max,
+ c
onst char *
file,
unsigned line)
{
as_internal_value_out_of_range (prefix, value, min, max, file, line, 1);
unsigned line)
{
as_internal_value_out_of_range (prefix, value, min, max, file, line, 1);
This page took
0.028427 seconds
and
4
git commands to generate.