]>
Commit | Line | Data |
---|---|---|
04b58880 | 1 | /* Basic error reporting routines. |
fbd26352 | 2 | Copyright (C) 1999-2019 Free Software Foundation, Inc. |
04b58880 | 3 | |
f12b58b3 | 4 | This file is part of GCC. |
04b58880 | 5 | |
f12b58b3 | 6 | GCC is free software; you can redistribute it and/or modify it under |
7 | the terms of the GNU General Public License as published by the Free | |
8c4c00c1 | 8 | Software Foundation; either version 3, or (at your option) any later |
f12b58b3 | 9 | version. |
04b58880 | 10 | |
f12b58b3 | 11 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
12 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 | for more details. | |
04b58880 | 15 | |
16 | You should have received a copy of the GNU General Public License | |
8c4c00c1 | 17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ | |
04b58880 | 19 | |
20 | /* warning, error, and fatal. These definitions are suitable for use | |
fdef3332 | 21 | in the generator programs; the compiler has a more elaborate suite |
22 | of diagnostic printers, found in diagnostic.c. */ | |
04b58880 | 23 | |
ed89620f | 24 | #ifdef HOST_GENERATOR_FILE |
117115d0 | 25 | #include "config.h" |
ed89620f | 26 | #define GENERATOR_FILE 1 |
27 | #else | |
28 | #include "bconfig.h" | |
117115d0 | 29 | #endif |
04b58880 | 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 | ||
86931af8 | 43 | void |
44 | warning (const char *format, ...) | |
04b58880 | 45 | { |
ee582a61 | 46 | va_list ap; |
1a97be37 | 47 | |
ee582a61 | 48 | va_start (ap, format); |
04b58880 | 49 | fprintf (stderr, "%s: warning: ", progname); |
50 | vfprintf (stderr, format, ap); | |
ee582a61 | 51 | va_end (ap); |
9af5ce0c | 52 | fputc ('\n', stderr); |
04b58880 | 53 | } |
54 | ||
55 | ||
56 | /* Print an error message - we keep going but the output is unusable. */ | |
57 | ||
58 | void | |
ee582a61 | 59 | error (const char *format, ...) |
04b58880 | 60 | { |
ee582a61 | 61 | va_list ap; |
1a97be37 | 62 | |
ee582a61 | 63 | va_start (ap, format); |
04b58880 | 64 | fprintf (stderr, "%s: ", progname); |
65 | vfprintf (stderr, format, ap); | |
ee582a61 | 66 | va_end (ap); |
9af5ce0c | 67 | fputc ('\n', stderr); |
04b58880 | 68 | |
69 | have_error = 1; | |
70 | } | |
71 | ||
72 | ||
73 | /* Fatal error - terminate execution immediately. Does not return. */ | |
74 | ||
75 | void | |
ee582a61 | 76 | fatal (const char *format, ...) |
04b58880 | 77 | { |
ee582a61 | 78 | va_list ap; |
1a97be37 | 79 | |
ee582a61 | 80 | va_start (ap, format); |
04b58880 | 81 | fprintf (stderr, "%s: ", progname); |
82 | vfprintf (stderr, format, ap); | |
ee582a61 | 83 | va_end (ap); |
9af5ce0c | 84 | fputc ('\n', stderr); |
04b58880 | 85 | exit (FATAL_EXIT_CODE); |
86 | } | |
19fafbd3 | 87 | |
0ae3acac | 88 | /* Similar, but say we got an internal error. */ |
89 | ||
90 | void | |
ee582a61 | 91 | internal_error (const char *format, ...) |
0ae3acac | 92 | { |
ee582a61 | 93 | va_list ap; |
1a97be37 | 94 | |
ee582a61 | 95 | va_start (ap, format); |
aa4c562d | 96 | fprintf (stderr, "%s: Internal error: ", progname); |
0ae3acac | 97 | vfprintf (stderr, format, ap); |
ee582a61 | 98 | va_end (ap); |
0ae3acac | 99 | fputc ('\n', stderr); |
100 | exit (FATAL_EXIT_CODE); | |
101 | } | |
102 | ||
103 | /* Given a partial pathname as input, return another pathname that | |
104 | shares no directory elements with the pathname of __FILE__. This | |
105 | is used by fancy_abort() to print `Internal compiler error in expr.c' | |
106 | instead of `Internal compiler error in ../../GCC/gcc/expr.c'. This | |
4034c43c | 107 | version is meant to be used for the gen* programs and therefor need not |
3d400f58 | 108 | handle subdirectories. */ |
0ae3acac | 109 | |
110 | const char * | |
1a97be37 | 111 | trim_filename (const char *name) |
0ae3acac | 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. */ | |
e1a7f2e1 | 121 | while (p > name && !IS_DIR_SEPARATOR (p[-1])) |
0ae3acac | 122 | p--; |
123 | ||
124 | return p; | |
125 | } | |
126 | ||
19fafbd3 | 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 | |
1a97be37 | 131 | fancy_abort (const char *file, int line, const char *func) |
19fafbd3 | 132 | { |
117115d0 | 133 | internal_error ("abort in %s, at %s:%d", func, trim_filename (file), line); |
19fafbd3 | 134 | } |