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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [cp/] [g++spec.c] - Blame information for rev 714

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

Line No. Rev Author Line
1 710 jeremybenn
/* Specific flags and argument handling of the C++ front end.
2
   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3
   2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4
 
5
This file is part of GCC.
6
 
7
GCC is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 3, or (at your option)
10
any later version.
11
 
12
GCC is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
GNU General Public License for more details.
16
 
17
You should have received a copy of the GNU General Public License
18
along with GCC; see the file COPYING3.  If not see
19
<http://www.gnu.org/licenses/>.  */
20
 
21
#include "config.h"
22
#include "system.h"
23
#include "coretypes.h"
24
#include "tm.h"
25
#include "gcc.h"
26
#include "opts.h"
27
 
28
/* This bit is set if we saw a `-xfoo' language specification.  */
29
#define LANGSPEC        (1<<1)
30
/* This bit is set if they did `-lm' or `-lmath'.  */
31
#define MATHLIB         (1<<2)
32
/* This bit is set if they did `-lc'.  */
33
#define WITHLIBC        (1<<3)
34
/* Skip this option.  */
35
#define SKIPOPT         (1<<4)
36
 
37
#ifndef MATH_LIBRARY
38
#define MATH_LIBRARY "m"
39
#endif
40
#ifndef MATH_LIBRARY_PROFILE
41
#define MATH_LIBRARY_PROFILE MATH_LIBRARY
42
#endif
43
 
44
#ifndef LIBSTDCXX
45
#define LIBSTDCXX "stdc++"
46
#endif
47
#ifndef LIBSTDCXX_PROFILE
48
#define LIBSTDCXX_PROFILE LIBSTDCXX
49
#endif
50
#ifndef LIBSTDCXX_STATIC
51
#define LIBSTDCXX_STATIC NULL
52
#endif
53
 
54
void
55
lang_specific_driver (struct cl_decoded_option **in_decoded_options,
56
                      unsigned int *in_decoded_options_count,
57
                      int *in_added_libraries)
