1 /* Basic error reporting routines. 2 Copyright (C) 1999-2013 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.c. */ 23 24 #ifdef GENERATOR_FILE 25 #include "bconfig.h" 26 #else 27 #include "config.h" 28 #endif 29 #include "system.h" 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 43 warning (const char *format, ...) 44 { 45 va_list ap; 46 47 va_start (ap, format); 48 fprintf (stderr, "%s: warning: ", progname); 49 vfprintf (stderr, format, ap); 50 va_end (ap); 51 fputc('\n', stderr); 52 } 53 54 55 /* Print an error message - we keep going but the output is unusable. */ 56 57 void 58 error (const char *format, ...) 59 { 60 va_list ap; 61 62 va_start (ap, format); 63 fprintf (stderr, "%s: ", progname); 64 vfprintf (stderr, format, ap); 65 va_end (ap); 66 fputc('\n', stderr); 67 68 have_error = 1; 69 } 70 71 72 /* Fatal error - terminate execution immediately. Does not return. */ 73 74 void 75 fatal (const char *format, ...) 76 { 77 va_list ap; 78 79 va_start (ap, format); 80 fprintf (stderr, "%s: ", progname); 81 vfprintf (stderr, format, ap); 82 va_end (ap); 83 fputc('\n', stderr); 84 exit (FATAL_EXIT_CODE); 85 } 86 87 /* Similar, but say we got an internal error. */ 88 89 void 90 internal_error (const char *format, ...) 91 { 92 va_list ap; 93 94 va_start (ap, format); 95 fprintf (stderr, "%s: Internal error: ", progname); 96 vfprintf (stderr, format, ap); 97 va_end (ap); 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 106 version is meant to be used for the gen* programs and therefor need not 107 handle subdirectories. */ 108 109 const char * 110 trim_filename (const char *name) 111 { 112 static const char this_file[] = __FILE__; 113 const char *p = name, *q = this_file; 114 115 /* Skip any parts the two filenames have in common. */ 116 while (*p == *q && *p != 0 && *q != 0) 117 p++, q++; 118 119 /* Now go backwards until the previous directory separator. */ 120 while (p > name && !IS_DIR_SEPARATOR (p[-1])) 121 p--; 122 123 return p; 124 } 125 126 /* "Fancy" abort. Reports where in the compiler someone gave up. 127 This file is used only by build programs, so we're not as polite as 128 the version in diagnostic.c. */ 129 void 130 fancy_abort (const char *file, int line, const char *func) 131 { 132 internal_error ("abort in %s, at %s:%d", func, trim_filename (file), line); 133 } 134