system.h: Don't redefine abort or trim_filename.

1999-08-25 22:10 -0700  Zack Weinberg  <zack@bitmover.com>

	* system.h: Don't redefine abort or trim_filename.
	* rtl.h: Define abort to fancy_abort (__FILE__, __LINE__, 0)
	or fancy_abort (__FILE__, __LINE__, __FUNCTION__) depending on
	whether or not __FUNCTION__ is available.
	* tree.h: Duplicate rtl.h's definition of abort, for files
	that don't include rtl.h.  Delete all code to perform type
	checking with a compiler other than GCC.
	* varray.h: Delete all code to perform type checking with a
	compiler other than GCC.  Make VARRAY_CHECK() always evaluate
	its arguments exactly once, using a statement expression.
	Adjust the VARRAY_<type> accessor macros to match.
	* toplev.h (fatal_insn, fatal_insn_not_found): Kill.
	(_fatal_insn, _fatal_insn_not_found): New fns, take info on
	caller's location.  Define fatal_insn and fatal_insn_not_found
	as macros that use _fatal_insn and _fatal_insn_not_found.
	(fancy_abort, trim_filename): Kill prototypes.

	* rtl.c (trim_filename): Move here from toplev.c.
	(fancy_abort): New function.
	(DIR_SEPARATOR): Provide default definition.
	* tree.c (tree_check_failed, tree_class_check_failed): Go
	through fancy_abort.
	(tree_check, tree_class_check, cst_or_constructor_check,
	expr_check): Delete.
	* varray.c (varray_check_failed): New function.
	* toplev.c (fatal_insn, fatal_insn_not_found): Replace with
	_fatal_insn and _fatal_insn_not_found.  Go through
	fancy_abort.
	(trim_filename, fancy_abort): Delete.

	* builtins.c (expand_builtin_args_info): Report ICE with abort.
	* except.c (start_catch_handler): Report ICE with error/abort
	combo.
	* final.c (output_operand_lossage): Likewise.
	* flow.c (verify_flow_info): Likewise.

	* gcc.c: Prototype fatal.
	* gengenrtl.c: Undef abort after including rtl.h not system.h.
	* genattr.c, genattrtab.c, genemit.c, genextract.c,
	genflags.c, genopinit.c, genoutput.c, genpeep.c, genrecog.c:
	Don't define fancy_abort.

From-SVN: r28889
This commit is contained in:
Zack Weinberg 1999-08-26 05:18:44 +00:00 committed by Zack Weinberg
parent f18a14bcc1
commit 987009bf0d
27 changed files with 273 additions and 371 deletions

View File

@ -1,3 +1,47 @@
1999-08-25 22:10 -0700 Zack Weinberg <zack@bitmover.com>
* system.h: Don't redefine abort or trim_filename.
* rtl.h: Define abort to fancy_abort (__FILE__, __LINE__, 0)
or fancy_abort (__FILE__, __LINE__, __FUNCTION__) depending on
whether or not __FUNCTION__ is available.
* tree.h: Duplicate rtl.h's definition of abort, for files
that don't include rtl.h. Delete all code to perform type
checking with a compiler other than GCC.
* varray.h: Delete all code to perform type checking with a
compiler other than GCC. Make VARRAY_CHECK() always evaluate
its arguments exactly once, using a statement expression.
Adjust the VARRAY_<type> accessor macros to match.
* toplev.h (fatal_insn, fatal_insn_not_found): Kill.
(_fatal_insn, _fatal_insn_not_found): New fns, take info on
caller's location. Define fatal_insn and fatal_insn_not_found
as macros that use _fatal_insn and _fatal_insn_not_found.
(fancy_abort, trim_filename): Kill prototypes.
* rtl.c (trim_filename): Move here from toplev.c.
(fancy_abort): New function.
(DIR_SEPARATOR): Provide default definition.
* tree.c (tree_check_failed, tree_class_check_failed): Go
through fancy_abort.
(tree_check, tree_class_check, cst_or_constructor_check,
expr_check): Delete.
* varray.c (varray_check_failed): New function.
* toplev.c (fatal_insn, fatal_insn_not_found): Replace with
_fatal_insn and _fatal_insn_not_found. Go through
fancy_abort.
(trim_filename, fancy_abort): Delete.
* builtins.c (expand_builtin_args_info): Report ICE with abort.
* except.c (start_catch_handler): Report ICE with error/abort
combo.
* final.c (output_operand_lossage): Likewise.
* flow.c (verify_flow_info): Likewise.
* gcc.c: Prototype fatal.
* gengenrtl.c: Undef abort after including rtl.h not system.h.
* genattr.c, genattrtab.c, genemit.c, genextract.c,
genflags.c, genopinit.c, genoutput.c, genpeep.c, genrecog.c:
Don't define fancy_abort.
Wed Aug 25 17:56:59 1999 Richard Henderson <rth@cygnus.com>
* optabs.c (emit_cmp_and_jump_insns): Be more thorough in

