]>
Commit | Line | Data |
---|---|---|
f8b6598e | 1 | /* Basic error reporting routines. |
3d7aafde AJ |
2 | Copyright (C) 1999, 2000, 2001, 2003 |
3 | Free Software Foundation, Inc. | |
f8b6598e | 4 | |
1322177d | 5 | This file is part of GCC. |
f8b6598e | 6 | |
1322177d LB |
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 2, or (at your option) any later | |
10 | version. | |
f8b6598e | 11 | |
1322177d LB |
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. | |
f8b6598e ZW |
16 | |
17 | You should have received a copy of the GNU General Public License | |
1322177d LB |
18 | along with GCC; see the file COPYING. If not, write to the Free |
19 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA | |
20 | 02111-1307, USA. */ | |
f8b6598e ZW |
21 | |
22 | /* warning, error, and fatal. These definitions are suitable for use | |
23 | in the generator programs; eventually we would like to use them in | |
24 | cc1 too, but that's a longer term project. */ | |
25 | ||
26 | #include "config.h" | |
27 | #include "system.h" | |
4977bab6 ZW |
28 | #include "coretypes.h" |
29 | #include "tm.h" | |
f8b6598e ZW |
30 | #include "errors.h" |
31 | ||
32 | /* Set this to argv[0] at the beginning of main. */ | |
33 | ||
34 | const char *progname; | |
35 | ||
36 | /* Starts out 0, set to 1 if error is called. */ | |
37 | ||
38 | int have_error = 0; | |
39 | ||
40 | /* Print a warning message - output produced, but there may be problems. */ | |
41 | ||
42 | void | |
e34d07f2 | 43 | warning (const char *format, ...) |
f8b6598e | 44 | { |
e34d07f2 | 45 | va_list ap; |
3d7aafde | 46 | |
e34d07f2 | 47 | va_start (ap, format); |
f8b6598e ZW |
48 | fprintf (stderr, "%s: warning: ", progname); |
49 | vfprintf (stderr, format, ap); | |
e34d07f2 | 50 | va_end (ap); |
f8b6598e ZW |
51 | fputc('\n', stderr); |
52 | } | |
53 | ||
54 | ||
55 | /* Print an error message - we keep going but the output is unusable. */ | |
56 | ||
57 | void | |
e34d07f2 | 58 | error (const char *format, ...) |
f8b6598e | 59 | { |
e34d07f2 | 60 | va_list ap; |
3d7aafde | 61 | |
e34d07f2 | 62 | va_start (ap, format); |
f8b6598e ZW |
63 | fprintf (stderr, "%s: ", progname); |
64 | vfprintf (stderr, format, ap); | |
e34d07f2 | 65 | va_end (ap); |
f8b6598e ZW |
66 | fputc('\n', stderr); |
67 | ||
68 | have_error = 1; | |
69 | } | |
70 | ||
71 | ||
72 | /* Fatal error - terminate execution immediately. Does not return. */ | |
73 | ||
74 | void | |
e34d07f2 | 75 | fatal (const char *format, ...) |
f8b6598e | 76 | { |
e34d07f2 | 77 | va_list ap; |
3d7aafde | 78 | |
e34d07f2 | 79 | va_start (ap, format); |
f8b6598e ZW |
80 | fprintf (stderr, "%s: ", progname); |
81 | vfprintf (stderr, format, ap); | |
e34d07f2 | 82 | va_end (ap); |
f8b6598e ZW |
83 | fputc('\n', stderr); |
84 | exit (FATAL_EXIT_CODE); | |
85 | } | |
fbfc1192 | 86 | |
f900ecd8 RK |
87 | /* Similar, but say we got an internal error. */ |
88 | ||
89 | void | |
e34d07f2 | 90 | internal_error (const char *format, ...) |
f900ecd8 | 91 | { |
e34d07f2 | 92 | va_list ap; |
3d7aafde | 93 | |
e34d07f2 | 94 | va_start (ap, format); |
1f3b37a3 | 95 | fprintf (stderr, "%s: Internal error: ", progname); |
f900ecd8 | 96 | vfprintf (stderr, format, ap); |
e34d07f2 | 97 | va_end (ap); |
f900ecd8 RK |
98 | fputc ('\n', stderr); |
99 | exit (FATAL_EXIT_CODE); | |
100 | } | |
101 | ||
102 | /* Given a partial pathname as input, return another pathname that | |
103 | shares no directory elements with the pathname of __FILE__. This | |
104 | is used by fancy_abort() to print `Internal compiler error in expr.c' | |
105 | instead of `Internal compiler error in ../../GCC/gcc/expr.c'. This | |
a1f300c0 | 106 | version if for the gen* programs and so needn't handle subdirectories. */ |
f900ecd8 RK |
107 | |
108 | const char * | |
3d7aafde | 109 | trim_filename (const char *name) |
f900ecd8 RK |
110 | { |
111 | static const char this_file[] = __FILE__; | |
112 | const char *p = name, *q = this_file; | |
113 | ||
114 | /* Skip any parts the two filenames have in common. */ | |
115 | while (*p == *q && *p != 0 && *q != 0) | |
116 | p++, q++; | |
117 | ||
118 | /* Now go backwards until the previous directory separator. */ | |
119 | while (p > name && p[-1] != DIR_SEPARATOR | |
120 | #ifdef DIR_SEPARATOR_2 | |
121 | && p[-1] != DIR_SEPARATOR_2 | |
122 | #endif | |
123 | ) | |
124 | p--; | |
125 | ||
126 | return p; | |
127 | } | |
128 | ||
fbfc1192 ZW |
129 | /* "Fancy" abort. Reports where in the compiler someone gave up. |
130 | This file is used only by build programs, so we're not as polite as | |
131 | the version in diagnostic.c. */ | |
132 | void | |
3d7aafde | 133 | fancy_abort (const char *file, int line, const char *func) |
fbfc1192 | 134 | { |
f900ecd8 | 135 | internal_error ("abort in %s, at %s:%d", func, file, line); |
fbfc1192 | 136 | } |