58
{
59
  unsigned int i, j;
60
 
61
  /* If nonzero, the user gave us the `-p' or `-pg' flag.  */
62
  int saw_profile_flag = 0;
63
 
64
  /* What do with libstdc++:
65
     -1 means we should not link in libstdc++
66
 
67
     1  means libstdc++ is needed and should be linked in.
68
     2  means libstdc++ is needed and should be linked statically.  */
69
  int library = 0;
70
 
71
  /* The number of arguments being added to what's in argv, other than
72
     libraries.  We use this to track the number of times we've inserted
73
     -xc++/-xnone.  */
74
  int added = 0;
75
 
76
  /* The new argument list will be contained in this.  */
77
  struct cl_decoded_option *new_decoded_options;
78
 
79
  /* Nonzero if we saw a `-xfoo' language specification on the
80
     command line.  Used to avoid adding our own -xc++ if the user
81
     already gave a language for the file.  */
82
  int saw_speclang = 0;
83
 
84
  /* "-lm" or "-lmath" if it appears on the command line.  */
85
  const struct cl_decoded_option *saw_math = NULL;
86
 
87
  /* "-lc" if it appears on the command line.  */
88
  const struct cl_decoded_option *saw_libc = NULL;
89
 
90
  /* An array used to flag each argument that needs a bit set for
91
     LANGSPEC, MATHLIB, or WITHLIBC.  */
92
  int *args;
93
 
94
  /* By default, we throw on the math library if we have one.  */
95
  int need_math = (MATH_LIBRARY[0] != '\0');
96
 
97
  /* True if we saw -static.  */
98
  int static_link = 0;
99
 
100
  /* True if we should add -shared-libgcc to the command-line.  */
101
  int shared_libgcc = 1;
102
 
103
  /* The total number of arguments with the new stuff.  */
104
  unsigned int argc;
105
 
106
  /* The argument list.  */
107
  struct cl_decoded_option *decoded_options;
108
 
109
  /* The number of libraries added in.  */
110
  int added_libraries;
111
 
112
  /* The total number of arguments with the new stuff.  */
113
  unsigned int num_args = 1;
114
 
115
  argc = *in_decoded_options_count;
116
  decoded_options = *in_decoded_options;
117
  added_libraries = *in_added_libraries;
118
 
119
  args = XCNEWVEC (int, argc);
120
 
121
  for (i = 1; i < argc; i++)
122
    {
123
      const char *arg = decoded_options[i].arg;
124
      if (decoded_options[i].errors & CL_ERR_MISSING_ARG)
125
        continue; /* Avoid examining arguments of options missing them.  */
126
 
127
      switch (decoded_options[i].opt_index)
128
        {
129
        case OPT_nostdlib:
130
        case OPT_nodefaultlibs:
131
          library = -1;
132
          break;
133
 
134
        case OPT_l:
135
          if (strcmp (arg, MATH_LIBRARY) == 0)
136
            {
137
              args[i] |= MATHLIB;
138
              need_math = 0;
139
            }
140
          else if (strcmp (arg, "c") == 0)
141
            args[i] |= WITHLIBC;
142
          else
143
            /* Unrecognized libraries (e.g. -lfoo) may require libstdc++.  */
144
            library = (library == 0) ? 1 : library;
145
          break;
146
 
147
        case OPT_pg:
148
        case OPT_p:
149
          saw_profile_flag++;
150
          break;
151
 
152
        case OPT_x:
153
          if (library == 0
154
              && (strcmp (arg, "c++") == 0
155
                  || strcmp (arg, "c++-cpp-output") == 0
156
                  || strcmp (arg, "objective-c++") == 0
157
                  || strcmp (arg, "objective-c++-cpp-output") == 0))
158
            library = 1;
159
 
160
          saw_speclang = 1;
161
          break;
162
 
163
        case OPT_Xlinker:
164
        case OPT_Wl_:
165
          /* Arguments that go directly to the linker might be .o files,
166
             or something, and so might cause libstdc++ to be needed.  */
167
          if (library == 0)
168
            library = 1;
169
          break;
170
 
171
        case OPT_c:
172
        case OPT_S:
173
        case OPT_E:
174
        case OPT_M:
175
        case OPT_MM:
176
        case OPT_fsyntax_only:
177
          /* Don't specify libraries if we won't link, since that would
178
             cause a warning.  */
179
          library = -1;
180
          break;
181
 
182
        case OPT_static:
183
          static_link = 1;
184
          break;
185
 
186
        case OPT_static_libgcc:
187
          shared_libgcc = 0;
188
          break;
189
 
190
        case OPT_static_libstdc__:
191
          library = library >= 0 ? 2 : library;
192
          args[i] |= SKIPOPT;
193
          break;
194
 
195
        case OPT_SPECIAL_input_file:
196
          {
197
            int len;
198
 
199
            /* We don't do this anymore, since we don't get them with minus
200
               signs on them.  */
201
            if (arg[0] == '\0' || arg[1] == '\0')
202
              continue;
203
 
204
            if (saw_speclang)
205
              {
206
                saw_speclang = 0;
207
                continue;
208
              }
209
 
210
            /* If the filename ends in .[chi], put options around it.
211
               But not if a specified -x option is currently active.  */
212
            len = strlen (arg);
213
            if (len > 2
214
                && (arg[len - 1] == 'c'
215
                    || arg[len - 1] == 'i'
216
                    || arg[len - 1] == 'h')
217
                && arg[len - 2] == '.')
218
              {
219
                args[i] |= LANGSPEC;
220
                added += 2;
221
              }
222
 
223
            /* If we don't know that this is a header file, we might
224
               need to be linking in the libraries.  */
225
            if (library == 0)
226
              {
227
                if ((len <= 2 || strcmp (arg + (len - 2), ".H") != 0)
228
                    && (len <= 2 || strcmp (arg + (len - 2), ".h") != 0)
229
                    && (len <= 4 || strcmp (arg + (len - 4), ".hpp") != 0)
230
                    && (len <= 3 || strcmp (arg + (len - 3), ".hp") != 0)
231
                    && (len <= 4 || strcmp (arg + (len - 4), ".hxx") != 0)
232
                    && (len <= 4 || strcmp (arg + (len - 4), ".h++") != 0)
233
                    && (len <= 4 || strcmp (arg + (len - 4), ".HPP") != 0)
234
                    && (len <= 4 || strcmp (arg + (len - 4), ".tcc") != 0)
235
                    && (len <= 3 || strcmp (arg + (len - 3), ".hh") != 0))
236
                  library = 1;
237
              }
238
          }
239
          break;
240
        }
241
    }
242
 
243
  /* There's no point adding -shared-libgcc if we don't have a shared
244
     libgcc.  */
245
#ifndef ENABLE_SHARED_LIBGCC
246
  shared_libgcc = 0;
247
#endif
248
 
249
  /* Add one for shared_libgcc or extra static library.  */
250
  num_args = argc + added + need_math + (library > 0) * 4 + 1;
251
  new_decoded_options = XNEWVEC (struct cl_decoded_option, num_args);
252
 
253
  i = 0;
254
  j = 0;
255
 
256
  /* Copy the 0th argument, i.e., the name of the program itself.  */
257
  new_decoded_options[j++] = decoded_options[i++];
258
 
259
  /* NOTE: We start at 1 now, not 0.  */
260
  while (i < argc)
261
    {
262
      new_decoded_options[j] = decoded_options[i];
263
 
264
      /* Make sure -lstdc++ is before the math library, since libstdc++
265
         itself uses those math routines.  */
266
      if (!saw_math && (args[i] & MATHLIB) && library > 0)
267
        {
268
          --j;
269
          saw_math = &decoded_options[i];
270
        }
271
 
272
      if (!saw_libc && (args[i] & WITHLIBC) && library > 0)
273
        {
274
          --j;
275
          saw_libc = &decoded_options[i];
276
        }
277
 
278
      /* Wrap foo.[chi] files in a language specification to
279
         force the gcc compiler driver to run cc1plus on them.  */
280
      if (args[i] & LANGSPEC)
281
        {
282
          const char *arg = decoded_options[i].arg;
283
          int len = strlen (arg);
284
          switch (arg[len - 1])
285
            {
286
            case 'c':
287
              generate_option (OPT_x, "c++", 1, CL_DRIVER,
288
                               &new_decoded_options[j++]);
289
              break;
290
            case 'i':
291
              generate_option (OPT_x, "c++-cpp-output", 1, CL_DRIVER,
292
                               &new_decoded_options[j++]);
293
              break;
294
            case 'h':
295
              generate_option (OPT_x, "c++-header", 1, CL_DRIVER,
296
                               &new_decoded_options[j++]);
297
              break;
298
            default:
299
              gcc_unreachable ();
300
            }
301
          new_decoded_options[j++] = decoded_options[i];
302
          generate_option (OPT_x, "none", 1, CL_DRIVER,
303
                           &new_decoded_options[j]);
304
        }
305
 
306
      if ((args[i] & SKIPOPT) != 0)
307
        --j;
308
 
309
      i++;
310
      j++;
311
    }
312
 
313
  /* Add `-lstdc++' if we haven't already done so.  */
314
  if (library > 0)
315
    {
316
#ifdef HAVE_LD_STATIC_DYNAMIC
317
      if (library > 1 && !static_link)
318
        {
319
          generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER,
320
                           &new_decoded_options[j]);
321
          j++;
322
        }
323
#endif
324
      generate_option (OPT_l,
325
                       saw_profile_flag ? LIBSTDCXX_PROFILE : LIBSTDCXX, 1,
326
                       CL_DRIVER, &new_decoded_options[j]);
327
      added_libraries++;
328
      j++;
329
      /* Add target-dependent static library, if necessary.  */
330
      if ((static_link || library > 1) && LIBSTDCXX_STATIC != NULL)
331
        {
332
          generate_option (OPT_l, LIBSTDCXX_STATIC, 1,
333
                           CL_DRIVER, &new_decoded_options[j]);
334
          added_libraries++;
335
          j++;
336
        }
337
#ifdef HAVE_LD_STATIC_DYNAMIC
338
      if (library > 1 && !static_link)
339
        {
340
          generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER,
341
                           &new_decoded_options[j]);
342
          j++;
343
        }
344
#endif
345
    }
346
  if (saw_math)
347
    new_decoded_options[j++] = *saw_math;
348
  else if (library > 0 && need_math)
349
    {
350
      generate_option (OPT_l,
351
                       saw_profile_flag ? MATH_LIBRARY_PROFILE : MATH_LIBRARY,
352
                       1, CL_DRIVER, &new_decoded_options[j]);
353
      added_libraries++;
354
      j++;
355
    }
356
  if (saw_libc)
357
    new_decoded_options[j++] = *saw_libc;
358
  if (shared_libgcc && !static_link)
359
    generate_option (OPT_shared_libgcc, NULL, 1, CL_DRIVER,
360
                     &new_decoded_options[j++]);
361
 
362
  *in_decoded_options_count = j;
363
  *in_decoded_options = new_decoded_options;
364
  *in_added_libraries = added_libraries;
365
}
366
 
367
/* Called before linking.  Returns 0 on success and -1 on failure.  */
368
int lang_specific_pre_link (void)  /* Not used for C++.  */
369
{
370
  return 0;
371
}
372
 
373
/* Number of extra output files that lang_specific_pre_link may generate.  */
374
int lang_specific_extra_outfiles = 0;  /* Not used for C++.  */

powered by: WebSVN 2.1.0

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