1 | /* Basic error reporting routines. |
2 | Copyright (C) 1999-2023 Free Software Foundation, Inc. |
3 | |
4 | This file is part of GCC. |
5 | |
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 |
8 | Software Foundation; either version 3, or (at your option) any later |
9 | version. |
10 | |
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. |
15 | |
16 | You should have received a copy of the GNU General Public License |
17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ |
19 | |
20 | /* warning, error, and fatal. These definitions are suitable for use |
21 | in the generator programs; the compiler has a more elaborate suite |
22 | of diagnostic printers, found in diagnostic.cc. */ |
23 | |
24 | #ifdef HOST_GENERATOR_FILE |
25 | #include "config.h" |
26 | #define GENERATOR_FILE 1 |
27 | #else |
28 | #include "bconfig.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 | void |
44 | warning (const char *format, ...) |
45 | { |
46 | va_list ap; |
47 | |
48 | va_start (ap, format); |
49 | fprintf (stderr, format: "%s: warning: " , progname); |
50 | vfprintf (stderr, format: format, arg: ap); |
51 | va_end (ap); |
52 | fputc ('\n', stderr); |
53 | } |
54 | |
55 | |
56 | /* Print an error message - we keep going but the output is unusable. */ |
57 | |
58 | void |
59 | error (const char *format, ...) |
60 | { |
61 | va_list ap; |
62 | |
63 | va_start (ap, format); |
64 | fprintf (stderr, format: "%s: " , progname); |
65 | vfprintf (stderr, format: format, arg: ap); |
66 | va_end (ap); |
67 | fputc ('\n', stderr); |
68 | |
69 | have_error = 1; |
70 | } |
71 | |
72 | |
73 | /* Fatal error - terminate execution immediately. Does not return. */ |
74 | |
75 | void |
76 | fatal (const char *format, ...) |
77 | { |
78 | va_list ap; |
79 | |
80 | va_start (ap, format); |
81 | fprintf (stderr, format: "%s: " , progname); |
82 | vfprintf (stderr, format: format, arg: ap); |
83 | va_end (ap); |
84 | fputc ('\n', stderr); |
85 | exit (FATAL_EXIT_CODE); |
86 | } |
87 | |
88 | /* Similar, but say we got an internal error. */ |
89 | |
90 | void |
91 | internal_error (const char *format, ...) |
92 | { |
93 | va_list ap; |
94 | |
95 | va_start (ap, format); |
96 | fprintf (stderr, format: "%s: Internal error: " , progname); |
97 | vfprintf (stderr, format: format, arg: ap); |
98 | va_end (ap); |
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.cc' |
106 | instead of `Internal compiler error in ../../GCC/gcc/expr.cc'. This |
107 | version is meant to be used for the gen* programs and therefor need not |
108 | 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.cc. */ |
130 | void |
131 | fancy_abort (const char *file, int line, const char *func) |
132 | { |
133 | internal_error (format: "abort in %s, at %s:%d" , func, trim_filename (name: file), line); |
134 | } |
135 | |