Deleted Added
full compact
gcc.c (42719) gcc.c (50599)
1/* Compiler driver program that can handle many languages.
1/* Compiler driver program that can handle many languages.
2 Copyright (C) 1987, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
2 Copyright (C) 1987, 89, 92-97, 1998 Free Software Foundation, Inc.
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10

--- 15 unchanged lines hidden (view full) ---

26which involves running several programs and passing temporary files between
27them, forwarding the users switches to those programs selectively,
28and deleting the temporary files at the end.
29
30CC recognizes how to compile each input file by suffixes in the file names.
31Once it knows which kind of compilation to perform, the procedure for
32compilation is specified by a string called a "spec". */
33
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10

--- 15 unchanged lines hidden (view full) ---

26which involves running several programs and passing temporary files between
27them, forwarding the users switches to those programs selectively,
28and deleting the temporary files at the end.
29
30CC recognizes how to compile each input file by suffixes in the file names.
31Once it knows which kind of compilation to perform, the procedure for
32compilation is specified by a string called a "spec". */
33
34#include <sys/types.h>
35#include <sys/wait.h>
36#include <ctype.h>
37#include <signal.h>
38#include <sys/stat.h>
39#include <errno.h>
40
41#ifndef _WIN32
42#include <sys/file.h> /* May get R_OK, etc. on some systems. */
43#else
44#include <process.h>
45int __spawnv ();
46int __spawnvp ();
47#endif
48
49#include "config.h"
34#include "config.h"
50#include "obstack.h"
35
51#ifdef __STDC__
52#include <stdarg.h>
53#else
54#include <varargs.h>
55#endif
36#ifdef __STDC__
37#include <stdarg.h>
38#else
39#include <varargs.h>
40#endif
56#include <stdio.h>
57#include <stdlib.h>
58#include <unistd.h>
59#include <string.h>
41#include "system.h"
42#include <signal.h>
43#include <sys/stat.h>
60
44
61/* Include multi-lib information. */
62#include "multilib.h"
45#include "gansidecl.h"
46#include "obstack.h"
63
47
64#ifndef R_OK
65#define R_OK 4
66#define W_OK 2
67#define X_OK 1
68#endif
69
48
49/* ??? Need to find a GCC header to put these in. */
50extern int pexecute PROTO ((const char *, char * const *, const char *,
51 const char *, char **, char **, int));
52extern int pwait PROTO ((int, int *, int));
53extern char *update_path PROTO((char *, char *));
54extern void set_std_prefix PROTO((char *, int));
55/* Flag arguments to pexecute. */
56#define PEXECUTE_FIRST 1
57#define PEXECUTE_LAST 2
58#define PEXECUTE_SEARCH 4
59#define PEXECUTE_VERBOSE 8
60
70#ifndef WIFSIGNALED
71#define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f)
72#endif
73#ifndef WTERMSIG
74#define WTERMSIG(S) ((S) & 0x7f)
75#endif
76#ifndef WIFEXITED
77#define WIFEXITED(S) (((S) & 0xff) == 0)
78#endif
79#ifndef WEXITSTATUS
80#define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
81#endif
82
61#ifndef WIFSIGNALED
62#define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f)
63#endif
64#ifndef WTERMSIG
65#define WTERMSIG(S) ((S) & 0x7f)
66#endif
67#ifndef WIFEXITED
68#define WIFEXITED(S) (((S) & 0xff) == 0)
69#endif
70#ifndef WEXITSTATUS
71#define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
72#endif
73
83/* Add prototype support. */
84#ifndef PROTO
85#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
86#define PROTO(ARGS) ARGS
87#else
88#define PROTO(ARGS) ()
74#ifdef VMS
75#define exit __posix_exit
89#endif
76#endif
90#endif
91
77
92#ifndef VPROTO
93#ifdef __STDC__
94#define PVPROTO(ARGS) ARGS
95#define VPROTO(ARGS) ARGS
96#define VA_START(va_list,var) va_start(va_list,var)
97#else
98#define PVPROTO(ARGS) ()
99#define VPROTO(ARGS) (va_alist) va_dcl
100#define VA_START(va_list,var) va_start(va_list)
101#endif
102#endif
103
104/* Define a generic NULL if one hasn't already been defined. */
105
106#ifndef NULL
107#define NULL 0
108#endif
109
110/* Define O_RDONLY if the system hasn't defined it for us. */
111#ifndef O_RDONLY
112#define O_RDONLY 0
113#endif
114
115#ifndef GENERIC_PTR
116#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
117#define GENERIC_PTR void *
118#else
119#define GENERIC_PTR char *
120#endif
121#endif
122
123#ifndef NULL_PTR
124#define NULL_PTR ((GENERIC_PTR)0)
125#endif
126
127#ifdef USG
128#define vfork fork
129#endif /* USG */
130
78#ifdef USG
79#define vfork fork
80#endif /* USG */
81
131/* On MSDOS, write temp files in current dir
132 because there's no place else we can expect to use. */
133#ifdef __MSDOS__
134#ifndef P_tmpdir
135#define P_tmpdir "."
136#endif
137#endif
138
139/* Test if something is a normal file. */
140#ifndef S_ISREG
141#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
142#endif
143
144/* Test if something is a directory. */
145#ifndef S_ISDIR
146#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
147#endif
148
149/* By default there is no special suffix for executables. */
82/* Test if something is a normal file. */
83#ifndef S_ISREG
84#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
85#endif
86
87/* Test if something is a directory. */
88#ifndef S_ISDIR
89#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
90#endif
91
92/* By default there is no special suffix for executables. */
150#ifndef EXECUTABLE_SUFFIX
93#ifdef EXECUTABLE_SUFFIX
94#define HAVE_EXECUTABLE_SUFFIX
95#else
151#define EXECUTABLE_SUFFIX ""
152#endif
153
96#define EXECUTABLE_SUFFIX ""
97#endif
98
154/* By default, the suffix for object files is ".o". */
99/* By default, the suffix for object files is ".o". */
155#ifdef OBJECT_SUFFIX
156#define HAVE_OBJECT_SUFFIX
157#else
158#define OBJECT_SUFFIX ".o"
159#endif
160
161/* By default, colon separates directories in a path. */
162#ifndef PATH_SEPARATOR

--- 4 unchanged lines hidden (view full) ---

167#define DIR_SEPARATOR '/'
168#endif
169
170static char dir_separator_str[] = {DIR_SEPARATOR, 0};
171
172#define obstack_chunk_alloc xmalloc
173#define obstack_chunk_free free
174
100#ifdef OBJECT_SUFFIX
101#define HAVE_OBJECT_SUFFIX
102#else
103#define OBJECT_SUFFIX ".o"
104#endif
105
106/* By default, colon separates directories in a path. */
107#ifndef PATH_SEPARATOR

--- 4 unchanged lines hidden (view full) ---

112#define DIR_SEPARATOR '/'
113#endif
114
115static char dir_separator_str[] = {DIR_SEPARATOR, 0};
116
117#define obstack_chunk_alloc xmalloc
118#define obstack_chunk_free free
119
175extern void free ();
176extern char *getenv ();
177
178#ifndef errno
179extern int errno;
120#ifndef GET_ENVIRONMENT
121#define GET_ENVIRONMENT(ENV_VALUE,ENV_NAME) ENV_VALUE = getenv (ENV_NAME)
180#endif
181
122#endif
123
182extern int sys_nerr;
183#ifndef HAVE_STRERROR
184#if defined(bsd4_4)
185extern const char *const sys_errlist[];
186#else
187extern char *sys_errlist[];
124extern char *my_strerror PROTO((int));
125
126#ifndef HAVE_KILL
127#define kill(p,s) raise(s)
188#endif
128#endif
189#else
190extern char *strerror();
191#endif
192
129
193extern int execv (), execvp ();
194
195/* If a stage of compilation returns an exit status >= 1,
196 compilation of that file ceases. */
197
198#define MIN_FATAL_STATUS 1
199
200/* Flag saying to print the directories gcc will search through looking for
201 programs, libraries, etc. */
202
203static int print_search_dirs;
204
205/* Flag saying to print the full filename of this file
206 as found through our usual search mechanism. */
207
208static char *print_file_name = NULL;
209
130/* If a stage of compilation returns an exit status >= 1,
131 compilation of that file ceases. */
132
133#define MIN_FATAL_STATUS 1
134
135/* Flag saying to print the directories gcc will search through looking for
136 programs, libraries, etc. */
137
138static int print_search_dirs;
139
140/* Flag saying to print the full filename of this file
141 as found through our usual search mechanism. */
142
143static char *print_file_name = NULL;
144
210/* As print_file_name, but search for executable file. */
145/* As print_file_name, but search for executable file. */
211
212static char *print_prog_name = NULL;
213
214/* Flag saying to print the relative path we'd use to
215 find libgcc.a given the current compiler flags. */
216
217static int print_multi_directory;
218
219/* Flag saying to print the list of subdirectories and
220 compiler flags used to select them in a standard form. */
221
222static int print_multi_lib;
223
146
147static char *print_prog_name = NULL;
148
149/* Flag saying to print the relative path we'd use to
150 find libgcc.a given the current compiler flags. */
151
152static int print_multi_directory;
153
154/* Flag saying to print the list of subdirectories and
155 compiler flags used to select them in a standard form. */
156
157static int print_multi_lib;
158
159/* Flag saying to print the command line options understood by gcc and its
160 sub-processes. */
161
162static int print_help_list;
163
224/* Flag indicating whether we should print the command and arguments */
225
226static int verbose_flag;
227
228/* Nonzero means write "temp" files in source directory
229 and use the source file's name in them, and don't delete them. */
230
231static int save_temps_flag;

--- 9 unchanged lines hidden (view full) ---

241/* The target machine specified with -b. */
242
243static char *spec_machine = DEFAULT_TARGET_MACHINE;
244
245/* Nonzero if cross-compiling.
246 When -b is used, the value comes from the `specs' file. */
247
248#ifdef CROSS_COMPILE
164/* Flag indicating whether we should print the command and arguments */
165
166static int verbose_flag;
167
168/* Nonzero means write "temp" files in source directory
169 and use the source file's name in them, and don't delete them. */
170
171static int save_temps_flag;

--- 9 unchanged lines hidden (view full) ---

181/* The target machine specified with -b. */
182
183static char *spec_machine = DEFAULT_TARGET_MACHINE;
184
185/* Nonzero if cross-compiling.
186 When -b is used, the value comes from the `specs' file. */
187
188#ifdef CROSS_COMPILE
249static int cross_compile = 1;
189static char *cross_compile = "1";
250#else
190#else
251static int cross_compile = 0;
191static char *cross_compile = "0";
252#endif
253
254/* The number of errors that have occurred; the link phase will not be
255 run if this is non-zero. */
256static int error_count = 0;
257
258/* This is the obstack which we use to allocate many strings. */
259

--- 6 unchanged lines hidden (view full) ---

266
267static struct obstack collect_obstack;
268
269extern char *version_string;
270
271/* Forward declaration for prototypes. */
272struct path_prefix;
273
192#endif
193
194/* The number of errors that have occurred; the link phase will not be
195 run if this is non-zero. */
196static int error_count = 0;
197
198/* This is the obstack which we use to allocate many strings. */
199

--- 6 unchanged lines hidden (view full) ---

206
207static struct obstack collect_obstack;
208
209extern char *version_string;
210
211/* Forward declaration for prototypes. */
212struct path_prefix;
213
214static void init_spec PROTO((void));
215static void read_specs PROTO((char *, int));
274static void set_spec PROTO((char *, char *));
216static void set_spec PROTO((char *, char *));
275static struct compiler *lookup_compiler PROTO((char *, int, char *));
217static struct compiler *lookup_compiler PROTO((char *, size_t, char *));
276static char *build_search_list PROTO((struct path_prefix *, char *, int));
277static void putenv_from_prefixes PROTO((struct path_prefix *, char *));
278static char *find_a_file PROTO((struct path_prefix *, char *, int));
218static char *build_search_list PROTO((struct path_prefix *, char *, int));
219static void putenv_from_prefixes PROTO((struct path_prefix *, char *));
220static char *find_a_file PROTO((struct path_prefix *, char *, int));
279static void add_prefix PROTO((struct path_prefix *, char *, int, int, int *));
221static void add_prefix PROTO((struct path_prefix *, char *, char *,
222 int, int, int *));
280static char *skip_whitespace PROTO((char *));
281static void record_temp_file PROTO((char *, int, int));
282static void delete_if_ordinary PROTO((char *));
283static void delete_temp_files PROTO((void));
284static void delete_failure_queue PROTO((void));
285static void clear_failure_queue PROTO((void));
223static char *skip_whitespace PROTO((char *));
224static void record_temp_file PROTO((char *, int, int));
225static void delete_if_ordinary PROTO((char *));
226static void delete_temp_files PROTO((void));
227static void delete_failure_queue PROTO((void));
228static void clear_failure_queue PROTO((void));
286static char *choose_temp_base_try PROTO((char *, char *));
287static void choose_temp_base PROTO((void));
288static int check_live_switch PROTO((int, int));
289static char *handle_braces PROTO((char *));
290static char *save_string PROTO((char *, int));
229static int check_live_switch PROTO((int, int));
230static char *handle_braces PROTO((char *));
231static char *save_string PROTO((char *, int));
291static char *concat PROTO((char *, char *));
292static char *concat3 PROTO((char *, char *, char *));
293static char *concat4 PROTO((char *, char *, char *, char *));
294static char *concat6 PROTO((char *, char *, char *, char *, char *, \
295 char *));
296static int do_spec PROTO((char *));
232static char *concat PVPROTO((char *, ...));
233extern int do_spec PROTO((char *));
297static int do_spec_1 PROTO((char *, int, char *));
298static char *find_file PROTO((char *));
299static int is_directory PROTO((char *, char *, int));
300static void validate_switches PROTO((char *));
301static void validate_all_switches PROTO((void));
234static int do_spec_1 PROTO((char *, int, char *));
235static char *find_file PROTO((char *));
236static int is_directory PROTO((char *, char *, int));
237static void validate_switches PROTO((char *));
238static void validate_all_switches PROTO((void));
302static void give_switch PROTO((int, int));
239static void give_switch PROTO((int, int, int));
303static int used_arg PROTO((char *, int));
304static int default_arg PROTO((char *, int));
305static void set_multilib_dir PROTO((void));
306static void print_multilib_info PROTO((void));
307static void pfatal_with_name PROTO((char *));
308static void perror_with_name PROTO((char *));
240static int used_arg PROTO((char *, int));
241static int default_arg PROTO((char *, int));
242static void set_multilib_dir PROTO((void));
243static void print_multilib_info PROTO((void));
244static void pfatal_with_name PROTO((char *));
245static void perror_with_name PROTO((char *));
309static void perror_exec PROTO((char *));
310#ifdef HAVE_VPRINTF
246static void pfatal_pexecute PROTO((char *, char *));
311static void fatal PVPROTO((char *, ...));
312static void error PVPROTO((char *, ...));
247static void fatal PVPROTO((char *, ...));
248static void error PVPROTO((char *, ...));
313#else
314/* We must not provide any prototype here, even if ANSI C. */
315static void fatal PROTO(());
316static void error PROTO(());
317#endif
249static void display_help PROTO((void));
318
319void fancy_abort ();
320char *xmalloc ();
321char *xrealloc ();
250
251void fancy_abort ();
252char *xmalloc ();
253char *xrealloc ();
254
255#ifdef LANG_SPECIFIC_DRIVER
256/* Called before processing to change/add/remove arguments. */
257extern void lang_specific_driver PROTO ((void (*) PVPROTO((char *, ...)), int *, char ***, int *));
258
259/* Called before linking. Returns 0 on success and -1 on failure. */
260extern int lang_specific_pre_link ();
261
262/* Number of extra output files that lang_specific_pre_link may generate. */
263extern int lang_specific_extra_outfiles;
264#endif
322
323/* Specs are strings containing lines, each of which (if not blank)
324is made up of a program name, and arguments separated by spaces.
325The program name must be exact and start from root, since no path
326is searched and it is unreliable to depend on the current working directory.
327Redirection of input or output is not supported; the subprograms must
328accept filenames saying what files to read and write.
329
330In addition, the specs can contain %-sequences to substitute variable text
331or for conditional text. Here is a table of all defined %-sequences.
332Note that spaces are not generated automatically around the results of
333expanding these sequences; therefore, you can concatenate them together
334or with constant text in a single argument.
335
336 %% substitute one % into the program name or argument.
337 %i substitute the name of the input file being processed.
338 %b substitute the basename of the input file being processed.
339 This is the substring up to (and not including) the last period
340 and not including the directory.
265
266/* Specs are strings containing lines, each of which (if not blank)
267is made up of a program name, and arguments separated by spaces.
268The program name must be exact and start from root, since no path
269is searched and it is unreliable to depend on the current working directory.
270Redirection of input or output is not supported; the subprograms must
271accept filenames saying what files to read and write.
272
273In addition, the specs can contain %-sequences to substitute variable text
274or for conditional text. Here is a table of all defined %-sequences.
275Note that spaces are not generated automatically around the results of
276expanding these sequences; therefore, you can concatenate them together
277or with constant text in a single argument.
278
279 %% substitute one % into the program name or argument.
280 %i substitute the name of the input file being processed.
281 %b substitute the basename of the input file being processed.
282 This is the substring up to (and not including) the last period
283 and not including the directory.
341 %g substitute the temporary-file-name-base. This is a string chosen
342 once per compilation. Different temporary file names are made by
343 concatenation of constant strings on the end, as in `%g.s'.
344 %g also has the same effect of %d.
345 %u like %g, but make the temporary file name unique.
346 %U returns the last file name generated with %u.
284 %gSUFFIX
285 substitute a file name that has suffix SUFFIX and is chosen
286 once per compilation, and mark the argument a la %d. To reduce
287 exposure to denial-of-service attacks, the file name is now
288 chosen in a way that is hard to predict even when previously
289 chosen file names are known. For example, `%g.s ... %g.o ... %g.s'
290 might turn into `ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches
291 the regexp "[.A-Za-z]*" or the special string "%O", which is
292 treated exactly as if %O had been pre-processed. Previously, %g
293 was simply substituted with a file name chosen once per compilation,
294 without regard to any appended suffix (which was therefore treated
295 just like ordinary text), making such attacks more likely to succeed.
296 %uSUFFIX
297 like %g, but generates a new temporary file name even if %uSUFFIX
298 was already seen.
299 %USUFFIX
300 substitutes the last file name generated with %uSUFFIX, generating a
301 new one if there is no such last file name. In the absence of any
302 %uSUFFIX, this is just like %gSUFFIX, except they don't share
303 the same suffix "space", so `%g.s ... %U.s ... %g.s ... %U.s'
304 would involve the generation of two distinct file names, one
305 for each `%g.s' and another for each `%U.s'. Previously, %U was
306 simply substituted with a file name chosen for the previous %u,
307 without regard to any appended suffix.
347 %d marks the argument containing or following the %d as a
348 temporary file name, so that that file will be deleted if CC exits
349 successfully. Unlike %g, this contributes no text to the argument.
350 %w marks the argument containing or following the %w as the
351 "output file" of this compilation. This puts the argument
352 into the sequence of arguments that %o will substitute later.
353 %W{...}
354 like %{...} but mark last argument supplied within
355 as a file to be deleted on failure.
356 %o substitutes the names of all the output files, with spaces
357 automatically placed around them. You should write spaces
358 around the %o as well or the results are undefined.
359 %o is for use in the specs for running the linker.
360 Input files whose names have no recognized suffix are not compiled
361 at all, but they are included among the output files, so they will
362 be linked.
308 %d marks the argument containing or following the %d as a
309 temporary file name, so that that file will be deleted if CC exits
310 successfully. Unlike %g, this contributes no text to the argument.
311 %w marks the argument containing or following the %w as the
312 "output file" of this compilation. This puts the argument
313 into the sequence of arguments that %o will substitute later.
314 %W{...}
315 like %{...} but mark last argument supplied within
316 as a file to be deleted on failure.
317 %o substitutes the names of all the output files, with spaces
318 automatically placed around them. You should write spaces
319 around the %o as well or the results are undefined.
320 %o is for use in the specs for running the linker.
321 Input files whose names have no recognized suffix are not compiled
322 at all, but they are included among the output files, so they will
323 be linked.
363 %O substitutes the suffix for object files.
324 %O substitutes the suffix for object files. Note that this is
325 handled specially when it immediately follows %g, %u, or %U,
326 because of the need for those to form complete file names. The
327 handling is such that %O is treated exactly as if it had already
328 been substituted, except that %g, %u, and %U do not currently
329 support additional SUFFIX characters following %O as they would
330 following, for example, `.o'.
364 %p substitutes the standard macro predefinitions for the
365 current target machine. Use this when running cpp.
366 %P like %p, but puts `__' before and after the name of each macro.
367 (Except macros that already have __.)
368 This is for ANSI C.
369 %I Substitute a -iprefix option made from GCC_EXEC_PREFIX.
370 %s current argument is the name of a library or startup file of some sort.
371 Search for that file in a standard list of directories

--- 7 unchanged lines hidden (view full) ---

379 %v1 Substitute the major version number of GCC.
380 (For version 2.5.n, this is 2.)
381 %v2 Substitute the minor version number of GCC.
382 (For version 2.5.n, this is 5.)
383 %a process ASM_SPEC as a spec.
384 This allows config.h to specify part of the spec for running as.
385 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
386 used here. This can be used to run a post-processor after the
331 %p substitutes the standard macro predefinitions for the
332 current target machine. Use this when running cpp.
333 %P like %p, but puts `__' before and after the name of each macro.
334 (Except macros that already have __.)
335 This is for ANSI C.
336 %I Substitute a -iprefix option made from GCC_EXEC_PREFIX.
337 %s current argument is the name of a library or startup file of some sort.
338 Search for that file in a standard list of directories

--- 7 unchanged lines hidden (view full) ---

346 %v1 Substitute the major version number of GCC.
347 (For version 2.5.n, this is 2.)
348 %v2 Substitute the minor version number of GCC.
349 (For version 2.5.n, this is 5.)
350 %a process ASM_SPEC as a spec.
351 This allows config.h to specify part of the spec for running as.
352 %A process ASM_FINAL_SPEC as a spec. A capital A is actually
353 used here. This can be used to run a post-processor after the
387 assembler has done it's job.
354 assembler has done its job.
388 %D Dump out a -L option for each directory in startfile_prefixes.
389 If multilib_dir is set, extra entries are generated with it affixed.
390 %l process LINK_SPEC as a spec.
391 %L process LIB_SPEC as a spec.
392 %G process LIBGCC_SPEC as a spec.
393 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
394 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
395 %c process SIGNED_CHAR_SPEC as a spec.

--- 7 unchanged lines hidden (view full) ---

403 %{S} substitutes the -S switch, if that switch was given to CC.
404 If that switch was not specified, this substitutes nothing.
405 Here S is a metasyntactic variable.
406 %{S*} substitutes all the switches specified to CC whose names start
407 with -S. This is used for -o, -D, -I, etc; switches that take
408 arguments. CC considers `-o foo' as being one switch whose
409 name starts with `o'. %{o*} would substitute this text,
410 including the space; thus, two arguments would be generated.
355 %D Dump out a -L option for each directory in startfile_prefixes.
356 If multilib_dir is set, extra entries are generated with it affixed.
357 %l process LINK_SPEC as a spec.
358 %L process LIB_SPEC as a spec.
359 %G process LIBGCC_SPEC as a spec.
360 %S process STARTFILE_SPEC as a spec. A capital S is actually used here.
361 %E process ENDFILE_SPEC as a spec. A capital E is actually used here.
362 %c process SIGNED_CHAR_SPEC as a spec.

--- 7 unchanged lines hidden (view full) ---

370 %{S} substitutes the -S switch, if that switch was given to CC.
371 If that switch was not specified, this substitutes nothing.
372 Here S is a metasyntactic variable.
373 %{S*} substitutes all the switches specified to CC whose names start
374 with -S. This is used for -o, -D, -I, etc; switches that take
375 arguments. CC considers `-o foo' as being one switch whose
376 name starts with `o'. %{o*} would substitute this text,
377 including the space; thus, two arguments would be generated.
378 %{^S*} likewise, but don't put a blank between a switch and any args.
411 %{S*:X} substitutes X if one or more switches whose names start with -S are
412 specified to CC. Note that the tail part of the -S option
413 (i.e. the part matched by the `*') will be substituted for each
414 occurrence of %* within X.
415 %{S:X} substitutes X, but only if the -S switch was given to CC.
416 %{!S:X} substitutes X, but only if the -S switch was NOT given to CC.
417 %{|S:X} like %{S:X}, but if no S switch, substitute `-'.
418 %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
419 %{.S:X} substitutes X, but only if processing a file with suffix S.
420 %{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
379 %{S*:X} substitutes X if one or more switches whose names start with -S are
380 specified to CC. Note that the tail part of the -S option
381 (i.e. the part matched by the `*') will be substituted for each
382 occurrence of %* within X.
383 %{S:X} substitutes X, but only if the -S switch was given to CC.
384 %{!S:X} substitutes X, but only if the -S switch was NOT given to CC.
385 %{|S:X} like %{S:X}, but if no S switch, substitute `-'.
386 %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'.
387 %{.S:X} substitutes X, but only if processing a file with suffix S.
388 %{!.S:X} substitutes X, but only if NOT processing a file with suffix S.
389 %{S|P:X} substitutes X if either -S or -P was given to CC. This may be
390 combined with ! and . as above binding stronger than the OR.
421 %(Spec) processes a specification defined in a specs file as *Spec:
422 %[Spec] as above, but put __ around -D arguments
423
424The conditional text X in a %{S:X} or %{!S:X} construct may contain
425other nested % constructs or spaces, or even newlines. They are
426processed as usual, as described above.
427
428The -O, -f, -m, and -W switches are handled specifically in these
429constructs. If another value of -O or the negated form of a -f, -m, or
430-W switch is found later in the command line, the earlier switch
431value is ignored, except with {S*} where S is just one letter; this
432passes all matching options.
433
391 %(Spec) processes a specification defined in a specs file as *Spec:
392 %[Spec] as above, but put __ around -D arguments
393
394The conditional text X in a %{S:X} or %{!S:X} construct may contain
395other nested % constructs or spaces, or even newlines. They are
396processed as usual, as described above.
397
398The -O, -f, -m, and -W switches are handled specifically in these
399constructs. If another value of -O or the negated form of a -f, -m, or
400-W switch is found later in the command line, the earlier switch
401value is ignored, except with {S*} where S is just one letter; this
402passes all matching options.
403
434The character | is used to indicate that a command should be piped to
435the following command, but only if -pipe is specified.
404The character | at the beginning of the predicate text is used to indicate
405that a command should be piped to the following command, but only if -pipe
406is specified.
436
437Note that it is built into CC which switches take arguments and which
438do not. You might think it would be useful to generalize this to
439allow each compiler's spec to say which switches take arguments. But
440this cannot be done in a consistent fashion. CC cannot even decide
441which input files have been specified without knowing which switches
442take arguments, and it must know which input files to compile in order
443to tell which compilers to run.

--- 45 unchanged lines hidden (view full) ---

489#define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
490#endif
491
492/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
493 included. */
494#ifndef LIBGCC_SPEC
495#if defined(LINK_LIBGCC_SPECIAL) || defined(LINK_LIBGCC_SPECIAL_1)
496/* Have gcc do the search for libgcc.a. */
407
408Note that it is built into CC which switches take arguments and which
409do not. You might think it would be useful to generalize this to
410allow each compiler's spec to say which switches take arguments. But
411this cannot be done in a consistent fashion. CC cannot even decide
412which input files have been specified without knowing which switches
413take arguments, and it must know which input files to compile in order
414to tell which compilers to run.

--- 45 unchanged lines hidden (view full) ---

460#define LIB_SPEC "%{!shared:%{g*:-lg} %{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}}"
461#endif
462
463/* config.h can define LIBGCC_SPEC to override how and when libgcc.a is
464 included. */
465#ifndef LIBGCC_SPEC
466#if defined(LINK_LIBGCC_SPECIAL) || defined(LINK_LIBGCC_SPECIAL_1)
467/* Have gcc do the search for libgcc.a. */
497#define LIBGCC_SPEC "%{!shared:libgcc.a%s}"
468#define LIBGCC_SPEC "libgcc.a%s"
498#else
469#else
499#define LIBGCC_SPEC "%{!shared:-lgcc}"
470#define LIBGCC_SPEC "-lgcc"
500#endif
501#endif
502
503/* config.h can define STARTFILE_SPEC to override the default crt0 files. */
504#ifndef STARTFILE_SPEC
505#define STARTFILE_SPEC \
506 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
507#endif
508
471#endif
472#endif
473
474/* config.h can define STARTFILE_SPEC to override the default crt0 files. */
475#ifndef STARTFILE_SPEC
476#define STARTFILE_SPEC \
477 "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}}}"
478#endif
479
509/* config.h can define SWITCHES_NEED_SPACES to control passing -o and -L.
510 Make the string nonempty to require spaces there. */
480/* config.h can define SWITCHES_NEED_SPACES to control which options
481 require spaces between the option and the argument. */
511#ifndef SWITCHES_NEED_SPACES
512#define SWITCHES_NEED_SPACES ""
513#endif
514
515/* config.h can define ENDFILE_SPEC to override the default crtn files. */
516#ifndef ENDFILE_SPEC
517#define ENDFILE_SPEC ""
518#endif

--- 4 unchanged lines hidden (view full) ---

523 because MIPS C compiler rejects like ?: in initializers. */
524#if DEFAULT_SIGNED_CHAR
525#define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
526#else
527#define SIGNED_CHAR_SPEC "%{!fsigned-char:-D__CHAR_UNSIGNED__}"
528#endif
529#endif
530
482#ifndef SWITCHES_NEED_SPACES
483#define SWITCHES_NEED_SPACES ""
484#endif
485
486/* config.h can define ENDFILE_SPEC to override the default crtn files. */
487#ifndef ENDFILE_SPEC
488#define ENDFILE_SPEC ""
489#endif

--- 4 unchanged lines hidden (view full) ---

