toplev.c (notice, [...]): Move to diagnostic.c

1999-12-18 Gabriel Dos Reis  <gdr@codesourcery.com>

        * toplev.c (notice, vmessage, v_message_with_file_and_line,
        v_message_with_decl, file_and_line_for_asm,
        v_error_with_file_and_line, v_error_with_decl, v_error_for_asm,
        verror, vfatal, v_warning_with_file_and_line, v_warning_with_decl,
        v_warning_for_asm, vwarning, vpedwarn, v_pedwarn_with_decl,
        v_pedwarn_with_file_and_line, vsorry, vnotice, count_error,
        pfatal_with_name, fatal_io_error, need_error_newline,
        last_error_function, last_error_tick, announce_function,
        default_print_error_function, print_error_function,
        report_error_function, fnotice, error_with_file_and_line,
        error_with_decl, error_for_asm, error, set_fatal_function, fatal,
        _fatal_insn, _fatal_insn_not_found, warning_with_file_and_line,
        warning_with_decl, warning_for_asm, warning, pedwarn,
        pedwarn_with_decl, pedwarn_with_file_and_line, sorry): Move to
        diagnostic.c
        (compile_file): Use fnotice instead of notice.  Adjust call.

        * diagnostic.c: New file.

        * Makefile.in (OBJS): Include diagnostic.o
        (diagnostic.o): Define dependence.

From-SVN: r31003
This commit is contained in:
Gabriel Dos Reis 1999-12-18 01:45:40 +00:00 committed by Gabriel Dos Reis
parent ccfe7d0a0d
commit 6ed551b487
4 changed files with 964 additions and 875 deletions

View File

@ -1,3 +1,27 @@
1999-12-18 Gabriel Dos Reis <gdr@codesourcery.com>
* toplev.c (notice, vmessage, v_message_with_file_and_line,
v_message_with_decl, file_and_line_for_asm,
v_error_with_file_and_line, v_error_with_decl, v_error_for_asm,
verror, vfatal, v_warning_with_file_and_line, v_warning_with_decl,
v_warning_for_asm, vwarning, vpedwarn, v_pedwarn_with_decl,
v_pedwarn_with_file_and_line, vsorry, vnotice, count_error,
pfatal_with_name, fatal_io_error, need_error_newline,
last_error_function, last_error_tick, announce_function,
default_print_error_function, print_error_function,
report_error_function, fnotice, error_with_file_and_line,
error_with_decl, error_for_asm, error, set_fatal_function, fatal,
_fatal_insn, _fatal_insn_not_found, warning_with_file_and_line,
warning_with_decl, warning_for_asm, warning, pedwarn,
pedwarn_with_decl, pedwarn_with_file_and_line, sorry): Move to
diagnostic.c
(compile_file): Use fnotice instead of notice. Adjust call.
* diagnostic.c: New file.
* Makefile.in (OBJS): Include diagnostic.o
(diagnostic.o): Define dependence.
1999-12-18 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.h (ASM_OUTPUT_XXX): Wrap in do-while(0).

View File

@ -656,7 +656,8 @@ C_AND_OBJC_OBJS = c-lex.o c-pragma.o c-decl.o c-typeck.o c-convert.o \
C_OBJS = c-parse.o c-lang.o $(C_AND_OBJC_OBJS)
# Language-independent object files.
OBJS = toplev.o version.o tree.o print-tree.o stor-layout.o fold-const.o \
OBJS = diagnostic.o \
toplev.o version.o tree.o print-tree.o stor-layout.o fold-const.o \
function.o stmt.o except.o expr.o calls.o expmed.o explow.o optabs.o real.o \
builtins.o intl.o varasm.o rtl.o print-rtl.o rtlanal.o emit-rtl.o genrtl.o \
dbxout.o sdbout.o dwarfout.o dwarf2out.o xcoffout.o bitmap.o alias.o gcse.o \
@ -748,7 +749,7 @@ DEMANGLE_H = $(srcdir)/../include/demangle.h
RECOG_H = recog.h
EXPR_H = expr.h insn-codes.h
REGS_H = regs.h varray.h $(MACHMODE_H)
INTEGRATE_H = integrate.h varray.h
INTREGRATE_H = integrate.h varray.h
LOOP_H = loop.h varray.h
#
# Language makefile fragments.
@ -1463,6 +1464,8 @@ stor-layout.o : stor-layout.c $(CONFIG_H) system.h $(TREE_H) flags.h \
function.h $(EXPR_H) $(RTL_H) toplev.h ggc.h
fold-const.o : fold-const.c $(CONFIG_H) system.h $(TREE_H) flags.h toplev.h \
$(RTL_H) ggc.h
diagnostic.o : $(CONFIG_H) system.h $(TREE_H) $(RTL_H) tm_p.h flags.h \
input.h insn-attr.h insn-codes.h insn-config.h toplev.h intl.h
toplev.o : toplev.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) function.h \
flags.h input.h insn-attr.h xcoffout.h defaults.h output.h \
insn-codes.h insn-config.h intl.h $(RECOG_H) Makefile toplev.h dwarfout.h \

926
gcc/diagnostic.c Normal file
View File

