]>
Commit | Line | Data |
---|---|---|
5b76d03b | 1 | /* Specific flags and argument handling of the C++ front-end. |
eeb109f2 | 2 | Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. |
5b76d03b BK |
3 | |
4 | This file is part of GNU CC. | |
5 | ||
6 | GNU CC is free software; you can redistribute it and/or modify | |
7 | it under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 2, or (at your option) | |
9 | any later version. | |
10 | ||
11 | GNU CC is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with GNU CC; see the file COPYING. If not, write to | |
18 | the Free Software Foundation, 59 Temple Place - Suite 330, | |
19 | Boston, MA 02111-1307, USA. */ | |
20 | ||
da20811c | 21 | #include "config.h" |
8d052bc7 | 22 | #include "system.h" |
9257393c | 23 | #include "gcc.h" |
2ba25f50 | 24 | |
f442f723 MS |
25 | /* This bit is set if we saw a `-xfoo' language specification. */ |
26 | #define LANGSPEC (1<<1) | |
27 | /* This bit is set if they did `-lm' or `-lmath'. */ | |
28 | #define MATHLIB (1<<2) | |
29 | /* This bit is set if they did `-lc'. */ | |
30 | #define WITHLIBC (1<<3) | |
31 | ||
32 | #ifndef MATH_LIBRARY | |
33 | #define MATH_LIBRARY "-lm" | |
34 | #endif | |
35 | ||
18cd4ded ME |
36 | #ifndef LIBSTDCXX |
37 | #define LIBSTDCXX "-lstdc++" | |
38 | #endif | |
39 | ||
f442f723 | 40 | void |
9257393c | 41 | lang_specific_driver (in_argc, in_argv, in_added_libraries) |
f442f723 MS |
42 | int *in_argc; |
43 | char ***in_argv; | |
84914634 | 44 | int *in_added_libraries; |
f442f723 MS |
45 | { |
46 | int i, j; | |
47 | ||
48 | /* If non-zero, the user gave us the `-v' flag. */ | |
49 | int saw_verbose_flag = 0; | |
50 | ||
51 | /* This will be 0 if we encounter a situation where we should not | |
52 | link in libstdc++. */ | |
53 | int library = 1; | |
54 | ||
55 | /* The number of arguments being added to what's in argv, other than | |
56 | libraries. We use this to track the number of times we've inserted | |
57 | -xc++/-xnone. */ | |
58 | int added = 2; | |
59 | ||
60 | /* Used to track options that take arguments, so we don't go wrapping | |
61 | those with -xc++/-xnone. */ | |
9257393c | 62 | const char *quote = NULL; |
f442f723 MS |
63 | |
64 | /* The new argument list will be contained in this. */ | |
9257393c KG |
65 | char **real_arglist; |
66 | const char **arglist; | |
f442f723 MS |
67 | |
68 | /* Non-zero if we saw a `-xfoo' language specification on the | |
69 | command line. Used to avoid adding our own -xc++ if the user | |
70 | already gave a language for the file. */ | |
71 | int saw_speclang = 0; | |
72 | ||
73 | /* "-lm" or "-lmath" if it appears on the command line. */ | |
9257393c | 74 | const char *saw_math = 0; |
f442f723 MS |
75 | |
76 | /* "-lc" if it appears on the command line. */ | |
9257393c | 77 | const char *saw_libc = 0; |
f442f723 MS |
78 | |
79 | /* An array used to flag each argument that needs a bit set for | |
80 | LANGSPEC, MATHLIB, or WITHLIBC. */ | |
81 | int *args; | |
82 | ||
b54ccf71 JM |
83 | /* By default, we throw on the math library if we have one. */ |
84 | int need_math = (MATH_LIBRARY[0] != '\0'); | |
f442f723 MS |
85 | |
86 | /* The total number of arguments with the new stuff. */ | |
87 | int argc; | |
88 | ||
89 | /* The argument list. */ | |
90 | char **argv; | |
91 | ||
84914634 JW |
92 | /* The number of libraries added in. */ |
93 | int added_libraries; | |
94 | ||
f442f723 MS |
95 | /* The total number of arguments with the new stuff. */ |
96 | int num_args = 1; | |
97 | ||
eeb109f2 NS |
98 | #if ENABLE_NEW_GXX_ABI |
99 | added++; | |
100 | #endif | |
101 | ||
f442f723 MS |
102 | argc = *in_argc; |
103 | argv = *in_argv; | |
84914634 | 104 | added_libraries = *in_added_libraries; |
f442f723 | 105 | |
9257393c | 106 | args = (int *) xcalloc (argc, sizeof (int)); |
f442f723 | 107 | |
1bf2b2d2 | 108 | for (i = 1; i < argc; i++) |
f442f723 MS |
109 | { |
110 | /* If the previous option took an argument, we swallow it here. */ | |
111 | if (quote) | |
112 | { | |
113 | quote = NULL; | |
114 | continue; | |
115 | } | |
116 | ||
117 | /* We don't do this anymore, since we don't get them with minus | |
118 | signs on them. */ | |
119 | if (argv[i][0] == '\0' || argv[i][1] == '\0') | |
120 | continue; | |
121 | ||
122 | if (argv[i][0] == '-') | |
123 | { | |
1bf2b2d2 BK |
124 | if (library != 0 && (strcmp (argv[i], "-nostdlib") == 0 |
125 | || strcmp (argv[i], "-nodefaultlibs") == 0)) | |
f442f723 MS |
126 | { |
127 | library = 0; | |
128 | } | |
1bf2b2d2 BK |
129 | else if (strcmp (argv[i], "-lm") == 0 |
130 | || strcmp (argv[i], "-lmath") == 0 | |
b54ccf71 | 131 | || strcmp (argv[i], MATH_LIBRARY) == 0 |
f442f723 MS |
132 | #ifdef ALT_LIBM |
133 | || strcmp (argv[i], ALT_LIBM) == 0 | |
134 | #endif | |
135 | ) | |
136 | { | |
137 | args[i] |= MATHLIB; | |
138 | need_math = 0; | |
139 | } | |
1bf2b2d2 | 140 | else if (strcmp (argv[i], "-lc") == 0) |
f442f723 | 141 | args[i] |= WITHLIBC; |
1bf2b2d2 | 142 | else if (strcmp (argv[i], "-v") == 0) |
f442f723 MS |
143 | { |
144 | saw_verbose_flag = 1; | |
1bf2b2d2 | 145 | if (argc == 2) |
f442f723 MS |
146 | { |
147 | /* If they only gave us `-v', don't try to link | |
148 | in libg++. */ | |
149 | library = 0; | |
150 | } | |
151 | } | |
1bf2b2d2 | 152 | else if (strncmp (argv[i], "-x", 2) == 0) |
f442f723 MS |
153 | saw_speclang = 1; |
154 | else if (((argv[i][2] == '\0' | |
155 | && (char *)strchr ("bBVDUoeTuIYmLiA", argv[i][1]) != NULL) | |
1bf2b2d2 | 156 | || strcmp (argv[i], "-Tdata") == 0)) |
f442f723 MS |
157 | quote = argv[i]; |
158 | else if (library != 0 && ((argv[i][2] == '\0' | |
159 | && (char *) strchr ("cSEM", argv[i][1]) != NULL) | |
1bf2b2d2 | 160 | || strcmp (argv[i], "-MM") == 0)) |
f442f723 MS |
161 | { |
162 | /* Don't specify libraries if we won't link, since that would | |
163 | cause a warning. */ | |
164 | library = 0; | |
165 | added -= 2; | |
166 | } | |
167 | else | |
168 | /* Pass other options through. */ | |
169 | continue; | |
170 | } | |
171 | else | |
172 | { | |
173 | int len; | |
174 | ||
175 | if (saw_speclang) | |
176 | { | |
177 | saw_speclang = 0; | |
178 | continue; | |
179 | } | |
180 | ||
181 | /* If the filename ends in .c or .i, put options around it. | |
182 | But not if a specified -x option is currently active. */ | |
183 | len = strlen (argv[i]); | |
184 | if (len > 2 | |
185 | && (argv[i][len - 1] == 'c' || argv[i][len - 1] == 'i') | |
186 | && argv[i][len - 2] == '.') | |
187 | { | |
188 | args[i] |= LANGSPEC; | |
189 | added += 2; | |
190 | } | |
191 | } | |
192 | } | |
193 | ||
194 | if (quote) | |
9257393c | 195 | fatal ("argument to `%s' missing\n", quote); |
f442f723 MS |
196 | |
197 | /* If we know we don't have to do anything, bail now. */ | |
198 | if (! added && ! library) | |
199 | { | |
200 | free (args); | |
201 | return; | |
202 | } | |
203 | ||
732d9b8c MK |
204 | /* Make sure to have room for the trailing NULL argument. */ |
205 | num_args = argc + added + need_math + 1; | |
9257393c KG |
206 | real_arglist = (char **) xmalloc (num_args * sizeof (char *)); |
207 | arglist = (const char **) real_arglist; | |
f442f723 MS |
208 | |
209 | /* NOTE: We start at 1 now, not 0. */ | |
210 | for (i = 0, j = 0; i < argc; i++, j++) | |
211 | { | |
212 | arglist[j] = argv[i]; | |
213 | ||
214 | /* Make sure -lstdc++ is before the math library, since libstdc++ | |
215 | itself uses those math routines. */ | |
216 | if (!saw_math && (args[i] & MATHLIB) && library) | |
217 | { | |
218 | --j; | |
219 | saw_math = argv[i]; | |
220 | } | |
221 | ||
222 | if (!saw_libc && (args[i] & WITHLIBC) && library) | |
223 | { | |
224 | --j; | |
225 | saw_libc = argv[i]; | |
226 | } | |
227 | ||
228 | /* Wrap foo.c and foo.i files in a language specification to | |
229 | force the gcc compiler driver to run cc1plus on them. */ | |
230 | if (args[i] & LANGSPEC) | |
231 | { | |
232 | int len = strlen (argv[i]); | |
233 | if (argv[i][len - 1] == 'i') | |
234 | arglist[j++] = "-xc++-cpp-output"; | |
235 | else | |
236 | arglist[j++] = "-xc++"; | |
237 | arglist[j++] = argv[i]; | |
238 | arglist[j] = "-xnone"; | |
239 | } | |
240 | } | |
241 | ||
eeb109f2 NS |
242 | #if ENABLE_NEW_GXX_ABI |
243 | arglist[j++] = "-fnew-abi"; | |
244 | #endif | |
245 | ||
f442f723 MS |
246 | /* Add `-lstdc++' if we haven't already done so. */ |
247 | if (library) | |
84914634 | 248 | { |
18cd4ded | 249 | arglist[j++] = LIBSTDCXX; |
84914634 JW |
250 | added_libraries++; |
251 | } | |
f442f723 MS |
252 | if (saw_math) |
253 | arglist[j++] = saw_math; | |
17294adf | 254 | else if (library && need_math) |
84914634 JW |
255 | { |
256 | arglist[j++] = MATH_LIBRARY; | |
257 | added_libraries++; | |
258 | } | |
f442f723 MS |
259 | if (saw_libc) |
260 | arglist[j++] = saw_libc; | |
261 | ||
262 | arglist[j] = NULL; | |
263 | ||
264 | *in_argc = j; | |
9257393c | 265 | *in_argv = real_arglist; |
84914634 | 266 | *in_added_libraries = added_libraries; |
f442f723 | 267 | } |
240661ba PB |
268 | |
269 | /* Called before linking. Returns 0 on success and -1 on failure. */ | |
270 | int lang_specific_pre_link () /* Not used for C++. */ | |
271 | { | |
272 | return 0; | |
273 | } | |
274 | ||
275 | /* Number of extra output files that lang_specific_pre_link may generate. */ | |
8db79477 | 276 | int lang_specific_extra_outfiles = 0; /* Not used for C++. */ |