494 because MIPS C compiler rejects like ?: in initializers. */
495#if DEFAULT_SIGNED_CHAR
496#define SIGNED_CHAR_SPEC "%{funsigned-char:-D__CHAR_UNSIGNED__}"
497#else
498#define SIGNED_CHAR_SPEC "%{!fsigned-char:-D__CHAR_UNSIGNED__}"
499#endif
500#endif
501
531/* MULTILIB_SELECT comes from multilib.h. It gives a
532 string interpreted by set_multilib_dir to select a library
533 subdirectory based on the compiler options. */
534#ifndef MULTILIB_SELECT
535#define MULTILIB_SELECT ". ;"
502#ifndef LINKER_NAME
503#define LINKER_NAME "collect2"
536#endif
537
538static char *cpp_spec = CPP_SPEC;
539static char *cpp_predefines = CPP_PREDEFINES;
540static char *cc1_spec = CC1_SPEC;
541static char *cc1plus_spec = CC1PLUS_SPEC;
542static char *signed_char_spec = SIGNED_CHAR_SPEC;
543static char *asm_spec = ASM_SPEC;
544static char *asm_final_spec = ASM_FINAL_SPEC;
545static char *link_spec = LINK_SPEC;
546static char *lib_spec = LIB_SPEC;
547static char *libgcc_spec = LIBGCC_SPEC;
548static char *endfile_spec = ENDFILE_SPEC;
549static char *startfile_spec = STARTFILE_SPEC;
550static char *switches_need_spaces = SWITCHES_NEED_SPACES;
504#endif
505
506static char *cpp_spec = CPP_SPEC;
507static char *cpp_predefines = CPP_PREDEFINES;
508static char *cc1_spec = CC1_SPEC;
509static char *cc1plus_spec = CC1PLUS_SPEC;
510static char *signed_char_spec = SIGNED_CHAR_SPEC;
511static char *asm_spec = ASM_SPEC;
512static char *asm_final_spec = ASM_FINAL_SPEC;
513static char *link_spec = LINK_SPEC;
514static char *lib_spec = LIB_SPEC;
515static char *libgcc_spec = LIBGCC_SPEC;
516static char *endfile_spec = ENDFILE_SPEC;
517static char *startfile_spec = STARTFILE_SPEC;
518static char *switches_need_spaces = SWITCHES_NEED_SPACES;
551static char *multilib_select = MULTILIB_SELECT;
519static char *linker_name_spec = LINKER_NAME;
552
520
521/* Some compilers have limits on line lengths, and the multilib_select
522 and/or multilib_matches strings can be very long, so we build them at
523 run time. */
524static struct obstack multilib_obstack;
525static char *multilib_select;
526static char *multilib_matches;
527static char *multilib_defaults;
528#include "multilib.h"
529
530/* Check whether a particular argument is a default argument. */
531
532#ifndef MULTILIB_DEFAULTS
533#define MULTILIB_DEFAULTS { "" }
534#endif
535
536static char *multilib_defaults_raw[] = MULTILIB_DEFAULTS;
537
538struct user_specs {
539 struct user_specs *next;
540 char *filename;
541};
542
543static struct user_specs *user_specs_head, *user_specs_tail;
544
553/* This defines which switch letters take arguments. */
554
545/* This defines which switch letters take arguments. */
546
555#ifndef SWITCH_TAKES_ARG
556#define SWITCH_TAKES_ARG(CHAR) \
547#define DEFAULT_SWITCH_TAKES_ARG(CHAR) \
557 ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
558 || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
559 || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x' \
548 ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
549 || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
550 || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x' \
560 || (CHAR) == 'L' || (CHAR) == 'A')
551 || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V' \
552 || (CHAR) == 'B' || (CHAR) == 'b')
553
554#ifndef SWITCH_TAKES_ARG
555#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
561#endif
562
563/* This defines which multi-letter switches take arguments. */
564
565#define DEFAULT_WORD_SWITCH_TAKES_ARG(STR) \
566 (!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext") \
567 || !strcmp (STR, "Tbss") || !strcmp (STR, "include") \
568 || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info") \
569 || !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
570 || !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
556#endif
557
558/* This defines which multi-letter switches take arguments. */
559
560#define DEFAULT_WORD_SWITCH_TAKES_ARG(STR) \
561 (!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext") \
562 || !strcmp (STR, "Tbss") || !strcmp (STR, "include") \
563 || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info") \
564 || !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
565 || !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
571 || !strcmp (STR, "isystem"))
566 || !strcmp (STR, "isystem") || !strcmp (STR, "specs"))
572
573#ifndef WORD_SWITCH_TAKES_ARG
574#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
575#endif
576
567
568#ifndef WORD_SWITCH_TAKES_ARG
569#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
570#endif
571
572
573#ifdef HAVE_EXECUTABLE_SUFFIX
574/* This defines which switches stop a full compilation. */
575#define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
576 ((CHAR) == 'c' || (CHAR) == 'S')
577
578#ifndef SWITCH_CURTAILS_COMPILATION
579#define SWITCH_CURTAILS_COMPILATION(CHAR) \
580 DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR)
581#endif
582#endif
583
577/* Record the mapping from file suffixes for compilation specs. */
578
579struct compiler
580{
581 char *suffix; /* Use this compiler for input files
582 whose names end in this suffix. */
583
584 char *spec[4]; /* To use this compiler, concatenate these

--- 14 unchanged lines hidden (view full) ---

599/* Number of entries in `compilers', not counting the null terminator. */
600
601static int n_compilers;
602
603/* The default list of file name suffixes and their compilation specs. */
604
605static struct compiler default_compilers[] =
606{
584/* Record the mapping from file suffixes for compilation specs. */
585
586struct compiler
587{
588 char *suffix; /* Use this compiler for input files
589 whose names end in this suffix. */
590
591 char *spec[4]; /* To use this compiler, concatenate these

--- 14 unchanged lines hidden (view full) ---

606/* Number of entries in `compilers', not counting the null terminator. */
607
608static int n_compilers;
609
610/* The default list of file name suffixes and their compilation specs. */
611
612static struct compiler default_compilers[] =
613{
607 {".c", "@c"},
614 /* Add lists of suffixes of known languages here. If those languages
615 were not present when we built the driver, we will hit these copies
616 and be given a more meaningful error than "file not used since
617 linking is not done". */
618 {".cc", {"#C++"}}, {".cxx", {"#C++"}}, {".cpp", {"#C++"}}, {".c++", {"#C++"}},
619 {".C", {"#C++"}}, {".ads", {"#Ada"}}, {".adb", {"#Ada"}}, {".ada", {"#Ada"}},
620 {".f", {"#Fortran"}}, {".for", {"#Fortran"}}, {".F", {"#Fortran"}},
621 {".fpp", {"#Fortran"}},
622 {".p", {"#Pascal"}}, {".pas", {"#Pascal"}},
623 /* Next come the entries for C. */
624 {".c", {"@c"}},
608 {"@c",
625 {"@c",
609 "cpp -lang-c%{ansi:89} %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
626 {
627#if USE_CPPLIB
628 "%{E|M|MM:cpp -lang-c%{ansi:89} %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
610 %{C:%{!E:%eGNU C does not support -C without using -E}}\
611 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
612 -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
629 %{C:%{!E:%eGNU C does not support -C without using -E}}\
630 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
631 -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
613 %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
632 %{ansi:-trigraphs -D__STRICT_ANSI__}\
614 %{!undef:%{!ansi:%p} %P} %{trigraphs} \
633 %{!undef:%{!ansi:%p} %P} %{trigraphs} \
615 %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
634 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
635 %{traditional} %{ftraditional:-traditional}\
616 %{traditional-cpp:-traditional}\
617 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
636 %{traditional-cpp:-traditional}\
637 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
638 %i %{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}}\n}\
639 %{!E:%{!M:%{!MM:cc1 %i %1 \
640 -lang-c%{ansi:89} %{nostdinc*} %{A*} %{I*} %I\
641 %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\
642 %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
643 -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
644 %{ansi:-trigraphs -D__STRICT_ANSI__}\
645 %{!undef:%{!ansi:%p} %P} %{trigraphs} \
646 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
647 %{H} %C %{D*} %{U*} %{i*} %Z\
648 %{ftraditional:-traditional}\
649 %{traditional-cpp:-traditional}\
650 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
651 %{aux-info*}\
652 %{--help:--help} \
653 %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
654 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
655 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
656 %{!S:as %a %Y\
657 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
658 %{!pipe:%g.s} %A\n }}}}"
659 }},
660#else /* ! USE_CPPLIB */
661 "cpp -lang-c%{ansi:89} %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
662 %{C:%{!E:%eGNU C does not support -C without using -E}}\
663 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
664 -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
665 %{ansi:-trigraphs -D__STRICT_ANSI__}\
666 %{!undef:%{!ansi:%p} %P} %{trigraphs} \
667 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
668 %{traditional} %{ftraditional:-traditional}\
669 %{traditional-cpp:-traditional}\
670 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
618 %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
619 "%{!M:%{!MM:%{!E:cc1 %{!pipe:%g.i} %1 \
671 %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
672 "%{!M:%{!MM:%{!E:cc1 %{!pipe:%g.i} %1 \
620 %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a}\
673 %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\
621 %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
622 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
623 %{aux-info*}\
674 %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
675 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
676 %{aux-info*}\
677 %{--help:--help} \
624 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
625 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
626 %{!S:as %a %Y\
627 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
678 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
679 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
680 %{!S:as %a %Y\
681 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
628 %{!pipe:%g.s} %A\n }}}}"},
682 %{!pipe:%g.s} %A\n }}}}"
683 }},
684#endif /* ! USE_CPPLIB */
629 {"-",
685 {"-",
630 "%{E:cpp -lang-c%{ansi:89} %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
686 {"%{E:cpp -lang-c%{ansi:89} %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
631 %{C:%{!E:%eGNU C does not support -C without using -E}}\
632 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
633 -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
687 %{C:%{!E:%eGNU C does not support -C without using -E}}\
688 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
689 -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
634 %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
690 %{ansi:-trigraphs -D__STRICT_ANSI__}\
635 %{!undef:%{!ansi:%p} %P} %{trigraphs}\
691 %{!undef:%{!ansi:%p} %P} %{trigraphs}\
636 %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
692 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
693 %{traditional} %{ftraditional:-traditional}\
637 %{traditional-cpp:-traditional}\
638 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
639 %i %W{o*}}\
694 %{traditional-cpp:-traditional}\
695 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
696 %i %W{o*}}\
640 %{!E:%e-E required when input is from standard input}"},
641 {".m", "@objective-c"},
697 %{!E:%e-E required when input is from standard input}"}},
698 {".m", {"@objective-c"}},
642 {"@objective-c",
699 {"@objective-c",
643 "cpp -lang-objc %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
700 {"cpp -lang-objc %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
644 %{C:%{!E:%eGNU C does not support -C without using -E}}\
645 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
646 -undef -D__OBJC__ -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
701 %{C:%{!E:%eGNU C does not support -C without using -E}}\
702 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
703 -undef -D__OBJC__ -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
647 %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
704 %{ansi:-trigraphs -D__STRICT_ANSI__}\
648 %{!undef:%{!ansi:%p} %P} %{trigraphs}\
705 %{!undef:%{!ansi:%p} %P} %{trigraphs}\
649 %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
706 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
707 %{traditional} %{ftraditional:-traditional}\
650 %{traditional-cpp:-traditional}\
651 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
652 %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
708 %{traditional-cpp:-traditional}\
709 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
710 %i %{!M:%{!MM:%{!E:%{!pipe:%g.i}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
653 "%{!M:%{!MM:%{!E:cc1obj %{!pipe:%g.i} %1 \
654 %{!Q:-quiet} -dumpbase %b.m %{d*} %{m*} %{a}\
711 "%{!M:%{!MM:%{!E:cc1obj %{!pipe:%g.i} %1 \
712 %{!Q:-quiet} -dumpbase %b.m %{d*} %{m*} %{a*}\
655 %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
656 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*} \
657 -lang-objc %{gen-decls} \
658 %{aux-info*}\
659 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
660 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
661 %{!S:as %a %Y\
662 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
713 %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi} \
714 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*} \
715 -lang-objc %{gen-decls} \
716 %{aux-info*}\
717 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
718 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
719 %{!S:as %a %Y\
720 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
663 %{!pipe:%g.s} %A\n }}}}"},
664 {".h", "@c-header"},
721 %{!pipe:%g.s} %A\n }}}}"}},
722 {".h", {"@c-header"}},
665 {"@c-header",
723 {"@c-header",
666 "%{!E:%eCompilation of header file requested} \
724 {"%{!E:%eCompilation of header file requested} \
667 cpp %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
668 %{C:%{!E:%eGNU C does not support -C without using -E}}\
669 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
670 -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
725 cpp %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
726 %{C:%{!E:%eGNU C does not support -C without using -E}}\
727 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
728 -undef -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
671 %{ansi:-trigraphs -$ -D__STRICT_ANSI__}\
729 %{ansi:-trigraphs -D__STRICT_ANSI__}\
672 %{!undef:%{!ansi:%p} %P} %{trigraphs}\
730 %{!undef:%{!ansi:%p} %P} %{trigraphs}\
673 %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
731 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
732 %{traditional} %{ftraditional:-traditional}\
674 %{traditional-cpp:-traditional}\
675 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
733 %{traditional-cpp:-traditional}\
734 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
676 %i %W{o*}"},
677 {".i", "@cpp-output"},
735 %i %W{o*}"}},
736 {".i", {"@cpp-output"}},
678 {"@cpp-output",
737 {"@cpp-output",
679 "%{!M:%{!MM:%{!E:cc1 %i %1 %{!Q:-quiet} %{d*} %{m*} %{a}\
738 {"%{!M:%{!MM:%{!E:cc1 %i %1 %{!Q:-quiet} %{d*} %{m*} %{a*}\
680 %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\
681 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
682 %{aux-info*}\
683 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
684 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
685 %{!S:as %a %Y\
686 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
739 %{g*} %{O*} %{W*} %{w} %{pedantic*} %{ansi}\
740 %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
741 %{aux-info*}\
742 %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
743 %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\
744 %{!S:as %a %Y\
745 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
687 %{!pipe:%g.s} %A\n }}}}"},
688 {".s", "@assembler"},
746 %{!pipe:%g.s} %A\n }}}}"}},
747 {".s", {"@assembler"}},
689 {"@assembler",
748 {"@assembler",
690 "%{!M:%{!MM:%{!E:%{!S:as %a %Y\
749 {"%{!M:%{!MM:%{!E:%{!S:as %a %Y\
691 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
750 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
692 %i %A\n }}}}"},
693 {".S", "@assembler-with-cpp"},
751 %i %A\n }}}}"}},
752 {".S", {"@assembler-with-cpp"}},
694 {"@assembler-with-cpp",
753 {"@assembler-with-cpp",
695 "cpp -lang-asm %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
754 {"cpp -lang-asm %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
696 %{C:%{!E:%eGNU C does not support -C without using -E}}\
697 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG} %{trigraphs}\
698 -undef -$ %{!undef:%p %P} -D__ASSEMBLER__ \
755 %{C:%{!E:%eGNU C does not support -C without using -E}}\
756 %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG} %{trigraphs}\
757 -undef -$ %{!undef:%p %P} -D__ASSEMBLER__ \
699 %c %{O*:%{!O0:-D__OPTIMIZE__}} %{traditional} %{ftraditional:-traditional}\
758 %c %{Os:-D__OPTIMIZE_SIZE__} %{O*:%{!O0:-D__OPTIMIZE__}}\
759 %{traditional} %{ftraditional:-traditional}\
700 %{traditional-cpp:-traditional}\
701 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
702 %i %{!M:%{!MM:%{!E:%{!pipe:%g.s}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
760 %{traditional-cpp:-traditional}\
761 %{g*} %{W*} %{w} %{pedantic*} %{H} %{d*} %C %{D*} %{U*} %{i*} %Z\
762 %i %{!M:%{!MM:%{!E:%{!pipe:%g.s}}}}%{E:%W{o*}}%{M:%W{o*}}%{MM:%W{o*}} |\n",
703 "%{!M:%{!MM:%{!E:%{!S:as %a %Y\
763 "%{!M:%{!MM:%{!E:%{!S:as %a %Y\
704 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
764 %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}\
705 %{!pipe:%g.s} %A\n }}}}"},
765 %{!pipe:%g.s} %A\n }}}}"}},
706#include "specs.h"
707 /* Mark end of table */
766#include "specs.h"
767 /* Mark end of table */
708 {0, 0}
768 {0, {0}}
709};
710
711/* Number of elements in default_compilers, not counting the terminator. */
712
713static int n_default_compilers
714 = (sizeof default_compilers / sizeof (struct compiler)) - 1;
715
716/* Here is the spec for running the linker, after compiling all files. */
717
718/* -u* was put back because both BSD and SysV seem to support it. */
719/* %{static:} simply prevents an error message if the target machine
720 doesn't handle -static. */
721/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
722 scripts which exist in user specified directories, or in standard
723 directories. */
769};
770
771/* Number of elements in default_compilers, not counting the terminator. */
772
773static int n_default_compilers
774 = (sizeof default_compilers / sizeof (struct compiler)) - 1;
775
776/* Here is the spec for running the linker, after compiling all files. */
777
778/* -u* was put back because both BSD and SysV seem to support it. */
779/* %{static:} simply prevents an error message if the target machine
780 doesn't handle -static. */
781/* We want %{T*} after %{L*} and %D so that it can be used to specify linker
782 scripts which exist in user specified directories, or in standard
783 directories. */
784#ifdef LINK_COMMAND_SPEC
785/* Provide option to override link_command_spec from machine specific
786 configuration files. */
787static char *link_command_spec =
788 LINK_COMMAND_SPEC;
789#else
724#ifdef LINK_LIBGCC_SPECIAL
725/* Don't generate -L options. */
726static char *link_command_spec = "\
727%{!fsyntax-only: \
790#ifdef LINK_LIBGCC_SPECIAL
791/* Don't generate -L options. */
792static char *link_command_spec = "\
793%{!fsyntax-only: \
728 %{!c:%{!M:%{!MM:%{!E:%{!S:ld %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
794 %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
729 %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
730 %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
795 %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
796 %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
731 %{static:} %{L*} %{T*} %o\
797 %{static:} %{L*} %o\
732 %{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
798 %{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
733 %{!A:%{!nostdlib:%{!nostartfiles:%E}}}\n }}}}}}";
799 %{!A:%{!nostdlib:%{!nostartfiles:%E}}}\
800 %{T*}\
801 \n }}}}}}";
734#else
735/* Use -L. */
736static char *link_command_spec = "\
737%{!fsyntax-only: \
802#else
803/* Use -L. */
804static char *link_command_spec = "\
805%{!fsyntax-only: \
738 %{!c:%{!M:%{!MM:%{!E:%{!S:ld %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
806 %{!c:%{!M:%{!MM:%{!E:%{!S:%(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \
739 %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
740 %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
807 %{r} %{s} %{t} %{u*} %{x} %{z} %{Z}\
808 %{!A:%{!nostdlib:%{!nostartfiles:%S}}}\
741 %{static:} %{L*} %D %{T*} %o\
809 %{static:} %{L*} %D %o\
742 %{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
810 %{!nostdlib:%{!nodefaultlibs:%G %L %G}}\
743 %{!A:%{!nostdlib:%{!nostartfiles:%E}}}\n }}}}}}";
811 %{!A:%{!nostdlib:%{!nostartfiles:%E}}}\
812 %{T*}\
813 \n }}}}}}";
744#endif
814#endif
815#endif
745
746/* A vector of options to give to the linker.
747 These options are accumulated by %x,
748 and substituted into the linker command with %X. */
749static int n_linker_options;
750static char **linker_options;
751
752/* A vector of options to give to the assembler.

--- 32 unchanged lines hidden (view full) ---

785 {
786 {"--all-warnings", "-Wall", 0},
787 {"--ansi", "-ansi", 0},
788 {"--assemble", "-S", 0},
789 {"--assert", "-A", "a"},
790 {"--comments", "-C", 0},
791 {"--compile", "-c", 0},
792 {"--debug", "-g", "oj"},
816
817/* A vector of options to give to the linker.
818 These options are accumulated by %x,
819 and substituted into the linker command with %X. */
820static int n_linker_options;
821static char **linker_options;
822
823/* A vector of options to give to the assembler.

--- 32 unchanged lines hidden (view full) ---

856 {
857 {"--all-warnings", "-Wall", 0},
858 {"--ansi", "-ansi", 0},
859 {"--assemble", "-S", 0},
860 {"--assert", "-A", "a"},
861 {"--comments", "-C", 0},
862 {"--compile", "-c", 0},
863 {"--debug", "-g", "oj"},
793 {"--define-macro", "-D", "a"},
864 {"--define-macro", "-D", "aj"},
794 {"--dependencies", "-M", 0},
795 {"--dump", "-d", "a"},
796 {"--dumpbase", "-dumpbase", "a"},
797 {"--entry", "-e", 0},
798 {"--extra-warnings", "-W", 0},
799 {"--for-assembler", "-Wa", "a"},
800 {"--for-linker", "-Xlinker", "a"},
801 {"--force-link", "-u", "a"},
802 {"--imacros", "-imacros", "a"},
803 {"--include", "-include", "a"},
804 {"--include-barrier", "-I-", 0},
865 {"--dependencies", "-M", 0},
866 {"--dump", "-d", "a"},
867 {"--dumpbase", "-dumpbase", "a"},
868 {"--entry", "-e", 0},
869 {"--extra-warnings", "-W", 0},
870 {"--for-assembler", "-Wa", "a"},
871 {"--for-linker", "-Xlinker", "a"},
872 {"--force-link", "-u", "a"},
873 {"--imacros", "-imacros", "a"},
874 {"--include", "-include", "a"},
875 {"--include-barrier", "-I-", 0},
805 {"--include-directory", "-I", "a"},
876 {"--include-directory", "-I", "aj"},
806 {"--include-directory-after", "-idirafter", "a"},
807 {"--include-prefix", "-iprefix", "a"},
808 {"--include-with-prefix", "-iwithprefix", "a"},
809 {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
810 {"--include-with-prefix-after", "-iwithprefix", "a"},
811 {"--language", "-x", "a"},
812 {"--library-directory", "-L", "a"},
813 {"--machine", "-m", "aj"},

--- 18 unchanged lines hidden (view full) ---

832 {"--print-multi-directory", "-print-multi-directory", 0},
833 {"--print-prog-name", "-print-prog-name=", "aj"},
834 {"--profile", "-p", 0},
835 {"--profile-blocks", "-a", 0},
836 {"--quiet", "-q", 0},
837 {"--save-temps", "-save-temps", 0},
838 {"--shared", "-shared", 0},
839 {"--silent", "-q", 0},
877 {"--include-directory-after", "-idirafter", "a"},
878 {"--include-prefix", "-iprefix", "a"},
879 {"--include-with-prefix", "-iwithprefix", "a"},
880 {"--include-with-prefix-before", "-iwithprefixbefore", "a"},
881 {"--include-with-prefix-after", "-iwithprefix", "a"},
882 {"--language", "-x", "a"},
883 {"--library-directory", "-L", "a"},
884 {"--machine", "-m", "aj"},

--- 18 unchanged lines hidden (view full) ---

903 {"--print-multi-directory", "-print-multi-directory", 0},
904 {"--print-prog-name", "-print-prog-name=", "aj"},
905 {"--profile", "-p", 0},
906 {"--profile-blocks", "-a", 0},
907 {"--quiet", "-q", 0},
908 {"--save-temps", "-save-temps", 0},
909 {"--shared", "-shared", 0},
910 {"--silent", "-q", 0},
911 {"--specs", "-specs=", "aj"},
840 {"--static", "-static", 0},
841 {"--symbolic", "-symbolic", 0},
842 {"--target", "-b", "a"},
843 {"--trace-includes", "-H", 0},
844 {"--traditional", "-traditional", 0},
845 {"--traditional-cpp", "-traditional-cpp", 0},
846 {"--trigraphs", "-trigraphs", 0},
912 {"--static", "-static", 0},
913 {"--symbolic", "-symbolic", 0},
914 {"--target", "-b", "a"},
915 {"--trace-includes", "-H", 0},
916 {"--traditional", "-traditional", 0},
917 {"--traditional-cpp", "-traditional-cpp", 0},
918 {"--trigraphs", "-trigraphs", 0},
847 {"--undefine-macro", "-U", "a"},
919 {"--undefine-macro", "-U", "aj"},
848 {"--use-version", "-V", "a"},
849 {"--user-dependencies", "-MM", 0},
850 {"--verbose", "-v", 0},
851 {"--version", "-dumpversion", 0},
852 {"--warn-", "-W", "*j"},
853 {"--write-dependencies", "-MD", 0},
854 {"--write-user-dependencies", "-MMD", 0},
855 {"--", "-f", "*j"}

--- 20 unchanged lines hidden (view full) ---

876 while (i < argc)
877 {
878 /* Translate -- options. */
879 if (argv[i][0] == '-' && argv[i][1] == '-')
880 {
881 /* Find a mapping that applies to this option. */
882 for (j = 0; j < sizeof (option_map) / sizeof (option_map[0]); j++)
883 {
920 {"--use-version", "-V", "a"},
921 {"--user-dependencies", "-MM", 0},
922 {"--verbose", "-v", 0},
923 {"--version", "-dumpversion", 0},
924 {"--warn-", "-W", "*j"},
925 {"--write-dependencies", "-MD", 0},
926 {"--write-user-dependencies", "-MMD", 0},
927 {"--", "-f", "*j"}

--- 20 unchanged lines hidden (view full) ---

948 while (i < argc)
949 {
950 /* Translate -- options. */
951 if (argv[i][0] == '-' && argv[i][1] == '-')
952 {
953 /* Find a mapping that applies to this option. */
954 for (j = 0; j < sizeof (option_map) / sizeof (option_map[0]); j++)
955 {
884 int optlen = strlen (option_map[j].name);
885 int arglen = strlen (argv[i]);
886 int complen = arglen > optlen ? optlen : arglen;
956 size_t optlen = strlen (option_map[j].name);
957 size_t arglen = strlen (argv[i]);
958 size_t complen = arglen > optlen ? optlen : arglen;
887 char *arginfo = option_map[j].arg_info;
888
889 if (arginfo == 0)
890 arginfo = "";
891
892 if (!strncmp (argv[i], option_map[j].name, complen))
893 {
894 char *arg = 0;

--- 59 unchanged lines hidden (view full) ---

954 if (arg != 0)
955 error ("Extraneous argument to `%s' option",
956 option_map[j].name);
957 arg = 0;
958 }
959
960 /* Store the translation as one argv elt or as two. */
961 if (arg != 0 && index (arginfo, 'j') != 0)
959 char *arginfo = option_map[j].arg_info;
960
961 if (arginfo == 0)
962 arginfo = "";
963
964 if (!strncmp (argv[i], option_map[j].name, complen))
965 {
966 char *arg = 0;

--- 59 unchanged lines hidden (view full) ---

1026 if (arg != 0)
1027 error ("Extraneous argument to `%s' option",
1028 option_map[j].name);
1029 arg = 0;
1030 }
1031
1032 /* Store the translation as one argv elt or as two. */
1033 if (arg != 0 && index (arginfo, 'j') != 0)
962 newv[newindex++] = concat (option_map[j].equivalent, arg);
1034 newv[newindex++] = concat (option_map[j].equivalent, arg,
1035 NULL_PTR);
963 else if (arg != 0)
964 {
965 newv[newindex++] = option_map[j].equivalent;
966 newv[newindex++] = arg;
967 }
968 else
969 newv[newindex++] = option_map[j].equivalent;
970

--- 43 unchanged lines hidden (view full) ---

1014 *argvp = newv;
1015 *argcp = newindex;
1016}
1017
1018char *
1019my_strerror(e)
1020 int e;
1021{
1036 else if (arg != 0)
1037 {
1038 newv[newindex++] = option_map[j].equivalent;
1039 newv[newindex++] = arg;
1040 }
1041 else
1042 newv[newindex++] = option_map[j].equivalent;
1043

--- 43 unchanged lines hidden (view full) ---

1087 *argvp = newv;
1088 *argcp = newindex;
1089}
1090
1091char *
1092my_strerror(e)
1093 int e;
1094{
1022
1023#ifdef HAVE_STRERROR
1095#ifdef HAVE_STRERROR
1096
1024 return strerror(e);
1025
1026#else
1027
1028 static char buffer[30];
1029 if (!e)
1097 return strerror(e);
1098
1099#else
1100
1101 static char buffer[30];
1102 if (!e)
1030 return "";
1103 return "cannot access";
1031
1032 if (e > 0 && e < sys_nerr)
1033 return sys_errlist[e];
1034
1035 sprintf (buffer, "Unknown error %d", e);
1036 return buffer;
1037#endif
1038}
1039
1104
1105 if (e > 0 && e < sys_nerr)
1106 return sys_errlist[e];
1107
1108 sprintf (buffer, "Unknown error %d", e);
1109 return buffer;
1110#endif
1111}
1112
1040/* Read compilation specs from a file named FILENAME,
1041 replacing the default ones.
1042
1043 A suffix which starts with `*' is a definition for
1044 one of the machine-specific sub-specs. The "suffix" should be
1045 *asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
1046 The corresponding spec is stored in asm_spec, etc.,
1047 rather than in the `compilers' vector.
1048
1049 Anything invalid in the file is a fatal error. */
1050
1051static void
1052read_specs (filename)
1053 char *filename;
1054{
1055 int desc;
1056 int readlen;
1057 struct stat statbuf;
1058 char *buffer;
1059 register char *p;
1060
1061 if (verbose_flag)
1062 fprintf (stderr, "Reading specs from %s\n", filename);
1063
1064 /* Open and stat the file. */
1065 desc = open (filename, O_RDONLY, 0);
1066 if (desc < 0)
1067 pfatal_with_name (filename);
1068 if (stat (filename, &statbuf) < 0)
1069 pfatal_with_name (filename);
1070
1071 /* Read contents of file into BUFFER. */
1072 buffer = xmalloc ((unsigned) statbuf.st_size + 1);
1073 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1074 if (readlen < 0)
1075 pfatal_with_name (filename);
1076 buffer[readlen] = 0;
1077 close (desc);
1078
1079 /* Scan BUFFER for specs, putting them in the vector. */
1080 p = buffer;
1081 while (1)
1082 {
1083 char *suffix;
1084 char *spec;
1085 char *in, *out, *p1, *p2;
1086
1087 /* Advance P in BUFFER to the next nonblank nocomment line. */
1088 p = skip_whitespace (p);
1089 if (*p == 0)
1090 break;
1091
1092 /* Find the colon that should end the suffix. */
1093 p1 = p;
1094 while (*p1 && *p1 != ':' && *p1 != '\n') p1++;
1095 /* The colon shouldn't be missing. */
1096 if (*p1 != ':')
1097 fatal ("specs file malformed after %d characters", p1 - buffer);
1098 /* Skip back over trailing whitespace. */
1099 p2 = p1;
1100 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t')) p2--;
1101 /* Copy the suffix to a string. */
1102 suffix = save_string (p, p2 - p);
1103 /* Find the next line. */
1104 p = skip_whitespace (p1 + 1);
1105 if (p[1] == 0)
1106 fatal ("specs file malformed after %d characters", p - buffer);
1107 p1 = p;
1108 /* Find next blank line. */
1109 while (*p1 && !(*p1 == '\n' && p1[1] == '\n')) p1++;
1110 /* Specs end at the blank line and do not include the newline. */
1111 spec = save_string (p, p1 - p);
1112 p = p1;
1113
1114 /* Delete backslash-newline sequences from the spec. */
1115 in = spec;
1116 out = spec;
1117 while (*in != 0)
1118 {
1119 if (in[0] == '\\' && in[1] == '\n')
1120 in += 2;
1121 else if (in[0] == '#')
1122 {
1123 while (*in && *in != '\n') in++;
1124 }
1125 else
1126 *out++ = *in++;
1127 }
1128 *out = 0;
1129
1130 if (suffix[0] == '*')
1131 {
1132 if (! strcmp (suffix, "*link_command"))
1133 link_command_spec = spec;
1134 else
1135 set_spec (suffix + 1, spec);
1136 }
1137 else
1138 {
1139 /* Add this pair to the vector. */
1140 compilers
1141 = ((struct compiler *)
1142 xrealloc (compilers, (n_compilers + 2) * sizeof (struct compiler)));
1143 compilers[n_compilers].suffix = suffix;
1144 bzero ((char *) compilers[n_compilers].spec,
1145 sizeof compilers[n_compilers].spec);
1146 compilers[n_compilers].spec[0] = spec;
1147 n_compilers++;
1148 bzero ((char *) &compilers[n_compilers],
1149 sizeof compilers[n_compilers]);
1150 }
1151
1152 if (*suffix == 0)
1153 link_command_spec = spec;
1154 }
1155
1156 if (link_command_spec == 0)
1157 fatal ("spec file has no spec for linking");
1158}
1159
1160static char *
1161skip_whitespace (p)
1162 char *p;
1163{
1164 while (1)
1165 {
1166 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1167 be considered whitespace. */

--- 8 unchanged lines hidden (view full) ---

1176 }
1177 else
1178 break;
1179 }
1180
1181 return p;
1182}
1183
1113static char *
1114skip_whitespace (p)
1115 char *p;
1116{
1117 while (1)
1118 {
1119 /* A fully-blank line is a delimiter in the SPEC file and shouldn't
1120 be considered whitespace. */

--- 8 unchanged lines hidden (view full) ---

1129 }
1130 else
1131 break;
1132 }
1133
1134 return p;
1135}
1136
1184/* Structure to keep track of the specs that have been defined so far. These
1185 are accessed using %(specname) or %[specname] in a compiler or link spec. */
1137/* Structure to keep track of the specs that have been defined so far.
1138 These are accessed using %(specname) or %[specname] in a compiler
1139 or link spec. */
1186
1187struct spec_list
1188{
1140
1141struct spec_list
1142{
1189 char *name; /* Name of the spec. */
1190 char *spec; /* The spec itself. */
1191 struct spec_list *next; /* Next spec in linked list. */
1143 /* The following 2 fields must be first */
1144 /* to allow EXTRA_SPECS to be initialized */
1145 char *name; /* name of the spec. */
1146 char *ptr; /* available ptr if no static pointer */
1147
1148 /* The following fields are not initialized */
1149 /* by EXTRA_SPECS */
1150 char **ptr_spec; /* pointer to the spec itself. */
1151 struct spec_list *next; /* Next spec in linked list. */
1152 int name_len; /* length of the name */
1153 int alloc_p; /* whether string was allocated */
1192};
1193
1154};
1155
1194/* List of specs that have been defined so far. */
1156#define INIT_STATIC_SPEC(NAME,PTR) \
1157{ NAME, NULL_PTR, PTR, (struct spec_list *)0, sizeof (NAME)-1, 0 }
1195
1158
1196static struct spec_list *specs = (struct spec_list *) 0;
1159/* List of statically defined specs */
1160static struct spec_list static_specs[] = {
1161 INIT_STATIC_SPEC ("asm", &asm_spec),
1162 INIT_STATIC_SPEC ("asm_final", &asm_final_spec),
1163 INIT_STATIC_SPEC ("cpp", &cpp_spec),
1164 INIT_STATIC_SPEC ("cc1", &cc1_spec),
1165 INIT_STATIC_SPEC ("cc1plus", &cc1plus_spec),
1166 INIT_STATIC_SPEC ("endfile", &endfile_spec),
1167 INIT_STATIC_SPEC ("link", &link_spec),
1168 INIT_STATIC_SPEC ("lib", &lib_spec),
1169 INIT_STATIC_SPEC ("libgcc", &libgcc_spec),
1170 INIT_STATIC_SPEC ("startfile", &startfile_spec),
1171 INIT_STATIC_SPEC ("switches_need_spaces", &switches_need_spaces),
1172 INIT_STATIC_SPEC ("signed_char", &signed_char_spec),
1173 INIT_STATIC_SPEC ("predefines", &cpp_predefines),
1174 INIT_STATIC_SPEC ("cross_compile", &cross_compile),
1175 INIT_STATIC_SPEC ("version", &compiler_version),
1176 INIT_STATIC_SPEC ("multilib", &multilib_select),
1177 INIT_STATIC_SPEC ("multilib_defaults", &multilib_defaults),
1178 INIT_STATIC_SPEC ("multilib_extra", &multilib_extra),
1179 INIT_STATIC_SPEC ("multilib_matches", &multilib_matches),
1180 INIT_STATIC_SPEC ("linker", &linker_name_spec),
1181};
1182
1183#ifdef EXTRA_SPECS /* additional specs needed */
1184static struct spec_list extra_specs[] = { EXTRA_SPECS };
1185#endif
1186
1187/* List of dynamically allocates specs that have been defined so far. */
1188
1189static struct spec_list *specs = (struct spec_list *)0;
1190
1197
1191
1192/* Initialize the specs lookup routines. */
1193
1194static void
1195init_spec ()
1196{
1197 struct spec_list *next = (struct spec_list *)0;
1198 struct spec_list *sl = (struct spec_list *)0;
1199 int i;
1200
1201 if (specs)
1202 return; /* already initialized */
1203
1204 if (verbose_flag)
1205 fprintf (stderr, "Using builtin specs.\n");
1206
1207#ifdef EXTRA_SPECS
1208 for (i = (sizeof (extra_specs) / sizeof (extra_specs[0])) - 1; i >= 0; i--)
1209 {
1210 sl = &extra_specs[i];
1211 sl->next = next;
1212 sl->name_len = strlen (sl->name);
1213 sl->ptr_spec = &sl->ptr;
1214 next = sl;
1215 }
1216#endif
1217
1218 for (i = (sizeof (static_specs) / sizeof (static_specs[0])) - 1; i >= 0; i--)
1219 {
1220 sl = &static_specs[i];
1221 sl->next = next;
1222 next = sl;
1223 }
1224
1225 specs = sl;
1226}
1227
1228
1198/* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1199 removed; If the spec starts with a + then SPEC is added to the end of the
1229/* Change the value of spec NAME to SPEC. If SPEC is empty, then the spec is
1230 removed; If the spec starts with a + then SPEC is added to the end of the
1200 current spec. */
1231 current spec. */
1201
1202static void
1203set_spec (name, spec)
1204 char *name;
1205 char *spec;
1206{
1207 struct spec_list *sl;
1208 char *old_spec;
1232
1233static void
1234set_spec (name, spec)
1235 char *name;
1236 char *spec;
1237{
1238 struct spec_list *sl;
1239 char *old_spec;
1240 int name_len = strlen (name);
1241 int i;
1209
1242
1243 /* If this is the first call, initialize the statically allocated specs */
1244 if (!specs)
1245 {
1246 struct spec_list *next = (struct spec_list *)0;
1247 for (i = (sizeof (static_specs) / sizeof (static_specs[0])) - 1;
1248 i >= 0; i--)
1249 {
1250 sl = &static_specs[i];
1251 sl->next = next;
1252 next = sl;
1253 }
1254 specs = sl;
1255 }
1256
1210 /* See if the spec already exists */
1211 for (sl = specs; sl; sl = sl->next)
1257 /* See if the spec already exists */
1258 for (sl = specs; sl; sl = sl->next)
1212 if (strcmp (sl->name, name) == 0)
1259 if (name_len == sl->name_len && !strcmp (sl->name, name))
1213 break;
1214
1215 if (!sl)
1216 {
1217 /* Not found - make it */
1218 sl = (struct spec_list *) xmalloc (sizeof (struct spec_list));
1219 sl->name = save_string (name, strlen (name));
1260 break;
1261
1262 if (!sl)
1263 {
1264 /* Not found - make it */
1265 sl = (struct spec_list *) xmalloc (sizeof (struct spec_list));
1266 sl->name = save_string (name, strlen (name));
1220 sl->spec = save_string ("", 0);
1267 sl->name_len = name_len;
1268 sl->ptr_spec = &sl->ptr;
1269 sl->alloc_p = 0;
1270 *(sl->ptr_spec) = "";
1221 sl->next = specs;
1222 specs = sl;
1223 }
1224
1271 sl->next = specs;
1272 specs = sl;
1273 }
1274
1225 old_spec = sl->spec;
1226 if (name && spec[0] == '+' && isspace (spec[1]))
1227 sl->spec = concat (old_spec, spec + 1);
1228 else
1229 sl->spec = save_string (spec, strlen (spec));
1275 old_spec = *(sl->ptr_spec);
1276 *(sl->ptr_spec) = ((spec[0] == '+' && ISSPACE (spec[1]))
1277 ? concat (old_spec, spec + 1, NULL_PTR)
1278 : save_string (spec, strlen (spec)));
1230
1279
1231 if (! strcmp (name, "asm"))
1232 asm_spec = sl->spec;
1233 else if (! strcmp (name, "asm_final"))
1234 asm_final_spec = sl->spec;
1235 else if (! strcmp (name, "cc1"))
1236 cc1_spec = sl->spec;
1237 else if (! strcmp (name, "cc1plus"))
1238 cc1plus_spec = sl->spec;
1239 else if (! strcmp (name, "cpp"))
1240 cpp_spec = sl->spec;
1241 else if (! strcmp (name, "endfile"))
1242 endfile_spec = sl->spec;
1243 else if (! strcmp (name, "lib"))
1244 lib_spec = sl->spec;
1245 else if (! strcmp (name, "libgcc"))
1246 libgcc_spec = sl->spec;
1247 else if (! strcmp (name, "link"))
1248 link_spec = sl->spec;
1249 else if (! strcmp (name, "predefines"))
1250 cpp_predefines = sl->spec;
1251 else if (! strcmp (name, "signed_char"))
1252 signed_char_spec = sl->spec;
1253 else if (! strcmp (name, "startfile"))
1254 startfile_spec = sl->spec;
1255 else if (! strcmp (name, "switches_need_spaces"))
1256 switches_need_spaces = sl->spec;
1257 else if (! strcmp (name, "cross_compile"))
1258 cross_compile = atoi (sl->spec);
1259 else if (! strcmp (name, "multilib"))
1260 multilib_select = sl->spec;
1280#ifdef DEBUG_SPECS
1281 if (verbose_flag)
1282 fprintf (stderr, "Setting spec %s to '%s'\n\n", name, *(sl->ptr_spec));
1283#endif
1284
1261 /* Free the old spec */
1285 /* Free the old spec */
1262 if (old_spec)
1286 if (old_spec && sl->alloc_p)
1263 free (old_spec);
1287 free (old_spec);
1288
1289 sl->alloc_p = 1;
1264}
1265
1266/* Accumulate a command (program name and args), and run it. */
1267
1268/* Vector of pointers to arguments in the current line of specifications. */
1269
1270static char **argbuf;
1271
1272/* Number of elements allocated in argbuf. */
1273
1274static int argbuf_length;
1275
1276/* Number of elements in argbuf currently in use (containing args). */
1277
1278static int argbuf_index;
1279
1290}
1291
1292/* Accumulate a command (program name and args), and run it. */
1293
1294/* Vector of pointers to arguments in the current line of specifications. */
1295
1296static char **argbuf;
1297
1298/* Number of elements allocated in argbuf. */
1299
1300static int argbuf_length;
1301
1302/* Number of elements in argbuf currently in use (containing args). */
1303
1304static int argbuf_index;
1305
1306/* We want this on by default all the time now. */
1307#define MKTEMP_EACH_FILE
1308
1309#ifdef MKTEMP_EACH_FILE
1310
1311extern char *make_temp_file PROTO((char *));
1312
1280/* This is the list of suffixes and codes (%g/%u/%U) and the associated
1313/* This is the list of suffixes and codes (%g/%u/%U) and the associated
1281 temp file. Used only if MKTEMP_EACH_FILE. */
1314 temp file. */
1282
1283static struct temp_name {
1284 char *suffix; /* suffix associated with the code. */
1285 int length; /* strlen (suffix). */
1286 int unique; /* Indicates whether %g or %u/%U was used. */
1287 char *filename; /* associated filename. */
1288 int filename_length; /* strlen (filename). */
1289 struct temp_name *next;
1290} *temp_names;
1315
1316static struct temp_name {
1317 char *suffix; /* suffix associated with the code. */
1318 int length; /* strlen (suffix). */
1319 int unique; /* Indicates whether %g or %u/%U was used. */
1320 char *filename; /* associated filename. */
1321 int filename_length; /* strlen (filename). */
1322 struct temp_name *next;
1323} *temp_names;
1324#else
1325extern char *choose_temp_base PROTO((void));
1326#endif
1291
1327
1328
1292/* Number of commands executed so far. */
1293
1294static int execution_count;
1295
1296/* Number of commands that exited with a signal. */
1297
1298static int signal_count;
1299
1300/* Name with which this program was invoked. */
1301
1302static char *programname;
1303
1329/* Number of commands executed so far. */
1330
1331static int execution_count;
1332
1333/* Number of commands that exited with a signal. */
1334
1335static int signal_count;
1336
1337/* Name with which this program was invoked. */
1338
1339static char *programname;
1340
1304/* Structures to keep track of prefixes to try when looking for files. */
1341/* Structures to keep track of prefixes to try when looking for files. */
1305
1306struct prefix_list
1307{
1342
1343struct prefix_list
1344{
1308 char *prefix; /* String to prepend to the path. */
1309 struct prefix_list *next; /* Next in linked list. */
1345 char *prefix; /* String to prepend to the path. */
1346 struct prefix_list *next; /* Next in linked list. */
1310 int require_machine_suffix; /* Don't use without machine_suffix. */
1311 /* 2 means try both machine_suffix and just_machine_suffix. */
1312 int *used_flag_ptr; /* 1 if a file was found with this prefix. */
1313};
1314
1315struct path_prefix
1316{
1317 struct prefix_list *plist; /* List of prefixes to try */
1318 int max_len; /* Max length of a prefix in PLIST */
1319 char *name; /* Name of this list (used in config stuff) */
1320};
1321
1347 int require_machine_suffix; /* Don't use without machine_suffix. */
1348 /* 2 means try both machine_suffix and just_machine_suffix. */
1349 int *used_flag_ptr; /* 1 if a file was found with this prefix. */
1350};
1351
1352struct path_prefix
1353{
1354 struct prefix_list *plist; /* List of prefixes to try */
1355 int max_len; /* Max length of a prefix in PLIST */
1356 char *name; /* Name of this list (used in config stuff) */
1357};
1358
1322/* List of prefixes to try when looking for executables. */
1359/* List of prefixes to try when looking for executables. */
1323
1324static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1325
1360
1361static struct path_prefix exec_prefixes = { 0, 0, "exec" };
1362
1326/* List of prefixes to try when looking for startup (crt0) files. */
1363/* List of prefixes to try when looking for startup (crt0) files. */
1327
1328static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1329
1330/* List of prefixes to try when looking for include files. */
1331
1332static struct path_prefix include_prefixes = { 0, 0, "include" };
1333
1334/* Suffix to attach to directories searched for commands.

--- 69 unchanged lines hidden (view full) ---

1404 and the file should be deleted if this compilation fails. */
1405
1406static void
1407store_arg (arg, delete_always, delete_failure)
1408 char *arg;
1409 int delete_always, delete_failure;
1410{
1411 if (argbuf_index + 1 == argbuf_length)
1364
1365static struct path_prefix startfile_prefixes = { 0, 0, "startfile" };
1366
1367/* List of prefixes to try when looking for include files. */
1368
1369static struct path_prefix include_prefixes = { 0, 0, "include" };
1370
1371/* Suffix to attach to directories searched for commands.

--- 69 unchanged lines hidden (view full) ---

1441 and the file should be deleted if this compilation fails. */
1442
1443static void
1444store_arg (arg, delete_always, delete_failure)
1445 char *arg;
1446 int delete_always, delete_failure;
1447{
1448 if (argbuf_index + 1 == argbuf_length)
1412 {
1413 argbuf = (char **) xrealloc (argbuf, (argbuf_length *= 2) * sizeof (char *));
1414 }
1449 argbuf
1450 = (char **) xrealloc (argbuf, (argbuf_length *= 2) * sizeof (char *));
1415
1416 argbuf[argbuf_index++] = arg;
1417 argbuf[argbuf_index] = 0;
1418
1419 if (delete_always || delete_failure)
1420 record_temp_file (arg, delete_always, delete_failure);
1421}
1422
1451
1452 argbuf[argbuf_index++] = arg;
1453 argbuf[argbuf_index] = 0;
1454
1455 if (delete_always || delete_failure)
1456 record_temp_file (arg, delete_always, delete_failure);
1457}
1458
1459/* Read compilation specs from a file named FILENAME,
1460 replacing the default ones.
1461
1462 A suffix which starts with `*' is a definition for
1463 one of the machine-specific sub-specs. The "suffix" should be
1464 *asm, *cc1, *cpp, *link, *startfile, *signed_char, etc.
1465 The corresponding spec is stored in asm_spec, etc.,
1466 rather than in the `compilers' vector.
1467
1468 Anything invalid in the file is a fatal error. */
1469
1470static void
1471read_specs (filename, main_p)
1472 char *filename;
1473 int main_p;
1474{
1475 int desc;
1476 int readlen;
1477 struct stat statbuf;
1478 char *buffer;
1479 register char *p;
1480
1481 if (verbose_flag)
1482 fprintf (stderr, "Reading specs from %s\n", filename);
1483
1484 /* Open and stat the file. */
1485 desc = open (filename, O_RDONLY, 0);
1486 if (desc < 0)
1487 pfatal_with_name (filename);
1488 if (stat (filename, &statbuf) < 0)
1489 pfatal_with_name (filename);
1490
1491 /* Read contents of file into BUFFER. */
1492 buffer = xmalloc ((unsigned) statbuf.st_size + 1);
1493 readlen = read (desc, buffer, (unsigned) statbuf.st_size);
1494 if (readlen < 0)
1495 pfatal_with_name (filename);
1496 buffer[readlen] = 0;
1497 close (desc);
1498
1499 /* Scan BUFFER for specs, putting them in the vector. */
1500 p = buffer;
1501 while (1)
1502 {
1503 char *suffix;
1504 char *spec;
1505 char *in, *out, *p1, *p2, *p3;
1506
1507 /* Advance P in BUFFER to the next nonblank nocomment line. */
1508 p = skip_whitespace (p);
1509 if (*p == 0)
1510 break;
1511
1512 /* Is this a special command that starts with '%'? */
1513 /* Don't allow this for the main specs file, since it would
1514 encourage people to overwrite it. */
1515 if (*p == '%' && !main_p)
1516 {
1517 p1 = p;
1518 while (*p && *p != '\n')
1519 p++;
1520
1521 p++; /* Skip '\n' */
1522
1523 if (!strncmp (p1, "%include", sizeof ("%include")-1)
1524 && (p1[sizeof "%include" - 1] == ' '
1525 || p1[sizeof "%include" - 1] == '\t'))
1526 {
1527 char *new_filename;
1528
1529 p1 += sizeof ("%include");
1530 while (*p1 == ' ' || *p1 == '\t')
1531 p1++;
1532
1533 if (*p1++ != '<' || p[-2] != '>')
1534 fatal ("specs %%include syntax malformed after %d characters",
1535 p1 - buffer + 1);
1536
1537 p[-2] = '\0';
1538 new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1539 read_specs (new_filename ? new_filename : p1, FALSE);
1540 continue;
1541 }
1542 else if (!strncmp (p1, "%include_noerr", sizeof "%include_noerr" - 1)
1543 && (p1[sizeof "%include_noerr" - 1] == ' '
1544 || p1[sizeof "%include_noerr" - 1] == '\t'))
1545 {
1546 char *new_filename;
1547
1548 p1 += sizeof "%include_noerr";
1549 while (*p1 == ' ' || *p1 == '\t') p1++;
1550
1551 if (*p1++ != '<' || p[-2] != '>')
1552 fatal ("specs %%include syntax malformed after %d characters",
1553 p1 - buffer + 1);
1554
1555 p[-2] = '\0';
1556 new_filename = find_a_file (&startfile_prefixes, p1, R_OK);
1557 if (new_filename)
1558 read_specs (new_filename, FALSE);
1559 else if (verbose_flag)
1560 fprintf (stderr, "Could not find specs file %s\n", p1);
1561 continue;
1562 }
1563 else if (!strncmp (p1, "%rename", sizeof "%rename" - 1)
1564 && (p1[sizeof "%rename" - 1] == ' '
1565 || p1[sizeof "%rename" - 1] == '\t'))
1566 {
1567 int name_len;
1568 struct spec_list *sl;
1569
1570 /* Get original name */
1571 p1 += sizeof "%rename";
1572 while (*p1 == ' ' || *p1 == '\t')
1573 p1++;
1574
1575 if (! ISALPHA (*p1))
1576 fatal ("specs %%rename syntax malformed after %d characters",
1577 p1 - buffer);
1578
1579 p2 = p1;
1580 while (*p2 && !ISSPACE (*p2))
1581 p2++;
1582
1583 if (*p2 != ' ' && *p2 != '\t')
1584 fatal ("specs %%rename syntax malformed after %d characters",
1585 p2 - buffer);
1586
1587 name_len = p2 - p1;
1588 *p2++ = '\0';
1589 while (*p2 == ' ' || *p2 == '\t')
1590 p2++;
1591
1592 if (! ISALPHA (*p2))
1593 fatal ("specs %%rename syntax malformed after %d characters",
1594 p2 - buffer);
1595
1596 /* Get new spec name */
1597 p3 = p2;
1598 while (*p3 && !ISSPACE (*p3))
1599 p3++;
1600
1601 if (p3 != p-1)
1602 fatal ("specs %%rename syntax malformed after %d characters",
1603 p3 - buffer);
1604 *p3 = '\0';
1605
1606 for (sl = specs; sl; sl = sl->next)
1607 if (name_len == sl->name_len && !strcmp (sl->name, p1))
1608 break;
1609
1610 if (!sl)
1611 fatal ("specs %s spec was not found to be renamed", p1);
1612
1613 if (strcmp (p1, p2) == 0)
1614 continue;
1615
1616 if (verbose_flag)
1617 {
1618 fprintf (stderr, "rename spec %s to %s\n", p1, p2);
1619#ifdef DEBUG_SPECS
1620 fprintf (stderr, "spec is '%s'\n\n", *(sl->ptr_spec));
1621#endif
1622 }
1623
1624 set_spec (p2, *(sl->ptr_spec));
1625 if (sl->alloc_p)
1626 free (*(sl->ptr_spec));
1627
1628 *(sl->ptr_spec) = "";
1629 sl->alloc_p = 0;
1630 continue;
1631 }
1632 else
1633 fatal ("specs unknown %% command after %d characters",
1634 p1 - buffer);
1635 }
1636
1637 /* Find the colon that should end the suffix. */
1638 p1 = p;
1639 while (*p1 && *p1 != ':' && *p1 != '\n')
1640 p1++;
1641
1642 /* The colon shouldn't be missing. */
1643 if (*p1 != ':')
1644 fatal ("specs file malformed after %d characters", p1 - buffer);
1645
1646 /* Skip back over trailing whitespace. */
1647 p2 = p1;
1648 while (p2 > buffer && (p2[-1] == ' ' || p2[-1] == '\t'))
1649 p2--;
1650
1651 /* Copy the suffix to a string. */
1652 suffix = save_string (p, p2 - p);
1653 /* Find the next line. */
1654 p = skip_whitespace (p1 + 1);
1655 if (p[1] == 0)
1656 fatal ("specs file malformed after %d characters", p - buffer);
1657
1658 p1 = p;
1659 /* Find next blank line or end of string. */
1660 while (*p1 && !(*p1 == '\n' && (p1[1] == '\n' || p1[1] == '\0')))
1661 p1++;
1662
1663 /* Specs end at the blank line and do not include the newline. */
1664 spec = save_string (p, p1 - p);
1665 p = p1;
1666
1667 /* Delete backslash-newline sequences from the spec. */
1668 in = spec;
1669 out = spec;
1670 while (*in != 0)
1671 {
1672 if (in[0] == '\\' && in[1] == '\n')
1673 in += 2;
1674 else if (in[0] == '#')
1675 while (*in && *in != '\n')
1676 in++;
1677
1678 else
1679 *out++ = *in++;
1680 }
1681 *out = 0;
1682
1683 if (suffix[0] == '*')
1684 {
1685 if (! strcmp (suffix, "*link_command"))
1686 link_command_spec = spec;
1687 else
1688 set_spec (suffix + 1, spec);
1689 }
1690 else
1691 {
1692 /* Add this pair to the vector. */
1693 compilers
1694 = ((struct compiler *)
1695 xrealloc (compilers,
1696 (n_compilers + 2) * sizeof (struct compiler)));
1697
1698 compilers[n_compilers].suffix = suffix;
1699 bzero ((char *) compilers[n_compilers].spec,
1700 sizeof compilers[n_compilers].spec);
1701 compilers[n_compilers].spec[0] = spec;
1702 n_compilers++;
1703 bzero ((char *) &compilers[n_compilers],
1704 sizeof compilers[n_compilers]);
1705 }
1706
1707 if (*suffix == 0)
1708 link_command_spec = spec;
1709 }
1710
1711 if (link_command_spec == 0)
1712 fatal ("spec file has no spec for linking");
1713}
1714
1423/* Record the names of temporary files we tell compilers to write,
1424 and delete them at the end of the run. */
1425
1426/* This is the common prefix we use to make temp file names.
1427 It is chosen once for each run of this program.
1428 It is substituted into a spec by %g.
1429 Thus, all temp file names contain this prefix.
1430 In practice, all temp file names start with this prefix.
1431
1432 This prefix comes from the envvar TMPDIR if it is defined;
1433 otherwise, from the P_tmpdir macro if that is defined;
1715/* Record the names of temporary files we tell compilers to write,
1716 and delete them at the end of the run. */
1717
1718/* This is the common prefix we use to make temp file names.
1719 It is chosen once for each run of this program.
1720 It is substituted into a spec by %g.
1721 Thus, all temp file names contain this prefix.
1722 In practice, all temp file names start with this prefix.
1723
1724 This prefix comes from the envvar TMPDIR if it is defined;
1725 otherwise, from the P_tmpdir macro if that is defined;
1434 otherwise, in /usr/tmp or /tmp. */
1726 otherwise, in /usr/tmp or /tmp;
1727 or finally the current directory if all else fails. */
1435
1436static char *temp_filename;
1437
1438/* Length of the prefix. */
1439
1440static int temp_filename_length;
1441
1442/* Define the list of temporary files to delete. */

--- 26 unchanged lines hidden (view full) ---

1469 strcpy (name, filename);
1470
1471 if (always_delete)
1472 {
1473 register struct temp_file *temp;
1474 for (temp = always_delete_queue; temp; temp = temp->next)
1475 if (! strcmp (name, temp->name))
1476 goto already1;
1728
1729static char *temp_filename;
1730
1731/* Length of the prefix. */
1732
1733static int temp_filename_length;
1734
1735/* Define the list of temporary files to delete. */

--- 26 unchanged lines hidden (view full) ---

1762 strcpy (name, filename);
1763
1764 if (always_delete)
1765 {
1766 register struct temp_file *temp;
1767 for (temp = always_delete_queue; temp; temp = temp->next)
1768 if (! strcmp (name, temp->name))
1769 goto already1;
1770
1477 temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1478 temp->next = always_delete_queue;
1479 temp->name = name;
1480 always_delete_queue = temp;
1771 temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1772 temp->next = always_delete_queue;
1773 temp->name = name;
1774 always_delete_queue = temp;
1775
1481 already1:;
1482 }
1483
1484 if (fail_delete)
1485 {
1486 register struct temp_file *temp;
1487 for (temp = failure_delete_queue; temp; temp = temp->next)
1488 if (! strcmp (name, temp->name))
1489 goto already2;
1776 already1:;
1777 }
1778
1779 if (fail_delete)
1780 {
1781 register struct temp_file *temp;
1782 for (temp = failure_delete_queue; temp; temp = temp->next)
1783 if (! strcmp (name, temp->name))
1784 goto already2;
1785
1490 temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1491 temp->next = failure_delete_queue;
1492 temp->name = name;
1493 failure_delete_queue = temp;
1786 temp = (struct temp_file *) xmalloc (sizeof (struct temp_file));
1787 temp->next = failure_delete_queue;
1788 temp->name = name;
1789 failure_delete_queue = temp;
1790
1494 already2:;
1495 }
1496}
1497
1498/* Delete all the temporary files whose names we previously recorded. */
1499
1500static void
1501delete_if_ordinary (name)
1502 char *name;
1503{
1504 struct stat st;
1505#ifdef DEBUG
1506 int i, c;
1507
1508 printf ("Delete %s? (y or n) ", name);
1509 fflush (stdout);
1510 i = getchar ();
1511 if (i != '\n')
1791 already2:;
1792 }
1793}
1794
1795/* Delete all the temporary files whose names we previously recorded. */
1796
1797static void
1798delete_if_ordinary (name)
1799 char *name;
1800{
1801 struct stat st;
1802#ifdef DEBUG
1803 int i, c;
1804
1805 printf ("Delete %s? (y or n) ", name);
1806 fflush (stdout);
1807 i = getchar ();
1808 if (i != '\n')
1512 while ((c = getchar ()) != '\n' && c != EOF) ;
1809 while ((c = getchar ()) != '\n' && c != EOF)
1810 ;
1811
1513 if (i == 'y' || i == 'Y')
1514#endif /* DEBUG */
1515 if (stat (name, &st) >= 0 && S_ISREG (st.st_mode))
1516 if (unlink (name) < 0)
1517 if (verbose_flag)
1518 perror_with_name (name);
1519}
1520