@ -0,0 +1,926 @@
/* Top level of GNU C compiler
Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC 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.
GNU CC 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 GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* This file implements the language independant aspect of diagnostic
message module. */
#include "config.h"
#undef FLOAT /* This is for hpux. They should change hpux. */
#undef FFS /* Some systems define this in param.h. */
#include "system.h"
#include "tree.h"
#include "rtl.h"
#include "tm_p.h"
#include "flags.h"
#include "input.h"
#include "insn-attr.h"
#include "insn-codes.h"
#include "insn-config.h"
#include "toplev.h"
#include "intl.h"
/* Prototypes. */
static void notice PVPROTO((const char *s, ...)) ATTRIBUTE_PRINTF_1;
static void vmessage PROTO((const char *, const char *, va_list));
static void v_message_with_file_and_line PROTO((const char *, int, int,
const char *, va_list));
static void v_message_with_decl PROTO((tree, int, const char *, va_list));
static void file_and_line_for_asm PROTO((rtx, char **, int *));
static void v_error_with_file_and_line PROTO((const char *, int,
const char *, va_list));
static void v_error_with_decl PROTO((tree, const char *, va_list));
static void v_error_for_asm PROTO((rtx, const char *, va_list));
static void verror PROTO((const char *, va_list));
static void vfatal PROTO((const char *, va_list)) ATTRIBUTE_NORETURN;
static void v_warning_with_file_and_line PROTO ((const char *, int,
const char *, va_list));
static void v_warning_with_decl PROTO((tree, const char *, va_list));
static void v_warning_for_asm PROTO((rtx, const char *, va_list));
static void vwarning PROTO((const char *, va_list));
static void vpedwarn PROTO((const char *, va_list));
static void v_pedwarn_with_decl PROTO((tree, const char *, va_list));
static void v_pedwarn_with_file_and_line PROTO((const char *, int,
const char *, va_list));
static void vsorry PROTO((const char *, va_list));
static void report_file_and_line PROTO ((const char *, int, int));
static void vnotice PROTO ((FILE *, const char *, va_list));
extern int rtl_dump_and_exit;
extern int inhibit_warnings;
extern int warnings_are_errors;
extern int warningcount;
extern int errorcount;
static int need_error_newline;
/* Function of last error message;
more generally, function such that if next error message is in it
then we don't have to mention the function name. */
static tree last_error_function = NULL;
/* Used to detect when input_file_stack has changed since last described. */
static int last_error_tick;
/* Called by report_error_function to print out function name.
* Default may be overridden by language front-ends. */
void (*print_error_function) PROTO((const char *)) =
default_print_error_function;
/* Print the message MSGID in FILE. */
static void
vnotice (file, msgid, ap)
FILE *file;
const char *msgid;
va_list ap;
{
vfprintf (file, _(msgid), ap);
}
/* Print MSGID on stderr. */
static void
notice VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, char *);
#endif
vnotice (stderr, msgid, ap);
va_end (ap);
}
/* Report FILE and LINE (or program name), and optionally just WARN. */
static void
report_file_and_line (file, line, warn)
const char *file;
int line;
int warn;
{
if (file)
fprintf (stderr, "%s:%d: ", file, line);
else
fprintf (stderr, "%s: ", progname);
if (warn)
notice ("warning: ");
}
/* Print a PREFIXed MSGID. */
static void
vmessage (prefix, msgid, ap)
const char *prefix;
const char *msgid;
va_list ap;
{
if (prefix)
fprintf (stderr, "%s: ", prefix);
vfprintf (stderr, msgid, ap);
}
/* Print a message relevant to line LINE of file FILE. */
static void
v_message_with_file_and_line (file, line, warn, msgid, ap)
const char *file;
int line;
int warn;
const char *msgid;
va_list ap;
{
report_file_and_line (file, line, warn);
vnotice (stderr, msgid, ap);
fputc ('\n', stderr);
}
/* Print a message relevant to the given DECL. */
static void
v_message_with_decl (decl, warn, msgid, ap)
tree decl;
int warn;
const char *msgid;
va_list ap;
{
const char *p;
report_file_and_line (DECL_SOURCE_FILE (decl),
DECL_SOURCE_LINE (decl), warn);
/* Do magic to get around lack of varargs support for insertion
of arguments into existing list. We know that the decl is first;
we ass_u_me that it will be printed with "%s". */
for (p = _(msgid); *p; ++p)
{
if (*p == '%')
{
if (*(p + 1) == '%')
++p;
else if (*(p + 1) != 's')
abort ();
else
break;
}
}
if (p > _(msgid)) /* Print the left-hand substring. */
{
char fmt[sizeof "%.255s"];
long width = p - _(msgid);
if (width > 255L) width = 255L; /* arbitrary */
sprintf (fmt, "%%.%lds", width);
fprintf (stderr, fmt, _(msgid));
}
if (*p == '%') /* Print the name. */
{
const char *n = (DECL_NAME (decl)
? (*decl_printable_name) (decl, 2)
: "((anonymous))");
fputs (n, stderr);
while (*p)
{
++p;
if (ISALPHA (*(p - 1) & 0xFF))
break;
}
}
if (*p) /* Print the rest of the message. */
vmessage ((char *)NULL, p, ap);
fputc ('\n', stderr);
}
/* Figure file and line of the given INSN. */
static void
file_and_line_for_asm (insn, pfile, pline)
rtx insn;
char **pfile;
int *pline;
{
rtx body = PATTERN (insn);
rtx asmop;
/* Find the (or one of the) ASM_OPERANDS in the insn. */
if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
asmop = SET_SRC (body);
else if (GET_CODE (body) == ASM_OPERANDS)
asmop = body;
else if (GET_CODE (body) == PARALLEL
&& GET_CODE (XVECEXP (body, 0, 0)) == SET)
asmop = SET_SRC (XVECEXP (body, 0, 0));
else if (GET_CODE (body) == PARALLEL
&& GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
asmop = XVECEXP (body, 0, 0);
else
asmop = NULL;
if (asmop)
{
*pfile = ASM_OPERANDS_SOURCE_FILE (asmop);
*pline = ASM_OPERANDS_SOURCE_LINE (asmop);
}
else
{
*pfile = input_filename;
*pline = lineno;
}
}
/* Report an error at line LINE of file FILE. */
static void
v_error_with_file_and_line (file, line, msgid, ap)
const char *file;
int line;
const char *msgid;
va_list ap;
{
count_error (0);
report_error_function (file);
v_message_with_file_and_line (file, line, 0, msgid, ap);
}
/* Report an error at the declaration DECL.
MSGID is a format string which uses %s to substitute the declaration
name; subsequent substitutions are a la printf. */
static void
v_error_with_decl (decl, msgid, ap)
tree decl;
const char *msgid;
va_list ap;
{
count_error (0);
report_error_function (DECL_SOURCE_FILE (decl));
v_message_with_decl (decl, 0, msgid, ap);
}
/* Report an error at the line number of the insn INSN.
This is used only when INSN is an `asm' with operands,
and each ASM_OPERANDS records its own source file and line. */
static void
v_error_for_asm (insn, msgid, ap)
rtx insn;
const char *msgid;
va_list ap;
{
char *file;
int line;
count_error (0);
file_and_line_for_asm (insn, &file, &line);
report_error_function (file);
v_message_with_file_and_line (file, line, 0, msgid, ap);
}
/* Report an error at the current line number. */
static void
verror (msgid, ap)
const char *msgid;
va_list ap;
{
v_error_with_file_and_line (input_filename, lineno, msgid, ap);
}
/* Report a fatal error at the current line number. Allow a front end to
intercept the message. */
static void (*fatal_function) PROTO ((const char *, va_list));
static void
vfatal (msgid, ap)
const char *msgid;
va_list ap;
{
if (fatal_function != 0)
(*fatal_function) (_(msgid), ap);
verror (msgid, ap);
exit (FATAL_EXIT_CODE);
}
/* Report a warning at line LINE of file FILE. */
static void
v_warning_with_file_and_line (file, line, msgid, ap)
const char *file;
int line;
const char *msgid;
va_list ap;
{
if (count_error (1))
{
report_error_function (file);
v_message_with_file_and_line (file, line, 1, msgid, ap);
}
}
/* Report a warning at the declaration DECL.
MSGID is a format string which uses %s to substitute the declaration
name; subsequent substitutions are a la printf. */
static void
v_warning_with_decl (decl, msgid, ap)
tree decl;
const char *msgid;
va_list ap;
{
if (count_error (1))
{
report_error_function (DECL_SOURCE_FILE (decl));
v_message_with_decl (decl, 1, msgid, ap);
}
}
/* Report a warning at the line number of the insn INSN.
This is used only when INSN is an `asm' with operands,
and each ASM_OPERANDS records its own source file and line. */
static void
v_warning_for_asm (insn, msgid, ap)
rtx insn;
const char *msgid;
va_list ap;
{
if (count_error (1))
{
char *file;
int line;
file_and_line_for_asm (insn, &file, &line);
report_error_function (file);
v_message_with_file_and_line (file, line, 1, msgid, ap);
}
}
/* Report a warning at the current line number. */
static void
vwarning (msgid, ap)
const char *msgid;
va_list ap;
{
v_warning_with_file_and_line (input_filename, lineno, msgid, ap);
}
/* These functions issue either warnings or errors depending on
-pedantic-errors. */
static void
vpedwarn (msgid, ap)
const char *msgid;
va_list ap;
{
if (flag_pedantic_errors)
verror (msgid, ap);
else
vwarning (msgid, ap);
}
static void
v_pedwarn_with_decl (decl, msgid, ap)
tree decl;
const char *msgid;
va_list ap;
{
/* We don't want -pedantic-errors to cause the compilation to fail from
"errors" in system header files. Sometimes fixincludes can't fix what's
broken (eg: unsigned char bitfields - fixing it may change the alignment
which will cause programs to mysteriously fail because the C library
or kernel uses the original layout). There's no point in issuing a
warning either, it's just unnecessary noise. */
if (! DECL_IN_SYSTEM_HEADER (decl))
{
if (flag_pedantic_errors)
v_error_with_decl (decl, msgid, ap);
else
v_warning_with_decl (decl, msgid, ap);
}
}
static void
v_pedwarn_with_file_and_line (file, line, msgid, ap)
const char *file;
int line;
const char *msgid;
va_list ap;
{
if (flag_pedantic_errors)
v_error_with_file_and_line (file, line, msgid, ap);
else
v_warning_with_file_and_line (file, line, msgid, ap);
}
/* Apologize for not implementing some feature. */
static void
vsorry (msgid, ap)
const char *msgid;
va_list ap;
{
sorrycount++;
if (input_filename)
fprintf (stderr, "%s:%d: ", input_filename, lineno);
else
fprintf (stderr, "%s: ", progname);
notice ("sorry, not implemented: ");
vnotice (stderr, msgid, ap);
fputc ('\n', stderr);
}
/* Count an error or warning. Return 1 if the message should be printed. */
int
count_error (warningp)
int warningp;
{
if (warningp && inhibit_warnings)
return 0;
if (warningp && !warnings_are_errors)
warningcount++;
else
{
static int warning_message = 0;
if (warningp && !warning_message)
{
notice ("%s: warnings being treated as errors\n", progname);
warning_message = 1;
}
errorcount++;
}
return 1;
}
/* Print a diagnistic MSGID on FILE. */
void
fnotice VPROTO((FILE *file, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
FILE *file;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
file = va_arg (ap, FILE *);
msgid = va_arg (ap, const char *);
#endif
vnotice (file, msgid, ap);
va_end (ap);
}
/* Print a fatal error message. NAME is the text.
Also include a system error message based on `errno'. */
void
pfatal_with_name (name)
const char *name;
{
fprintf (stderr, "%s: ", progname);
perror (name);
exit (FATAL_EXIT_CODE);
}
void
fatal_io_error (name)
const char *name;
{
notice ("%s: %s: I/O error\n", progname, name);
exit (FATAL_EXIT_CODE);
}
/* Issue a pedantic warning MSGID. */
void
pedwarn VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
vpedwarn (msgid, ap);
va_end (ap);
}
/* Issue a pedantic waring about DECL. */
void
pedwarn_with_decl VPROTO((tree decl, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
tree decl;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
decl = va_arg (ap, tree);
msgid = va_arg (ap, const char *);
#endif
v_pedwarn_with_decl (decl, msgid, ap);
va_end (ap);
}
/* Same as above but within the context FILE and LINE. */
void
pedwarn_with_file_and_line VPROTO((const char *file, int line,
const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *file;
int line;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
file = va_arg (ap, const char *);
line = va_arg (ap, int);
msgid = va_arg (ap, const char *);
#endif
v_pedwarn_with_file_and_line (file, line, msgid, ap);
va_end (ap);
}
/* Just apologize with MSGID. */
void
sorry VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
vsorry (msgid, ap);
va_end (ap);
}
/* Called when the start of a function definition is parsed,
this function prints on stderr the name of the function. */
void
announce_function (decl)
tree decl;
{
if (! quiet_flag)
{
if (rtl_dump_and_exit)
fprintf (stderr, "%s ", IDENTIFIER_POINTER (DECL_NAME (decl)));
else
fprintf (stderr, " %s", (*decl_printable_name) (decl, 2));
fflush (stderr);
need_error_newline = 1;
last_error_function = current_function_decl;
}
}
/* The default function to print out name of current function that caused
an error. */
void
default_print_error_function (file)
const char *file;
{
if (last_error_function != current_function_decl)
{
if (file)
fprintf (stderr, "%s: ", file);
if (current_function_decl == NULL)
notice ("At top level:\n");
else
{
if (TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
notice ("In method `%s':\n",
(*decl_printable_name) (current_function_decl, 2));
else
notice ("In function `%s':\n",
(*decl_printable_name) (current_function_decl, 2));
}
last_error_function = current_function_decl;
}
}
/* Prints out, if necessary, the name of the current function
that caused an error. Called from all error and warning functions.
We ignore the FILE parameter, as it cannot be relied upon. */
void
report_error_function (file)
const char *file ATTRIBUTE_UNUSED;
{
struct file_stack *p;
if (need_error_newline)
{
fprintf (stderr, "\n");
need_error_newline = 0;
}
if (input_file_stack && input_file_stack->next != 0
&& input_file_stack_tick != last_error_tick)
{
for (p = input_file_stack->next; p; p = p->next)
if (p == input_file_stack->next)
notice ("In file included from %s:%d", p->name, p->line);
else
notice (",\n from %s:%d", p->name, p->line);
fprintf (stderr, ":\n");
last_error_tick = input_file_stack_tick;
}
(*print_error_function) (input_filename);
}
void
error_with_file_and_line VPROTO((const char *file, int line,
const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *file;
int line;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
file = va_arg (ap, const char *);
line = va_arg (ap, int);
msgid = va_arg (ap, const char *);
#endif
v_error_with_file_and_line (file, line, msgid, ap);
va_end (ap);
}
void
error_with_decl VPROTO((tree decl, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
tree decl;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
decl = va_arg (ap, tree);
msgid = va_arg (ap, const char *);
#endif
v_error_with_decl (decl, msgid, ap);
va_end (ap);
}
void
error_for_asm VPROTO((rtx insn, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
rtx insn;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
insn = va_arg (ap, rtx);
msgid = va_arg (ap, const char *);
#endif
v_error_for_asm (insn, msgid, ap);
va_end (ap);
}
void
error VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
verror (msgid, ap);
va_end (ap);
}
/* Set the function to call when a fatal error occurs. */
void
set_fatal_function (f)
void (*f) PROTO ((const char *, va_list));
{
fatal_function = f;
}
void
fatal VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
vfatal (msgid, ap);
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 ("%s", 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);
}
void
warning_with_file_and_line VPROTO((const char *file, int line,
const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *file;
int line;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
file = va_arg (ap, const char *);
line = va_arg (ap, int);
msgid = va_arg (ap, const char *);
#endif
v_warning_with_file_and_line (file, line, msgid, ap);
va_end (ap);
}
void
warning_with_decl VPROTO((tree decl, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
tree decl;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
decl = va_arg (ap, tree);
msgid = va_arg (ap, const char *);
#endif
v_warning_with_decl (decl, msgid, ap);
va_end (ap);
}
void
warning_for_asm VPROTO((rtx insn, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
rtx insn;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
insn = va_arg (ap, rtx);
msgid = va_arg (ap, const char *);
#endif
v_warning_for_asm (insn, msgid, ap);
va_end (ap);
}
void
warning VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
vwarning (msgid, ap);
va_end (ap);
}

View File

@ -151,30 +151,9 @@ extern char *version_string;
extern int size_directive_output;
extern tree last_assemble_variable_decl;
static void notice PVPROTO((const char *s, ...)) ATTRIBUTE_PRINTF_1;
static void set_target_switch PROTO((const char *));
static const char *decl_name PROTO((tree, int));
static void vmessage PROTO((const char *, const char *, va_list));
static void v_message_with_file_and_line PROTO((const char *, int, int,
const char *, va_list));
static void v_message_with_decl PROTO((tree, int, const char *, va_list));
static void file_and_line_for_asm PROTO((rtx, char **, int *));
static void v_error_with_file_and_line PROTO((const char *, int,
const char *, va_list));
static void v_error_with_decl PROTO((tree, const char *, va_list));
static void v_error_for_asm PROTO((rtx, const char *, va_list));
static void verror PROTO((const char *, va_list));
static void vfatal PROTO((const char *, va_list)) ATTRIBUTE_NORETURN;
static void v_warning_with_file_and_line PROTO ((const char *, int,
const char *, va_list));
static void v_warning_with_decl PROTO((tree, const char *, va_list));
static void v_warning_for_asm PROTO((rtx, const char *, va_list));
static void vwarning PROTO((const char *, va_list));
static void vpedwarn PROTO((const char *, va_list));
static void v_pedwarn_with_decl PROTO((tree, const char *, va_list));
static void v_pedwarn_with_file_and_line PROTO((const char *, int,
const char *, va_list));
static void vsorry PROTO((const char *, va_list));
extern void set_fatal_function PROTO((void (*)(const char *, va_list)));
static void float_signal PROTO((int)) ATTRIBUTE_NORETURN;
static void pipe_closed PROTO((int)) ATTRIBUTE_NORETURN;
@ -189,7 +168,6 @@ static void clean_dump_file PROTO((const char *));
static void compile_file PROTO((char *));
static void display_help PROTO ((void));
static void report_file_and_line PROTO ((const char *, int, int));
static void vnotice PROTO ((FILE *, const char *, va_list));
static void mark_file_stack PROTO ((void *));
static void decode_d_option PROTO ((const char *));
@ -1451,52 +1429,6 @@ print_time (str, total)
(double)total / (double)all_time * 100.0);
}
/* Count an error or warning. Return 1 if the message should be printed. */
int
count_error (warningp)
int warningp;
{
if (warningp && inhibit_warnings)
return 0;
if (warningp && !warnings_are_errors)
warningcount++;
else
{
static int warning_message = 0;
if (warningp && !warning_message)
{
notice ("%s: warnings being treated as errors\n", progname);
warning_message = 1;
}
errorcount++;
}
return 1;
}
/* Print a fatal error message. NAME is the text.
Also include a system error message based on `errno'. */
void
pfatal_with_name (name)
const char *name;
{
fprintf (stderr, "%s: ", progname);
perror (name);
exit (FATAL_EXIT_CODE);
}
void
fatal_io_error (name)
const char *name;
{
notice ("%s: %s: I/O error\n", progname, name);
exit (FATAL_EXIT_CODE);
}
/* This is the default decl_printable_name function. */
static const char *
@ -1525,793 +1457,6 @@ mark_file_stack (p)
stack = stack->next;
}
}
static int need_error_newline;
/* Function of last error message;
more generally, function such that if next error message is in it
then we don't have to mention the function name. */
static tree last_error_function = NULL;
/* Used to detect when input_file_stack has changed since last described. */
static int last_error_tick;
/* Called when the start of a function definition is parsed,
this function prints on stderr the name of the function. */
void
announce_function (decl)
tree decl;
{
if (! quiet_flag)
{
if (rtl_dump_and_exit)
fprintf (stderr, "%s ", IDENTIFIER_POINTER (DECL_NAME (decl)));
else
fprintf (stderr, " %s", (*decl_printable_name) (decl, 2));
fflush (stderr);
need_error_newline = 1;
last_error_function = current_function_decl;
}
}
/* The default function to print out name of current function that caused
an error. */
void
default_print_error_function (file)
const char *file;
{
if (last_error_function != current_function_decl)
{
if (file)
fprintf (stderr, "%s: ", file);
if (current_function_decl == NULL)
notice ("At top level:\n");
else
{
if (TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
notice ("In method `%s':\n",
(*decl_printable_name) (current_function_decl, 2));
else
notice ("In function `%s':\n",
(*decl_printable_name) (current_function_decl, 2));
}
last_error_function = current_function_decl;
}
}
/* Called by report_error_function to print out function name.
* Default may be overridden by language front-ends. */
void (*print_error_function) PROTO((const char *)) =
default_print_error_function;
/* Prints out, if necessary, the name of the current function
that caused an error. Called from all error and warning functions.
We ignore the FILE parameter, as it cannot be relied upon. */
void
report_error_function (file)
const char *file ATTRIBUTE_UNUSED;
{
struct file_stack *p;
if (need_error_newline)
{
fprintf (stderr, "\n");
need_error_newline = 0;
}
if (input_file_stack && input_file_stack->next != 0
&& input_file_stack_tick != last_error_tick)
{
for (p = input_file_stack->next; p; p = p->next)
if (p == input_file_stack->next)
notice ("In file included from %s:%d", p->name, p->line);
else
notice (",\n from %s:%d", p->name, p->line);
fprintf (stderr, ":\n");
last_error_tick = input_file_stack_tick;
}
(*print_error_function) (input_filename);
}
/* Print a message. */
static void
vnotice (file, msgid, ap)
FILE *file;
const char *msgid;
va_list ap;
{
vfprintf (file, _(msgid), ap);
}
static void
notice VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, char *);
#endif
vnotice (stderr, msgid, ap);
va_end (ap);
}
void
fnotice VPROTO((FILE *file, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
FILE *file;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
file = va_arg (ap, FILE *);
msgid = va_arg (ap, const char *);
#endif
vnotice (file, msgid, ap);
va_end (ap);
}
/* Report FILE and LINE (or program name), and optionally just WARN. */
static void
report_file_and_line (file, line, warn)
const char *file;
int line;
int warn;
{
if (file)
fprintf (stderr, "%s:%d: ", file, line);
else
fprintf (stderr, "%s: ", progname);
if (warn)
notice ("warning: ");
}
/* Print a message. */
static void
vmessage (prefix, msgid, ap)
const char *prefix;
const char *msgid;
va_list ap;
{
if (prefix)
fprintf (stderr, "%s: ", prefix);
vfprintf (stderr, msgid, ap);
}
/* Print a message relevant to line LINE of file FILE. */
static void
v_message_with_file_and_line (file, line, warn, msgid, ap)
const char *file;
int line;
int warn;
const char *msgid;
va_list ap;
{
report_file_and_line (file, line, warn);
vnotice (stderr, msgid, ap);
fputc ('\n', stderr);
}
/* Print a message relevant to the given DECL. */
static void
v_message_with_decl (decl, warn, msgid, ap)
tree decl;
int warn;
const char *msgid;
va_list ap;
{
const char *p;
report_file_and_line (DECL_SOURCE_FILE (decl),
DECL_SOURCE_LINE (decl), warn);
/* Do magic to get around lack of varargs support for insertion
of arguments into existing list. We know that the decl is first;
we ass_u_me that it will be printed with "%s". */
for (p = _(msgid); *p; ++p)
{
if (*p == '%')
{
if (*(p + 1) == '%')
++p;
else if (*(p + 1) != 's')
abort ();
else
break;
}
}
if (p > _(msgid)) /* Print the left-hand substring. */
{
char fmt[sizeof "%.255s"];
long width = p - _(msgid);
if (width > 255L) width = 255L; /* arbitrary */
sprintf (fmt, "%%.%lds", width);
fprintf (stderr, fmt, _(msgid));
}
if (*p == '%') /* Print the name. */
{
const char *n = (DECL_NAME (decl)
? (*decl_printable_name) (decl, 2)
: "((anonymous))");
fputs (n, stderr);
while (*p)
{
++p;
if (ISALPHA (*(p - 1) & 0xFF))
break;
}
}
if (*p) /* Print the rest of the message. */
vmessage ((char *)NULL, p, ap);
fputc ('\n', stderr);
}
/* Figure file and line of the given INSN. */
static void
file_and_line_for_asm (insn, pfile, pline)
rtx insn;
char **pfile;
int *pline;
{
rtx body = PATTERN (insn);
rtx asmop;
/* Find the (or one of the) ASM_OPERANDS in the insn. */
if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
asmop = SET_SRC (body);
else if (GET_CODE (body) == ASM_OPERANDS)
asmop = body;
else if (GET_CODE (body) == PARALLEL
&& GET_CODE (XVECEXP (body, 0, 0)) == SET)
asmop = SET_SRC (XVECEXP (body, 0, 0));
else if (GET_CODE (body) == PARALLEL
&& GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
asmop = XVECEXP (body, 0, 0);
else
asmop = NULL;
if (asmop)
{
*pfile = ASM_OPERANDS_SOURCE_FILE (asmop);
*pline = ASM_OPERANDS_SOURCE_LINE (asmop);
}
else
{
*pfile = input_filename;
*pline = lineno;
}
}
/* Report an error at line LINE of file FILE. */
static void
v_error_with_file_and_line (file, line, msgid, ap)
const char *file;
int line;
const char *msgid;
va_list ap;
{
count_error (0);
report_error_function (file);
v_message_with_file_and_line (file, line, 0, msgid, ap);
}
void
error_with_file_and_line VPROTO((const char *file, int line,
const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *file;
int line;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
file = va_arg (ap, const char *);
line = va_arg (ap, int);
msgid = va_arg (ap, const char *);
#endif
v_error_with_file_and_line (file, line, msgid, ap);
va_end (ap);
}
/* Report an error at the declaration DECL.
MSGID is a format string which uses %s to substitute the declaration
name; subsequent substitutions are a la printf. */
static void
v_error_with_decl (decl, msgid, ap)
tree decl;
const char *msgid;
va_list ap;
{
count_error (0);
report_error_function (DECL_SOURCE_FILE (decl));
v_message_with_decl (decl, 0, msgid, ap);
}
void
error_with_decl VPROTO((tree decl, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
tree decl;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
decl = va_arg (ap, tree);
msgid = va_arg (ap, const char *);
#endif
v_error_with_decl (decl, msgid, ap);
va_end (ap);
}
/* Report an error at the line number of the insn INSN.
This is used only when INSN is an `asm' with operands,
and each ASM_OPERANDS records its own source file and line. */
static void
v_error_for_asm (insn, msgid, ap)
rtx insn;
const char *msgid;
va_list ap;
{
char *file;
int line;
count_error (0);
file_and_line_for_asm (insn, &file, &line);
report_error_function (file);
v_message_with_file_and_line (file, line, 0, msgid, ap);
}
void
error_for_asm VPROTO((rtx insn, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
rtx insn;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
insn = va_arg (ap, rtx);
msgid = va_arg (ap, const char *);
#endif
v_error_for_asm (insn, msgid, ap);
va_end (ap);
}
/* Report an error at the current line number. */
static void
verror (msgid, ap)
const char *msgid;
va_list ap;
{
v_error_with_file_and_line (input_filename, lineno, msgid, ap);
}
void
error VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
verror (msgid, ap);
va_end (ap);
}
/* Report a fatal error at the current line number. Allow a front end to
intercept the message. */
static void (*fatal_function) PROTO ((const char *, va_list));
/* Set the function to call when a fatal error occurs. */
void
set_fatal_function (f)
void (*f) PROTO ((const char *, va_list));
{
fatal_function = f;
}
static void
vfatal (msgid, ap)
const char *msgid;
va_list ap;
{
if (fatal_function != 0)
(*fatal_function) (_(msgid), ap);
verror (msgid, ap);
exit (FATAL_EXIT_CODE);
}
void
fatal VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
vfatal (msgid, ap);
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 ("%s", 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
v_warning_with_file_and_line (file, line, msgid, ap)
const char *file;
int line;
const char *msgid;
va_list ap;
{
if (count_error (1))
{
report_error_function (file);
v_message_with_file_and_line (file, line, 1, msgid, ap);
}
}
void
warning_with_file_and_line VPROTO((const char *file, int line,
const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *file;
int line;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
file = va_arg (ap, const char *);
line = va_arg (ap, int);
msgid = va_arg (ap, const char *);
#endif
v_warning_with_file_and_line (file, line, msgid, ap);
va_end (ap);
}
/* Report a warning at the declaration DECL.
MSGID is a format string which uses %s to substitute the declaration
name; subsequent substitutions are a la printf. */
static void
v_warning_with_decl (decl, msgid, ap)
tree decl;
const char *msgid;
va_list ap;
{
if (count_error (1))
{
report_error_function (DECL_SOURCE_FILE (decl));
v_message_with_decl (decl, 1, msgid, ap);
}
}
void
warning_with_decl VPROTO((tree decl, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
tree decl;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
decl = va_arg (ap, tree);
msgid = va_arg (ap, const char *);
#endif
v_warning_with_decl (decl, msgid, ap);
va_end (ap);
}
/* Report a warning at the line number of the insn INSN.
This is used only when INSN is an `asm' with operands,
and each ASM_OPERANDS records its own source file and line. */
static void
v_warning_for_asm (insn, msgid, ap)
rtx insn;
const char *msgid;
va_list ap;
{
if (count_error (1))
{
char *file;
int line;
file_and_line_for_asm (insn, &file, &line);
report_error_function (file);
v_message_with_file_and_line (file, line, 1, msgid, ap);
}
}
void
warning_for_asm VPROTO((rtx insn, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
rtx insn;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
insn = va_arg (ap, rtx);
msgid = va_arg (ap, const char *);
#endif
v_warning_for_asm (insn, msgid, ap);
va_end (ap);
}
/* Report a warning at the current line number. */
static void
vwarning (msgid, ap)
const char *msgid;
va_list ap;
{
v_warning_with_file_and_line (input_filename, lineno, msgid, ap);
}
void
warning VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
vwarning (msgid, ap);
va_end (ap);
}
/* These functions issue either warnings or errors depending on
-pedantic-errors. */
static void
vpedwarn (msgid, ap)
const char *msgid;
va_list ap;
{
if (flag_pedantic_errors)
verror (msgid, ap);
else
vwarning (msgid, ap);
}
void
pedwarn VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
vpedwarn (msgid, ap);
va_end (ap);
}
static void
v_pedwarn_with_decl (decl, msgid, ap)
tree decl;
const char *msgid;
va_list ap;
{
/* We don't want -pedantic-errors to cause the compilation to fail from
"errors" in system header files. Sometimes fixincludes can't fix what's
broken (eg: unsigned char bitfields - fixing it may change the alignment
which will cause programs to mysteriously fail because the C library
or kernel uses the original layout). There's no point in issuing a
warning either, it's just unnecessary noise. */
if (! DECL_IN_SYSTEM_HEADER (decl))
{
if (flag_pedantic_errors)
v_error_with_decl (decl, msgid, ap);
else
v_warning_with_decl (decl, msgid, ap);
}
}
void
pedwarn_with_decl VPROTO((tree decl, const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
tree decl;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
decl = va_arg (ap, tree);
msgid = va_arg (ap, const char *);
#endif
v_pedwarn_with_decl (decl, msgid, ap);
va_end (ap);
}
static void
v_pedwarn_with_file_and_line (file, line, msgid, ap)
const char *file;
int line;
const char *msgid;
va_list ap;
{
if (flag_pedantic_errors)
v_error_with_file_and_line (file, line, msgid, ap);
else
v_warning_with_file_and_line (file, line, msgid, ap);
}
void
pedwarn_with_file_and_line VPROTO((const char *file, int line,
const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *file;
int line;
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
file = va_arg (ap, const char *);
line = va_arg (ap, int);
msgid = va_arg (ap, const char *);
#endif
v_pedwarn_with_file_and_line (file, line, msgid, ap);
va_end (ap);
}
/* Apologize for not implementing some feature. */
static void
vsorry (msgid, ap)
const char *msgid;
va_list ap;
{
sorrycount++;
if (input_filename)
fprintf (stderr, "%s:%d: ", input_filename, lineno);
else
fprintf (stderr, "%s: ", progname);
notice ("sorry, not implemented: ");
vnotice (stderr, msgid, ap);
fputc ('\n', stderr);
}
void
sorry VPROTO((const char *msgid, ...))
{
#ifndef ANSI_PROTOTYPES
const char *msgid;
#endif
va_list ap;
VA_START (ap, msgid);
#ifndef ANSI_PROTOTYPES
msgid = va_arg (ap, const char *);
#endif
vsorry (msgid, ap);
va_end (ap);
}
/* This calls abort and is used to avoid problems when abort if a macro.
@ -3238,7 +2383,7 @@ compile_file (name)
if (yyparse () != 0)
{
if (errorcount == 0)
notice ("Errors detected in input file (your bison.simple is out of date)\n");
fnotice (stderr, "Errors detected in input file (your bison.simple is out of date)\n");
/* In case there were missing closebraces,
get us back to the global binding level. */
@ -3605,14 +2750,6 @@ rest_of_compilation (decl)
collector to reclaim the memory used by the notes. */
remove_unncessary_notes ();
/* In function-at-a-time mode, we do not attempt to keep the BLOCK
tree in sensible shape. So, we just recalculate it here. */
if (current_function->x_whole_function_mode_p)
{
find_loop_tree_blocks ();
unroll_block_trees ();
}
/* If we are reconsidering an inline function
at the end of compilation, skip the stuff for making it inline. */
@ -4068,7 +3205,6 @@ rest_of_compilation (decl)
(flow_time,
{
find_basic_blocks (insns, max_reg_num (), rtl_dump_file, 1);
calculate_loop_depth (rtl_dump_file);
life_analysis (insns, max_reg_num (), rtl_dump_file, 1);
});
@ -4401,6 +3537,12 @@ rest_of_compilation (decl)
ggc_collect ();
#endif
/* Shorten branches. */
TIMEVAR (shorten_branch_time,
{
shorten_branches (get_insns ());
});
#ifdef STACK_REGS
if (stack_reg_dump)
open_dump_file (".20.stack", decl_printable_name (decl, 2));
@ -4418,12 +3560,6 @@ rest_of_compilation (decl)
ggc_collect ();
#endif
/* Shorten branches. */
TIMEVAR (shorten_branch_time,
{
shorten_branches (get_insns ());
});
/* Now turn the rtl into assembler code. */
TIMEVAR (final_time,
@ -5624,7 +4760,7 @@ main (argc, argv)
{
char *lim = (char *) sbrk (0);
notice ("Data size %ld.\n", (long) (lim - (char *) &environ));
fnotice (stderr, "Data size %ld.\n", (long) (lim - (char *) &environ));
fflush (stderr);
#ifndef __MSDOS__