errors.c 3.39 KB
Newer Older
Zack Weinberg committed
1
/* Basic error reporting routines.
2
   Copyright (C) 1999, 2000, 2001, 2003, 2004
3
   Free Software Foundation, Inc.
Zack Weinberg committed
4

5
This file is part of GCC.
Zack Weinberg committed
6

7 8 9 10
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
Zack Weinberg committed
11

12 13 14 15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
Zack Weinberg committed
16 17

You should have received a copy of the GNU General Public License
18 19 20
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */
Zack Weinberg committed
21 22

/* warning, error, and fatal.  These definitions are suitable for use
23 24
   in the generator programs; the compiler has a more elaborate suite
   of diagnostic printers, found in diagnostic.c.  */
Zack Weinberg committed
25

26
#ifdef GENERATOR_FILE
27
#include "bconfig.h"
28 29 30
#else
#include "config.h"
#endif
Zack Weinberg committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44
#include "system.h"
#include "errors.h"

/* Set this to argv[0] at the beginning of main.  */

const char *progname;

/* Starts out 0, set to 1 if error is called.  */

int have_error = 0;

/* Print a warning message - output produced, but there may be problems.  */

void
45
warning (const char *format, ...)
Zack Weinberg committed
46
{
47
  va_list ap;
48

49
  va_start (ap, format);
Zack Weinberg committed
50 51
  fprintf (stderr, "%s: warning: ", progname);
  vfprintf (stderr, format, ap);
52
  va_end (ap);
Zack Weinberg committed
53 54 55 56 57 58 59
  fputc('\n', stderr);
}


/* Print an error message - we keep going but the output is unusable.  */

void
60
error (const char *format, ...)
Zack Weinberg committed
61
{
62
  va_list ap;
63

64
  va_start (ap, format);
Zack Weinberg committed
65 66
  fprintf (stderr, "%s: ", progname);
  vfprintf (stderr, format, ap);
67
  va_end (ap);
Zack Weinberg committed
68 69 70 71 72 73 74 75 76
  fputc('\n', stderr);

  have_error = 1;
}


/* Fatal error - terminate execution immediately.  Does not return.  */

void
77
fatal (const char *format, ...)
Zack Weinberg committed
78
{
79
  va_list ap;
80

81
  va_start (ap, format);
Zack Weinberg committed
82 83
  fprintf (stderr, "%s: ", progname);
  vfprintf (stderr, format, ap);
84
  va_end (ap);
Zack Weinberg committed
85 86 87
  fputc('\n', stderr);
  exit (FATAL_EXIT_CODE);
}
88

89 90 91
/* Similar, but say we got an internal error.  */

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 101 102 103 104 105 106 107
  fputc ('\n', stderr);
  exit (FATAL_EXIT_CODE);
}

/* Given a partial pathname as input, return another pathname that
   shares no directory elements with the pathname of __FILE__.  This
   is used by fancy_abort() to print `Internal compiler error in expr.c'
   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 114 115 116 117 118 119 120
{
  static const char this_file[] = __FILE__;
  const char *p = name, *q = this_file;

  /* Skip any parts the two filenames have in common.  */
  while (*p == *q && *p != 0 && *q != 0)
    p++, q++;

  /* Now go backwards until the previous directory separator.  */
121
  while (p > name && !IS_DIR_SEPARATOR (p[-1]))
122 123 124 125 126
    p--;

  return p;
}

127 128 129 130
/* "Fancy" abort.  Reports where in the compiler someone gave up.
   This file is used only by build programs, so we're not as polite as
   the version in diagnostic.c.  */
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
}