--- 18 unchanged lines hidden (view full) ---

1539 delete_if_ordinary (temp->name);
1540}
1541
1542static void
1543clear_failure_queue ()
1544{
1545 failure_delete_queue = 0;
1546}
1812 if (i == 'y' || i == 'Y')
1813#endif /* DEBUG */
1814 if (stat (name, &st) >= 0 && S_ISREG (st.st_mode))
1815 if (unlink (name) < 0)
1816 if (verbose_flag)
1817 perror_with_name (name);
1818}
1819

--- 18 unchanged lines hidden (view full) ---

1838 delete_if_ordinary (temp->name);
1839}
1840
1841static void
1842clear_failure_queue ()
1843{
1844 failure_delete_queue = 0;
1845}
1547
1548/* Compute a string to use as the base of all temporary file names.
1549 It is substituted for %g. */
1550
1551static char *
1552choose_temp_base_try (try, base)
1553 char *try;
1554 char *base;
1555{
1556 char *rv;
1557 if (base)
1558 rv = base;
1559 else if (try == (char *)0)
1560 rv = 0;
1561 else if (access (try, R_OK | W_OK) != 0)
1562 rv = 0;
1563 else
1564 rv = try;
1565 return rv;
1566}
1567
1568static void
1569choose_temp_base ()
1570{
1571 char *base = 0;
1572 int len;
1573
1574 base = choose_temp_base_try (getenv ("TMPDIR"), base);
1575 base = choose_temp_base_try (getenv ("TMP"), base);
1576 base = choose_temp_base_try (getenv ("TEMP"), base);
1577
1578#ifdef P_tmpdir
1579 base = choose_temp_base_try (P_tmpdir, base);
1580#endif
1581
1582 base = choose_temp_base_try (concat4 (dir_separator_str, "usr",
1583 dir_separator_str, "tmp"),
1584 base);
1585 base = choose_temp_base_try (concat (dir_separator_str, "tmp"), base);
1586
1587 /* If all else fails, use the current directory! */
1588 if (base == (char *)0) base = concat(".", dir_separator_str);
1589
1590 len = strlen (base);
1591 temp_filename = xmalloc (len + strlen (concat (dir_separator_str,
1592 "ccXXXXXX")) + 1);
1593 strcpy (temp_filename, base);
1594 if (len > 0 && temp_filename[len-1] != '/'
1595 && temp_filename[len-1] != DIR_SEPARATOR)
1596 temp_filename[len++] = DIR_SEPARATOR;
1597 strcpy (temp_filename + len, "ccXXXXXX");
1598
1599 mktemp (temp_filename);
1600 temp_filename_length = strlen (temp_filename);
1601 if (temp_filename_length == 0)
1602 abort ();
1603}
1604
1846
1605
1606/* Routine to add variables to the environment. We do this to pass
1607 the pathname of the gcc driver, and the directories search to the
1608 collect2 program, which is being run as ld. This way, we can be
1609 sure of executing the right compiler when collect2 wants to build
1610 constructors and destructors. Since the environment variables we
1611 use come from an obstack, we don't have to worry about allocating
1612 space for them. */
1613

--- 5 unchanged lines hidden (view full) ---

