OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [cppspec.c] - Blame information for rev 867

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
/* Specific flags and argument handling of the C preprocessor.
2
   Copyright (C) 1999, 2007 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
#include "config.h"
21
#include "system.h"
22
#include "coretypes.h"
23
#include "tm.h"
24
#include "gcc.h"
25
 
26
/* The `cpp' executable installed in $(bindir) and $(cpp_install_dir)
27
   is a customized version of the gcc driver.  It forces -E; -S and -c
28
   are errors.  It defaults to -x c for files with unrecognized
29
   extensions, unless -x options appear in argv, in which case we
30
   assume the user knows what they're doing.  If no explicit input is
31
   mentioned, it will read stdin.  */
32
 
33
#ifndef SWITCH_TAKES_ARG
34
#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
35
#endif
36
 
37
#ifndef WORD_SWITCH_TAKES_ARG
38
#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
39
#endif
40
 
41
/* Suffixes for known sorts of input files.  Note that we do not list
42
   files which are normally considered to have been preprocessed already,
43
   since the user's expectation is that `cpp' always preprocesses.  */
44
static const char *const known_suffixes[] =
45
{
46
  ".c",  ".C",   ".S",   ".m",
47
  ".cc", ".cxx", ".cpp", ".cp",  ".c++",
48
  NULL
49
};
50
 
51
/* Filter argc and argv before processing by the gcc driver proper.  */
52
void
53
lang_specific_driver (int *in_argc, const char *const **in_argv,
54
                      int *in_added_libraries ATTRIBUTE_UNUSED)
55
{
56
  int argc = *in_argc;
57
  const char *const *argv = *in_argv;
58
 
59
  /* Do we need to read stdin? */
60
  int read_stdin = 1;
61
 
62
  /* Do we need to insert -E? */
63
  int need_E = 1;
64
 
65
  /* Have we seen an input file? */
66
  int seen_input = 0;
67
 
68
  /* Positions to insert -xc, -xassembler-with-cpp, and -o, if necessary.
69
 
70
  int lang_c_here = 0;
71
  int lang_S_here = 0;
72
  int o_here = 0;
73
 
74
  /* Do we need to fix up an input file with an unrecognized suffix? */
75
  int need_fixups = 1;
76
 
77
  int i, j, quote = 0;
78
  const char **new_argv;
79
  int new_argc;
80
  extern int is_cpp_driver;
81
 
82
  is_cpp_driver = 1;
83
 
84
  /* First pass.  If we see an -S or -c, barf.  If we see an input file,
85
     turn off read_stdin.  If we see a second input file, it is actually
86
     the output file.  If we see a third input file, barf.  */
87
  for (i = 1; i < argc; i++)
88
    {
89
      if (quote == 1)
90
        {
91
          quote = 0;
92
          continue;
93
        }
94
 
95
      if (argv[i][0] == '-')
96
        {
97
          if (argv[i][1] == '\0')
98
            read_stdin = 0;
99
          else if (argv[i][2] == '\0')
100
            {
101
              if (argv[i][1] == 'E')
102
                need_E = 0;
103
              else if (argv[i][1] == 'S' || argv[i][1] == 'c')
104
                {
105
                  fatal ("\"%s\" is not a valid option to the preprocessor",
106
                         argv[i]);
107
                  return;
108
                }
109
              else if (argv[i][1] == 'x')
110
                {
111
                  need_fixups = 0;
112
                  quote = 1;
113
                }
114
              else if (SWITCH_TAKES_ARG (argv[i][1]))
115
                quote = 1;
116
            }
117
          else if (argv[i][1] == 'x')
118
            need_fixups = 0;
119
          else if (WORD_SWITCH_TAKES_ARG (&argv[i][1]))
120
            quote = 1;
121
        }
122
      else /* not an option */
123
        {
124
          seen_input++;
125
          if (seen_input == 3)
126
            {
127
              fatal ("too many input files");
128
              return;
129
            }
130
          else if (seen_input == 2)
131
            {
132
              o_here = i;
133
            }
134
          else
135
            {
136
              read_stdin = 0;
137
              if (need_fixups)
138
                {
139
                  int l = strlen (argv[i]);
140
                  int known = 0;
141
                  const char *const *suff;
142
 
143
                  for (suff = known_suffixes; *suff; suff++)
144
                    if (!strcmp (*suff, &argv[i][l - strlen(*suff)]))
145
                      {
146
                        known = 1;
147
                        break;
148
                      }
149
 
150
                  if (! known)
151
                    {
152
                      /* .s files are a special case; we have to treat
153
                         them like .S files so -D__ASSEMBLER__ will be
154
                         in effect.  */
155
                      if (!strcmp (".s", &argv[i][l - 2]))
156
                        lang_S_here = i;
157
                      else
158
                        lang_c_here = i;
159
                    }
160
                }
161
            }
162
        }
163
    }
164
 
165
  /* If we don't need to edit the command line, we can bail early.  */
166
 
167
  new_argc = argc + need_E + read_stdin
168
    + !!o_here + !!lang_c_here + !!lang_S_here;
169
 
170
  if (new_argc == argc)
171
    return;
172
 
173
  /* One more slot for a terminating null.  */
174
  new_argv = XNEWVEC (const char *, new_argc + 1);
175
 
176
  new_argv[0] = argv[0];
177
  j = 1;
178
 
179
  if (need_E)
180
    new_argv[j++] = "-E";
181
 
182
  for (i = 1; i < argc; i++, j++)
183
    {
184
      if (i == lang_c_here)
185
        new_argv[j++] = "-xc";
186
      else if (i == lang_S_here)
187
        new_argv[j++] = "-xassembler-with-cpp";
188
      else if (i == o_here)
189
        new_argv[j++] = "-o";
190
 
191
      new_argv[j] = argv[i];
192
    }
193
 
194
  if (read_stdin)
195
    new_argv[j++] = "-";
196
 
197
  new_argv[j] = NULL;
198
  *in_argc = new_argc;
199
  *in_argv = new_argv;
200
}
201
 
202
/* Called before linking.  Returns 0 on success and -1 on failure.  */
203
int lang_specific_pre_link (void)
204
{
205
  return 0;  /* Not used for cpp.  */
206
}
207
 
208
/* Number of extra output files that lang_specific_pre_link may generate.  */
209
int lang_specific_extra_outfiles = 0;  /* Not used for cpp.  */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.