0
|
1 /* Basic error reporting routines.
|
|
2 Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008
|
|
3 Free Software Foundation, Inc.
|
|
4
|
|
5 This file is part of GCC.
|
|
6
|
|
7 GCC is free software; you can redistribute it and/or modify it under
|
|
8 the terms of the GNU General Public License as published by the Free
|
|
9 Software Foundation; either version 3, or (at your option) any later
|
|
10 version.
|
|
11
|
|
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
15 for more details.
|
|
16
|
|
17 You should have received a copy of the GNU General Public License
|
|
18 along with GCC; see the file COPYING3. If not see
|
|
19 <http://www.gnu.org/licenses/>. */
|
|
20
|
|
21 /* warning, error, and fatal. These definitions are suitable for use
|
|
22 in the generator programs; the compiler has a more elaborate suite
|
|
23 of diagnostic printers, found in diagnostic.c. */
|
|
24
|
|
25 #ifdef GENERATOR_FILE
|
|
26 #include "bconfig.h"
|
|
27 #else
|
|
28 #include "config.h"
|
|
29 #endif
|
|
30 #include "system.h"
|
|
31 #include "errors.h"
|
|
32
|
|
33 /* Set this to argv[0] at the beginning of main. */
|
|
34
|
|
35 const char *progname;
|
|
36
|
|
37 /* Starts out 0, set to 1 if error is called. */
|
|
38
|
|
39 int have_error = 0;
|
|
40
|
|
41 /* Print a warning message - output produced, but there may be problems. */
|
|
42
|
|
43 bool
|
|
44 warning (int opt ATTRIBUTE_UNUSED, const char *format, ...)
|
|
45 {
|
|
46 va_list ap;
|
|
47
|
|
48 va_start (ap, format);
|
|
49 fprintf (stderr, "%s: warning: ", progname);
|
|
50 vfprintf (stderr, format, ap);
|
|
51 va_end (ap);
|
|
52 fputc('\n', stderr);
|
|
53 return true;
|
|
54 }
|
|
55
|
|
56
|
|
57 /* Print an error message - we keep going but the output is unusable. */
|
|
58
|
|
59 void
|
|
60 error (const char *format, ...)
|
|
61 {
|
|
62 va_list ap;
|
|
63
|
|
64 va_start (ap, format);
|
|
65 fprintf (stderr, "%s: ", progname);
|
|
66 vfprintf (stderr, format, ap);
|
|
67 va_end (ap);
|
|
68 fputc('\n', stderr);
|
|
69
|
|
70 have_error = 1;
|
|
71 }
|
|
72
|
|
73
|
|
74 /* Fatal error - terminate execution immediately. Does not return. */
|
|
75
|
|
76 void
|
|
77 fatal (const char *format, ...)
|
|
78 {
|
|
79 va_list ap;
|
|
80
|
|
81 va_start (ap, format);
|
|
82 fprintf (stderr, "%s: ", progname);
|
|
83 vfprintf (stderr, format, ap);
|
|
84 va_end (ap);
|
|
85 fputc('\n', stderr);
|
|
86 exit (FATAL_EXIT_CODE);
|
|
87 }
|
|
88
|
|
89 /* Similar, but say we got an internal error. */
|
|
90
|
|
91 void
|
|
92 internal_error (const char *format, ...)
|
|
93 {
|
|
94 va_list ap;
|
|
95
|
|
96 va_start (ap, format);
|
|
97 fprintf (stderr, "%s: Internal error: ", progname);
|
|
98 vfprintf (stderr, format, ap);
|
|
99 va_end (ap);
|
|
100 fputc ('\n', stderr);
|
|
101 exit (FATAL_EXIT_CODE);
|
|
102 }
|
|
103
|
|
104 /* Given a partial pathname as input, return another pathname that
|
|
105 shares no directory elements with the pathname of __FILE__. This
|
|
106 is used by fancy_abort() to print `Internal compiler error in expr.c'
|
|
107 instead of `Internal compiler error in ../../GCC/gcc/expr.c'. This
|
|
108 version if for the gen* programs and so needn't handle subdirectories. */
|
|
109
|
|
110 const char *
|
|
111 trim_filename (const char *name)
|
|
112 {
|
|
113 static const char this_file[] = __FILE__;
|
|
114 const char *p = name, *q = this_file;
|
|
115
|
|
116 /* Skip any parts the two filenames have in common. */
|
|
117 while (*p == *q && *p != 0 && *q != 0)
|
|
118 p++, q++;
|
|
119
|
|
120 /* Now go backwards until the previous directory separator. */
|
|
121 while (p > name && !IS_DIR_SEPARATOR (p[-1]))
|
|
122 p--;
|
|
123
|
|
124 return p;
|
|
125 }
|
|
126
|
|
127 /* "Fancy" abort. Reports where in the compiler someone gave up.
|
|
128 This file is used only by build programs, so we're not as polite as
|
|
129 the version in diagnostic.c. */
|
|
130 void
|
|
131 fancy_abort (const char *file, int line, const char *func)
|
|
132 {
|
|
133 internal_error ("abort in %s, at %s:%d", func, trim_filename (file), line);
|
|
134 }
|