1619{
1620#ifndef VMS /* nor about VMS */
1621
1622 extern char **environ;
1623 char **old_environ = environ;
1624 char **envp;
1625 int num_envs = 0;
1626 int name_len = 1;
1847/* Routine to add variables to the environment. We do this to pass
1848 the pathname of the gcc driver, and the directories search to the
1849 collect2 program, which is being run as ld. This way, we can be
1850 sure of executing the right compiler when collect2 wants to build
1851 constructors and destructors. Since the environment variables we
1852 use come from an obstack, we don't have to worry about allocating
1853 space for them. */
1854

--- 5 unchanged lines hidden (view full) ---

1860{
1861#ifndef VMS /* nor about VMS */
1862
1863 extern char **environ;
1864 char **old_environ = environ;
1865 char **envp;
1866 int num_envs = 0;
1867 int name_len = 1;
1868 int str_len = strlen (str);
1627 char *p = str;
1628 int ch;
1629
1630 while ((ch = *p++) != '\0' && ch != '=')
1631 name_len++;
1632
1633 if (!ch)
1634 abort ();

--- 42 unchanged lines hidden (view full) ---

1677
1678 obstack_grow (&collect_obstack, prefix, strlen (prefix));
1679
1680 for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
1681 {
1682 int len = strlen (pprefix->prefix);
1683
1684 if (machine_suffix
1869 char *p = str;
1870 int ch;
1871
1872 while ((ch = *p++) != '\0' && ch != '=')
1873 name_len++;
1874
1875 if (!ch)
1876 abort ();

--- 42 unchanged lines hidden (view full) ---

1919
1920 obstack_grow (&collect_obstack, prefix, strlen (prefix));
1921
1922 for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next)
1923 {
1924 int len = strlen (pprefix->prefix);
1925
1926 if (machine_suffix
1685 && (!check_dir_p
1927 && (! check_dir_p
1686 || is_directory (pprefix->prefix, machine_suffix, 0)))
1687 {
1688 if (!first_time)
1689 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1690
1691 first_time = FALSE;
1692 obstack_grow (&collect_obstack, pprefix->prefix, len);
1693 obstack_grow (&collect_obstack, machine_suffix, suffix_len);
1694 }
1695
1696 if (just_machine_suffix
1697 && pprefix->require_machine_suffix == 2
1928 || is_directory (pprefix->prefix, machine_suffix, 0)))
1929 {
1930 if (!first_time)
1931 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1932
1933 first_time = FALSE;
1934 obstack_grow (&collect_obstack, pprefix->prefix, len);
1935 obstack_grow (&collect_obstack, machine_suffix, suffix_len);
1936 }
1937
1938 if (just_machine_suffix
1939 && pprefix->require_machine_suffix == 2
1698 && (!check_dir_p
1940 && (! check_dir_p
1699 || is_directory (pprefix->prefix, just_machine_suffix, 0)))
1700 {
1941 || is_directory (pprefix->prefix, just_machine_suffix, 0)))
1942 {
1701 if (!first_time)
1943 if (! first_time)
1702 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1703
1704 first_time = FALSE;
1705 obstack_grow (&collect_obstack, pprefix->prefix, len);
1706 obstack_grow (&collect_obstack, just_machine_suffix,
1707 just_suffix_len);
1708 }
1709
1944 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1945
1946 first_time = FALSE;
1947 obstack_grow (&collect_obstack, pprefix->prefix, len);
1948 obstack_grow (&collect_obstack, just_machine_suffix,
1949 just_suffix_len);
1950 }
1951
1710 if (!pprefix->require_machine_suffix)
1952 if (! pprefix->require_machine_suffix)
1711 {
1953 {
1712 if (!first_time)
1954 if (! first_time)
1713 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1714
1715 first_time = FALSE;
1716 obstack_grow (&collect_obstack, pprefix->prefix, len);
1717 }
1718 }
1955 obstack_1grow (&collect_obstack, PATH_SEPARATOR);
1956
1957 first_time = FALSE;
1958 obstack_grow (&collect_obstack, pprefix->prefix, len);
1959 }
1960 }
1961
1719 obstack_1grow (&collect_obstack, '\0');
1720 return obstack_finish (&collect_obstack);
1721}
1722
1962 obstack_1grow (&collect_obstack, '\0');
1963 return obstack_finish (&collect_obstack);
1964}
1965
1723/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables for collect. */
1966/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
1967 for collect. */
1724
1725static void
1726putenv_from_prefixes (paths, env_var)
1727 struct path_prefix *paths;
1728 char *env_var;
1729{
1730 putenv (build_search_list (paths, env_var, 1));
1731}
1732
1733/* Search for NAME using the prefix list PREFIXES. MODE is passed to
1734 access to check permissions.
1968
1969static void
1970putenv_from_prefixes (paths, env_var)
1971 struct path_prefix *paths;
1972 char *env_var;
1973{
1974 putenv (build_search_list (paths, env_var, 1));
1975}
1976
1977/* Search for NAME using the prefix list PREFIXES. MODE is passed to
1978 access to check permissions.
1735 Return 0 if not found, otherwise return its name, allocated with malloc. */
1979 Return 0 if not found, otherwise return its name, allocated with malloc. */
1736
1737static char *
1738find_a_file (pprefix, name, mode)
1739 struct path_prefix *pprefix;
1740 char *name;
1741 int mode;
1742{
1743 char *temp;
1744 char *file_suffix = ((mode & X_OK) != 0 ? EXECUTABLE_SUFFIX : "");
1745 struct prefix_list *pl;
1746 int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
1747
1748 if (machine_suffix)
1749 len += strlen (machine_suffix);
1750
1751 temp = xmalloc (len);
1752
1753 /* Determine the filename to execute (special case for absolute paths). */
1754
1980
1981static char *
1982find_a_file (pprefix, name, mode)
1983 struct path_prefix *pprefix;
1984 char *name;
1985 int mode;
1986{
1987 char *temp;
1988 char *file_suffix = ((mode & X_OK) != 0 ? EXECUTABLE_SUFFIX : "");
1989 struct prefix_list *pl;
1990 int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1;
1991
1992 if (machine_suffix)
1993 len += strlen (machine_suffix);
1994
1995 temp = xmalloc (len);
1996
1997 /* Determine the filename to execute (special case for absolute paths). */
1998
1755 if (*name == '/' || *name == DIR_SEPARATOR)
1999 if (*name == '/' || *name == DIR_SEPARATOR
2000 /* Check for disk name on MS-DOS-based systems. */
2001 || (DIR_SEPARATOR == '\\' && name[1] == ':'
2002 && (name[2] == DIR_SEPARATOR || name[2] == '/')))
1756 {
1757 if (access (name, mode))
1758 {
1759 strcpy (temp, name);
1760 return temp;
1761 }
1762 }
1763 else

--- 57 unchanged lines hidden (view full) ---

1821 if (pl->used_flag_ptr != 0)
1822 *pl->used_flag_ptr = 1;
1823 return temp;
1824 }
1825 }
1826
1827 /* Certain prefixes can't be used without the machine suffix
1828 when the machine or version is explicitly specified. */
2003 {
2004 if (access (name, mode))
2005 {
2006 strcpy (temp, name);
2007 return temp;
2008 }
2009 }
2010 else

--- 57 unchanged lines hidden (view full) ---