View File

@ -1734,8 +1734,7 @@ expand_builtin_args_info (exp)
#endif
if (sizeof (CUMULATIVE_ARGS) % sizeof (int) != 0)
fatal ("CUMULATIVE_ARGS type defined badly; see %s, line %d",
__FILE__, __LINE__);
abort ();
if (arglist != 0)
{

View File

@ -1692,7 +1692,10 @@ start_catch_handler (rtime)
rtx call_rtx, rtime_address;
if (catchstack.top->entry->false_label != NULL_RTX)
fatal ("Compiler Bug: Never issued previous false_label");
{
error ("Never issued previous false_label");
abort ();
}
catchstack.top->entry->false_label = gen_exception_label ();
rtime_address = expand_expr (rtime, NULL_RTX, Pmode, EXPAND_INITIALIZER);

View File

@ -3324,7 +3324,10 @@ output_operand_lossage (msgid)
if (this_is_asm_operands)
error_for_asm (this_is_asm_operands, "invalid `asm': %s", _(msgid));
else
fatal ("Internal compiler error, output_operand_lossage `%s'", _(msgid));
{
error ("output_operand: %s", _(msgid));
abort ();
}
}
/* Output of assembler code from a template, and its subroutines. */

View File

@ -6171,8 +6171,9 @@ verify_flow_info ()
break;
if (!x)
{
fatal ("verify_flow_info: Head insn %d for block %d not found in the insn stream.\n",
error ("Head insn %d for block %d not found in the insn stream.",
INSN_UID (bb->head), bb->index);
abort ();
}
/* Check the end pointer and make sure that it is pointing into
@ -6181,8 +6182,9 @@ verify_flow_info ()
{
if (bb_info[INSN_UID (x)] != NULL)
{
fatal ("verify_flow_info: Insn %d is in multiple basic blocks (%d and %d)",
error ("Insn %d is in multiple basic blocks (%d and %d)",
INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
abort ();
}
bb_info[INSN_UID (x)] = bb;
@ -6191,8 +6193,9 @@ verify_flow_info ()
}
if (!x)
{
fatal ("verify_flow_info: End insn %d for block %d not found in the insn stream.\n",
error ("End insn %d for block %d not found in the insn stream.",
INSN_UID (bb->end), bb->index);
abort ();
}
}
@ -6224,8 +6227,8 @@ verify_flow_info ()
e2 = e2->pred_next;
if (!e2)
{
fatal ("verify_flow_info: Basic block %i edge lists are corrupted\n",
bb->index);
error ("Basic block %i edge lists are corrupted", bb->index);
abort ();
}
}
e = e->succ_next;
@ -6236,13 +6239,12 @@ verify_flow_info ()
{
if (e->dest != bb)
{
fprintf (stderr, "verify_flow_info: Basic block %d pred edge is corrupted\n",
bb->index);
fprintf (stderr, "Predecessor: ");
error ("Basic block %d pred edge is corrupted", bb->index);
fputs ("Predecessor: ", stderr);
dump_edge_info (stderr, e, 0);
fprintf (stderr, "\nSuccessor: ");
fputs ("\nSuccessor: ", stderr);
dump_edge_info (stderr, e, 1);
fflush (stderr);
fputc ('\n', stderr);
abort ();
}
if (e->src != ENTRY_BLOCK_PTR)
@ -6252,8 +6254,8 @@ verify_flow_info ()
e2 = e2->succ_next;
if (!e2)
{
fatal ("verify_flow_info: Basic block %i edge lists are corrupted\n",
bb->index);
error ("Basic block %i edge lists are corrupted", bb->index);
abort;
}
}
e = e->pred_next;
@ -6267,7 +6269,9 @@ verify_flow_info ()
{
if (bb->end == x)
{
fatal ("verify_flow_info: Basic block contains only CODE_LABEL and no NOTE_INSN_BASIC_BLOCK note\n");
error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
bb->index);
abort ();
}
x = NEXT_INSN (x);
}
@ -6275,8 +6279,9 @@ verify_flow_info ()
|| NOTE_LINE_NUMBER (x) != NOTE_INSN_BASIC_BLOCK
|| NOTE_BASIC_BLOCK (x) != bb)
{
fatal ("verify_flow_info: NOTE_INSN_BASIC_BLOCK is missing for block %d\n",
error ("NOTE_INSN_BASIC_BLOCK is missing for block %d\n",
bb->index);
abort ();
}
if (bb->end == x)
@ -6291,8 +6296,9 @@ verify_flow_info ()
if (GET_CODE (x) == NOTE
&& NOTE_LINE_NUMBER (x) == NOTE_INSN_BASIC_BLOCK)
{
fatal ("verify_flow_info: NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d\n",
error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d",
INSN_UID (x), bb->index);
abort ();
}
if (x == bb->end)
@ -6302,8 +6308,8 @@ verify_flow_info ()
|| GET_CODE (x) == CODE_LABEL
|| GET_CODE (x) == BARRIER)
{
fatal_insn ("verify_flow_info: Incorrect insn in the middle of basic block %d\n",
x, bb->index);
error ("In basic block %d:", bb->index);
fatal_insn ("Flow control insn inside a basic block", x);
}
x = NEXT_INSN (x);
@ -6336,7 +6342,7 @@ verify_flow_info ()
break;
default:
fatal_insn ("verify_flow_info: Insn outside basic block\n", x);
fatal_insn ("Insn outside basic block", x);
}
}

View File

@ -205,6 +205,8 @@ static void pfatal_with_name PROTO((const char *)) ATTRIBUTE_NORETURN;
static void perror_with_name PROTO((const char *));
static void pfatal_pexecute PROTO((const char *, const char *))
ATTRIBUTE_NORETURN;
static void fatal PVPROTO((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
static void error PVPROTO((const char *, ...))
ATTRIBUTE_PRINTF_1;
static void notice PVPROTO((const char *, ...))

View File

@ -33,7 +33,6 @@ struct obstack *rtl_obstack = &obstack;
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
/* Define this so we can link with print-rtl.o to get debug_rtx function. */
char **insn_name_ptr = 0;
@ -246,15 +245,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
int
main (argc, argv)
int argc;

View File

@ -121,7 +121,6 @@ char **insn_name_ptr = 0;
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
/* enough space to reserve for printing out ints */
#define MAX_DIGITS (HOST_BITS_PER_INT * 3 / 10 + 3)
@ -5928,15 +5927,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
/* Determine if an insn has a constant number of delay slots, i.e., the
number of delay slots is not a function of the length of the insn. */

View File

@ -35,7 +35,6 @@ struct obstack *rtl_obstack = &obstack;
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
/* Define this so we can link with print-rtl.o to get debug_rtx function. */
char **insn_name_ptr = 0;
@ -103,15 +102,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
int
main (argc, argv)
int argc;

View File

@ -51,7 +51,6 @@ static int dup_operands_seen_this_insn;
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
static void walk_insn_part PROTO((rtx, int, int));
static void gen_insn PROTO((rtx));
@ -292,15 +291,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
int
main (argc, argv)
int argc;

View File

@ -32,7 +32,6 @@ struct obstack *rtl_obstack = &obstack;
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
/* Define this so we can link with print-rtl.o to get debug_rtx function. */
char **insn_name_ptr = 0;
@ -728,15 +727,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
int
main (argc, argv)
int argc;

View File

@ -100,7 +100,6 @@ static void walk_rtx PROTO ((rtx, const char *));
static void print_path PROTO ((char *));
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO ((void)) ATTRIBUTE_NORETURN;
static void
gen_insn (insn)
@ -391,15 +390,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
char *
xstrdup (input)
const char *input;

View File

@ -35,7 +35,6 @@ struct obstack *rtl_obstack = &obstack;
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
/* Names for patterns. Need to allow linking with print-rtl. */
char **insn_name_ptr;
@ -223,15 +222,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
int
main (argc, argv)
int argc;

View File

@ -21,10 +21,10 @@ Boston, MA 02111-1307, USA. */
#include "hconfig.h"
#include "system.h"
#undef abort
#define NO_GENRTL_H
#include "rtl.h"
#undef abort
struct rtx_definition

View File

@ -32,7 +32,6 @@ struct obstack *rtl_obstack = &obstack;
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
/* Many parts of GCC use arrays that are indexed by machine mode and
contain the insn codes for pattern in the MD file that perform a given
@ -328,15 +327,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
int
main (argc, argv)
int argc;

View File

@ -109,7 +109,6 @@ struct obstack *rtl_obstack = &obstack;
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
static void error PVPROTO ((const char *, ...)) ATTRIBUTE_PRINTF_1;
static int n_occurrences PROTO((int, char *));
@ -953,15 +952,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
static void
error VPROTO ((const char *format, ...))
{

View File

@ -48,7 +48,6 @@ struct link
void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
static int max_opno;
@ -431,15 +430,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
int
main (argc, argv)
int argc;

View File

@ -195,7 +195,6 @@ static void write_tree PROTO((struct decision *, const char *,
static void change_state PROTO((const char *, const char *, int));
void fatal PVPROTO((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void fancy_abort PROTO((void)) ATTRIBUTE_NORETURN;
/* Construct and return a sequence of decisions
that will recognize INSN.
@ -1732,15 +1731,6 @@ fatal VPROTO ((const char *format, ...))
exit (FATAL_EXIT_CODE);
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing. */
void
fancy_abort ()
{
fatal ("Internal gcc abort.");
}
int
main (argc, argv)
int argc;

View File

@ -29,6 +29,10 @@ Boston, MA 02111-1307, USA. */
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
#ifndef DIR_SEPARATOR
#define DIR_SEPARATOR '/'
#endif
/* Obstack used for allocating RTL objects.
Between functions, this is the permanent_obstack.
While parsing and expanding a function, this is maybepermanent_obstack
@ -962,3 +966,53 @@ init_rtl ()
}
}
}
/* These are utility functions used by fatal-error functions all over the
code. rtl.c happens to be linked by all the programs that need them,
so these are here. In the future we want to break out all error handling
to its own module. */
/* Given a partial pathname as input, return another pathname that
shares no directory elements with the pathname of __FILE__. This
is used by fancy_abort() to print `Internal compiler error in expr.c'
instead of `Internal compiler error in ../../egcs/gcc/expr.c'. */
static const char *
trim_filename (name)
const char *name;
{
static const char *this_file = __FILE__;
const char *p = name, *q = this_file;
while (*p == *q && *p != 0 && *q != 0) p++, q++;
while (p > name && p[-1] != DIR_SEPARATOR
#ifdef DIR_SEPARATOR_2
&& p[-1] != DIR_SEPARATOR_2
#endif
)
p--;
return p;
}
/* Report an internal compiler error in a friendly manner and without
dumping core. There are two versions because __FUNCTION__ isn't
available except in gcc 2.7 and later. */
extern void fatal PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void
fancy_abort (file, line, function)
const char *file;
int line;
const char *function;
{
if (function == NULL)
function = "?";
fatal (
"Internal compiler error in `%s', at %s:%d\n\
Please submit a full bug report.\n\
See <URL:http://www.gnu.org/software/gcc/faq.html#bugreport> \
for instructions.",
function, trim_filename (file), line);
}

View File

@ -1544,6 +1544,20 @@ extern int supports_one_only PROTO ((void));
extern void init_rtl PROTO ((void));
extern void rtx_free PROTO ((rtx));
/* Redefine abort to report an internal error w/o coredump, and
reporting the location of the error in the source file. This logic
is duplicated in rtl.h and tree.h because every file that needs the
special abort includes one or both. toplev.h gets too few files,
system.h gets too many. */
extern void fancy_abort PROTO((const char *, int, const char *))
ATTRIBUTE_NORETURN;
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
#define abort() fancy_abort (__FILE__, __LINE__, 0)
#else
#define abort() fancy_abort (__FILE__, __LINE__, __PRETTY_FUNCTION__)
#endif
/* In alias.c */
extern int true_dependence PROTO ((rtx, enum machine_mode, rtx,
int (*)(rtx)));

View File

@ -384,28 +384,9 @@ extern int setrlimit ();
#define volatile
#endif
/* Redefine abort to report an internal error w/o coredump, and reporting the
location of the error in the source file.
Some files undefine abort again, so we must prototype the real thing
for their sake. */
#ifdef NEED_DECLARATION_ABORT
extern void abort ();
#endif
extern void fatal PVPROTO((const char *, ...)) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
#define abort() fatal ("Internal compiler error at %s:%d\n", \
trim_filename (__FILE__), __LINE__)
#else
#define abort() fatal ("Internal compiler error in `%s', at %s:%d\n" \
"Please submit a full bug report.\n" \
"See <URL:http://www.gnu.org/software/gcc/faq.html#bugreport> for instructions.", \
__PRETTY_FUNCTION__, trim_filename (__FILE__), __LINE__)
#endif /* recent gcc */
/* trim_filename is in toplev.c. Define a stub macro for files that
don't link toplev.c. toplev.h will reset it to the real version. */
#define trim_filename(x) (x)
/* Define a STRINGIFY macro that's right for ANSI or traditional C.
HAVE_CPP_STRINGIFY only refers to the stage1 compiler. Assume that

View File

@ -1454,44 +1454,6 @@ fatal_io_error (name)
exit (FATAL_EXIT_CODE);
}
/* Called to give a better error message for a bad insn rather than
just calling abort(). */
void
fatal_insn VPROTO((const char *msgid, rtx insn, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
rtx insn;
#endif
va_list ap;
VA_START (ap, insn);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
insn = va_arg (ap, rtx);
#endif
verror (msgid, ap);
debug_rtx (insn);
exit (FATAL_EXIT_CODE);
}
/* Called to give a better error message when we don't have an insn to match
what we are looking for or if the insn's constraints aren't satisfied,
rather than just calling abort(). */
void
fatal_insn_not_found (insn)
rtx insn;
{
if (INSN_CODE (insn) < 0)
fatal_insn ("internal error--unrecognizable insn:", insn);
else
fatal_insn ("internal error--insn does not satisfy its constraints:", insn);
}
/* This is the default decl_printable_name function. */
static char *
@ -1953,6 +1915,33 @@ fatal VPROTO((const char *msgid, ...))
va_end (ap);
}
void
_fatal_insn (msgid, insn, file, line, function)
const char *msgid;
rtx insn;
const char *file;
int line;
const char *function;
{
error (msgid);
debug_rtx (insn);
fancy_abort (file, line, function);
}
void
_fatal_insn_not_found (insn, file, line, function)
rtx insn;
const char *file;
int line;
const char *function;
{
if (INSN_CODE (insn) < 0)
_fatal_insn ("Unrecognizable insn:", insn, file, line, function);
else
_fatal_insn ("Insn does not satisfy its constraints:",
insn, file, line, function);
}
/* Report a warning at line LINE of file FILE. */
static void
@ -2243,41 +2232,6 @@ sorry VPROTO((const char *msgid, ...))
va_end (ap);
}
/* Given a partial pathname as input, return another pathname that shares
no elements with the pathname of __FILE__. This is used by abort() to
print `Internal compiler error in expr.c' instead of `Internal compiler
error in ../../egcs/gcc/expr.c'. */
const char *
trim_filename (name)
const char *name;
{
static const char *this_file = __FILE__;
const char *p = name, *q = this_file;
while (*p == *q && *p != 0 && *q != 0) p++, q++;
while (p > name && p[-1] != DIR_SEPARATOR
#ifdef DIR_SEPARATOR_2
&& p[-1] != DIR_SEPARATOR_2
#endif
)
p--;
return p;
}
/* More 'friendly' abort that prints the line and file.
config.h can #define abort fancy_abort if you like that sort of thing.
I don't think this is actually a good idea.
Other sorts of crashes will look a certain way.
It is a good thing if crashes from calling abort look the same way.
-- RMS */
void
fancy_abort ()
{
fatal ("internal gcc abort");
}
/* This calls abort and is used to avoid problems when abort if a macro.
It is used when we need to pass the address of abort. */

