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} |