2068 if (pl->used_flag_ptr != 0)
2069 *pl->used_flag_ptr = 1;
2070 return temp;
2071 }
2072 }
2073
2074 /* Certain prefixes can't be used without the machine suffix
2075 when the machine or version is explicitly specified. */
1829 if (!pl->require_machine_suffix)
2076 if (! pl->require_machine_suffix)
1830 {
1831 /* Some systems have a suffix for executable files.
1832 So try appending that first. */
1833 if (file_suffix[0] != 0)
1834 {
1835 strcpy (temp, pl->prefix);
1836 strcat (temp, name);
1837 strcat (temp, file_suffix);

--- 22 unchanged lines hidden (view full) ---

1860
1861/* Add an entry for PREFIX in PLIST. If FIRST is set, it goes
1862 at the start of the list, otherwise it goes at the end.
1863
1864 If WARN is nonzero, we will warn if no file is found
1865 through this prefix. WARN should point to an int
1866 which will be set to 1 if this entry is used.
1867
2077 {
2078 /* Some systems have a suffix for executable files.
2079 So try appending that first. */
2080 if (file_suffix[0] != 0)
2081 {
2082 strcpy (temp, pl->prefix);
2083 strcat (temp, name);
2084 strcat (temp, file_suffix);

--- 22 unchanged lines hidden (view full) ---

2107
2108/* Add an entry for PREFIX in PLIST. If FIRST is set, it goes
2109 at the start of the list, otherwise it goes at the end.
2110
2111 If WARN is nonzero, we will warn if no file is found
2112 through this prefix. WARN should point to an int
2113 which will be set to 1 if this entry is used.
2114
2115 COMPONENT is the value to be passed to update_path.
2116
1868 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
1869 the complete value of machine_suffix.
1870 2 means try both machine_suffix and just_machine_suffix. */
1871
1872static void
2117 REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
2118 the complete value of machine_suffix.
2119 2 means try both machine_suffix and just_machine_suffix. */
2120
2121static void
1873add_prefix (pprefix, prefix, first, require_machine_suffix, warn)
2122add_prefix (pprefix, prefix, component, first, require_machine_suffix, warn)
1874 struct path_prefix *pprefix;
1875 char *prefix;
2123 struct path_prefix *pprefix;
2124 char *prefix;
2125 char *component;
1876 int first;
1877 int require_machine_suffix;
1878 int *warn;
1879{
1880 struct prefix_list *pl, **prev;
1881 int len;
1882
2126 int first;
2127 int require_machine_suffix;
2128 int *warn;
2129{
2130 struct prefix_list *pl, **prev;
2131 int len;
2132
1883 if (!first && pprefix->plist)
2133 if (! first && pprefix->plist)
1884 {
1885 for (pl = pprefix->plist; pl->next; pl = pl->next)
1886 ;
1887 prev = &pl->next;
1888 }
1889 else
1890 prev = &pprefix->plist;
1891
1892 /* Keep track of the longest prefix */
1893
2134 {
2135 for (pl = pprefix->plist; pl->next; pl = pl->next)
2136 ;
2137 prev = &pl->next;
2138 }
2139 else
2140 prev = &pprefix->plist;
2141
2142 /* Keep track of the longest prefix */
2143
2144 prefix = update_path (prefix, component);
1894 len = strlen (prefix);
1895 if (len > pprefix->max_len)
1896 pprefix->max_len = len;
1897
1898 pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
1899 pl->prefix = save_string (prefix, len);
1900 pl->require_machine_suffix = require_machine_suffix;
1901 pl->used_flag_ptr = warn;

--- 14 unchanged lines hidden (view full) ---

1916 struct path_prefix *pprefix;
1917{
1918 struct prefix_list *pl = pprefix->plist;
1919
1920 while (pl)
1921 {
1922 if (pl->used_flag_ptr != 0 && !*pl->used_flag_ptr)
1923 {
2145 len = strlen (prefix);
2146 if (len > pprefix->max_len)
2147 pprefix->max_len = len;
2148
2149 pl = (struct prefix_list *) xmalloc (sizeof (struct prefix_list));
2150 pl->prefix = save_string (prefix, len);
2151 pl->require_machine_suffix = require_machine_suffix;
2152 pl->used_flag_ptr = warn;

--- 14 unchanged lines hidden (view full) ---

2167 struct path_prefix *pprefix;
2168{
2169 struct prefix_list *pl = pprefix->plist;
2170
2171 while (pl)
2172 {
2173 if (pl->used_flag_ptr != 0 && !*pl->used_flag_ptr)
2174 {
1924 error ("file path prefix `%s' never used",
1925 pl->prefix);
2175 if (pl->require_machine_suffix && machine_suffix)
2176 error ("file path prefix `%s%s' never used", pl->prefix,
2177 machine_suffix);
2178 else
2179 error ("file path prefix `%s' never used", pl->prefix);
2180
1926 /* Prevent duplicate warnings. */
1927 *pl->used_flag_ptr = 1;
1928 }
2181 /* Prevent duplicate warnings. */
2182 *pl->used_flag_ptr = 1;
2183 }
1929 pl = pl->next;
1930 }
1931}
1932
2184
1933/* Get rid of all prefixes built up so far in *PLISTP. */
1934
1935static void
1936free_path_prefix (pprefix)
1937 struct path_prefix *pprefix;
1938{
1939 struct prefix_list *pl = pprefix->plist;
1940 struct prefix_list *temp;
1941
1942 while (pl)
1943 {
1944 temp = pl;
1945 pl = pl->next;
2185 pl = pl->next;
1946 free (temp->prefix);
1947 free ((char *) temp);
1948 }
2186 }
1949 pprefix->plist = (struct prefix_list *) 0;
1950}
2187}
1951
1952/* stdin file number. */
1953#define STDIN_FILE_NO 0
1954
2188
1955/* stdout file number. */
1956#define STDOUT_FILE_NO 1
1957
1958/* value of `pipe': port index for reading. */
1959#define READ_PORT 0
1960
1961/* value of `pipe': port index for writing. */
1962#define WRITE_PORT 1
1963
1964/* Pipe waiting from last process, to be used as input for the next one.
1965 Value is STDIN_FILE_NO if no pipe is waiting
1966 (i.e. the next command is the first of a group). */
1967
1968static int last_pipe_input;
1969
1970/* Fork one piped subcommand. FUNC is the system call to use
1971 (either execv or execvp). ARGV is the arg vector to use.
1972 NOT_LAST is nonzero if this is not the last subcommand
1973 (i.e. its output should be piped to the next one.) */
1974
1975#ifdef __MSDOS__
1976
1977#include <process.h>
1978static int
1979pexecute (search_flag, program, argv, not_last)
1980 int search_flag;
1981 char *program;
1982 char *argv[];
1983 int not_last;
1984{
1985#ifdef __GO32__
1986 int i = (search_flag ? spawnv : spawnvp) (1, program, argv);
1987#else
1988 char *scmd, *rf;
1989 FILE *argfile;
1990 int i, el = search_flag ? 0 : 4;
1991
1992 scmd = (char *)malloc (strlen (program) + strlen (temp_filename) + 6 + el);
1993 rf = scmd + strlen(program) + 2 + el;
1994 sprintf (scmd, "%s%s @%s.gp", program,
1995 (search_flag ? "" : ".exe"), temp_filename);
1996 argfile = fopen (rf, "w");
1997 if (argfile == 0)
1998 pfatal_with_name (rf);
1999
2000 for (i=1; argv[i]; i++)
2001 {
2002 char *cp;
2003 for (cp = argv[i]; *cp; cp++)
2004 {
2005 if (*cp == '"' || *cp == '\'' || *cp == '\\' || isspace (*cp))
2006 fputc ('\\', argfile);
2007 fputc (*cp, argfile);
2008 }
2009 fputc ('\n', argfile);
2010 }
2011 fclose (argfile);
2012
2013 i = system (scmd);
2014
2015 remove (rf);
2016#endif
2017
2018 if (i == -1)
2019 {
2020 perror_exec (program);
2021 return MIN_FATAL_STATUS << 8;
2022 }
2023 return i << 8;
2024}
2025
2026#endif
2027
2028#if !defined(__MSDOS__) && !defined(OS2) && !defined(_WIN32)
2029
2030static int
2031pexecute (search_flag, program, argv, not_last)
2032 int search_flag;
2033 char *program;
2034 char *argv[];
2035 int not_last;
2036{
2037 int (*func)() = (search_flag ? execv : execvp);
2038 int pid;
2039 int pdes[2];
2040 int input_desc = last_pipe_input;
2041 int output_desc = STDOUT_FILE_NO;
2042 int retries, sleep_interval;
2043
2044 /* If this isn't the last process, make a pipe for its output,
2045 and record it as waiting to be the input to the next process. */
2046
2047 if (not_last)
2048 {
2049 if (pipe (pdes) < 0)
2050 pfatal_with_name ("pipe");
2051 output_desc = pdes[WRITE_PORT];
2052 last_pipe_input = pdes[READ_PORT];
2053 }
2054 else
2055 last_pipe_input = STDIN_FILE_NO;
2056
2057 /* Fork a subprocess; wait and retry if it fails. */
2058 sleep_interval = 1;
2059 for (retries = 0; retries < 4; retries++)
2060 {
2061 pid = vfork ();
2062 if (pid >= 0)
2063 break;
2064 sleep (sleep_interval);
2065 sleep_interval *= 2;
2066 }
2067
2068 switch (pid)
2069 {
2070 case -1:
2071#ifdef vfork
2072 pfatal_with_name ("fork");
2073#else
2074 pfatal_with_name ("vfork");
2075#endif
2076 /* NOTREACHED */
2077 return 0;
2078
2079 case 0: /* child */
2080 /* Move the input and output pipes into place, if nec. */
2081 if (input_desc != STDIN_FILE_NO)
2082 {
2083 close (STDIN_FILE_NO);
2084 dup (input_desc);
2085 close (input_desc);
2086 }
2087 if (output_desc != STDOUT_FILE_NO)
2088 {
2089 close (STDOUT_FILE_NO);
2090 dup (output_desc);
2091 close (output_desc);
2092 }
2093
2094 /* Close the parent's descs that aren't wanted here. */
2095 if (last_pipe_input != STDIN_FILE_NO)
2096 close (last_pipe_input);
2097
2098 /* Exec the program. */
2099 (*func) (program, argv);
2100 perror_exec (program);
2101 _exit (1);
2102 /* NOTREACHED */
2103 return 0;
2104
2105 default:
2106 /* In the parent, after forking.
2107 Close the descriptors that we made for this child. */
2108 if (input_desc != STDIN_FILE_NO)
2109 close (input_desc);
2110 if (output_desc != STDOUT_FILE_NO)
2111 close (output_desc);
2112
2113 /* Return child's process number. */
2114 return pid;
2115 }
2116}
2117
2118#endif /* not __MSDOS__ and not OS2 and not _WIN32 */
2119
2120#if defined(OS2)
2121
2122static int
2123pexecute (search_flag, program, argv, not_last)
2124 int search_flag;
2125 char *program;
2126 char *argv[];
2127 int not_last;
2128{
2129 return (search_flag ? spawnv : spawnvp) (1, program, argv);
2130}
2131#endif /* OS2 */
2132
2133#if defined(_WIN32)
2134
2135static int
2136pexecute (search_flag, program, argv, not_last)
2137 int search_flag;
2138 char *program;
2139 char *argv[];
2140 int not_last;
2141{
2142 return (search_flag ? __spawnv : __spawnvp) (1, program, argv);
2143}
2144#endif /* _WIN32 */
2145
2146
2147/* Execute the command specified by the arguments on the current line of spec.
2148 When using pipes, this includes several piped-together commands
2149 with `|' between them.
2150
2151 Return 0 if successful, -1 if failed. */
2152
2153static int

--- 22 unchanged lines hidden (view full) ---

2176
2177 /* Split argbuf into its separate piped processes,
2178 and record info about each one.
2179 Also search for the programs that are to be run. */
2180
2181 commands[0].prog = argbuf[0]; /* first command. */
2182 commands[0].argv = &argbuf[0];
2183 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK);
2189
2190/* Execute the command specified by the arguments on the current line of spec.
2191 When using pipes, this includes several piped-together commands
2192 with `|' between them.
2193
2194 Return 0 if successful, -1 if failed. */
2195
2196static int

--- 22 unchanged lines hidden (view full) ---

2219
2220 /* Split argbuf into its separate piped processes,
2221 and record info about each one.
2222 Also search for the programs that are to be run. */
2223
2224 commands[0].prog = argbuf[0]; /* first command. */
2225 commands[0].argv = &argbuf[0];
2226 string = find_a_file (&exec_prefixes, commands[0].prog, X_OK);
2227
2184 if (string)
2185 commands[0].argv[0] = string;
2186
2187 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2188 if (strcmp (argbuf[i], "|") == 0)
2189 { /* each command. */
2228 if (string)
2229 commands[0].argv[0] = string;
2230
2231 for (n_commands = 1, i = 0; i < argbuf_index; i++)
2232 if (strcmp (argbuf[i], "|") == 0)
2233 { /* each command. */
2190#ifdef __MSDOS__
2191 fatal ("-pipe not supported under MS-DOS");
2234#if defined (__MSDOS__) || (defined (_WIN32) && defined (__CYGWIN32_)) || defined (OS2) || defined (VMS)
2235 fatal ("-pipe not supported");
2192#endif
2193 argbuf[i] = 0; /* termination of command args. */
2194 commands[n_commands].prog = argbuf[i + 1];
2195 commands[n_commands].argv = &argbuf[i + 1];
2196 string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK);
2197 if (string)
2198 commands[n_commands].argv[0] = string;
2199 n_commands++;
2200 }
2201
2202 argbuf[argbuf_index] = 0;
2203
2204 /* If -v, print what we are about to do, and maybe query. */
2205
2206 if (verbose_flag)
2207 {
2236#endif
2237 argbuf[i] = 0; /* termination of command args. */
2238 commands[n_commands].prog = argbuf[i + 1];
2239 commands[n_commands].argv = &argbuf[i + 1];
2240 string = find_a_file (&exec_prefixes, commands[n_commands].prog, X_OK);
2241 if (string)
2242 commands[n_commands].argv[0] = string;
2243 n_commands++;
2244 }
2245
2246 argbuf[argbuf_index] = 0;
2247
2248 /* If -v, print what we are about to do, and maybe query. */
2249
2250 if (verbose_flag)
2251 {
2252 /* For help listings, put a blank line between sub-processes. */
2253 if (print_help_list)
2254 fputc ('\n', stderr);
2255
2208 /* Print each piped command as a separate line. */
2209 for (i = 0; i < n_commands ; i++)
2210 {
2211 char **j;
2212
2213 for (j = commands[i].argv; *j; j++)
2214 fprintf (stderr, " %s", *j);
2215
2216 /* Print a pipe symbol after all but the last command. */
2217 if (i + 1 != n_commands)
2218 fprintf (stderr, " |");
2219 fprintf (stderr, "\n");
2220 }
2221 fflush (stderr);
2222#ifdef DEBUG
2223 fprintf (stderr, "\nGo ahead? (y or n) ");
2224 fflush (stderr);
2225 i = getchar ();
2226 if (i != '\n')
2256 /* Print each piped command as a separate line. */
2257 for (i = 0; i < n_commands ; i++)
2258 {
2259 char **j;
2260
2261 for (j = commands[i].argv; *j; j++)
2262 fprintf (stderr, " %s", *j);
2263
2264 /* Print a pipe symbol after all but the last command. */
2265 if (i + 1 != n_commands)
2266 fprintf (stderr, " |");
2267 fprintf (stderr, "\n");
2268 }
2269 fflush (stderr);
2270#ifdef DEBUG
2271 fprintf (stderr, "\nGo ahead? (y or n) ");
2272 fflush (stderr);
2273 i = getchar ();
2274 if (i != '\n')
2227 while (getchar () != '\n') ;
2275 while (getchar () != '\n')
2276 ;
2277
2228 if (i != 'y' && i != 'Y')
2229 return 0;
2230#endif /* DEBUG */
2231 }
2232
2233 /* Run each piped subprocess. */
2234
2278 if (i != 'y' && i != 'Y')
2279 return 0;
2280#endif /* DEBUG */
2281 }
2282
2283 /* Run each piped subprocess. */
2284
2235 last_pipe_input = STDIN_FILE_NO;
2236 for (i = 0; i < n_commands; i++)
2237 {
2285 for (i = 0; i < n_commands; i++)
2286 {
2287 char *errmsg_fmt, *errmsg_arg;
2238 char *string = commands[i].argv[0];
2239
2288 char *string = commands[i].argv[0];
2289
2240 commands[i].pid = pexecute (string != commands[i].prog,
2241 string, commands[i].argv,
2242 i + 1 < n_commands);
2290 commands[i].pid = pexecute (string, commands[i].argv,
2291 programname, temp_filename,
2292 &errmsg_fmt, &errmsg_arg,
2293 ((i == 0 ? PEXECUTE_FIRST : 0)
2294 | (i + 1 == n_commands ? PEXECUTE_LAST : 0)
2295 | (string == commands[i].prog
2296 ? PEXECUTE_SEARCH : 0)
2297 | (verbose_flag ? PEXECUTE_VERBOSE : 0)));
2243
2298
2299 if (commands[i].pid == -1)
2300 pfatal_pexecute (errmsg_fmt, errmsg_arg);
2301
2244 if (string != commands[i].prog)
2245 free (string);
2246 }
2247
2248 execution_count++;
2249
2250 /* Wait for all the subprocesses to finish.
2251 We don't care what order they finish in;

--- 5 unchanged lines hidden (view full) ---

2257 int ret_code = 0;
2258
2259 for (i = 0; i < n_commands; )
2260 {
2261 int j;
2262 int status;
2263 int pid;
2264
2302 if (string != commands[i].prog)
2303 free (string);
2304 }
2305
2306 execution_count++;
2307
2308 /* Wait for all the subprocesses to finish.
2309 We don't care what order they finish in;

--- 5 unchanged lines hidden (view full) ---

2315 int ret_code = 0;
2316
2317 for (i = 0; i < n_commands; )
2318 {
2319 int j;
2320 int status;
2321 int pid;
2322
2265#ifdef __MSDOS__
2266 status = pid = commands[i].pid;
2267#else
2268#ifdef _WIN32
2269 pid = cwait (&status, commands[i].pid, WAIT_CHILD);
2270#else
2271 pid = wait (&status);
2272#endif
2273#endif
2323 pid = pwait (commands[i].pid, &status, 0);
2274 if (pid < 0)
2275 abort ();
2276
2277 for (j = 0; j < n_commands; j++)
2278 if (commands[j].pid == pid)
2279 {
2280 i++;
2281 if (status != 0)

--- 40 unchanged lines hidden (view full) ---

2322static int n_switches;
2323
2324struct infile
2325{
2326 char *name;
2327 char *language;
2328};
2329
2324 if (pid < 0)
2325 abort ();
2326
2327 for (j = 0; j < n_commands; j++)
2328 if (commands[j].pid == pid)
2329 {
2330 i++;
2331 if (status != 0)

--- 40 unchanged lines hidden (view full) ---

2372static int n_switches;
2373
2374struct infile
2375{
2376 char *name;
2377 char *language;
2378};
2379
2330#if defined(FREEBSD_NATIVE) && defined(__i386__)
2331static int objformat_aout = 0;
2332#endif
2333
2334/* Also a vector of input files specified. */
2335
2336static struct infile *infiles;
2337
2338static int n_infiles;
2339
2380/* Also a vector of input files specified. */
2381
2382static struct infile *infiles;
2383
2384static int n_infiles;
2385
2386/* This counts the number of libraries added by LANG_SPECIFIC_DRIVER, so that
2387 we can tell if there were any user supplied any files or libraries. */
2388
2389static int added_libraries;
2390
2340/* And a vector of corresponding output files is made up later. */
2341
2342static char **outfiles;
2343
2391/* And a vector of corresponding output files is made up later. */
2392
2393static char **outfiles;
2394
2395/* Used to track if none of the -B paths are used. */
2396static int warn_B;
2397
2398/* Used to track if standard path isn't used and -b or -V is specified. */
2399static int warn_std;
2400
2401/* Gives value to pass as "warn" to add_prefix for standard prefixes. */
2402static int *warn_std_ptr = 0;
2403
2404#if defined(FREEBSD_NATIVE) && defined(__i386__)
2405static int objformat_aout = 0; /* ELF by default */
2406#endif
2407
2408#if defined(HAVE_OBJECT_SUFFIX) || defined(HAVE_EXECUTABLE_SUFFIX)
2409
2410/* Convert NAME to a new name if it is the standard suffix. DO_EXE
2411 is true if we should look for an executable suffix as well. */
2412
2413static char *
2414convert_filename (name, do_exe)
2415 char *name;
2416 int do_exe;
2417{
2418 int i;
2419 int len = strlen (name);
2420
2421#ifdef HAVE_OBJECT_SUFFIX
2422 /* Convert x.o to x.obj if OBJECT_SUFFIX is ".obj". */
2423 if (len > 2
2424 && name[len - 2] == '.'
2425 && name[len - 1] == 'o')
2426 {
2427 obstack_grow (&obstack, name, len - 2);
2428 obstack_grow0 (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
2429 name = obstack_finish (&obstack);
2430 }
2431#endif
2432
2433#ifdef HAVE_EXECUTABLE_SUFFIX
2434 /* If there is no filetype, make it the executable suffix (which includes
2435 the "."). But don't get confused if we have just "-o". */
2436 if (! do_exe || EXECUTABLE_SUFFIX[0] == 0 || (len == 2 && name[0] == '-'))
2437 return name;
2438
2439 for (i = len - 1; i >= 0; i--)
2440 if (name[i] == '/' || name[i] == DIR_SEPARATOR)
2441 break;
2442
2443 for (i++; i < len; i++)
2444 if (name[i] == '.')
2445 return name;
2446
2447 obstack_grow (&obstack, name, len);
2448 obstack_grow0 (&obstack, EXECUTABLE_SUFFIX, strlen (EXECUTABLE_SUFFIX));
2449 name = obstack_finish (&obstack);
2450#endif
2451
2452 return name;
2453}
2454#endif
2455
2456/* Display the command line switches accepted by gcc. */
2457static void
2458display_help ()
2459{
2460 printf ("Usage: %s [options] file...\n", programname);
2461 printf ("Options:\n");
2462
2463 printf (" --help Display this information\n");
2464 if (! verbose_flag)
2465 printf (" (Use '-v --help' to display command line options of sub-processes)\n");
2466 printf (" -dumpspecs Display all of the built in spec strings\n");
2467 printf (" -dumpversion Display the version of the compiler\n");
2468 printf (" -dumpmachine Display the compiler's target processor\n");
2469 printf (" -print-search-dirs Display the directories in the compiler's search path\n");
2470 printf (" -print-libgcc-file-name Display the name of the compiler's companion library\n");
2471 printf (" -print-file-name=<lib> Display the full path to library <lib>\n");
2472 printf (" -print-prog-name=<prog> Display the full path to compiler component <prog>\n");
2473 printf (" -print-multi-directory Display the root directory for versions of libgcc\n");
2474 printf (" -print-multi-lib Display the mapping between command line options and\n");
2475 printf (" multiple library search directories\n");
2476 printf (" -Wa,<options> Pass comma-separated <options> on to the assembler\n");
2477 printf (" -Wp,<options> Pass comma-separated <options> on to the preprocessor\n");
2478 printf (" -Wl,<options> Pass comma-separated <options> on to the linker\n");
2479 printf (" -Xlinker <arg> Pass <arg> on to the linker\n");
2480 printf (" -save-temps Do not delete intermediate files\n");
2481 printf (" -pipe Use pipes rather than intermediate files\n");
2482 printf (" -specs=<file> Override builtin specs with the contents of <file>\n");
2483 printf (" -B <directory> Add <directory> to the compiler's search paths\n");
2484 printf (" -b <machine> Run gcc for target <machine>, if installed\n");
2485 printf (" -V <version> Run gcc version number <version>, if installed\n");
2486 printf (" -v Display the programs invoked by the compiler\n");
2487 printf (" -E Preprocess only; do not compile, assemble or link\n");
2488 printf (" -S Compile only; do not assemble or link\n");
2489 printf (" -c Compile and assemble, but do not link\n");
2490 printf (" -o <file> Place the output into <file>\n");
2491 printf (" -x <language> Specify the language of the following input files\n");
2492 printf (" Permissable languages include: c c++ assembler none\n");
2493 printf (" 'none' means revert to the default behaviour of\n");
2494 printf (" guessing the language based on the file's extension\n");
2495
2496 printf ("\nOptions starting with -g, -f, -m, -O or -W are automatically passed on to\n");
2497 printf ("the various sub-processes invoked by %s. In order to pass other options\n",
2498 programname);
2499 printf ("on to these processes the -W<letter> options must be used.\n");
2500
2501 /* The rest of the options are displayed by invocations of the various
2502 sub-processes. */
2503}
2504
2505static void
2506add_preprocessor_option (option, len)
2507 char * option;
2508 int len;
2509{
2510 n_preprocessor_options++;
2511
2512 if (! preprocessor_options)
2513 preprocessor_options
2514 = (char **) xmalloc (n_preprocessor_options * sizeof (char **));
2515 else
2516 preprocessor_options
2517 = (char **) xrealloc (preprocessor_options,
2518 n_preprocessor_options * sizeof (char **));
2519
2520 preprocessor_options [n_preprocessor_options - 1] = save_string (option, len);
2521}
2522
2523static void
2524add_assembler_option (option, len)
2525 char * option;
2526 int len;
2527{
2528 n_assembler_options++;
2529
2530 if (! assembler_options)
2531 assembler_options
2532 = (char **) xmalloc (n_assembler_options * sizeof (char **));
2533 else
2534 assembler_options
2535 = (char **) xrealloc (assembler_options,
2536 n_assembler_options * sizeof (char **));
2537
2538 assembler_options [n_assembler_options - 1] = save_string (option, len);
2539}
2540
2541static void
2542add_linker_option (option, len)
2543 char * option;
2544 int len;
2545{
2546 n_linker_options++;
2547
2548 if (! linker_options)
2549 linker_options
2550 = (char **) xmalloc (n_linker_options * sizeof (char **));
2551 else
2552 linker_options
2553 = (char **) xrealloc (linker_options,
2554 n_linker_options * sizeof (char **));
2555
2556 linker_options [n_linker_options - 1] = save_string (option, len);
2557}
2558
2559
2344/* Create the vector `switches' and its contents.
2345 Store its length in `n_switches'. */
2346
2347static void
2348process_command (argc, argv)
2349 int argc;
2350 char **argv;
2351{
2352 register int i;
2353 char *temp;
2354 char *spec_lang = 0;
2355 int last_language_n_infiles;
2560/* Create the vector `switches' and its contents.
2561 Store its length in `n_switches'. */
2562
2563static void
2564process_command (argc, argv)
2565 int argc;
2566 char **argv;
2567{
2568 register int i;
2569 char *temp;
2570 char *spec_lang = 0;
2571 int last_language_n_infiles;
2572 int have_c = 0;
2573 int have_o = 0;
2574 int lang_n_infiles = 0;
2356
2575
2357 gcc_exec_prefix = getenv ("GCC_EXEC_PREFIX");
2576 GET_ENVIRONMENT (gcc_exec_prefix, "GCC_EXEC_PREFIX");
2358
2359 n_switches = 0;
2360 n_infiles = 0;
2577
2578 n_switches = 0;
2579 n_infiles = 0;
2580 added_libraries = 0;
2361
2362 /* Figure compiler version from version string. */
2363
2364 compiler_version = save_string (version_string, strlen (version_string));
2365 for (temp = compiler_version; *temp; ++temp)
2366 {
2367 if (*temp == ' ')
2368 {
2369 *temp = '\0';
2370 break;
2371 }
2372 }
2373
2374 /* Set up the default search paths. */
2375
2376 if (gcc_exec_prefix)
2377 {
2581
2582 /* Figure compiler version from version string. */
2583
2584 compiler_version = save_string (version_string, strlen (version_string));
2585 for (temp = compiler_version; *temp; ++temp)
2586 {
2587 if (*temp == ' ')
2588 {
2589 *temp = '\0';
2590 break;
2591 }
2592 }
2593
2594 /* Set up the default search paths. */
2595
2596 if (gcc_exec_prefix)
2597 {
2378 add_prefix (&exec_prefixes, gcc_exec_prefix, 0, 0, NULL_PTR);
2379 add_prefix (&startfile_prefixes, gcc_exec_prefix, 0, 0, NULL_PTR);
2598 int len = strlen (gcc_exec_prefix);
2599 if (len > sizeof ("/lib/gcc-lib/")-1
2600 && (gcc_exec_prefix[len-1] == '/'
2601 || gcc_exec_prefix[len-1] == DIR_SEPARATOR))
2602 {
2603 temp = gcc_exec_prefix + len - sizeof ("/lib/gcc-lib/") + 1;
2604 if ((*temp == '/' || *temp == DIR_SEPARATOR)
2605 && strncmp (temp+1, "lib", 3) == 0
2606 && (temp[4] == '/' || temp[4] == DIR_SEPARATOR)
2607 && strncmp (temp+5, "gcc-lib", 7) == 0)
2608 len -= sizeof ("/lib/gcc-lib/") - 1;
2609 }
2610
2611 set_std_prefix (gcc_exec_prefix, len);
2612 add_prefix (&exec_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
2613 add_prefix (&startfile_prefixes, gcc_exec_prefix, "GCC", 0, 0, NULL_PTR);
2380 }
2381
2382 /* COMPILER_PATH and LIBRARY_PATH have values
2383 that are lists of directory names with colons. */
2384
2614 }
2615
2616 /* COMPILER_PATH and LIBRARY_PATH have values
2617 that are lists of directory names with colons. */
2618
2385 temp = getenv ("COMPILER_PATH");
2619 GET_ENVIRONMENT (temp, "COMPILER_PATH");
2386 if (temp)
2387 {
2388 char *startp, *endp;
2389 char *nstore = (char *) alloca (strlen (temp) + 3);
2390
2391 startp = endp = temp;
2392 while (1)
2393 {
2394 if (*endp == PATH_SEPARATOR || *endp == 0)
2395 {
2396 strncpy (nstore, startp, endp-startp);
2397 if (endp == startp)
2620 if (temp)
2621 {
2622 char *startp, *endp;
2623 char *nstore = (char *) alloca (strlen (temp) + 3);
2624
2625 startp = endp = temp;
2626 while (1)
2627 {
2628 if (*endp == PATH_SEPARATOR || *endp == 0)
2629 {
2630 strncpy (nstore, startp, endp-startp);
2631 if (endp == startp)
2398 strcpy (nstore, concat (".", dir_separator_str));
2632 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2399 else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
2400 {
2401 nstore[endp-startp] = DIR_SEPARATOR;
2402 nstore[endp-startp+1] = 0;
2403 }
2404 else
2405 nstore[endp-startp] = 0;
2633 else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
2634 {
2635 nstore[endp-startp] = DIR_SEPARATOR;
2636 nstore[endp-startp+1] = 0;
2637 }
2638 else
2639 nstore[endp-startp] = 0;
2406 add_prefix (&exec_prefixes, nstore, 0, 0, NULL_PTR);
2640 add_prefix (&exec_prefixes, nstore, 0, 0, 0, NULL_PTR);
2641 add_prefix (&include_prefixes,
2642 concat (nstore, "include", NULL_PTR),
2643 0, 0, 0, NULL_PTR);
2407 if (*endp == 0)
2408 break;
2409 endp = startp = endp + 1;
2410 }
2411 else
2412 endp++;
2413 }
2414 }
2415
2644 if (*endp == 0)
2645 break;
2646 endp = startp = endp + 1;
2647 }
2648 else
2649 endp++;
2650 }
2651 }
2652
2416 temp = getenv ("LIBRARY_PATH");
2417 if (temp && ! cross_compile)
2653 GET_ENVIRONMENT (temp, "LIBRARY_PATH");
2654 if (temp && *cross_compile == '0')
2418 {
2419 char *startp, *endp;
2420 char *nstore = (char *) alloca (strlen (temp) + 3);
2421
2422 startp = endp = temp;
2423 while (1)
2424 {
2425 if (*endp == PATH_SEPARATOR || *endp == 0)
2426 {
2427 strncpy (nstore, startp, endp-startp);
2428 if (endp == startp)
2655 {
2656 char *startp, *endp;
2657 char *nstore = (char *) alloca (strlen (temp) + 3);
2658
2659 startp = endp = temp;
2660 while (1)
2661 {
2662 if (*endp == PATH_SEPARATOR || *endp == 0)
2663 {
2664 strncpy (nstore, startp, endp-startp);
2665 if (endp == startp)
2429 strcpy (nstore, concat (".", dir_separator_str));
2666 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2430 else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
2431 {
2432 nstore[endp-startp] = DIR_SEPARATOR;
2433 nstore[endp-startp+1] = 0;
2434 }
2435 else
2436 nstore[endp-startp] = 0;
2667 else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
2668 {
2669 nstore[endp-startp] = DIR_SEPARATOR;
2670 nstore[endp-startp+1] = 0;
2671 }
2672 else
2673 nstore[endp-startp] = 0;
2437 add_prefix (&startfile_prefixes, nstore, 0, 0, NULL_PTR);
2674 add_prefix (&startfile_prefixes, nstore, NULL_PTR,
2675 0, 0, NULL_PTR);
2438 if (*endp == 0)
2439 break;
2440 endp = startp = endp + 1;
2441 }
2442 else
2443 endp++;
2444 }
2445 }
2446
2447 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
2676 if (*endp == 0)
2677 break;
2678 endp = startp = endp + 1;
2679 }
2680 else
2681 endp++;
2682 }
2683 }
2684
2685 /* Use LPATH like LIBRARY_PATH (for the CMU build program). */
2448 temp = getenv ("LPATH");
2449 if (temp && ! cross_compile)
2686 GET_ENVIRONMENT (temp, "LPATH");
2687 if (temp && *cross_compile == '0')
2450 {
2451 char *startp, *endp;
2452 char *nstore = (char *) alloca (strlen (temp) + 3);
2453
2454 startp = endp = temp;
2455 while (1)
2456 {
2457 if (*endp == PATH_SEPARATOR || *endp == 0)
2458 {
2459 strncpy (nstore, startp, endp-startp);
2460 if (endp == startp)
2688 {
2689 char *startp, *endp;
2690 char *nstore = (char *) alloca (strlen (temp) + 3);
2691
2692 startp = endp = temp;
2693 while (1)
2694 {
2695 if (*endp == PATH_SEPARATOR || *endp == 0)
2696 {
2697 strncpy (nstore, startp, endp-startp);
2698 if (endp == startp)
2461 strcpy (nstore, concat (".", dir_separator_str));
2699 strcpy (nstore, concat (".", dir_separator_str, NULL_PTR));
2462 else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
2463 {
2464 nstore[endp-startp] = DIR_SEPARATOR;
2465 nstore[endp-startp+1] = 0;
2466 }
2467 else
2468 nstore[endp-startp] = 0;
2700 else if (endp[-1] != '/' && endp[-1] != DIR_SEPARATOR)
2701 {
2702 nstore[endp-startp] = DIR_SEPARATOR;
2703 nstore[endp-startp+1] = 0;
2704 }
2705 else
2706 nstore[endp-startp] = 0;
2469 add_prefix (&startfile_prefixes, nstore, 0, 0, NULL_PTR);
2707 add_prefix (&startfile_prefixes, nstore, NULL_PTR,
2708 0, 0, NULL_PTR);
2470 if (*endp == 0)
2471 break;
2472 endp = startp = endp + 1;
2473 }
2474 else
2475 endp++;
2476 }
2477 }

--- 25 unchanged lines hidden (view full) ---

2503 objformat_aout = 1;
2504 else if (strcmp(temp, "elf") == 0)
2505 objformat_aout = 0;
2506 else
2507 fprintf(stderr, "Unrecognized value of $OBJFORMAT: %s\n", temp);
2508 }
2509 }
2510#endif
2709 if (*endp == 0)
2710 break;
2711 endp = startp = endp + 1;
2712 }
2713 else
2714 endp++;
2715 }
2716 }

--- 25 unchanged lines hidden (view full) ---

2742 objformat_aout = 1;
2743 else if (strcmp(temp, "elf") == 0)
2744 objformat_aout = 0;
2745 else
2746 fprintf(stderr, "Unrecognized value of $OBJFORMAT: %s\n", temp);
2747 }
2748 }
2749#endif
2511
2750
2512 /* Convert new-style -- options to old-style. */
2513 translate_options (&argc, &argv);
2514
2751 /* Convert new-style -- options to old-style. */
2752 translate_options (&argc, &argv);
2753
2754#ifdef LANG_SPECIFIC_DRIVER
2755 /* Do language-specific adjustment/addition of flags. */
2756 lang_specific_driver (fatal, &argc, &argv, &added_libraries);
2757#endif
2758
2515 /* Scan argv twice. Here, the first time, just count how many switches
2516 there will be in their vector, and how many input files in theirs.
2517 Here we also parse the switches that cc itself uses (e.g. -v). */
2518
2519 for (i = 1; i < argc; i++)
2520 {
2521#if defined(FREEBSD_NATIVE) && defined(__i386__)
2522 /* .. and command line args override all */

--- 5 unchanged lines hidden (view full) ---

2528 else if (strcmp (argv[i], "-elf") == 0)
2529 {
2530 objformat_aout = 0;
2531 continue;
2532 }
2533#endif
2534 if (! strcmp (argv[i], "-dumpspecs"))
2535 {
2759 /* Scan argv twice. Here, the first time, just count how many switches
2760 there will be in their vector, and how many input files in theirs.
2761 Here we also parse the switches that cc itself uses (e.g. -v). */
2762
2763 for (i = 1; i < argc; i++)
2764 {
2765#if defined(FREEBSD_NATIVE) && defined(__i386__)
2766 /* .. and command line args override all */

--- 5 unchanged lines hidden (view full) ---

2772 else if (strcmp (argv[i], "-elf") == 0)
2773 {
2774 objformat_aout = 0;
2775 continue;
2776 }
2777#endif
2778 if (! strcmp (argv[i], "-dumpspecs"))
2779 {
2536 printf ("*asm:\n%s\n\n", asm_spec);
2537 printf ("*asm_final:\n%s\n\n", asm_final_spec);
2538 printf ("*cpp:\n%s\n\n", cpp_spec);
2539 printf ("*cc1:\n%s\n\n", cc1_spec);
2540 printf ("*cc1plus:\n%s\n\n", cc1plus_spec);
2541 printf ("*endfile:\n%s\n\n", endfile_spec);
2542 printf ("*link:\n%s\n\n", link_spec);
2543 printf ("*lib:\n%s\n\n", lib_spec);
2544 printf ("*libgcc:\n%s\n\n", libgcc_spec);
2545 printf ("*startfile:\n%s\n\n", startfile_spec);
2546 printf ("*switches_need_spaces:\n%s\n\n", switches_need_spaces);
2547 printf ("*signed_char:\n%s\n\n", signed_char_spec);
2548 printf ("*predefines:\n%s\n\n", cpp_predefines);
2549 printf ("*cross_compile:\n%d\n\n", cross_compile);
2550 printf ("*multilib:\n%s\n\n", multilib_select);
2551
2780 struct spec_list *sl;
2781 init_spec ();
2782 for (sl = specs; sl; sl = sl->next)
2783 printf ("*%s:\n%s\n\n", sl->name, *(sl->ptr_spec));
2552 exit (0);
2553 }
2554 else if (! strcmp (argv[i], "-dumpversion"))
2555 {
2784 exit (0);
2785 }
2786 else if (! strcmp (argv[i], "-dumpversion"))
2787 {
2556 printf ("%s\n", version_string);
2788 printf ("%s\n", spec_version);
2557 exit (0);
2558 }
2559 else if (! strcmp (argv[i], "-dumpmachine"))
2560 {
2561 printf ("%s\n", spec_machine);
2562 exit (0);
2563 }
2789 exit (0);
2790 }
2791 else if (! strcmp (argv[i], "-dumpmachine"))
2792 {
2793 printf ("%s\n", spec_machine);
2794 exit (0);
2795 }
2796 else if (strcmp (argv[i], "-fhelp") == 0)
2797 {
2798 /* translate_options () has turned --help into -fhelp. */
2799 print_help_list = 1;
2800
2801 /* We will be passing a dummy file on to the sub-processes. */
2802 n_infiles++;
2803 n_switches++;
2804
2805 add_preprocessor_option ("--help", 6);
2806 add_assembler_option ("--help", 6);
2807 add_linker_option ("--help", 6);
2808 }
2564 else if (! strcmp (argv[i], "-print-search-dirs"))
2565 print_search_dirs = 1;
2566 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
2567 print_file_name = "libgcc.a";
2568 else if (! strncmp (argv[i], "-print-file-name=", 17))
2569 print_file_name = argv[i] + 17;
2570 else if (! strncmp (argv[i], "-print-prog-name=", 17))
2571 print_prog_name = argv[i] + 17;
2572 else if (! strcmp (argv[i], "-print-multi-lib"))
2573 print_multi_lib = 1;
2574 else if (! strcmp (argv[i], "-print-multi-directory"))
2575 print_multi_directory = 1;
2576 else if (! strncmp (argv[i], "-Wa,", 4))
2577 {
2578 int prev, j;
2579 /* Pass the rest of this option to the assembler. */
2580
2809 else if (! strcmp (argv[i], "-print-search-dirs"))
2810 print_search_dirs = 1;
2811 else if (! strcmp (argv[i], "-print-libgcc-file-name"))
2812 print_file_name = "libgcc.a";
2813 else if (! strncmp (argv[i], "-print-file-name=", 17))
2814 print_file_name = argv[i] + 17;
2815 else if (! strncmp (argv[i], "-print-prog-name=", 17))
2816 print_prog_name = argv[i] + 17;
2817 else if (! strcmp (argv[i], "-print-multi-lib"))
2818 print_multi_lib = 1;
2819 else if (! strcmp (argv[i], "-print-multi-directory"))
2820 print_multi_directory = 1;
2821 else if (! strncmp (argv[i], "-Wa,", 4))
2822 {
2823 int prev, j;
2824 /* Pass the rest of this option to the assembler. */
2825
2581 n_assembler_options++;
2582 if (!assembler_options)
2583 assembler_options
2584 = (char **) xmalloc (n_assembler_options * sizeof (char **));
2585 else
2586 assembler_options
2587 = (char **) xrealloc (assembler_options,
2588 n_assembler_options * sizeof (char **));
2589
2590 /* Split the argument at commas. */
2591 prev = 4;
2592 for (j = 4; argv[i][j]; j++)
2593 if (argv[i][j] == ',')
2594 {
2826 /* Split the argument at commas. */
2827 prev = 4;
2828 for (j = 4; argv[i][j]; j++)
2829 if (argv[i][j] == ',')
2830 {
2595 assembler_options[n_assembler_options - 1]
2596 = save_string (argv[i] + prev, j - prev);
2597 n_assembler_options++;
2598 assembler_options
2599 = (char **) xrealloc (assembler_options,
2600 n_assembler_options * sizeof (char **));
2831 add_assembler_option (argv[i] + prev, j - prev);
2601 prev = j + 1;
2602 }
2832 prev = j + 1;
2833 }
2834
2603 /* Record the part after the last comma. */
2835 /* Record the part after the last comma. */
2604 assembler_options[n_assembler_options - 1] = argv[i] + prev;
2836 add_assembler_option (argv[i] + prev, j - prev);
2605 }
2606 else if (! strncmp (argv[i], "-Wp,", 4))
2607 {
2608 int prev, j;
2609 /* Pass the rest of this option to the preprocessor. */
2610
2837 }
2838 else if (! strncmp (argv[i], "-Wp,", 4))
2839 {
2840 int prev, j;
2841 /* Pass the rest of this option to the preprocessor. */
2842
2611 n_preprocessor_options++;
2612 if (!preprocessor_options)
2613 preprocessor_options
2614 = (char **) xmalloc (n_preprocessor_options * sizeof (char **));
2615 else
2616 preprocessor_options
2617 = (char **) xrealloc (preprocessor_options,
2618 n_preprocessor_options * sizeof (char **));
2619
2620 /* Split the argument at commas. */
2621 prev = 4;
2622 for (j = 4; argv[i][j]; j++)
2623 if (argv[i][j] == ',')
2624 {
2843 /* Split the argument at commas. */
2844 prev = 4;
2845 for (j = 4; argv[i][j]; j++)
2846 if (argv[i][j] == ',')
2847 {
2625 preprocessor_options[n_preprocessor_options - 1]
2626 = save_string (argv[i] + prev, j - prev);
2627 n_preprocessor_options++;
2628 preprocessor_options
2629 = (char **) xrealloc (preprocessor_options,
2630 n_preprocessor_options * sizeof (char **));
2848 add_preprocessor_option (argv[i] + prev, j - prev);
2631 prev = j + 1;
2632 }
2849 prev = j + 1;
2850 }
2851
2633 /* Record the part after the last comma. */
2852 /* Record the part after the last comma. */
2634 preprocessor_options[n_preprocessor_options - 1] = argv[i] + prev;
2853 add_preprocessor_option (argv[i] + prev, j - prev);
2635 }
2636 else if (argv[i][0] == '+' && argv[i][1] == 'e')
2637 /* The +e options to the C++ front-end. */
2638 n_switches++;
2639 else if (strncmp (argv[i], "-Wl,", 4) == 0)
2640 {
2641 int j;
2642 /* Split the argument at commas. */

--- 5 unchanged lines hidden (view full) ---

2648 if (i + 1 == argc)
2649 fatal ("argument to `-Xlinker' is missing");
2650
2651 n_infiles++;
2652 i++;
2653 }
2654 else if (strncmp (argv[i], "-l", 2) == 0)
2655 n_infiles++;
2854 }
2855 else if (argv[i][0] == '+' && argv[i][1] == 'e')
2856 /* The +e options to the C++ front-end. */
2857 n_switches++;
2858 else if (strncmp (argv[i], "-Wl,", 4) == 0)
2859 {
2860 int j;
2861 /* Split the argument at commas. */

--- 5 unchanged lines hidden (view full) ---

2867 if (i + 1 == argc)
2868 fatal ("argument to `-Xlinker' is missing");
2869
2870 n_infiles++;
2871 i++;
2872 }
2873 else if (strncmp (argv[i], "-l", 2) == 0)
2874 n_infiles++;
2875 else if (strcmp (argv[i], "-save-temps") == 0)
2876 {
2877 save_temps_flag = 1;
2878 n_switches++;
2879 }
2880 else if (strcmp (argv[i], "-specs") == 0)
2881 {
2882 struct user_specs *user = (struct user_specs *)
2883 xmalloc (sizeof (struct user_specs));
2884 if (++i >= argc)
2885 fatal ("argument to `-specs' is missing");
2886
2887 user->next = (struct user_specs *)0;
2888 user->filename = argv[i];
2889 if (user_specs_tail)
2890 user_specs_tail->next = user;
2891 else
2892 user_specs_head = user;
2893 user_specs_tail = user;
2894 }
2895 else if (strncmp (argv[i], "-specs=", 7) == 0)
2896 {
2897 struct user_specs *user = (struct user_specs *)
2898 xmalloc (sizeof (struct user_specs));
2899 if (strlen (argv[i]) == 7)
2900 fatal ("argument to `-specs=' is missing");
2901
2902 user->next = (struct user_specs *)0;
2903 user->filename = argv[i]+7;
2904 if (user_specs_tail)
2905 user_specs_tail->next = user;
2906 else
2907 user_specs_head = user;
2908 user_specs_tail = user;
2909 }
2656 else if (argv[i][0] == '-' && argv[i][1] != 0)
2657 {
2658 register char *p = &argv[i][1];
2659 register int c = *p;
2660
2661 switch (c)
2662 {
2663 case 'b':
2910 else if (argv[i][0] == '-' && argv[i][1] != 0)
2911 {
2912 register char *p = &argv[i][1];
2913 register int c = *p;
2914
2915 switch (c)
2916 {
2917 case 'b':
2918 n_switches++;
2664 if (p[1] == 0 && i + 1 == argc)
2665 fatal ("argument to `-b' is missing");
2666 if (p[1] == 0)
2667 spec_machine = argv[++i];
2668 else
2669 spec_machine = p + 1;
2919 if (p[1] == 0 && i + 1 == argc)
2920 fatal ("argument to `-b' is missing");
2921 if (p[1] == 0)
2922 spec_machine = argv[++i];
2923 else
2924 spec_machine = p + 1;
2925
2926 warn_std_ptr = &warn_std;
2670 break;
2671
2672 case 'B':
2673 {
2927 break;
2928
2929 case 'B':
2930 {
2674 int *temp = (int *) xmalloc (sizeof (int));
2675 char *value;
2676 if (p[1] == 0 && i + 1 == argc)
2677 fatal ("argument to `-B' is missing");
2678 if (p[1] == 0)
2679 value = argv[++i];
2680 else
2681 value = p + 1;
2931 char *value;
2932 if (p[1] == 0 && i + 1 == argc)
2933 fatal ("argument to `-B' is missing");
2934 if (p[1] == 0)
2935 value = argv[++i];
2936 else
2937 value = p + 1;
2682 add_prefix (&exec_prefixes, value, 1, 0, temp);
2683 add_prefix (&startfile_prefixes, value, 1, 0, temp);
2684 add_prefix (&include_prefixes, concat (value, "include"),
2685 1, 0, 0);
2938 add_prefix (&exec_prefixes, value, NULL_PTR, 1, 0, &warn_B);
2939 add_prefix (&startfile_prefixes, value, NULL_PTR,
2940 1, 0, &warn_B);
2941 add_prefix (&include_prefixes, concat (value, "include",
2942 NULL_PTR),
2943 NULL_PTR, 1, 0, NULL_PTR);
2686
2687 /* As a kludge, if the arg is "[foo/]stageN/", just add
2688 "[foo/]include" to the include prefix. */
2689 {
2690 int len = strlen (value);
2691 if ((len == 7
2692 || (len > 7
2693 && (value[len - 8] == '/'
2694 || value[len - 8] == DIR_SEPARATOR)))
2695 && strncmp (value + len - 7, "stage", 5) == 0
2944
2945 /* As a kludge, if the arg is "[foo/]stageN/", just add
2946 "[foo/]include" to the include prefix. */
2947 {
2948 int len = strlen (value);
2949 if ((len == 7
2950 || (len > 7
2951 && (value[len - 8] == '/'
2952 || value[len - 8] == DIR_SEPARATOR)))
2953 && strncmp (value + len - 7, "stage", 5) == 0
2696 && isdigit (value[len - 2])
2954 && ISDIGIT (value[len - 2])
2697 && (value[len - 1] == '/'
2698 || value[len - 1] == DIR_SEPARATOR))
2699 {
2700 if (len == 7)
2955 && (value[len - 1] == '/'
2956 || value[len - 1] == DIR_SEPARATOR))
2957 {
2958 if (len == 7)
2701 add_prefix (&include_prefixes, "include", 1, 0, 0);
2959 add_prefix (&include_prefixes, "include", NULL_PTR,
2960 1, 0, NULL_PTR);
2702 else
2703 {
2704 char *string = xmalloc (len + 1);
2705 strncpy (string, value, len-7);
2961 else
2962 {
2963 char *string = xmalloc (len + 1);
2964 strncpy (string, value, len-7);
2706 strcat (string, "include");
2707 add_prefix (&include_prefixes, string, 1, 0, 0);
2965 strcpy (string+len-7, "include");
2966 add_prefix (&include_prefixes, string, NULL_PTR,
2967 1, 0, NULL_PTR);
2708 }
2709 }
2710 }
2968 }
2969 }
2970 }
2971 n_switches++;
2711 }
2712 break;
2713
2714 case 'v': /* Print our subcommands and print versions. */
2715 n_switches++;
2716 /* If they do anything other than exactly `-v', don't set
2717 verbose_flag; rather, continue on to give the error. */
2718 if (p[1] != 0)
2719 break;
2720 verbose_flag++;
2721 break;
2722
2723 case 'V':
2972 }
2973 break;
2974
2975 case 'v': /* Print our subcommands and print versions. */
2976 n_switches++;
2977 /* If they do anything other than exactly `-v', don't set
2978 verbose_flag; rather, continue on to give the error. */
2979 if (p[1] != 0)
2980 break;
2981 verbose_flag++;
2982 break;
2983
2984 case 'V':
2985 n_switches++;
2724 if (p[1] == 0 && i + 1 == argc)
2725 fatal ("argument to `-V' is missing");
2726 if (p[1] == 0)
2727 spec_version = argv[++i];
2728 else
2729 spec_version = p + 1;
2730 compiler_version = spec_version;
2986 if (p[1] == 0 && i + 1 == argc)
2987 fatal ("argument to `-V' is missing");
2988 if (p[1] == 0)
2989 spec_version = argv[++i];
2990 else
2991 spec_version = p + 1;
2992 compiler_version = spec_version;
2993 warn_std_ptr = &warn_std;
2994
2995 /* Validate the version number. Use the same checks
2996 done when inserting it into a spec.
2997
2998 The format of the version string is
2999 ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? */
3000 {
3001 char *v = compiler_version;
3002
3003 /* Ignore leading non-digits. i.e. "foo-" in "foo-2.7.2". */
3004 while (! ISDIGIT (*v))
3005 v++;
3006
3007 if (v > compiler_version && v[-1] != '-')
3008 fatal ("invalid version number format");
3009
3010 /* Set V after the first period. */
3011 while (ISDIGIT (*v))
3012 v++;
3013
3014 if (*v != '.')
3015 fatal ("invalid version number format");
3016
3017 v++;
3018 while (ISDIGIT (*v))
3019 v++;
3020
3021 if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
3022 fatal ("invalid version number format");
3023 }
2731 break;
2732
3024 break;
3025
2733 case 's':
2734 if (!strcmp (p, "save-temps"))
3026 case 'S':
3027 case 'c':
3028 if (p[1] == 0)
2735 {
3029 {
2736 save_temps_flag = 1;
3030 have_c = 1;
2737 n_switches++;
2738 break;
2739 }
3031 n_switches++;
3032 break;
3033 }
3034 goto normal_switch;
3035
3036 case 'o':
3037 have_o = 1;
3038#if defined(HAVE_EXECUTABLE_SUFFIX)
3039 if (! have_c)
3040 {
3041 int skip;
3042
3043 /* Forward scan, just in case -S or -c is specified
3044 after -o. */
3045 int j = i + 1;
3046 if (p[1] == 0)
3047 ++j;
3048 while (j < argc)
3049 {
3050 if (argv[j][0] == '-')
3051 {
3052 if (SWITCH_CURTAILS_COMPILATION (argv[j][1])
3053 && argv[j][2] == 0)
3054 {
3055 have_c = 1;
3056 break;
3057 }
3058 else if (skip = SWITCH_TAKES_ARG (argv[j][1]))
3059 j += skip - (argv[j][2] != 0);
3060 else if (skip = WORD_SWITCH_TAKES_ARG (argv[j] + 1))
3061 j += skip;
3062 }
3063 j++;
3064 }
3065 }
3066#endif
3067#if defined(HAVE_EXECUTABLE_SUFFIX) || defined(HAVE_OBJECT_SUFFIX)
3068 if (p[1] == 0)
3069 argv[i+1] = convert_filename (argv[i+1], ! have_c);
3070 else
3071 argv[i] = convert_filename (argv[i], ! have_c);
3072#endif
3073 goto normal_switch;
3074
2740 default:
3075 default:
3076 normal_switch:
2741 n_switches++;
2742
2743 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
2744 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
2745 else if (WORD_SWITCH_TAKES_ARG (p))
2746 i += WORD_SWITCH_TAKES_ARG (p);
2747 }
2748 }
2749 else
3077 n_switches++;
3078
3079 if (SWITCH_TAKES_ARG (c) > (p[1] != 0))
3080 i += SWITCH_TAKES_ARG (c) - (p[1] != 0);
3081 else if (WORD_SWITCH_TAKES_ARG (p))
3082 i += WORD_SWITCH_TAKES_ARG (p);
3083 }
3084 }
3085 else
2750 n_infiles++;
3086 {
3087 n_infiles++;
3088 lang_n_infiles++;
3089 }
2751 }
2752
3090 }
3091
3092 if (have_c && have_o && lang_n_infiles > 1)
3093 fatal ("cannot specify -o with -c or -S and multiple compilations");
3094
2753 /* Set up the search paths before we go looking for config files. */
2754
2755 /* These come before the md prefixes so that we will find gcc's subcommands
2756 (such as cpp) rather than those of the host system. */
2757 /* Use 2 as fourth arg meaning try just the machine as a suffix,
2758 as well as trying the machine and the version. */
2759#ifdef FREEBSD_NATIVE
2760#if defined(__i386__)
2761 if (objformat_aout) {
2762 n_switches++; /* add implied -maout */
3095 /* Set up the search paths before we go looking for config files. */
3096
3097 /* These come before the md prefixes so that we will find gcc's subcommands
3098 (such as cpp) rather than those of the host system. */
3099 /* Use 2 as fourth arg meaning try just the machine as a suffix,
3100 as well as trying the machine and the version. */
3101#ifdef FREEBSD_NATIVE
3102#if defined(__i386__)
3103 if (objformat_aout) {
3104 n_switches++; /* add implied -maout */
2763 add_prefix (&exec_prefixes, "/usr/libexec/aout/", 0, 0, NULL_PTR);
3105 add_prefix (&exec_prefixes, "/usr/libexec/aout/", "BINUTILS",
3106 0, 0, NULL_PTR);
2764 } else
3107 } else
2765 add_prefix (&exec_prefixes, "/usr/libexec/elf/", 0, 0, NULL_PTR);
3108 add_prefix (&exec_prefixes, "/usr/libexec/elf/", "BINUTILS",
3109 0, 0, NULL_PTR);
2766#endif
3110#endif
2767 add_prefix (&exec_prefixes, "/usr/libexec/", 0, 0, NULL_PTR);
2768 add_prefix (&exec_prefixes, "/usr/bin/", 0, 0, NULL_PTR);
2769 add_prefix (&startfile_prefixes, "/usr/libdata/gcc/", 0, 0, NULL_PTR);
3111 add_prefix (&exec_prefixes, "/usr/libexec", "GCC",
3112 0, 0, warn_std_ptr);
3113 add_prefix (&exec_prefixes, "/usr/bin", "GCC",
3114 0, 0, warn_std_ptr);
3115 add_prefix (&startfile_prefixes, "/usr/libdata/gcc/", "BINUTILS",
3116 0, 0, warn_std_ptr);
2770#else /* not FREEBSD_NATIVE */
2771#ifndef OS2
3117#else /* not FREEBSD_NATIVE */
3118#ifndef OS2
2772 add_prefix (&exec_prefixes, standard_exec_prefix, 0, 2, NULL_PTR);
2773 add_prefix (&exec_prefixes, standard_exec_prefix_1, 0, 2, NULL_PTR);
3119 add_prefix (&exec_prefixes, standard_exec_prefix, "BINUTILS",
3120 0, 2, warn_std_ptr);
3121 add_prefix (&exec_prefixes, standard_exec_prefix_1, "BINUTILS",
3122 0, 2, warn_std_ptr);
2774#endif
2775
3123#endif
3124
2776 add_prefix (&startfile_prefixes, standard_exec_prefix, 0, 1, NULL_PTR);
2777 add_prefix (&startfile_prefixes, standard_exec_prefix_1, 0, 1, NULL_PTR);
3125 add_prefix (&startfile_prefixes, standard_exec_prefix, "BINUTILS",
3126 0, 1, warn_std_ptr);
3127 add_prefix (&startfile_prefixes, standard_exec_prefix_1, "BINUTILS",
3128 0, 1, warn_std_ptr);
2778#endif /* FREEBSD_NATIVE */
2779
3129#endif /* FREEBSD_NATIVE */
3130
2780 tooldir_prefix = concat3 (tooldir_base_prefix, spec_machine,
2781 dir_separator_str);
3131 tooldir_prefix = concat (tooldir_base_prefix, spec_machine,
3132 dir_separator_str, NULL_PTR);
2782
2783 /* If tooldir is relative, base it on exec_prefixes. A relative
2784 tooldir lets us move the installed tree as a unit.
2785
2786 If GCC_EXEC_PREFIX is defined, then we want to add two relative
2787 directories, so that we can search both the user specified directory
2788 and the standard place. */
2789
2790 if (*tooldir_prefix != '/' && *tooldir_prefix != DIR_SEPARATOR)
2791 {
2792 if (gcc_exec_prefix)
2793 {
2794 char *gcc_exec_tooldir_prefix
3133
3134 /* If tooldir is relative, base it on exec_prefixes. A relative
3135 tooldir lets us move the installed tree as a unit.
3136
3137 If GCC_EXEC_PREFIX is defined, then we want to add two relative
3138 directories, so that we can search both the user specified directory
3139 and the standard place. */
3140
3141 if (*tooldir_prefix != '/' && *tooldir_prefix != DIR_SEPARATOR)
3142 {
3143 if (gcc_exec_prefix)
3144 {
3145 char *gcc_exec_tooldir_prefix
2795 = concat6 (gcc_exec_prefix, spec_machine, dir_separator_str,
2796 spec_version, dir_separator_str, tooldir_prefix);
3146 = concat (gcc_exec_prefix, spec_machine, dir_separator_str,
3147 spec_version, dir_separator_str, tooldir_prefix, NULL_PTR);
2797
2798 add_prefix (&exec_prefixes,
3148
3149 add_prefix (&exec_prefixes,
2799 concat3 (gcc_exec_tooldir_prefix, "bin",
2800 dir_separator_str),
2801 0, 0, NULL_PTR);
3150 concat (gcc_exec_tooldir_prefix, "bin",
3151 dir_separator_str, NULL_PTR),
3152 NULL_PTR, 0, 0, NULL_PTR);
2802 add_prefix (&startfile_prefixes,
3153 add_prefix (&startfile_prefixes,
2803 concat3 (gcc_exec_tooldir_prefix, "lib",
2804 dir_separator_str),
2805 0, 0, NULL_PTR);
3154 concat (gcc_exec_tooldir_prefix, "lib",
3155 dir_separator_str, NULL_PTR),
3156 NULL_PTR, 0, 0, NULL_PTR);
2806 }
2807
3157 }
3158
2808 tooldir_prefix = concat6 (standard_exec_prefix, spec_machine,
2809 dir_separator_str, spec_version,
2810 dir_separator_str, tooldir_prefix);
3159 tooldir_prefix = concat (standard_exec_prefix, spec_machine,
3160 dir_separator_str, spec_version,
3161 dir_separator_str, tooldir_prefix, NULL_PTR);
2811 }
2812
2813#ifndef FREEBSD_NATIVE
2814 add_prefix (&exec_prefixes,
3162 }
3163
3164#ifndef FREEBSD_NATIVE
3165 add_prefix (&exec_prefixes,
2815 concat3 (tooldir_prefix, "bin", dir_separator_str),
2816 0, 0, NULL_PTR);
3166 concat (tooldir_prefix, "bin", dir_separator_str, NULL_PTR),
3167 "BINUTILS", 0, 0, NULL_PTR);
2817 add_prefix (&startfile_prefixes,
3168 add_prefix (&startfile_prefixes,
2818 concat3 (tooldir_prefix, "lib", dir_separator_str),
2819 0, 0, NULL_PTR);
3169 concat (tooldir_prefix, "lib", dir_separator_str, NULL_PTR),
3170 "BINUTILS", 0, 0, NULL_PTR);
2820#endif /* FREEBSD_NATIVE */
2821
2822 /* More prefixes are enabled in main, after we read the specs file
2823 and determine whether this is cross-compilation or not. */
2824
2825
2826 /* Then create the space for the vectors and scan again. */
2827

--- 41 unchanged lines hidden (view full) ---

2869 else if (! strcmp (argv[i], "-print-multi-directory"))
2870 ;
2871#if defined(FREEBSD_NATIVE) && defined(__i386__)
2872 else if (! strcmp (argv[i], "-aout"))
2873 ;
2874 else if (! strcmp (argv[i], "-elf"))
2875 ;
2876#endif
3171#endif /* FREEBSD_NATIVE */
3172
3173 /* More prefixes are enabled in main, after we read the specs file
3174 and determine whether this is cross-compilation or not. */
3175
3176
3177 /* Then create the space for the vectors and scan again. */
3178

--- 41 unchanged lines hidden (view full) ---

3220 else if (! strcmp (argv[i], "-print-multi-directory"))
3221 ;
3222#if defined(FREEBSD_NATIVE) && defined(__i386__)
3223 else if (! strcmp (argv[i], "-aout"))
3224 ;
3225 else if (! strcmp (argv[i], "-elf"))
3226 ;
3227#endif
3228 else if (strcmp (argv[i], "-fhelp") == 0)
3229 {
3230 if (verbose_flag)
3231 {
3232 /* Create a dummy input file, so that we can pass --help on to
3233 the various sub-processes. */
3234 infiles[n_infiles].language = "c";
3235 infiles[n_infiles++].name = "help-dummy";
3236
3237 /* Preserve the --help switch so that it can be caught by the
3238 cc1 spec string. */
3239 switches[n_switches].part1 = "--help";
3240 switches[n_switches].args = 0;
3241 switches[n_switches].live_cond = 0;
3242 switches[n_switches].valid = 0;
3243
3244 n_switches++;
3245 }
3246 }
2877 else if (argv[i][0] == '+' && argv[i][1] == 'e')
2878 {
2879 /* Compensate for the +e options to the C++ front-end;
2880 they're there simply for cfront call-compatibility. We do
2881 some magic in default_compilers to pass them down properly.
2882 Note we deliberately start at the `+' here, to avoid passing
2883 -e0 or -e1 down into the linker. */
2884 switches[n_switches].part1 = &argv[i][0];

--- 5 unchanged lines hidden (view full) ---

2890 else if (strncmp (argv[i], "-Wl,", 4) == 0)
2891 {
2892 int prev, j;
2893 /* Split the argument at commas. */
2894 prev = 4;
2895 for (j = 4; argv[i][j]; j++)
2896 if (argv[i][j] == ',')
2897 {
3247 else if (argv[i][0] == '+' && argv[i][1] == 'e')
3248 {
3249 /* Compensate for the +e options to the C++ front-end;
3250 they're there simply for cfront call-compatibility. We do
3251 some magic in default_compilers to pass them down properly.
3252 Note we deliberately start at the `+' here, to avoid passing
3253 -e0 or -e1 down into the linker. */
3254 switches[n_switches].part1 = &argv[i][0];

--- 5 unchanged lines hidden (view full) ---

3260 else if (strncmp (argv[i], "-Wl,", 4) == 0)
3261 {
3262 int prev, j;
3263 /* Split the argument at commas. */
3264 prev = 4;
3265 for (j = 4; argv[i][j]; j++)
3266 if (argv[i][j] == ',')
3267 {
2898 infiles[n_infiles].language = 0;
3268 infiles[n_infiles].language = "*";
2899 infiles[n_infiles++].name
2900 = save_string (argv[i] + prev, j - prev);
2901 prev = j + 1;
2902 }
2903 /* Record the part after the last comma. */
3269 infiles[n_infiles++].name
3270 = save_string (argv[i] + prev, j - prev);
3271 prev = j + 1;
3272 }
3273 /* Record the part after the last comma. */
2904 infiles[n_infiles].language = 0;
3274 infiles[n_infiles].language = "*";
2905 infiles[n_infiles++].name = argv[i] + prev;
2906 }
2907 else if (strcmp (argv[i], "-Xlinker") == 0)
2908 {
3275 infiles[n_infiles++].name = argv[i] + prev;
3276 }
3277 else if (strcmp (argv[i], "-Xlinker") == 0)
3278 {
2909 infiles[n_infiles].language = 0;
3279 infiles[n_infiles].language = "*";
2910 infiles[n_infiles++].name = argv[++i];
2911 }
2912 else if (strncmp (argv[i], "-l", 2) == 0)
2913 {
3280 infiles[n_infiles++].name = argv[++i];
3281 }
3282 else if (strncmp (argv[i], "-l", 2) == 0)
3283 {
2914 infiles[n_infiles].language = 0;
3284 infiles[n_infiles].language = "*";
2915 infiles[n_infiles++].name = argv[i];
2916 }
3285 infiles[n_infiles++].name = argv[i];
3286 }
3287 else if (strcmp (argv[i], "-specs") == 0)
3288 i++;
3289 else if (strncmp (argv[i], "-specs=", 7) == 0)
3290 ;
3291 /* -save-temps overrides -pipe, so that temp files are produced */
3292 else if (save_temps_flag && strcmp (argv[i], "-pipe") == 0)
3293 error ("Warning: -pipe ignored since -save-temps specified");
2917 else if (argv[i][0] == '-' && argv[i][1] != 0)
2918 {
2919 register char *p = &argv[i][1];
2920 register int c = *p;
2921
3294 else if (argv[i][0] == '-' && argv[i][1] != 0)
3295 {
3296 register char *p = &argv[i][1];
3297 register int c = *p;
3298
2922 if (c == 'B' || c == 'b' || c == 'V')
2923 {
2924 /* Skip a separate arg, if any. */
2925 if (p[1] == 0)
2926 i++;
2927 continue;
2928 }
2929 if (c == 'x')
2930 {
2931 if (p[1] == 0 && i + 1 == argc)
2932 fatal ("argument to `-x' is missing");
2933 if (p[1] == 0)
2934 spec_lang = argv[++i];
2935 else
2936 spec_lang = p + 1;

--- 23 unchanged lines hidden (view full) ---

2960 fatal ("argument to `-%s' is missing", p);
2961 switches[n_switches].args
2962 = (char **) xmalloc ((n_args + 1) * sizeof (char *));
2963 while (j < n_args)
2964 switches[n_switches].args[j++] = argv[++i];
2965 /* Null-terminate the vector. */
2966 switches[n_switches].args[j] = 0;
2967 }
3299 if (c == 'x')
3300 {
3301 if (p[1] == 0 && i + 1 == argc)
3302 fatal ("argument to `-x' is missing");
3303 if (p[1] == 0)
3304 spec_lang = argv[++i];
3305 else
3306 spec_lang = p + 1;

--- 23 unchanged lines hidden (view full) ---

3330 fatal ("argument to `-%s' is missing", p);
3331 switches[n_switches].args
3332 = (char **) xmalloc ((n_args + 1) * sizeof (char *));
3333 while (j < n_args)
3334 switches[n_switches].args[j++] = argv[++i];
3335 /* Null-terminate the vector. */
3336 switches[n_switches].args[j] = 0;
3337 }
2968 else if (*switches_need_spaces != 0 && (c == 'o' || c == 'L'))
3338 else if (index (switches_need_spaces, c))
2969 {
3339 {
2970 /* On some systems, ld cannot handle -o or -L without space.
2971 So split the -o or -L from its argument. */
2972 switches[n_switches].part1 = (c == 'o' ? "o" : "L");
3340 /* On some systems, ld cannot handle some options without
3341 a space. So split the option from its argument. */
3342 char *part1 = (char *) xmalloc (2);
3343 part1[0] = c;
3344 part1[1] = '\0';
3345
3346 switches[n_switches].part1 = part1;
2973 switches[n_switches].args = (char **) xmalloc (2 * sizeof (char *));
2974 switches[n_switches].args[0] = xmalloc (strlen (p));
2975 strcpy (switches[n_switches].args[0], &p[1]);
2976 switches[n_switches].args[1] = 0;
2977 }
2978 else
2979 switches[n_switches].args = 0;
2980
2981 switches[n_switches].live_cond = 0;
2982 switches[n_switches].valid = 0;
2983 /* This is always valid, since gcc.c itself understands it. */
2984 if (!strcmp (p, "save-temps"))
2985 switches[n_switches].valid = 1;
3347 switches[n_switches].args = (char **) xmalloc (2 * sizeof (char *));
3348 switches[n_switches].args[0] = xmalloc (strlen (p));
3349 strcpy (switches[n_switches].args[0], &p[1]);
3350 switches[n_switches].args[1] = 0;
3351 }
3352 else
3353 switches[n_switches].args = 0;
3354
3355 switches[n_switches].live_cond = 0;
3356 switches[n_switches].valid = 0;
3357 /* This is always valid, since gcc.c itself understands it. */
3358 if (!strcmp (p, "save-temps"))
3359 switches[n_switches].valid = 1;
3360 else
3361 {
3362 char ch = switches[n_switches].part1[0];
3363 if (ch == 'V' || ch == 'b' || ch == 'B')
3364 switches[n_switches].valid = 1;
3365 }
2986 n_switches++;
2987 }
2988 else
2989 {
2990#ifdef HAVE_OBJECT_SUFFIX
3366 n_switches++;
3367 }
3368 else
3369 {
3370#ifdef HAVE_OBJECT_SUFFIX
2991 /* Convert x.o to x.obj if OBJECT_SUFFIX is ".obj". */
2992 if (strlen (argv[i]) > 2
2993 && argv[i][strlen (argv[i]) - 2] == '.'
2994 && argv[i][strlen (argv[i]) - 1] == 'o')
2995 {
2996 int j;
2997
2998 for (j = 0; j < strlen (argv[i]) - 2; j++)
2999 obstack_1grow (&obstack, argv[i][j]);
3000
3001 obstack_grow (&obstack, OBJECT_SUFFIX, strlen (OBJECT_SUFFIX));
3002 obstack_1grow (&obstack, 0);
3003 argv[i] = obstack_finish (&obstack);
3004 }
3371 argv[i] = convert_filename (argv[i], 0);
3005#endif
3006
3007 if (strcmp (argv[i], "-") != 0 && access (argv[i], R_OK) < 0)
3008 {
3009 perror_with_name (argv[i]);
3010 error_count++;
3011 }
3012 else

--- 15 unchanged lines hidden (view full) ---

3028
3029/* These variables describe the input file name.
3030 input_file_number is the index on outfiles of this file,
3031 so that the output file name can be stored for later use by %o.
3032 input_basename is the start of the part of the input file
3033 sans all directory names, and basename_length is the number
3034 of characters starting there excluding the suffix .c or whatever. */
3035
3372#endif
3373
3374 if (strcmp (argv[i], "-") != 0 && access (argv[i], R_OK) < 0)
3375 {
3376 perror_with_name (argv[i]);
3377 error_count++;
3378 }
3379 else

--- 15 unchanged lines hidden (view full) ---

3395
3396/* These variables describe the input file name.
3397 input_file_number is the index on outfiles of this file,
3398 so that the output file name can be stored for later use by %o.
3399 input_basename is the start of the part of the input file
3400 sans all directory names, and basename_length is the number
3401 of characters starting there excluding the suffix .c or whatever. */
3402
3036static char *input_filename;
3403char *input_filename;
3037static int input_file_number;
3404static int input_file_number;
3038static int input_filename_length;
3405size_t input_filename_length;
3039static int basename_length;
3040static char *input_basename;
3041static char *input_suffix;
3042
3043/* These are variables used within do_spec and do_spec_1. */
3044
3045/* Nonzero if an arg has been started and not yet terminated
3046 (with space, tab or newline). */

--- 13 unchanged lines hidden (view full) ---

3060static int this_is_library_file;
3061
3062/* Nonzero means that the input of this command is coming from a pipe. */
3063static int input_from_pipe;
3064
3065/* Process the spec SPEC and run the commands specified therein.
3066 Returns 0 if the spec is successfully processed; -1 if failed. */
3067
3406static int basename_length;
3407static char *input_basename;
3408static char *input_suffix;
3409
3410/* These are variables used within do_spec and do_spec_1. */
3411
3412/* Nonzero if an arg has been started and not yet terminated
3413 (with space, tab or newline). */

--- 13 unchanged lines hidden (view full) ---

3427static int this_is_library_file;
3428
3429/* Nonzero means that the input of this command is coming from a pipe. */
3430static int input_from_pipe;
3431
3432/* Process the spec SPEC and run the commands specified therein.
3433 Returns 0 if the spec is successfully processed; -1 if failed. */
3434
3068static int
3435int
3069do_spec (spec)
3070 char *spec;
3071{
3072 int value;
3073
3074 clear_args ();
3075 arg_going = 0;
3076 delete_this_arg = 0;

--- 36 unchanged lines hidden (view full) ---

3113 char *soft_matched_part;
3114{
3115 register char *p = spec;
3116 register int c;
3117 int i;
3118 char *string;
3119 int value;
3120
3436do_spec (spec)
3437 char *spec;
3438{
3439 int value;
3440
3441 clear_args ();
3442 arg_going = 0;
3443 delete_this_arg = 0;

--- 36 unchanged lines hidden (view full) ---

3480 char *soft_matched_part;
3481{
3482 register char *p = spec;
3483 register int c;
3484 int i;
3485 char *string;
3486 int value;
3487
3121 while (c = *p++)
3488 while ((c = *p++))
3122 /* If substituting a switch, treat all chars like letters.
3123 Otherwise, NL, SPC, TAB and % are special. */
3124 switch (inswitch ? 'a' : c)
3125 {
3126 case '\n':
3127 /* End of line: finish any pending argument,
3128 then run the pending command if one has been started. */
3129 if (arg_going)

--- 96 unchanged lines hidden (view full) ---

3226 break;
3227
3228 /* Dump out the directories specified with LIBRARY_PATH,
3229 followed by the absolute directories
3230 that we search for startfiles. */
3231 case 'D':
3232 {
3233 struct prefix_list *pl = startfile_prefixes.plist;
3489 /* If substituting a switch, treat all chars like letters.
3490 Otherwise, NL, SPC, TAB and % are special. */
3491 switch (inswitch ? 'a' : c)
3492 {
3493 case '\n':
3494 /* End of line: finish any pending argument,
3495 then run the pending command if one has been started. */
3496 if (arg_going)

--- 96 unchanged lines hidden (view full) ---

3593 break;
3594
3595 /* Dump out the directories specified with LIBRARY_PATH,
3596 followed by the absolute directories
3597 that we search for startfiles. */
3598 case 'D':
3599 {
3600 struct prefix_list *pl = startfile_prefixes.plist;
3234 int bufsize = 100;
3601 size_t bufsize = 100;
3235 char *buffer = (char *) xmalloc (bufsize);
3236 int idx;
3237
3238 for (; pl; pl = pl->next)
3239 {
3240#ifdef RELATIVE_PREFIX_NOT_LINKDIR
3241 /* Used on systems which record the specified -L dirs
3242 and use them to search for dynamic linking. */

--- 118 unchanged lines hidden (view full) ---

3361 else
3362 {
3363#ifdef MKTEMP_EACH_FILE
3364 /* ??? This has a problem: the total number of
3365 values mktemp can return is limited.
3366 That matters for the names of object files.
3367 In 2.4, do something about that. */
3368 struct temp_name *t;
3602 char *buffer = (char *) xmalloc (bufsize);
3603 int idx;
3604
3605 for (; pl; pl = pl->next)
3606 {
3607#ifdef RELATIVE_PREFIX_NOT_LINKDIR
3608 /* Used on systems which record the specified -L dirs
3609 and use them to search for dynamic linking. */

--- 118 unchanged lines hidden (view full) ---

3728 else
3729 {
3730#ifdef MKTEMP_EACH_FILE
3731 /* ??? This has a problem: the total number of
3732 values mktemp can return is limited.
3733 That matters for the names of object files.
3734 In 2.4, do something about that. */
3735 struct temp_name *t;
3736 int suffix_length;
3369 char *suffix = p;
3737 char *suffix = p;
3370 while (*p == '.' || isalpha (*p)
3371 || (p[0] == '%' && p[1] == 'O'))
3372 p++;
3373
3738
3739 if (p[0] == '%' && p[1] == 'O')
3740 {
3741 p += 2;
3742 /* We don't support extra suffix characters after %O. */
3743 if (*p == '.' || ISALPHA (*p))
3744 abort ();
3745 suffix = OBJECT_SUFFIX;
3746 suffix_length = strlen (OBJECT_SUFFIX);
3747 }
3748 else
3749 {
3750 while (*p == '.' || ISALPHA (*p))
3751 p++;
3752 suffix_length = p - suffix;
3753 }
3754
3374 /* See if we already have an association of %g/%u/%U and
3375 suffix. */
3376 for (t = temp_names; t; t = t->next)
3755 /* See if we already have an association of %g/%u/%U and
3756 suffix. */
3757 for (t = temp_names; t; t = t->next)
3377 if (t->length == p - suffix
3378 && strncmp (t->suffix, suffix, p - suffix) == 0
3758 if (t->length == suffix_length
3759 && strncmp (t->suffix, suffix, suffix_length) == 0
3379 && t->unique == (c != 'g'))
3380 break;
3381
3382 /* Make a new association if needed. %u requires one. */
3383 if (t == 0 || c == 'u')
3384 {
3385 if (t == 0)
3386 {
3387 t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
3388 t->next = temp_names;
3389 temp_names = t;
3390 }
3760 && t->unique == (c != 'g'))
3761 break;
3762
3763 /* Make a new association if needed. %u requires one. */
3764 if (t == 0 || c == 'u')
3765 {
3766 if (t == 0)
3767 {
3768 t = (struct temp_name *) xmalloc (sizeof (struct temp_name));
3769 t->next = temp_names;
3770 temp_names = t;
3771 }
3391 t->length = p - suffix;
3392 t->suffix = save_string (suffix, p - suffix);
3772 t->length = suffix_length;
3773 t->suffix = save_string (suffix, suffix_length);
3393 t->unique = (c != 'g');
3774 t->unique = (c != 'g');
3394 choose_temp_base ();
3775 temp_filename = make_temp_file (t->suffix);
3776 temp_filename_length = strlen (temp_filename);
3395 t->filename = temp_filename;
3396 t->filename_length = temp_filename_length;
3397 }
3398
3399 obstack_grow (&obstack, t->filename, t->filename_length);
3400 delete_this_arg = 1;
3401#else
3402 obstack_grow (&obstack, temp_filename, temp_filename_length);

--- 56 unchanged lines hidden (view full) ---

3459 break;
3460
3461 case 'w':
3462 this_is_output_file = 1;
3463 break;
3464
3465 case 'W':
3466 {
3777 t->filename = temp_filename;
3778 t->filename_length = temp_filename_length;
3779 }
3780
3781 obstack_grow (&obstack, t->filename, t->filename_length);
3782 delete_this_arg = 1;
3783#else
3784 obstack_grow (&obstack, temp_filename, temp_filename_length);

--- 56 unchanged lines hidden (view full) ---

3841 break;
3842
3843 case 'w':
3844 this_is_output_file = 1;
3845 break;
3846
3847 case 'W':
3848 {
3467 int index = argbuf_index;
3849 int cur_index = argbuf_index;
3468 /* Handle the {...} following the %W. */
3469 if (*p != '{')
3470 abort ();
3471 p = handle_braces (p + 1);
3472 if (p == 0)
3473 return -1;
3474 /* If any args were output, mark the last one for deletion
3475 on failure. */
3850 /* Handle the {...} following the %W. */
3851 if (*p != '{')
3852 abort ();
3853 p = handle_braces (p + 1);
3854 if (p == 0)
3855 return -1;
3856 /* If any args were output, mark the last one for deletion
3857 on failure. */
3476 if (argbuf_index != index)
3858 if (argbuf_index != cur_index)
3477 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
3478 break;
3479 }
3480
3481 /* %x{OPTION} records OPTION for %X to output. */
3482 case 'x':
3483 {
3484 char *p1 = p;

--- 10 unchanged lines hidden (view full) ---

3495 for (i = 0; i < n_linker_options; i++)
3496 if (! strcmp (string, linker_options[i]))
3497 {
3498 free (string);
3499 return 0;
3500 }
3501
3502 /* This option is new; add it. */
3859 record_temp_file (argbuf[argbuf_index - 1], 0, 1);
3860 break;
3861 }
3862
3863 /* %x{OPTION} records OPTION for %X to output. */
3864 case 'x':
3865 {
3866 char *p1 = p;

--- 10 unchanged lines hidden (view full) ---

3877 for (i = 0; i < n_linker_options; i++)
3878 if (! strcmp (string, linker_options[i]))
3879 {
3880 free (string);
3881 return 0;
3882 }
3883
3884 /* This option is new; add it. */
3503 n_linker_options++;
3504 if (!linker_options)
3505 linker_options
3506 = (char **) xmalloc (n_linker_options * sizeof (char **));
3507 else
3508 linker_options
3509 = (char **) xrealloc (linker_options,
3510 n_linker_options * sizeof (char **));
3511
3512 linker_options[n_linker_options - 1] = string;
3885 add_linker_option (string, strlen (string));
3513 }
3514 break;
3515
3516 /* Dump out the options accumulated previously using %x. */
3517 case 'X':
3518 for (i = 0; i < n_linker_options; i++)
3519 {
3520 do_spec_1 (linker_options[i], 1, NULL_PTR);

--- 129 unchanged lines hidden (view full) ---

3650 if (! strncmp (y, "-D", 2))
3651 {
3652 int flag = 0;
3653
3654 *x++ = *y++;
3655 *x++ = *y++;
3656
3657 if (*y != '_'
3886 }
3887 break;
3888
3889 /* Dump out the options accumulated previously using %x. */
3890 case 'X':
3891 for (i = 0; i < n_linker_options; i++)
3892 {
3893 do_spec_1 (linker_options[i], 1, NULL_PTR);

--- 129 unchanged lines hidden (view full) ---

4023 if (! strncmp (y, "-D", 2))
4024 {
4025 int flag = 0;
4026
4027 *x++ = *y++;
4028 *x++ = *y++;
4029
4030 if (*y != '_'
3658 || (*(y+1) != '_' && ! isupper (*(y+1))))
4031 || (*(y+1) != '_' && ! ISUPPER (*(y+1))))
3659 {
3660 /* Stick __ at front of macro name. */
3661 *x++ = '_';
3662 *x++ = '_';
3663 /* Arrange to stick __ at the end as well. */
3664 flag = 1;
3665 }
3666

--- 25 unchanged lines hidden (view full) ---

3692 y = cpp_predefines;
3693 while (*y != 0)
3694 {
3695 if (! strncmp (y, "-D", 2))
3696 {
3697 y += 2;
3698
3699 if (*y != '_'
4032 {
4033 /* Stick __ at front of macro name. */
4034 *x++ = '_';
4035 *x++ = '_';
4036 /* Arrange to stick __ at the end as well. */
4037 flag = 1;
4038 }
4039

--- 25 unchanged lines hidden (view full) ---

4065 y = cpp_predefines;
4066 while (*y != 0)
4067 {
4068 if (! strncmp (y, "-D", 2))
4069 {
4070 y += 2;
4071
4072 if (*y != '_'
3700 || (*(y+1) != '_' && ! isupper (*(y+1))))
4073 || (*(y+1) != '_' && ! ISUPPER (*(y+1))))
3701 {
3702 /* Stick -D__ at front of macro name. */
3703 *x++ = '-';
3704 *x++ = 'D';
3705 *x++ = '_';
3706 *x++ = '_';
3707
3708 /* Copy the macro name. */

--- 67 unchanged lines hidden (view full) ---

3776 do_spec_1 (" ", 0, NULL_PTR);
3777 break;
3778
3779 /* Process a string found as the value of a spec given by name.
3780 This feature allows individual machine descriptions
3781 to add and use their own specs.
3782 %[...] modifies -D options the way %P does;
3783 %(...) uses the spec unmodified. */
4074 {
4075 /* Stick -D__ at front of macro name. */
4076 *x++ = '-';
4077 *x++ = 'D';
4078 *x++ = '_';
4079 *x++ = '_';
4080
4081 /* Copy the macro name. */

--- 67 unchanged lines hidden (view full) ---

4149 do_spec_1 (" ", 0, NULL_PTR);
4150 break;
4151
4152 /* Process a string found as the value of a spec given by name.
4153 This feature allows individual machine descriptions
4154 to add and use their own specs.
4155 %[...] modifies -D options the way %P does;
4156 %(...) uses the spec unmodified. */
3784 case '(':
3785 case '[':
4157 case '[':
4158 error ("Warning: use of obsolete %%[ operator in specs");
4159 case '(':
3786 {
3787 char *name = p;
3788 struct spec_list *sl;
3789 int len;
3790
3791 /* The string after the S/P is the name of a spec that is to be
4160 {
4161 char *name = p;
4162 struct spec_list *sl;
4163 int len;
4164
4165 /* The string after the S/P is the name of a spec that is to be
3792 processed. */
4166 processed. */
3793 while (*p && *p != ')' && *p != ']')
3794 p++;
3795
3796 /* See if it's in the list */
3797 for (len = p - name, sl = specs; sl; sl = sl->next)
4167 while (*p && *p != ')' && *p != ']')
4168 p++;
4169
4170 /* See if it's in the list */
4171 for (len = p - name, sl = specs; sl; sl = sl->next)
3798 if (strncmp (sl->name, name, len) == 0 && !sl->name[len])
4172 if (sl->name_len == len && !strncmp (sl->name, name, len))
3799 {
4173 {
3800 name = sl->spec;
4174 name = *(sl->ptr_spec);
4175#ifdef DEBUG_SPECS
4176 fprintf (stderr, "Processing spec %c%s%c, which is '%s'\n",
4177 c, sl->name, (c == '(') ? ')' : ']', name);
4178#endif
3801 break;
3802 }
3803
3804 if (sl)
3805 {
3806 if (c == '(')
3807 {
3808 value = do_spec_1 (name, 0, NULL_PTR);
3809 if (value != 0)
3810 return value;
3811 }
3812 else
3813 {
3814 char *x = (char *) alloca (strlen (name) * 2 + 1);
3815 char *buf = x;
3816 char *y = name;
4179 break;
4180 }
4181
4182 if (sl)
4183 {
4184 if (c == '(')
4185 {
4186 value = do_spec_1 (name, 0, NULL_PTR);
4187 if (value != 0)
4188 return value;
4189 }
4190 else
4191 {
4192 char *x = (char *) alloca (strlen (name) * 2 + 1);
4193 char *buf = x;
4194 char *y = name;
4195 int flag = 0;
3817
3818 /* Copy all of NAME into BUF, but put __ after
3819 every -D and at the end of each arg, */
3820 while (1)
3821 {
3822 if (! strncmp (y, "-D", 2))
3823 {
3824 *x++ = '-';
3825 *x++ = 'D';
3826 *x++ = '_';
3827 *x++ = '_';
3828 y += 2;
4196
4197 /* Copy all of NAME into BUF, but put __ after
4198 every -D and at the end of each arg, */
4199 while (1)
4200 {
4201 if (! strncmp (y, "-D", 2))
4202 {
4203 *x++ = '-';
4204 *x++ = 'D';
4205 *x++ = '_';
4206 *x++ = '_';
4207 y += 2;
4208 flag = 1;
4209 continue;
3829 }
4210 }
3830 else if (*y == ' ' || *y == 0)
4211 else if (flag && (*y == ' ' || *y == '\t' || *y == '='
4212 || *y == '}' || *y == 0))
3831 {
3832 *x++ = '_';
3833 *x++ = '_';
4213 {
4214 *x++ = '_';
4215 *x++ = '_';
3834 if (*y == 0)
3835 break;
3836 else
3837 *x++ = *y++;
4216 flag = 0;
3838 }
4217 }
4218 if (*y == 0)
4219 break;
3839 else
3840 *x++ = *y++;
3841 }
3842 *x = 0;
3843
3844 value = do_spec_1 (buf, 0, NULL_PTR);
3845 if (value != 0)
3846 return value;

--- 6 unchanged lines hidden (view full) ---

3853 }
3854 break;
3855
3856 case 'v':
3857 {
3858 int c1 = *p++; /* Select first or second version number. */
3859 char *v = compiler_version;
3860 char *q;
4220 else
4221 *x++ = *y++;
4222 }
4223 *x = 0;
4224
4225 value = do_spec_1 (buf, 0, NULL_PTR);
4226 if (value != 0)
4227 return value;

--- 6 unchanged lines hidden (view full) ---

4234 }
4235 break;
4236
4237 case 'v':
4238 {
4239 int c1 = *p++; /* Select first or second version number. */
4240 char *v = compiler_version;
4241 char *q;
4242
4243 /* The format of the version string is
4244 ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? */
4245
4246 /* Ignore leading non-digits. i.e. "foo-" in "foo-2.7.2". */
4247 while (! ISDIGIT (*v))
4248 v++;
4249 if (v > compiler_version && v[-1] != '-')
4250 abort ();
4251
3861 /* If desired, advance to second version number. */
3862 if (c1 == '2')
3863 {
4252 /* If desired, advance to second version number. */
4253 if (c1 == '2')
4254 {
3864 /* Set P after the first period. */
3865 while (*v != 0 && *v != ' ' && *v != '.')
4255 /* Set V after the first period. */
4256 while (ISDIGIT (*v))
3866 v++;
4257 v++;
3867 if (*v == '.')
3868 v++;
4258 if (*v != '.')
4259 abort ();
4260 v++;
3869 }
4261 }
4262
3870 /* Set Q at the next period or at the end. */
3871 q = v;
4263 /* Set Q at the next period or at the end. */
4264 q = v;
3872 while (*q != 0 && *q != ' ' && *q != '.')
4265 while (ISDIGIT (*q))
3873 q++;
4266 q++;
3874 /* Empty string means zero. */
3875 if (p == q)
3876 {
3877 v = "0";
3878 q = v + 1;
3879 }
4267 if (*q != 0 && *q != ' ' && *q != '.' && *q != '-')
4268 abort ();
4269
3880 /* Put that part into the command. */
3881 obstack_grow (&obstack, v, q - v);
3882 arg_going = 1;
3883 }
3884 break;
3885
3886 case '|':
3887 if (input_from_pipe)

--- 20 unchanged lines hidden (view full) ---

3908}
3909
3910/* Return 0 if we call do_spec_1 and that returns -1. */
3911
3912static char *
3913handle_braces (p)
3914 register char *p;
3915{
4270 /* Put that part into the command. */
4271 obstack_grow (&obstack, v, q - v);
4272 arg_going = 1;
4273 }
4274 break;
4275
4276 case '|':
4277 if (input_from_pipe)

--- 20 unchanged lines hidden (view full) ---

4298}
4299
4300/* Return 0 if we call do_spec_1 and that returns -1. */
4301
4302static char *
4303handle_braces (p)
4304 register char *p;
4305{
3916 register char *q;
3917 char *filter;
3918 int pipe = 0;
3919 int negate = 0;
3920 int suffix = 0;
4306 char *filter, *body = NULL, *endbody;
4307 int pipe_p = 0;
4308 int negate;
4309 int suffix;
4310 int include_blanks = 1;
3921
4311
4312 if (*p == '^')
4313 /* A '^' after the open-brace means to not give blanks before args. */
4314 include_blanks = 0, ++p;
4315
3922 if (*p == '|')
3923 /* A `|' after the open-brace means,
3924 if the test fails, output a single minus sign rather than nothing.
3925 This is used in %{|!pipe:...}. */
4316 if (*p == '|')
4317 /* A `|' after the open-brace means,
4318 if the test fails, output a single minus sign rather than nothing.
4319 This is used in %{|!pipe:...}. */
3926 pipe = 1, ++p;
4320 pipe_p = 1, ++p;
3927
4321
4322next_member:
4323 negate = suffix = 0;
4324
3928 if (*p == '!')
3929 /* A `!' after the open-brace negates the condition:
3930 succeed if the specified switch is not present. */
3931 negate = 1, ++p;
3932
3933 if (*p == '.')
3934 /* A `.' after the open-brace means test against the current suffix. */
3935 {
4325 if (*p == '!')
4326 /* A `!' after the open-brace negates the condition:
4327 succeed if the specified switch is not present. */
4328 negate = 1, ++p;
4329
4330 if (*p == '.')
4331 /* A `.' after the open-brace means test against the current suffix. */
4332 {
3936 if (pipe)
4333 if (pipe_p)
3937 abort ();
3938
3939 suffix = 1;
3940 ++p;
3941 }
3942
3943 filter = p;
4334 abort ();
4335
4336 suffix = 1;
4337 ++p;
4338 }
4339
4340 filter = p;
3944 while (*p != ':' && *p != '}') p++;
3945 if (*p != '}')
4341 while (*p != ':' && *p != '}' && *p != '|') p++;
4342
4343 if (*p == '|' && pipe_p)
4344 abort ();
4345
4346 if (!body)
3946 {
4347 {
3947 register int count = 1;
3948 q = p + 1;
3949 while (count > 0)
3950 {
3951 if (*q == '{')
3952 count++;
3953 else if (*q == '}')
3954 count--;
3955 else if (*q == 0)
3956 abort ();
3957 q++;
4348 if (*p != '}')
4349 {
4350 register int count = 1;
4351 register char *q = p;
4352
4353 while (*q++ != ':') continue;
4354 body = q;
4355
4356 while (count > 0)
4357 {
4358 if (*q == '{')
4359 count++;
4360 else if (*q == '}')
4361 count--;
4362 else if (*q == 0)
4363 abort ();
4364 q++;
4365 }
4366 endbody = q;
3958 }
4367 }
4368 else
4369 body = p, endbody = p+1;
3959 }
4370 }
3960 else
3961 q = p + 1;
3962
3963 if (suffix)
3964 {
3965 int found = (input_suffix != 0
3966 && strlen (input_suffix) == p - filter
3967 && strncmp (input_suffix, filter, p - filter) == 0);
3968
4371
4372 if (suffix)
4373 {
4374 int found = (input_suffix != 0
4375 && strlen (input_suffix) == p - filter
4376 && strncmp (input_suffix, filter, p - filter) == 0);
4377
3969 if (p[0] == '}')
4378 if (body[0] == '}')
3970 abort ();
3971
3972 if (negate != found
4379 abort ();
4380
4381 if (negate != found
3973 && do_spec_1 (save_string (p + 1, q - p - 2), 0, NULL_PTR) < 0)
4382 && do_spec_1 (save_string (body, endbody-body-1), 0, NULL_PTR) < 0)
3974 return 0;
4383 return 0;
3975
3976 return q;
3977 }
3978 else if (p[-1] == '*' && p[0] == '}')
3979 {
3980 /* Substitute all matching switches as separate args. */
3981 register int i;
3982 --p;
3983 for (i = 0; i < n_switches; i++)
3984 if (!strncmp (switches[i].part1, filter, p - filter)
3985 && check_live_switch (i, p - filter))
4384 }
4385 else if (p[-1] == '*' && p[0] == '}')
4386 {
4387 /* Substitute all matching switches as separate args. */
4388 register int i;
4389 --p;
4390 for (i = 0; i < n_switches; i++)
4391 if (!strncmp (switches[i].part1, filter, p - filter)
4392 && check_live_switch (i, p - filter))
3986 give_switch (i, 0);
4393 give_switch (i, 0, include_blanks);
3987 }
3988 else
3989 {
3990 /* Test for presence of the specified switch. */
3991 register int i;
3992 int present = 0;
3993
3994 /* If name specified ends in *, as in {x*:...},
3995 check for %* and handle that case. */
3996 if (p[-1] == '*' && !negate)
3997 {
3998 int substitution;
4394 }
4395 else
4396 {
4397 /* Test for presence of the specified switch. */
4398 register int i;
4399 int present = 0;
4400
4401 /* If name specified ends in *, as in {x*:...},
4402 check for %* and handle that case. */
4403 if (p[-1] == '*' && !negate)
4404 {
4405 int substitution;
3999 char *r = p;
4406 char *r = body;
4000
4001 /* First see whether we have %*. */
4002 substitution = 0;
4407
4408 /* First see whether we have %*. */
4409 substitution = 0;
4003 while (r < q)
4410 while (r < endbody)
4004 {
4005 if (*r == '%' && r[1] == '*')
4006 substitution = 1;
4007 r++;
4008 }
4009 /* If we do, handle that case. */
4010 if (substitution)
4011 {
4012 /* Substitute all matching switches as separate args.
4013 But do this by substituting for %*
4014 in the text that follows the colon. */
4015
4016 unsigned hard_match_len = p - filter - 1;
4411 {
4412 if (*r == '%' && r[1] == '*')
4413 substitution = 1;
4414 r++;
4415 }
4416 /* If we do, handle that case. */
4417 if (substitution)
4418 {
4419 /* Substitute all matching switches as separate args.
4420 But do this by substituting for %*
4421 in the text that follows the colon. */
4422
4423 unsigned hard_match_len = p - filter - 1;
4017 char *string = save_string (p + 1, q - p - 2);
4424 char *string = save_string (body, endbody - body - 1);
4018
4019 for (i = 0; i < n_switches; i++)
4020 if (!strncmp (switches[i].part1, filter, hard_match_len)
4021 && check_live_switch (i, -1))
4022 {
4023 do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
4024 /* Pass any arguments this switch has. */
4425
4426 for (i = 0; i < n_switches; i++)
4427 if (!strncmp (switches[i].part1, filter, hard_match_len)
4428 && check_live_switch (i, -1))
4429 {
4430 do_spec_1 (string, 0, &switches[i].part1[hard_match_len]);
4431 /* Pass any arguments this switch has. */
4025 give_switch (i, 1);
4432 give_switch (i, 1, 1);
4026 }
4027
4433 }
4434
4028 return q;
4435 /* We didn't match. Try again. */
4436 if (*p++ == '|')
4437 goto next_member;
4438 return endbody;
4029 }
4030 }
4031
4032 /* If name specified ends in *, as in {x*:...},
4033 check for presence of any switch name starting with x. */
4034 if (p[-1] == '*')
4035 {
4036 for (i = 0; i < n_switches; i++)

--- 17 unchanged lines hidden (view full) ---

4054 && check_live_switch (i, -1))
4055 {
4056 present = 1;
4057 break;
4058 }
4059 }
4060 }
4061
4439 }
4440 }
4441
4442 /* If name specified ends in *, as in {x*:...},
4443 check for presence of any switch name starting with x. */
4444 if (p[-1] == '*')
4445 {
4446 for (i = 0; i < n_switches; i++)

--- 17 unchanged lines hidden (view full) ---

4464 && check_live_switch (i, -1))
4465 {
4466 present = 1;
4467 break;
4468 }
4469 }
4470 }
4471
4062 /* If it is as desired (present for %{s...}, absent for %{-s...})
4472 /* If it is as desired (present for %{s...}, absent for %{!s...})
4063 then substitute either the switch or the specified
4064 conditional text. */
4065 if (present != negate)
4066 {
4067 if (*p == '}')
4068 {
4473 then substitute either the switch or the specified
4474 conditional text. */
4475 if (present != negate)
4476 {
4477 if (*p == '}')
4478 {
4069 give_switch (i, 0);
4479 give_switch (i, 0, include_blanks);
4070 }
4071 else
4072 {
4480 }
4481 else
4482 {
4073 if (do_spec_1 (save_string (p + 1, q - p - 2), 0, NULL_PTR) < 0)
4483 if (do_spec_1 (save_string (body, endbody - body - 1),
4484 0, NULL_PTR) < 0)
4074 return 0;
4075 }
4076 }
4485 return 0;
4486 }
4487 }
4077 else if (pipe)
4488 else if (pipe_p)
4078 {
4079 /* Here if a %{|...} conditional fails: output a minus sign,
4080 which means "standard output" or "standard input". */
4081 do_spec_1 ("-", 0, NULL_PTR);
4489 {
4490 /* Here if a %{|...} conditional fails: output a minus sign,
4491 which means "standard output" or "standard input". */
4492 do_spec_1 ("-", 0, NULL_PTR);
4493 return endbody;
4082 }
4083 }
4084
4494 }
4495 }
4496
4085 return q;
4497 /* We didn't match; try again. */
4498 if (*p++ == '|')
4499 goto next_member;
4500
4501 return endbody;
4086}
4087
4088/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
4089 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
4090 spec, or -1 if either exact match or %* is used.
4091
4092 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
4093 whose value does not begin with "no-" is obsoleted by the same value

--- 29 unchanged lines hidden (view full) ---

4123 switches[switchnum].live_cond = -1;
4124 return 0;
4125 }
4126 break;
4127
4128 case 'W': case 'f': case 'm':
4129 if (! strncmp (name + 1, "no-", 3))
4130 {
4502}
4503
4504/* Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
4505 on the command line. PREFIX_LENGTH is the length of XXX in an {XXX*}
4506 spec, or -1 if either exact match or %* is used.
4507
4508 A -O switch is obsoleted by a later -O switch. A -f, -m, or -W switch
4509 whose value does not begin with "no-" is obsoleted by the same value

--- 29 unchanged lines hidden (view full) ---

4539 switches[switchnum].live_cond = -1;
4540 return 0;
4541 }
4542 break;
4543
4544 case 'W': case 'f': case 'm':
4545 if (! strncmp (name + 1, "no-", 3))
4546 {
4131 /* We have Xno-YYY, search for XYYY. */
4547 /* We have Xno-YYY, search for XYYY. */
4132 for (i = switchnum + 1; i < n_switches; i++)
4133 if (switches[i].part1[0] == name[0]
4134 && ! strcmp (&switches[i].part1[1], &name[4]))
4135 {
4136 switches[switchnum].valid = 1;
4137 switches[switchnum].live_cond = -1;
4138 return 0;
4139 }

--- 22 unchanged lines hidden (view full) ---

4162}
4163
4164/* Pass a switch to the current accumulating command
4165 in the same form that we received it.
4166 SWITCHNUM identifies the switch; it is an index into
4167 the vector of switches gcc received, which is `switches'.
4168 This cannot fail since it never finishes a command line.
4169
4548 for (i = switchnum + 1; i < n_switches; i++)
4549 if (switches[i].part1[0] == name[0]
4550 && ! strcmp (&switches[i].part1[1], &name[4]))
4551 {
4552 switches[switchnum].valid = 1;
4553 switches[switchnum].live_cond = -1;
4554 return 0;
4555 }

--- 22 unchanged lines hidden (view full) ---

4578}
4579
4580/* Pass a switch to the current accumulating command
4581 in the same form that we received it.
4582 SWITCHNUM identifies the switch; it is an index into
4583 the vector of switches gcc received, which is `switches'.
4584 This cannot fail since it never finishes a command line.
4585
4170 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument. */
4586 If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.
4171
4587
4588 If INCLUDE_BLANKS is nonzero, then we include blanks before each argument
4589 of the switch. */
4590
4172static void
4591static void
4173give_switch (switchnum, omit_first_word)
4592give_switch (switchnum, omit_first_word, include_blanks)
4174 int switchnum;
4175 int omit_first_word;
4593 int switchnum;
4594 int omit_first_word;
4595 int include_blanks;
4176{
4177 if (!omit_first_word)
4178 {
4179 do_spec_1 ("-", 0, NULL_PTR);
4180 do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
4181 }
4596{
4597 if (!omit_first_word)
4598 {
4599 do_spec_1 ("-", 0, NULL_PTR);
4600 do_spec_1 (switches[switchnum].part1, 1, NULL_PTR);
4601 }
4182 do_spec_1 (" ", 0, NULL_PTR);
4602
4183 if (switches[switchnum].args != 0)
4184 {
4185 char **p;
4186 for (p = switches[switchnum].args; *p; p++)
4187 {
4603 if (switches[switchnum].args != 0)
4604 {
4605 char **p;
4606 for (p = switches[switchnum].args; *p; p++)
4607 {
4608 if (include_blanks)
4609 do_spec_1 (" ", 0, NULL_PTR);
4188 do_spec_1 (*p, 1, NULL_PTR);
4610 do_spec_1 (*p, 1, NULL_PTR);
4189 do_spec_1 (" ", 0, NULL_PTR);
4190 }
4191 }
4611 }
4612 }
4613
4614 do_spec_1 (" ", 0, NULL_PTR);
4192 switches[switchnum].valid = 1;
4193}
4194
4195/* Search for a file named NAME trying various prefixes including the
4196 user's -B prefix and some standard ones.
4197 Return the absolute file name found. If nothing is found, return NAME. */
4198
4199static char *

--- 55 unchanged lines hidden (view full) ---

4255 if (cp[-1] != '/' && cp[-1] != DIR_SEPARATOR)
4256 *cp++ = DIR_SEPARATOR;
4257 *cp++ = '.';
4258 *cp = '\0';
4259
4260 /* Exclude directories that the linker is known to search. */
4261 if (linker
4262 && ((cp - path == 6
4615 switches[switchnum].valid = 1;
4616}
4617
4618/* Search for a file named NAME trying various prefixes including the
4619 user's -B prefix and some standard ones.
4620 Return the absolute file name found. If nothing is found, return NAME. */
4621
4622static char *

--- 55 unchanged lines hidden (view full) ---

4678 if (cp[-1] != '/' && cp[-1] != DIR_SEPARATOR)
4679 *cp++ = DIR_SEPARATOR;
4680 *cp++ = '.';
4681 *cp = '\0';
4682
4683 /* Exclude directories that the linker is known to search. */
4684 if (linker
4685 && ((cp - path == 6
4263 && strcmp (path, concat4 (dir_separator_str, "lib",
4264 dir_separator_str, ".")) == 0)
4686 && strcmp (path, concat (dir_separator_str, "lib",
4687 dir_separator_str, ".", NULL_PTR)) == 0)
4265 || (cp - path == 10
4688 || (cp - path == 10
4266 && strcmp (path, concat6 (dir_separator_str, "usr",
4267 dir_separator_str, "lib",
4268 dir_separator_str, ".")) == 0)))
4689 && strcmp (path, concat (dir_separator_str, "usr",
4690 dir_separator_str, "lib",
4691 dir_separator_str, ".", NULL_PTR)) == 0)))
4269 return 0;
4270
4271 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
4272}
4273
4274/* On fatal signals, delete all the temporary files. */
4275
4276static void

--- 8 unchanged lines hidden (view full) ---

4285 kill (getpid (), signum);
4286}
4287
4288int
4289main (argc, argv)
4290 int argc;
4291 char **argv;
4292{
4692 return 0;
4693
4694 return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
4695}
4696
4697/* On fatal signals, delete all the temporary files. */
4698
4699static void

--- 8 unchanged lines hidden (view full) ---

4708 kill (getpid (), signum);
4709}
4710
4711int
4712main (argc, argv)
4713 int argc;
4714 char **argv;
4715{
4293 register int i;
4294 int j;
4716 register size_t i;
4717 size_t j;
4295 int value;
4296 int linker_was_run = 0;
4297 char *explicit_link_files;
4298 char *specs_file;
4299 char *p;
4718 int value;
4719 int linker_was_run = 0;
4720 char *explicit_link_files;
4721 char *specs_file;
4722 char *p;
4723 struct user_specs *uptr;
4300
4301 p = argv[0] + strlen (argv[0]);
4302 while (p != argv[0] && p[-1] != '/' && p[-1] != DIR_SEPARATOR) --p;
4303 programname = p;
4304
4305 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
4306 signal (SIGINT, fatal_error);
4307#ifdef SIGHUP

--- 7 unchanged lines hidden (view full) ---

4315 signal (SIGPIPE, fatal_error);
4316#endif
4317
4318 argbuf_length = 10;
4319 argbuf = (char **) xmalloc (argbuf_length * sizeof (char *));
4320
4321 obstack_init (&obstack);
4322
4724
4725 p = argv[0] + strlen (argv[0]);
4726 while (p != argv[0] && p[-1] != '/' && p[-1] != DIR_SEPARATOR) --p;
4727 programname = p;
4728
4729 if (signal (SIGINT, SIG_IGN) != SIG_IGN)
4730 signal (SIGINT, fatal_error);
4731#ifdef SIGHUP

--- 7 unchanged lines hidden (view full) ---

4739 signal (SIGPIPE, fatal_error);
4740#endif
4741
4742 argbuf_length = 10;
4743 argbuf = (char **) xmalloc (argbuf_length * sizeof (char *));
4744
4745 obstack_init (&obstack);
4746
4747 /* Build multilib_select, et. al from the separate lines that make up each
4748 multilib selection. */
4749 {
4750 char **q = multilib_raw;
4751 int need_space;
4752
4753 obstack_init (&multilib_obstack);
4754 while ((p = *q++) != (char *) 0)
4755 obstack_grow (&multilib_obstack, p, strlen (p));
4756
4757 obstack_1grow (&multilib_obstack, 0);
4758 multilib_select = obstack_finish (&multilib_obstack);
4759
4760 q = multilib_matches_raw;
4761 while ((p = *q++) != (char *) 0)
4762 obstack_grow (&multilib_obstack, p, strlen (p));
4763
4764 obstack_1grow (&multilib_obstack, 0);
4765 multilib_matches = obstack_finish (&multilib_obstack);
4766
4767 need_space = FALSE;
4768 for (i = 0;
4769 i < sizeof (multilib_defaults_raw) / sizeof (multilib_defaults_raw[0]);
4770 i++)
4771 {
4772 if (need_space)
4773 obstack_1grow (&multilib_obstack, ' ');
4774 obstack_grow (&multilib_obstack,
4775 multilib_defaults_raw[i],
4776 strlen (multilib_defaults_raw[i]));
4777 need_space = TRUE;
4778 }
4779
4780 obstack_1grow (&multilib_obstack, 0);
4781 multilib_defaults = obstack_finish (&multilib_obstack);
4782 }
4783
4323 /* Set up to remember the pathname of gcc and any options
4324 needed for collect. We use argv[0] instead of programname because
4325 we need the complete pathname. */
4326 obstack_init (&collect_obstack);
4327 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
4328 obstack_grow (&collect_obstack, argv[0], strlen (argv[0])+1);
4329 putenv (obstack_finish (&collect_obstack));
4330
4331#ifdef INIT_ENVIRONMENT
4332 /* Set up any other necessary machine specific environment variables. */
4333 putenv (INIT_ENVIRONMENT);
4334#endif
4335
4336 /* Choose directory for temp files. */
4337
4784 /* Set up to remember the pathname of gcc and any options
4785 needed for collect. We use argv[0] instead of programname because
4786 we need the complete pathname. */
4787 obstack_init (&collect_obstack);
4788 obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=")-1);
4789 obstack_grow (&collect_obstack, argv[0], strlen (argv[0])+1);
4790 putenv (obstack_finish (&collect_obstack));
4791
4792#ifdef INIT_ENVIRONMENT
4793 /* Set up any other necessary machine specific environment variables. */
4794 putenv (INIT_ENVIRONMENT);
4795#endif
4796
4797 /* Choose directory for temp files. */
4798
4338 choose_temp_base ();
4799#ifndef MKTEMP_EACH_FILE
4800 temp_filename = choose_temp_base ();
4801 temp_filename_length = strlen (temp_filename);
4802#endif
4339
4340 /* Make a table of what switches there are (switches, n_switches).
4341 Make a table of specified input files (infiles, n_infiles).
4342 Decode switches that are handled locally. */
4343
4344 process_command (argc, argv);
4345
4803
4804 /* Make a table of what switches there are (switches, n_switches).
4805 Make a table of specified input files (infiles, n_infiles).
4806 Decode switches that are handled locally. */
4807
4808 process_command (argc, argv);
4809
4810 {
4811 int first_time;
4812
4813 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4814 the compiler. */
4815 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4816 sizeof ("COLLECT_GCC_OPTIONS=")-1);
4817
4818 first_time = TRUE;
4819 for (i = 0; i < n_switches; i++)
4820 {
4821 char **args;
4822 char *p, *q;
4823 if (!first_time)
4824 obstack_grow (&collect_obstack, " ", 1);
4825
4826 first_time = FALSE;
4827 obstack_grow (&collect_obstack, "'-", 2);
4828 q = switches[i].part1;
4829 while ((p = index (q,'\'')))
4830 {
4831 obstack_grow (&collect_obstack, q, p-q);
4832 obstack_grow (&collect_obstack, "'\\''", 4);
4833 q = ++p;
4834 }
4835 obstack_grow (&collect_obstack, q, strlen (q));
4836 obstack_grow (&collect_obstack, "'", 1);
4837
4838 for (args = switches[i].args; args && *args; args++)
4839 {
4840 obstack_grow (&collect_obstack, " '", 2);
4841 q = *args;
4842 while ((p = index (q,'\'')))
4843 {
4844 obstack_grow (&collect_obstack, q, p-q);
4845 obstack_grow (&collect_obstack, "'\\''", 4);
4846 q = ++p;
4847 }
4848 obstack_grow (&collect_obstack, q, strlen (q));
4849 obstack_grow (&collect_obstack, "'", 1);
4850 }
4851 }
4852 obstack_grow (&collect_obstack, "\0", 1);
4853 putenv (obstack_finish (&collect_obstack));
4854 }
4855
4346 /* Initialize the vector of specs to just the default.
4347 This means one element containing 0s, as a terminator. */
4348
4349 compilers = (struct compiler *) xmalloc (sizeof default_compilers);
4350 bcopy ((char *) default_compilers, (char *) compilers,
4351 sizeof default_compilers);
4352 n_compilers = n_default_compilers;
4353
4354 /* Read specs from a file if there is one. */
4355
4356#ifndef FREEBSD_NATIVE
4856 /* Initialize the vector of specs to just the default.
4857 This means one element containing 0s, as a terminator. */
4858
4859 compilers = (struct compiler *) xmalloc (sizeof default_compilers);
4860 bcopy ((char *) default_compilers, (char *) compilers,
4861 sizeof default_compilers);
4862 n_compilers = n_default_compilers;
4863
4864 /* Read specs from a file if there is one. */
4865
4866#ifndef FREEBSD_NATIVE
4357 machine_suffix = concat4 (spec_machine, dir_separator_str,
4358 spec_version, dir_separator_str);
4359 just_machine_suffix = concat (spec_machine, dir_separator_str);
4360#endif
4867 machine_suffix = concat (spec_machine, dir_separator_str,
4868 spec_version, dir_separator_str, NULL_PTR);
4869 just_machine_suffix = concat (spec_machine, dir_separator_str, NULL_PTR);
4870#else /* FREEBSD_NATIVE */
4871 just_machine_suffix = "";
4872#endif /* FREEBSD_NATIVE */
4361
4362 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
4363 /* Read the specs file unless it is a default one. */
4364 if (specs_file != 0 && strcmp (specs_file, "specs"))
4873
4874 specs_file = find_a_file (&startfile_prefixes, "specs", R_OK);
4875 /* Read the specs file unless it is a default one. */
4876 if (specs_file != 0 && strcmp (specs_file, "specs"))
4365 read_specs (specs_file);
4877 read_specs (specs_file, TRUE);
4878 else
4879 init_spec ();
4366
4880
4881 /* We need to check standard_exec_prefix/just_machine_suffix/specs
4882 for any override of as, ld and libraries. */
4883 specs_file = (char *) alloca (strlen (standard_exec_prefix)
4884 + strlen (just_machine_suffix)
4885 + sizeof ("specs"));
4886
4887 strcpy (specs_file, standard_exec_prefix);
4888 strcat (specs_file, just_machine_suffix);
4889 strcat (specs_file, "specs");
4890 if (access (specs_file, R_OK) == 0)
4891 read_specs (specs_file, TRUE);
4892
4893 /* Process any user specified specs in the order given on the command
4894 line. */
4895 for (uptr = user_specs_head; uptr; uptr = uptr->next)
4896 {
4897 char *filename = find_a_file (&startfile_prefixes, uptr->filename, R_OK);
4898 read_specs (filename ? filename : uptr->filename, FALSE);
4899 }
4900
4367 /* If not cross-compiling, look for startfiles in the standard places. */
4368 /* The fact that these are done here, after reading the specs file,
4369 means that it cannot be found in these directories.
4370 But that's okay. It should never be there anyway. */
4901 /* If not cross-compiling, look for startfiles in the standard places. */
4902 /* The fact that these are done here, after reading the specs file,
4903 means that it cannot be found in these directories.
4904 But that's okay. It should never be there anyway. */
4371 if (!cross_compile)
4905 if (*cross_compile == '0')
4372 {
4373#ifdef MD_EXEC_PREFIX
4906 {
4907#ifdef MD_EXEC_PREFIX
4374 add_prefix (&exec_prefixes, md_exec_prefix, 0, 0, NULL_PTR);
4375 add_prefix (&startfile_prefixes, md_exec_prefix, 0, 0, NULL_PTR);
4908 add_prefix (&exec_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
4909 add_prefix (&startfile_prefixes, md_exec_prefix, "GCC", 0, 0, NULL_PTR);
4376#endif
4377
4378#ifdef MD_STARTFILE_PREFIX
4910#endif
4911
4912#ifdef MD_STARTFILE_PREFIX
4379 add_prefix (&startfile_prefixes, md_startfile_prefix, 0, 0, NULL_PTR);
4913 add_prefix (&startfile_prefixes, md_startfile_prefix, "GCC",
4914 0, 0, NULL_PTR);
4380#endif
4381
4382#ifdef MD_STARTFILE_PREFIX_1
4915#endif
4916
4917#ifdef MD_STARTFILE_PREFIX_1
4383 add_prefix (&startfile_prefixes, md_startfile_prefix_1, 0, 0, NULL_PTR);
4918 add_prefix (&startfile_prefixes, md_startfile_prefix_1, "GCC",
4919 0, 0, NULL_PTR);
4384#endif
4385
4386 /* If standard_startfile_prefix is relative, base it on
4387 standard_exec_prefix. This lets us move the installed tree
4388 as a unit. If GCC_EXEC_PREFIX is defined, base
4389 standard_startfile_prefix on that as well. */
4390 if (*standard_startfile_prefix == '/'
4920#endif
4921
4922 /* If standard_startfile_prefix is relative, base it on
4923 standard_exec_prefix. This lets us move the installed tree
4924 as a unit. If GCC_EXEC_PREFIX is defined, base
4925 standard_startfile_prefix on that as well. */
4926 if (*standard_startfile_prefix == '/'
4391 || *standard_startfile_prefix == DIR_SEPARATOR)
4392 add_prefix (&startfile_prefixes, standard_startfile_prefix, 0, 0,
4393 NULL_PTR);
4927 || *standard_startfile_prefix == DIR_SEPARATOR
4928 || *standard_startfile_prefix == '$'
4929#ifdef __MSDOS__
4930 /* Check for disk name on MS-DOS-based systems. */
4931 || (standard_startfile_prefix[1] == ':'
4932 && (standard_startfile_prefix[2] == DIR_SEPARATOR
4933 || standard_startfile_prefix[2] == '/'))
4934#endif
4935 )
4936 add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
4937 0, 0, NULL_PTR);
4394 else
4395 {
4396 if (gcc_exec_prefix)
4397 add_prefix (&startfile_prefixes,
4938 else
4939 {
4940 if (gcc_exec_prefix)
4941 add_prefix (&startfile_prefixes,
4398 concat3 (gcc_exec_prefix, machine_suffix,
4399 standard_startfile_prefix),
4400 0, 0, NULL_PTR);
4942 concat (gcc_exec_prefix, machine_suffix,
4943 standard_startfile_prefix, NULL_PTR),
4944 NULL_PTR, 0, 0, NULL_PTR);
4401 add_prefix (&startfile_prefixes,
4945 add_prefix (&startfile_prefixes,
4402 concat3 (standard_exec_prefix,
4403 machine_suffix,
4404 standard_startfile_prefix),
4405 0, 0, NULL_PTR);
4946 concat (standard_exec_prefix,
4947 machine_suffix,
4948 standard_startfile_prefix, NULL_PTR),
4949 NULL_PTR, 0, 0, NULL_PTR);
4406 }
4407
4408#ifndef FREEBSD_NATIVE
4950 }
4951
4952#ifndef FREEBSD_NATIVE
4409 add_prefix (&startfile_prefixes, standard_startfile_prefix_1, 0, 0,
4410 NULL_PTR);
4411 add_prefix (&startfile_prefixes, standard_startfile_prefix_2, 0, 0,
4412 NULL_PTR);
4953 add_prefix (&startfile_prefixes, standard_startfile_prefix_1,
4954 "BINUTILS", 0, 0, NULL_PTR);
4955 add_prefix (&startfile_prefixes, standard_startfile_prefix_2,
4956 "BINUTILS", 0, 0, NULL_PTR);
4413#if 0 /* Can cause surprises, and one can use -B./ instead. */
4957#if 0 /* Can cause surprises, and one can use -B./ instead. */
4414 add_prefix (&startfile_prefixes, "./", 0, 1, NULL_PTR);
4958 add_prefix (&startfile_prefixes, "./", NULL_PTR, 0, 1, NULL_PTR);
4415#endif
4416#endif /* FREEBSD_NATIVE */
4959#endif
4960#endif /* FREEBSD_NATIVE */
4417
4418 }
4419 else
4420 {
4421 if (*standard_startfile_prefix != DIR_SEPARATOR && gcc_exec_prefix)
4422 add_prefix (&startfile_prefixes,
4961 }
4962 else
4963 {
4964 if (*standard_startfile_prefix != DIR_SEPARATOR && gcc_exec_prefix)
4965 add_prefix (&startfile_prefixes,
4423 concat3 (gcc_exec_prefix, machine_suffix,
4424 standard_startfile_prefix),
4425 0, 0, NULL_PTR);
4966 concat (gcc_exec_prefix, machine_suffix,
4967 standard_startfile_prefix, NULL_PTR),
4968 "BINUTILS", 0, 0, NULL_PTR);
4426 }
4427
4428 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
4429 if (gcc_exec_prefix)
4430 {
4431 char * temp = (char *) xmalloc (strlen (gcc_exec_prefix)
4432 + strlen (spec_version)
4433 + strlen (spec_machine) + 3);

--- 53 unchanged lines hidden (view full) ---

4487 {
4488 if (multilib_dir == NULL)
4489 printf (".\n");
4490 else
4491 printf ("%s\n", multilib_dir);
4492 exit (0);
4493 }
4494
4969 }
4970
4971 /* If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake. */
4972 if (gcc_exec_prefix)
4973 {
4974 char * temp = (char *) xmalloc (strlen (gcc_exec_prefix)
4975 + strlen (spec_version)
4976 + strlen (spec_machine) + 3);

--- 53 unchanged lines hidden (view full) ---

5030 {
5031 if (multilib_dir == NULL)
5032 printf (".\n");
5033 else
5034 printf ("%s\n", multilib_dir);
5035 exit (0);
5036 }
5037
5038 if (print_help_list)
5039 {
5040 display_help ();
5041
5042 if (! verbose_flag)
5043 {
5044 printf ("\nReport bugs to egcs-bugs@cygnus.com.\n");
5045 printf ("Please see the file BUGS (included with the sources) first.\n");
5046
5047 exit (0);
5048 }
5049
5050 /* We do not exit here. Instead we have created a fake input file
5051 called 'help-dummy' which needs to be compiled, and we pass this
5052 on the the various sub-processes, along with the --help switch. */
5053 }
5054
4495 if (verbose_flag)
4496 {
5055 if (verbose_flag)
5056 {
4497 if (! strcmp (version_string, compiler_version))
5057 int n;
5058
5059 /* compiler_version is truncated at the first space when initialized
5060 from version string, so truncate version_string at the first space
5061 before comparing. */
5062 for (n = 0; version_string[n]; n++)
5063 if (version_string[n] == ' ')
5064 break;
5065
5066 if (! strncmp (version_string, compiler_version, n)
5067 && compiler_version[n] == 0)
4498 fprintf (stderr, "gcc version %s\n", version_string);
4499 else
4500 fprintf (stderr, "gcc driver version %s executing gcc version %s\n",
4501 version_string, compiler_version);
4502
4503 if (n_infiles == 0)
4504 exit (0);
4505 }
4506
5068 fprintf (stderr, "gcc version %s\n", version_string);
5069 else
5070 fprintf (stderr, "gcc driver version %s executing gcc version %s\n",
5071 version_string, compiler_version);
5072
5073 if (n_infiles == 0)
5074 exit (0);
5075 }
5076
4507 if (n_infiles == 0)
5077 if (n_infiles == added_libraries)
4508 fatal ("No input files specified");
4509
4510 /* Make a place to record the compiler output file names
4511 that correspond to the input files. */
4512
5078 fatal ("No input files specified");
5079
5080 /* Make a place to record the compiler output file names
5081 that correspond to the input files. */
5082
4513 outfiles = (char **) xmalloc (n_infiles * sizeof (char *));
5083 i = n_infiles;
5084#ifdef LANG_SPECIFIC_DRIVER
5085 i += lang_specific_extra_outfiles;
5086#endif
5087 outfiles = (char **) xmalloc (i * sizeof (char *));
4514 bzero ((char *) outfiles, n_infiles * sizeof (char *));
4515
4516 /* Record which files were specified explicitly as link input. */
4517
4518 explicit_link_files = xmalloc (n_infiles);
4519 bzero (explicit_link_files, n_infiles);
4520
4521 for (i = 0; i < n_infiles; i++)

--- 18 unchanged lines hidden (view full) ---

4540
4541 if (cp)
4542 {
4543 /* Ok, we found an applicable compiler. Run its spec. */
4544 /* First say how much of input_filename to substitute for %b */
4545 register char *p;
4546 int len;
4547
5088 bzero ((char *) outfiles, n_infiles * sizeof (char *));
5089
5090 /* Record which files were specified explicitly as link input. */
5091
5092 explicit_link_files = xmalloc (n_infiles);
5093 bzero (explicit_link_files, n_infiles);
5094
5095 for (i = 0; i < n_infiles; i++)

--- 18 unchanged lines hidden (view full) ---

5114
5115 if (cp)
5116 {
5117 /* Ok, we found an applicable compiler. Run its spec. */
5118 /* First say how much of input_filename to substitute for %b */
5119 register char *p;
5120 int len;
5121
5122 if (cp->spec[0][0] == '#')
5123 error ("%s: %s compiler not installed on this system",
5124 input_filename, &cp->spec[0][1]);
5125
4548 input_basename = input_filename;
4549 for (p = input_filename; *p; p++)
4550 if (*p == '/' || *p == DIR_SEPARATOR)
4551 input_basename = p + 1;
4552
4553 /* Find a suffix starting with the last period,
4554 and set basename_length to exclude that suffix. */
4555 basename_length = strlen (input_basename);

--- 41 unchanged lines hidden (view full) ---

4597 {
4598 delete_failure_queue ();
4599 error_count++;
4600 }
4601 /* If this compilation succeeded, don't delete those files later. */
4602 clear_failure_queue ();
4603 }
4604
5126 input_basename = input_filename;
5127 for (p = input_filename; *p; p++)
5128 if (*p == '/' || *p == DIR_SEPARATOR)
5129 input_basename = p + 1;
5130
5131 /* Find a suffix starting with the last period,
5132 and set basename_length to exclude that suffix. */
5133 basename_length = strlen (input_basename);

--- 41 unchanged lines hidden (view full) ---

5175 {
5176 delete_failure_queue ();
5177 error_count++;
5178 }
5179 /* If this compilation succeeded, don't delete those files later. */
5180 clear_failure_queue ();
5181 }
5182
5183#ifdef LANG_SPECIFIC_DRIVER
5184 if (error_count == 0
5185 && lang_specific_pre_link ())
5186 error_count++;
5187#endif
5188
4605 /* Run ld to link all the compiler output files. */
4606
4607 if (error_count == 0)
4608 {
4609 int tmp = execution_count;
5189 /* Run ld to link all the compiler output files. */
5190
5191 if (error_count == 0)
5192 {
5193 int tmp = execution_count;
4610 int i;
4611 int first_time;
4612
5194
5195 /* We'll use ld if we can't find collect2. */
5196 if (! strcmp (linker_name_spec, "collect2"))
5197 {
5198 char *s = find_a_file (&exec_prefixes, "collect2", X_OK);
5199 if (s == NULL)
5200 linker_name_spec = "ld";
5201 }
4613 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
4614 for collect. */
4615 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH=");
4616 putenv_from_prefixes (&startfile_prefixes, "LIBRARY_PATH=");
4617
5202 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
5203 for collect. */
5204 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH=");
5205 putenv_from_prefixes (&startfile_prefixes, "LIBRARY_PATH=");
5206
4618 /* Build COLLECT_GCC_OPTIONS to have all of the options specified to
4619 the compiler. */
4620 obstack_grow (&collect_obstack, "COLLECT_GCC_OPTIONS=",
4621 sizeof ("COLLECT_GCC_OPTIONS=")-1);
4622
4623 first_time = TRUE;
4624 for (i = 0; i < n_switches; i++)
4625 {
4626 char **args;
4627 if (!first_time)
4628 obstack_grow (&collect_obstack, " ", 1);
4629
4630 first_time = FALSE;
4631 obstack_grow (&collect_obstack, "-", 1);
4632 obstack_grow (&collect_obstack, switches[i].part1,
4633 strlen (switches[i].part1));
4634
4635 for (args = switches[i].args; args && *args; args++)
4636 {
4637 obstack_grow (&collect_obstack, " ", 1);
4638 obstack_grow (&collect_obstack, *args, strlen (*args));
4639 }
4640 }
4641 obstack_grow (&collect_obstack, "\0", 1);
4642 putenv (obstack_finish (&collect_obstack));
4643
4644 value = do_spec (link_command_spec);
4645 if (value < 0)
4646 error_count = 1;
4647 linker_was_run = (tmp != execution_count);
4648 }
4649
4650 /* Warn if a -B option was specified but the prefix was never used. */
4651 unused_prefix_warnings (&exec_prefixes);

--- 9 unchanged lines hidden (view full) ---

4661 outfiles[i]);
4662
4663 /* Delete some or all of the temporary files we made. */
4664
4665 if (error_count)
4666 delete_failure_queue ();
4667 delete_temp_files ();
4668
5207 value = do_spec (link_command_spec);
5208 if (value < 0)
5209 error_count = 1;
5210 linker_was_run = (tmp != execution_count);
5211 }
5212
5213 /* Warn if a -B option was specified but the prefix was never used. */
5214 unused_prefix_warnings (&exec_prefixes);

--- 9 unchanged lines hidden (view full) ---

5224 outfiles[i]);
5225
5226 /* Delete some or all of the temporary files we made. */
5227
5228 if (error_count)
5229 delete_failure_queue ();
5230 delete_temp_files ();
5231
5232 if (print_help_list)
5233 {
5234 printf ("\nReport bugs to egcs-bugs@cygnus.com.\n");
5235 printf ("Please see the file BUGS (included with the sources) first.\n");
5236 }
5237
4669 exit (error_count > 0 ? (signal_count ? 2 : 1) : 0);
4670 /* NOTREACHED */
4671 return 0;
4672}
4673
4674/* Find the proper compilation spec for the file name NAME,
4675 whose length is LENGTH. LANGUAGE is the specified language,
5238 exit (error_count > 0 ? (signal_count ? 2 : 1) : 0);
5239 /* NOTREACHED */
5240 return 0;
5241}
5242
5243/* Find the proper compilation spec for the file name NAME,
5244 whose length is LENGTH. LANGUAGE is the specified language,
4676 or 0 if none specified. */
5245 or 0 if this file is to be passed to the linker. */
4677
4678static struct compiler *
4679lookup_compiler (name, length, language)
4680 char *name;
5246
5247static struct compiler *
5248lookup_compiler (name, length, language)
5249 char *name;
4681 int length;
5250 size_t length;
4682 char *language;
4683{
4684 struct compiler *cp;
4685
5251 char *language;
5252{
5253 struct compiler *cp;
5254
4686 /* Look for the language, if one is spec'd. */
5255 /* If this was specified by the user to be a linker input, indicate that. */
5256 if (language != 0 && language[0] == '*')
5257 return 0;
5258
5259 /* Otherwise, look for the language, if one is spec'd. */
4687 if (language != 0)
4688 {
4689 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5260 if (language != 0)
5261 {
5262 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
4690 {
4691 if (language != 0)
4692 {
4693 if (cp->suffix[0] == '@'
4694 && !strcmp (cp->suffix + 1, language))
4695 return cp;
4696 }
4697 }
5263 if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
5264 return cp;
5265
4698 error ("language %s not recognized", language);
5266 error ("language %s not recognized", language);
5267 return 0;
4699 }
4700
4701 /* Look for a suffix. */
4702 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
4703 {
4704 if (/* The suffix `-' matches only the file name `-'. */
4705 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
5268 }
5269
5270 /* Look for a suffix. */
5271 for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
5272 {
5273 if (/* The suffix `-' matches only the file name `-'. */
5274 (!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
4706 ||
4707 (strlen (cp->suffix) < length
4708 /* See if the suffix matches the end of NAME. */
5275 || (strlen (cp->suffix) < length
5276 /* See if the suffix matches the end of NAME. */
4709#ifdef OS2
5277#ifdef OS2
4710 && (!strcmp (cp->suffix,
4711 name + length - strlen (cp->suffix))
4712 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
4713 && !strcasecmp (cp->suffix,
4714 name + length - strlen (cp->suffix)))))
5278 && ((!strcmp (cp->suffix,
5279 name + length - strlen (cp->suffix))
5280 || !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
5281 && !strcasecmp (cp->suffix,
5282 name + length - strlen (cp->suffix)))
4715#else
5283#else
4716 && !strcmp (cp->suffix,
4717 name + length - strlen (cp->suffix))))
5284 && !strcmp (cp->suffix,
5285 name + length - strlen (cp->suffix))
4718#endif
5286#endif
5287 ))
4719 {
4720 if (cp->spec[0][0] == '@')
4721 {
4722 struct compiler *new;
5288 {
5289 if (cp->spec[0][0] == '@')
5290 {
5291 struct compiler *new;
5292
4723 /* An alias entry maps a suffix to a language.
4724 Search for the language; pass 0 for NAME and LENGTH
4725 to avoid infinite recursion if language not found.
4726 Construct the new compiler spec. */
4727 language = cp->spec[0] + 1;
4728 new = (struct compiler *) xmalloc (sizeof (struct compiler));
4729 new->suffix = cp->suffix;
4730 bcopy ((char *) lookup_compiler (NULL_PTR, 0, language)->spec,
4731 (char *) new->spec, sizeof new->spec);
4732 return new;
4733 }
5293 /* An alias entry maps a suffix to a language.
5294 Search for the language; pass 0 for NAME and LENGTH
5295 to avoid infinite recursion if language not found.
5296 Construct the new compiler spec. */
5297 language = cp->spec[0] + 1;
5298 new = (struct compiler *) xmalloc (sizeof (struct compiler));
5299 new->suffix = cp->suffix;
5300 bcopy ((char *) lookup_compiler (NULL_PTR, 0, language)->spec,
5301 (char *) new->spec, sizeof new->spec);
5302 return new;
5303 }
5304
4734 /* A non-alias entry: return it. */
4735 return cp;
4736 }
4737 }
4738
4739 return 0;
4740}
4741

--- 13 unchanged lines hidden (view full) ---

4755 unsigned size;
4756{
4757 register char *value = (char *) realloc (ptr, size);
4758 if (value == 0)
4759 fatal ("virtual memory exhausted");
4760 return value;
4761}
4762
5305 /* A non-alias entry: return it. */
5306 return cp;
5307 }
5308 }
5309
5310 return 0;
5311}
5312

--- 13 unchanged lines hidden (view full) ---

5326 unsigned size;
5327{
5328 register char *value = (char *) realloc (ptr, size);
5329 if (value == 0)
5330 fatal ("virtual memory exhausted");
5331 return value;
5332}
5333
4763/* Return a newly-allocated string whose contents concatenate those of s1, s2 */
5334/* This function is based on the one in libiberty. */
4764
4765static char *
5335
5336static char *
4766concat (s1, s2)
4767 char *s1, *s2;
5337concat VPROTO((char *first, ...))
4768{
5338{
4769 int len1 = strlen (s1);
4770 int len2 = strlen (s2);
4771 char *result = xmalloc (len1 + len2 + 1);
5339 register int length;
5340 register char *newstr;
5341 register char *end;
5342 register char *arg;
5343 va_list args;
5344#ifndef __STDC__
5345 char *first;
5346#endif
4772
5347
4773 strcpy (result, s1);
4774 strcpy (result + len1, s2);
4775 *(result + len1 + len2) = 0;
5348 /* First compute the size of the result and get sufficient memory. */
4776
5349
4777 return result;
4778}
5350 VA_START (args, first);
5351#ifndef __STDC__
5352 first = va_arg (args, char *);
5353#endif
4779
5354
4780static char *
4781concat3 (s1, s2, s3)
4782 char *s1, *s2, *s3;
4783{
4784 return concat (concat (s1, s2), s3);
4785}
5355 arg = first;
5356 length = 0;
4786
5357
4787static char *
4788concat4 (s1, s2, s3, s4)
4789 char *s1, *s2, *s3, *s4;
4790{
4791 return concat (concat (s1, s2), concat (s3, s4));
4792}
5358 while (arg != 0)
5359 {
5360 length += strlen (arg);
5361 arg = va_arg (args, char *);
5362 }
4793
5363
4794static char *
4795concat6 (s1, s2, s3, s4, s5, s6)
4796 char *s1, *s2, *s3, *s4, *s5, *s6;
4797{
4798 return concat3 (concat (s1, s2), concat (s3, s4), concat (s5, s6));
5364 newstr = (char *) xmalloc (length + 1);
5365 va_end (args);
5366
5367 /* Now copy the individual pieces to the result string. */
5368
5369 VA_START (args, first);
5370#ifndef __STDC__
5371 first = va_arg (args, char *);
5372#endif
5373
5374 end = newstr;
5375 arg = first;
5376 while (arg != 0)
5377 {
5378 while (*arg)
5379 *end++ = *arg++;
5380 arg = va_arg (args, char *);
5381 }
5382 *end = '\000';
5383 va_end (args);
5384
5385 return (newstr);
4799}
4800
4801static char *
4802save_string (s, len)
4803 char *s;
4804 int len;
4805{
4806 register char *result = xmalloc (len + 1);
4807
4808 bcopy (s, result, len);
4809 result[len] = 0;
4810 return result;
4811}
4812
4813static void
4814pfatal_with_name (name)
4815 char *name;
4816{
5386}
5387
5388static char *
5389save_string (s, len)
5390 char *s;
5391 int len;
5392{
5393 register char *result = xmalloc (len + 1);
5394
5395 bcopy (s, result, len);
5396 result[len] = 0;
5397 return result;
5398}
5399
5400static void
5401pfatal_with_name (name)
5402 char *name;
5403{
4817 char *s;
4818
4819 if (errno < sys_nerr)
4820 s = concat ("%s: ", my_strerror( errno ));
4821 else
4822 s = "cannot open `%s'";
4823 fatal (s, name);
5404 fatal ("%s: %s", name, my_strerror (errno));
4824}
4825
4826static void
4827perror_with_name (name)
4828 char *name;
4829{
5405}
5406
5407static void
5408perror_with_name (name)
5409 char *name;
5410{
4830 char *s;
4831
4832 if (errno < sys_nerr)
4833 s = concat ("%s: ", my_strerror( errno ));
4834 else
4835 s = "cannot open `%s'";
4836 error (s, name);
5411 error ("%s: %s", name, my_strerror (errno));
4837}
4838
4839static void
5412}
5413
5414static void
4840perror_exec (name)
4841 char *name;
5415pfatal_pexecute (errmsg_fmt, errmsg_arg)
5416 char *errmsg_fmt;
5417 char *errmsg_arg;
4842{
5418{
4843 char *s;
5419 int save_errno = errno;
4844
5420
4845 if (errno < sys_nerr)
4846 s = concat ("installation problem, cannot exec `%s': ",
4847 my_strerror (errno));
4848 else
4849 s = "installation problem, cannot exec `%s'";
4850 error (s, name);
5421 if (errmsg_arg)
5422 {
5423 /* Space for trailing '\0' is in %s. */
5424 char *msg = xmalloc (strlen (errmsg_fmt) + strlen (errmsg_arg));
5425 sprintf (msg, errmsg_fmt, errmsg_arg);
5426 errmsg_fmt = msg;
5427 }
5428
5429 fatal ("%s: %s", errmsg_fmt, my_strerror (save_errno));
4851}
4852
4853/* More 'friendly' abort that prints the line and file.
4854 config.h can #define abort fancy_abort if you like that sort of thing. */
4855
4856void
4857fancy_abort ()
4858{
4859 fatal ("Internal gcc abort.");
4860}
4861
5430}
5431
5432/* More 'friendly' abort that prints the line and file.
5433 config.h can #define abort fancy_abort if you like that sort of thing. */
5434
5435void
5436fancy_abort ()
5437{
5438 fatal ("Internal gcc abort.");
5439}
5440
4862#ifdef HAVE_VPRINTF
4863
4864/* Output an error message and exit */
4865
4866static void
4867fatal VPROTO((char *format, ...))
4868{
4869#ifndef __STDC__
4870 char *format;
4871#endif
4872 va_list ap;
4873
4874 VA_START (ap, format);
4875
4876#ifndef __STDC__
5441/* Output an error message and exit */
5442
5443static void
5444fatal VPROTO((char *format, ...))
5445{
5446#ifndef __STDC__
5447 char *format;
5448#endif
5449 va_list ap;
5450
5451 VA_START (ap, format);
5452
5453#ifndef __STDC__
4877 format = va_arg (ap, char*);
5454 format = va_arg (ap, char *);
4878#endif
4879
4880 fprintf (stderr, "%s: ", programname);
4881 vfprintf (stderr, format, ap);
4882 va_end (ap);
4883 fprintf (stderr, "\n");
4884 delete_temp_files ();
4885 exit (1);

--- 5 unchanged lines hidden (view full) ---

4891#ifndef __STDC__
4892 char *format;
4893#endif
4894 va_list ap;
4895
4896 VA_START (ap, format);
4897
4898#ifndef __STDC__
5455#endif
5456
5457 fprintf (stderr, "%s: ", programname);
5458 vfprintf (stderr, format, ap);
5459 va_end (ap);
5460 fprintf (stderr, "\n");
5461 delete_temp_files ();
5462 exit (1);

--- 5 unchanged lines hidden (view full) ---

5468#ifndef __STDC__
5469 char *format;
5470#endif
5471 va_list ap;
5472
5473 VA_START (ap, format);
5474
5475#ifndef __STDC__
4899 format = va_arg (ap, char*);
5476 format = va_arg (ap, char *);
4900#endif
4901
4902 fprintf (stderr, "%s: ", programname);
4903 vfprintf (stderr, format, ap);
4904 va_end (ap);
4905
4906 fprintf (stderr, "\n");
4907}
5477#endif
5478
5479 fprintf (stderr, "%s: ", programname);
5480 vfprintf (stderr, format, ap);
5481 va_end (ap);
5482
5483 fprintf (stderr, "\n");
5484}
4908
4909#else /* not HAVE_VPRINTF */
4910
4911static void
4912fatal (msg, arg1, arg2)
4913 char *msg, *arg1, *arg2;
4914{
4915 error (msg, arg1, arg2);
4916 delete_temp_files ();
4917 exit (1);
4918}
4919
4920static void
4921error (msg, arg1, arg2)
4922 char *msg, *arg1, *arg2;
4923{
4924 fprintf (stderr, "%s: ", programname);
4925 fprintf (stderr, msg, arg1, arg2);
4926 fprintf (stderr, "\n");
4927}
4928
4929#endif /* not HAVE_VPRINTF */
4930
4931
4932static void
4933validate_all_switches ()
4934{
4935 struct compiler *comp;
4936 register char *p;
4937 register char c;
4938 struct spec_list *spec;
4939
4940 for (comp = compilers; comp->spec[0]; comp++)
4941 {
5485
5486static void
5487validate_all_switches ()
5488{
5489 struct compiler *comp;
5490 register char *p;
5491 register char c;
5492 struct spec_list *spec;
5493
5494 for (comp = compilers; comp->spec[0]; comp++)
5495 {
4942 int i;
5496 size_t i;
4943 for (i = 0; i < sizeof comp->spec / sizeof comp->spec[0] && comp->spec[i]; i++)
4944 {
4945 p = comp->spec[i];
5497 for (i = 0; i < sizeof comp->spec / sizeof comp->spec[0] && comp->spec[i]; i++)
5498 {
5499 p = comp->spec[i];
4946 while (c = *p++)
5500 while ((c = *p++))
4947 if (c == '%' && *p == '{')
4948 /* We have a switch spec. */
4949 validate_switches (p + 1);
4950 }
4951 }
4952
5501 if (c == '%' && *p == '{')
5502 /* We have a switch spec. */
5503 validate_switches (p + 1);
5504 }
5505 }
5506
4953 /* look through the linked list of extra specs read from the specs file */
5507 /* look through the linked list of specs read from the specs file */
4954 for (spec = specs; spec ; spec = spec->next)
4955 {
5508 for (spec = specs; spec ; spec = spec->next)
5509 {
4956 p = spec->spec;
4957 while (c = *p++)
5510 p = *(spec->ptr_spec);
5511 while ((c = *p++))
4958 if (c == '%' && *p == '{')
4959 /* We have a switch spec. */
4960 validate_switches (p + 1);
4961 }
4962
4963 p = link_command_spec;
5512 if (c == '%' && *p == '{')
5513 /* We have a switch spec. */
5514 validate_switches (p + 1);
5515 }
5516
5517 p = link_command_spec;
4964 while (c = *p++)
5518 while ((c = *p++))
4965 if (c == '%' && *p == '{')
4966 /* We have a switch spec. */
4967 validate_switches (p + 1);
5519 if (c == '%' && *p == '{')
5520 /* We have a switch spec. */
5521 validate_switches (p + 1);
4968
4969 /* Now notice switches mentioned in the machine-specific specs. */
4970
4971 p = asm_spec;
4972 while (c = *p++)
4973 if (c == '%' && *p == '{')
4974 /* We have a switch spec. */
4975 validate_switches (p + 1);
4976
4977 p = asm_final_spec;
4978 while (c = *p++)
4979 if (c == '%' && *p == '{')
4980 /* We have a switch spec. */
4981 validate_switches (p + 1);
4982
4983 p = cpp_spec;
4984 while (c = *p++)
4985 if (c == '%' && *p == '{')
4986 /* We have a switch spec. */
4987 validate_switches (p + 1);
4988
4989 p = signed_char_spec;
4990 while (c = *p++)
4991 if (c == '%' && *p == '{')
4992 /* We have a switch spec. */
4993 validate_switches (p + 1);
4994
4995 p = cc1_spec;
4996 while (c = *p++)
4997 if (c == '%' && *p == '{')
4998 /* We have a switch spec. */
4999 validate_switches (p + 1);
5000
5001 p = cc1plus_spec;
5002 while (c = *p++)
5003 if (c == '%' && *p == '{')
5004 /* We have a switch spec. */
5005 validate_switches (p + 1);
5006
5007 p = link_spec;
5008 while (c = *p++)
5009 if (c == '%' && *p == '{')
5010 /* We have a switch spec. */
5011 validate_switches (p + 1);
5012
5013 p = lib_spec;
5014 while (c = *p++)
5015 if (c == '%' && *p == '{')
5016 /* We have a switch spec. */
5017 validate_switches (p + 1);
5018
5019 p = libgcc_spec;
5020 while (c = *p++)
5021 if (c == '%' && *p == '{')
5022 /* We have a switch spec. */
5023 validate_switches (p + 1);
5024
5025 p = startfile_spec;
5026 while (c = *p++)
5027 if (c == '%' && *p == '{')
5028 /* We have a switch spec. */
5029 validate_switches (p + 1);
5030}
5031
5032/* Look at the switch-name that comes after START
5033 and mark as valid all supplied switches that match it. */
5034
5035static void
5036validate_switches (start)
5037 char *start;

--- 32 unchanged lines hidden (view full) ---

5070 {
5071 if (!strncmp (switches[i].part1, filter, p - filter)
5072 && switches[i].part1[p - filter] == 0)
5073 switches[i].valid = 1;
5074 }
5075 }
5076}
5077
5522}
5523
5524/* Look at the switch-name that comes after START
5525 and mark as valid all supplied switches that match it. */
5526
5527static void
5528validate_switches (start)
5529 char *start;

--- 32 unchanged lines hidden (view full) ---

5562 {
5563 if (!strncmp (switches[i].part1, filter, p - filter)
5564 && switches[i].part1[p - filter] == 0)
5565 switches[i].valid = 1;
5566 }
5567 }
5568}
5569
5078/* Check whether a particular argument was used. */
5570/* Check whether a particular argument was used. The first time we
5571 canonicalize the switches to keep only the ones we care about. */
5079
5080static int
5081used_arg (p, len)
5082 char *p;
5083 int len;
5084{
5572
5573static int
5574used_arg (p, len)
5575 char *p;
5576 int len;
5577{
5085 int i;
5578 struct mswitchstr {
5579 char *str;
5580 char *replace;
5581 int len;
5582 int rep_len;
5583 };
5086
5584
5087 for (i = 0; i < n_switches; i++)
5088 if (! strncmp (switches[i].part1, p, len)
5089 && strlen (switches[i].part1) == len)
5090 return 1;
5091 return 0;
5092}
5585 static struct mswitchstr *mswitches;
5586 static int n_mswitches;
5587 int i, j;
5093
5588
5094/* Check whether a particular argument is a default argument. */
5589 if (!mswitches)
5590 {
5591 struct mswitchstr *matches;
5592 char *q;
5593 int cnt = 0;
5095
5594
5096#ifndef MULTILIB_DEFAULTS
5097#define MULTILIB_DEFAULTS { NULL }
5098#endif
5595 /* Break multilib_matches into the component strings of string and replacement
5596 string */
5597 for (q = multilib_matches; *q != '\0'; q++)
5598 if (*q == ';')
5599 cnt++;
5099
5600
5100static char *multilib_defaults[] = MULTILIB_DEFAULTS;
5601 matches = (struct mswitchstr *) alloca ((sizeof (struct mswitchstr)) * cnt);
5602 i = 0;
5603 q = multilib_matches;
5604 while (*q != '\0')
5605 {
5606 matches[i].str = q;
5607 while (*q != ' ')
5608 {
5609 if (*q == '\0')
5610 abort ();
5611 q++;
5612 }
5613 *q = '\0';
5614 matches[i].len = q - matches[i].str;
5101
5615
5616 matches[i].replace = ++q;
5617 while (*q != ';' && *q != '\0')
5618 {
5619 if (*q == ' ')
5620 abort ();
5621 q++;
5622 }
5623 matches[i].rep_len = q - matches[i].replace;
5624 i++;
5625 if (*q == ';')
5626 *q++ = '\0';
5627 else
5628 break;
5629 }
5630
5631 /* Now build a list of the replacement string for switches that we care
5632 about. Make sure we allocate at least one entry. This prevents
5633 xmalloc from calling fatal, and prevents us from re-executing this
5634 block of code. */
5635 mswitches
5636 = (struct mswitchstr *) xmalloc ((sizeof (struct mswitchstr))
5637 * (n_switches ? n_switches : 1));
5638 for (i = 0; i < n_switches; i++)
5639 {
5640 int xlen = strlen (switches[i].part1);
5641 for (j = 0; j < cnt; j++)
5642 if (xlen == matches[j].len && ! strcmp (switches[i].part1, matches[j].str))
5643 {
5644 mswitches[n_mswitches].str = matches[j].replace;
5645 mswitches[n_mswitches].len = matches[j].rep_len;
5646 mswitches[n_mswitches].replace = (char *)0;
5647 mswitches[n_mswitches].rep_len = 0;
5648 n_mswitches++;
5649 break;
5650 }
5651 }
5652 }
5653
5654 for (i = 0; i < n_mswitches; i++)
5655 if (len == mswitches[i].len && ! strncmp (p, mswitches[i].str, len))
5656 return 1;
5657
5658 return 0;
5659}
5660
5102static int
5103default_arg (p, len)
5104 char *p;
5105 int len;
5106{
5661static int
5662default_arg (p, len)
5663 char *p;
5664 int len;
5665{
5107 int count = sizeof multilib_defaults / sizeof multilib_defaults[0];
5108 int i;
5666 char *start, *end;
5109
5667
5110 for (i = 0; i < count; i++)
5111 if (multilib_defaults[i] != NULL
5112 && strncmp (multilib_defaults[i], p, len) == 0
5113 && multilib_defaults[i][len] == '\0')
5114 return 1;
5668 for (start = multilib_defaults; *start != '\0'; start = end+1)
5669 {
5670 while (*start == ' ' || *start == '\t')
5671 start++;
5115
5672
5673 if (*start == '\0')
5674 break;
5675
5676 for (end = start+1; *end != ' ' && *end != '\t' && *end != '\0'; end++)
5677 ;
5678
5679 if ((end - start) == len && strncmp (p, start, len) == 0)
5680 return 1;
5681
5682 if (*end == '\0')
5683 break;
5684 }
5685
5116 return 0;
5117}
5118
5119/* Work out the subdirectory to use based on the
5120 options. The format of multilib_select is a list of elements.
5121 Each element is a subdirectory name followed by a list of options
5122 followed by a semicolon. gcc will consider each line in turn. If
5123 none of the options beginning with an exclamation point are

--- 210 unchanged lines hidden (view full) ---

5334 ++p;
5335 }
5336
5337 if (*p == ' ')
5338 ++p;
5339 }
5340
5341 if (! skip)
5686 return 0;
5687}
5688
5689/* Work out the subdirectory to use based on the
5690 options. The format of multilib_select is a list of elements.
5691 Each element is a subdirectory name followed by a list of options
5692 followed by a semicolon. gcc will consider each line in turn. If
5693 none of the options beginning with an exclamation point are

--- 210 unchanged lines hidden (view full) ---

5904 ++p;
5905 }
5906
5907 if (*p == ' ')
5908 ++p;
5909 }
5910
5911 if (! skip)
5342 putchar ('\n');
5912 {
5913 /* If there are extra options, print them now */
5914 if (multilib_extra && *multilib_extra)
5915 {
5916 int print_at = TRUE;
5917 char *q;
5343
5918
5919 for (q = multilib_extra; *q != '\0'; q++)
5920 {
5921 if (*q == ' ')
5922 print_at = TRUE;
5923 else
5924 {
5925 if (print_at)
5926 putchar ('@');
5927 putchar (*q);
5928 print_at = FALSE;
5929 }
5930 }
5931 }
5932 putchar ('\n');
5933 }
5934
5344 ++p;
5345 }
5346}
5935 ++p;
5936 }
5937}