View File

@ -41,11 +41,27 @@ extern void fatal_io_error PROTO ((const char *))
ATTRIBUTE_NORETURN;
extern void pfatal_with_name PROTO ((const char *))
ATTRIBUTE_NORETURN;
extern void fatal_insn_not_found PROTO ((struct rtx_def *))
extern void _fatal_insn_not_found PROTO ((struct rtx_def *,
const char *, int,
const char *))
ATTRIBUTE_NORETURN;
extern void fatal_insn PVPROTO ((const char *,
struct rtx_def *, ...))
ATTRIBUTE_PRINTF(1, 3) ATTRIBUTE_NORETURN;
extern void _fatal_insn PROTO ((const char *,
struct rtx_def *,
const char *, int,
const char *))
ATTRIBUTE_NORETURN;
#if defined __GNUC__ && (__GNUC__ > 2 || __GNUC_MINOR__ > 6)
#define fatal_insn(msgid, insn) \
_fatal_insn (msgid, insn, __FILE__, __LINE__, __PRETTY_FUNCTION__)
#define fatal_insn_not_found(insn) \
_fatal_insn_not_found (insn, __FILE__, __LINE__, __PRETTY_FUNCTION__)
#else
#define fatal_insn(msgid, insn) \
_fatal_insn (msgid, insn, __FILE__, __LINE__, 0)
#define fatal_insn_not_found(insn) \
_fatal_insn_not_found (insn, __FILE__, __LINE__, 0)
#endif
extern void warning PVPROTO ((const char *, ...))
ATTRIBUTE_PRINTF_1;
extern void error PVPROTO ((const char *, ...))
@ -100,8 +116,6 @@ extern int do_float_handler PROTO((void (*) (PTR), PTR));
extern void output_quoted_string PROTO ((FILE *, const char *));
extern void output_file_directive PROTO ((FILE *, const char *));
#endif
extern void fancy_abort PROTO ((void)) ATTRIBUTE_NORETURN;
extern void do_abort PROTO ((void)) ATTRIBUTE_NORETURN;
extern void botch PROTO ((const char *))
ATTRIBUTE_NORETURN;
@ -111,8 +125,6 @@ extern void fnotice PROTO ((FILE *, const char *, ...))
ATTRIBUTE_PRINTF_2;
#endif
#undef trim_filename
extern const char *trim_filename PROTO ((const char *));
extern int wrapup_global_declarations PROTO ((union tree_node **, int));
extern void check_global_declarations PROTO ((union tree_node **, int));
extern int errorcount;

View File

@ -5073,14 +5073,9 @@ get_set_constructor_bytes (init, buffer, wd_size)
return non_const_bits;
}
#ifdef ENABLE_CHECKING
#if defined __GNUC__ && (__GNUC__ > 2 || __GNUC_MINOR__ > 6)
#if defined ENABLE_CHECKING && (__GNUC__ > 2 || __GNUC_MINOR__ > 6)
/* Complain that the tree code of NODE does not match the expected CODE.
FILE, LINE, and FUNCTION are of the caller.
FIXME: should print the blather about reporting the bug. */
FILE, LINE, and FUNCTION are of the caller. */
void
tree_check_failed (node, code, file, line, function)
const tree node;
@ -5089,10 +5084,9 @@ tree_check_failed (node, code, file, line, function)
int line;
const char *function;
{
fatal ("Internal compiler error in `%s', at %s:%d:\n\
\texpected %s, have %s\n",
function, trim_filename (file), line,
error ("Tree check: expected %s, have %s",
tree_code_name[code], tree_code_name[TREE_CODE (node)]);
fancy_abort (file, line, function);
}
/* Similar to above, except that we check for a class of tree
@ -5105,81 +5099,12 @@ tree_class_check_failed (node, cl, file, line, function)
int line;
const char *function;
{
fatal ("Internal compiler error in `%s', at %s:%d:\n\
\texpected '%c', have '%c' (%s)\n",
function, trim_filename (file), line, cl,
TREE_CODE_CLASS (TREE_CODE (node)),
error ("Tree check: expected class '%c', have '%c' (%s)",
cl, TREE_CODE_CLASS (TREE_CODE (node)),
tree_code_name[TREE_CODE (node)]);
fancy_abort (file, line, function);
}
#else /* not gcc or old gcc */
/* These functions are just like the above, but they have to
do the check as well as report the error. */
tree
tree_check (node, code, file, line)
const tree node;
enum tree_code code;
const char *file;
int line;
{
if (TREE_CODE (node) == code)
return node;
fatal ("Internal compiler error at %s:%d:\n\texpected %s, have %s\n",
file, trim_filename (file), tree_code_name[code], tree_code_name[TREE_CODE(node)]);
}
tree
tree_class_check (node, class, file, line)
const tree node;
char class;
const char *file;
int line;
{
if (TREE_CODE_CLASS (TREE_CODE (node)) == class)
return node;
fatal ("Internal compiler error at %s:%d:\n\
\texpected '%c', have '%c' (%s)\n",
file, trim_filename (file), class, TREE_CODE_CLASS (TREE_CODE (node)),
tree_code_name[TREE_CODE(node)]);
}
tree
cst_or_constructor_check (node, file, line)
const tree node;
const char *file;
int line;
{
enum tree_code code = TREE_CODE (node);
if (code == CONSTRUCTOR || TREE_CODE_CLASS (code) == 'c')
return node;
fatal ("Internal compiler error at %s:%d:\n\
\texpected constructor, have %s\n",
file, line, tree_code_name[code]);
}
tree
expr_check (node, file, line)
const tree node;
const char *file;
int line;
{
char c = TREE_CODE_CLASS (TREE_CODE (node));
if (c == 'r' || c == 's' || c == '<'
|| c == '1' || c == '2' || c == 'e')
return node;
fatal ("Internal compiler error at %s:%d:\n\
\texpected 'e', have '%c' (%s)\n",
file, trim_filename (file), c, tree_code_name[TREE_CODE (node)]);
}
#endif /* not gcc or old gcc */
#endif /* ENABLE_CHECKING */
/* Return the alias set for T, which may be either a type or an

View File

@ -312,14 +312,8 @@ struct tree_common
/* When checking is enabled, errors will be generated if a tree node
is accessed incorrectly. The macros abort with a fatal error. */
#if defined ENABLE_CHECKING && (__GNUC__ > 2 || __GNUC_MINOR__ > 6)
#ifdef ENABLE_CHECKING
#if defined __GNUC__ && (__GNUC__ > 2 || __GNUC_MINOR__ > 6)
/* This optimization can only be done in stage2/3, because it
uses statement expressions. You might think that you could use
conditional (?:) expressions, but you would be wrong: these macros
need to evaluate `t' only once. */
#define TREE_CHECK(t, code) \
({ const tree __t = t; \
if (TREE_CODE(__t) != (code)) \
@ -357,25 +351,7 @@ extern void tree_class_check_failed PROTO((const tree, char,
const char *, int, const char *))
ATTRIBUTE_NORETURN;
#else /* not gcc or old gcc */
#define TREE_CHECK(t, code) \
tree_check (t, code, __FILE__, __LINE__)
#define TREE_CLASS_CHECK(t, code) \
tree_class_check (t, code, __FILE__, __LINE__)
#define CST_OR_CONSTRUCTOR_CHECK(t) \
cst_or_constructor_check (t, __FILE__, __LINE__)
#define EXPR_CHECK(t) \
expr_check (t, __FILE__, __LINE__)
extern tree tree_check PROTO((const tree, enum tree_code, const char *, int));
extern tree tree_class_check PROTO((const tree, char, const char *, int));
extern tree cst_or_constructor_check PROTO((const tree, const char *, int));
extern tree expr_check PROTO((const tree, enum tree_code, const char *, int));
#endif /* not gcc or old gcc */
#else /* not ENABLE_CHECKING */
#else /* not ENABLE_CHECKING, or not gcc */
#define TREE_CHECK(t, code) (t)
#define TREE_CLASS_CHECK(t, code) (t)
@ -2425,3 +2401,18 @@ extern void dwarf2out_begin_prologue PROTO((void));
code for a function definition. */
extern void dwarf2out_end_epilogue PROTO((void));
/* Redefine abort to report an internal error w/o coredump, and
reporting the location of the error in the source file. This logic
is duplicated in rtl.h and tree.h because every file that needs the
special abort includes one or both. toplev.h gets too few files,
system.h gets too many. */
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
extern void fancy_abort PROTO((const char *, int)) ATTRIBUTE_NORETURN;
#define abort() fancy_abort (__FILE__, __LINE__)
#else
extern void fancy_abort PROTO((const char *, int, const char *))
ATTRIBUTE_NORETURN;
#define abort() fancy_abort (__FILE__, __LINE__, __PRETTY_FUNCTION__)
#endif

View File

@ -68,3 +68,24 @@ varray_grow (va, n)
return va;
}
/* Check the bounds of a varray access. */
#if defined ENABLE_CHECKING && (__GNUC__ > 2 || __GNUC_MINOR__ > 6)
extern void error PVPROTO ((const char *, ...)) ATTRIBUTE_PRINTF_1;
void
varray_check_failed (va, n, file, line, function)
varray_type va;
size_t n;
const char *file;
int line;
const char *function;
{
error("Virtual array %s[%lu]: element %lu out of bounds",
va->name, (unsigned long) va->num_elements, (unsigned long) n);
fancy_abort (file, line, function);
}
#endif

View File

@ -162,38 +162,41 @@ extern varray_type varray_grow PROTO((varray_type, size_t));
#define VARRAY_SIZE(VA) ((VA)->num_elements)
/* Check for VARRAY_xxx macros being in bound, return N for use as an
index. */
#ifdef ENABLE_CHECKING
#define VARRAY_CHECK(VA, N) \
((((size_t)(N) < (VA)->num_elements) \
? 0 \
: (fatal ("Virtual array %s element %ld out of bounds, at %s:%d", \
(VA)->name, (long)(N), __FILE__, __LINE__), 0)), \
(N))
/* Check for VARRAY_xxx macros being in bound. */
#if defined ENABLE_CHECKING && (__GNUC__ > 2 || __GNUC_MINOR__ > 6)
extern void varray_check_failed PROTO ((varray_type, size_t,
const char *, int,
const char *)) ATTRIBUTE_NORETURN;
#define VARRAY_CHECK(VA, N, T) \
(*({ varray_type _va = VA; \
size_t _n = N; \
if (_n >= _va->num_elements) \
varray_check_failed (_va, _n, __FILE__, __LINE__, \
__PRETTY_FUNCTION__); \
&_va->data.T[_n]; }))
#else
#define VARRAY_CHECK(VA, N) (N)
#define VARRAY_CHECK(VA, N, T) ((VA)->data.T[N])
#endif
#define VARRAY_CHAR(VA, N) ((VA)->data.c[ VARRAY_CHECK (VA, N) ])
#define VARRAY_UCHAR(VA, N) ((VA)->data.uc[ VARRAY_CHECK (VA, N) ])
#define VARRAY_SHORT(VA, N) ((VA)->data.s[ VARRAY_CHECK (VA, N) ])
#define VARRAY_USHORT(VA, N) ((VA)->data.us[ VARRAY_CHECK (VA, N) ])
#define VARRAY_INT(VA, N) ((VA)->data.i[ VARRAY_CHECK (VA, N) ])
#define VARRAY_UINT(VA, N) ((VA)->data.u[ VARRAY_CHECK (VA, N) ])
#define VARRAY_LONG(VA, N) ((VA)->data.l[ VARRAY_CHECK (VA, N) ])
#define VARRAY_ULONG(VA, N) ((VA)->data.ul[ VARRAY_CHECK (VA, N) ])
#define VARRAY_WIDE_INT(VA, N) ((VA)->data.hint[ VARRAY_CHECK (VA, N) ])
#define VARRAY_UWIDE_INT(VA, N) ((VA)->data.uhint[ VARRAY_CHECK (VA, N) ])
#define VARRAY_GENERIC_PTR(VA,N) ((VA)->data.generic[ VARRAY_CHECK (VA, N) ])
#define VARRAY_CHAR_PTR(VA,N) ((VA)->data.cptr[ VARRAY_CHECK (VA, N) ])
#define VARRAY_RTX(VA, N) ((VA)->data.rtx[ VARRAY_CHECK (VA, N) ])
#define VARRAY_RTVEC(VA, N) ((VA)->data.rtvec[ VARRAY_CHECK (VA, N) ])
#define VARRAY_TREE(VA, N) ((VA)->data.tree[ VARRAY_CHECK (VA, N) ])
#define VARRAY_BITMAP(VA, N) ((VA)->data.bitmap[ VARRAY_CHECK (VA, N) ])
#define VARRAY_SCHED(VA, N) ((VA)->data.sched[ VARRAY_CHECK (VA, N) ])
#define VARRAY_REG(VA, N) ((VA)->data.reg[ VARRAY_CHECK (VA, N) ])
#define VARRAY_CONST_EQUIV(VA, N) ((VA)->data.const_equiv[VARRAY_CHECK (VA, N)])
#define VARRAY_BB(VA, N) ((VA)->data.bb[ VARRAY_CHECK (VA, N) ])
#define VARRAY_CHAR(VA, N) VARRAY_CHECK (VA, N, c)
#define VARRAY_UCHAR(VA, N) VARRAY_CHECK (VA, N, uc)
#define VARRAY_SHORT(VA, N) VARRAY_CHECK (VA, N, s)
#define VARRAY_USHORT(VA, N) VARRAY_CHECK (VA, N, us)
#define VARRAY_INT(VA, N) VARRAY_CHECK (VA, N, i)
#define VARRAY_UINT(VA, N) VARRAY_CHECK (VA, N, u)
#define VARRAY_LONG(VA, N) VARRAY_CHECK (VA, N, l)
#define VARRAY_ULONG(VA, N) VARRAY_CHECK (VA, N, ul)
#define VARRAY_WIDE_INT(VA, N) VARRAY_CHECK (VA, N, hint)
#define VARRAY_UWIDE_INT(VA, N) VARRAY_CHECK (VA, N, uhint)
#define VARRAY_GENERIC_PTR(VA,N) VARRAY_CHECK (VA, N, generic)
#define VARRAY_CHAR_PTR(VA,N) VARRAY_CHECK (VA, N, cptr)
#define VARRAY_RTX(VA, N) VARRAY_CHECK (VA, N, rtx)
#define VARRAY_RTVEC(VA, N) VARRAY_CHECK (VA, N, rtvec)
#define VARRAY_TREE(VA, N) VARRAY_CHECK (VA, N, tree)
#define VARRAY_BITMAP(VA, N) VARRAY_CHECK (VA, N, bitmap)
#define VARRAY_SCHED(VA, N) VARRAY_CHECK (VA, N, sched)
#define VARRAY_REG(VA, N) VARRAY_CHECK (VA, N, reg)
#define VARRAY_CONST_EQUIV(VA, N) VARRAY_CHECK (VA, N, const_equiv)
#define VARRAY_BB(VA, N) VARRAY_CHECK (VA, N, bb)
#endif /* _VARRAY_H_ */