GCC Middle and Back End API Reference
gcc.c File Reference

Data Structures

struct  default_spec
struct  user_specs
struct  compiler
struct  prefix_list
struct  path_prefix
struct  spec_list
struct  spec_list_1
struct  temp_name
struct  temp_file
struct  add_to_obstack_info
struct  file_at_path_info
struct  switchstr
struct  infile
struct  spec_path_info
struct  mdswitchstr


typedef char * char_p
typedef const char * const_char_p


enum  path_prefix_priority { PREFIX_PRIORITY_B_OPT, PREFIX_PRIORITY_LAST }


static void init_spec (void)
static void store_arg (const char *, int, int)
static void insert_wrapper (const char *)
static char * load_specs (const char *)
static void read_specs (const char *, bool, bool)
static void set_spec (const char *, const char *, bool)
static struct compilerlookup_compiler (const char *, size_t, const char *)
static char * build_search_list (const struct path_prefix *, const char *, bool, bool)
static void xputenv (const char *)
static void putenv_from_prefixes (const struct path_prefix *, const char *, bool)
static int access_check (const char *, int)
static char * find_a_file (const struct path_prefix *, const char *, int, bool)
static void add_prefix (struct path_prefix *, const char *, const char *, int, int, int)
static void add_sysrooted_prefix (struct path_prefix *, const char *, const char *, int, int, int)
static char * skip_whitespace (char *)
static void delete_if_ordinary (const char *)
static void delete_temp_files (void)
static void delete_failure_queue (void)
static void clear_failure_queue (void)
static int check_live_switch (int, int)
static const char * handle_braces (const char *)
static bool input_suffix_matches (const char *, const char *)
static bool switch_matches (const char *, const char *, int)
static void mark_matching_switches (const char *, const char *, int)
static void process_marked_switches (void)
static const char * process_brace_body (const char *, const char *, const char *, int, int)
static struct spec_functionlookup_spec_function (const char *)
static const char * eval_spec_function (const char *, const char *)
static const char * handle_spec_function (const char *, bool *)
static char * save_string (const char *, int)
static void set_collect_gcc_options (void)
static int do_spec_1 (const char *, int, const char *)
static int do_spec_2 (const char *)
static void do_option_spec (const char *, const char *)
static void do_self_spec (const char *)
static const char * find_file (const char *)
static int is_directory (const char *, bool)
static const char * validate_switches (const char *, bool)
static void validate_all_switches (void)
static void validate_switches_from_spec (const char *, bool)
static void give_switch (int, int)
static int used_arg (const char *, int)
static int default_arg (const char *, int)
static void set_multilib_dir (void)
static void print_multilib_info (void)
static void perror_with_name (const char *)
static void display_help (void)
static void add_preprocessor_option (const char *, int)
static void add_assembler_option (const char *, int)
static void add_linker_option (const char *, int)
static void process_command (unsigned int, struct cl_decoded_option *)
static int execute (void)
static void alloc_args (void)
static void clear_args (void)
static void fatal_signal (int)
static void init_gcc_specs (struct obstack *, const char *, const char *, const char *)
static const char * convert_filename (const char *, int, int)
static const char * getenv_spec_function (int, const char **)
static const char * if_exists_spec_function (int, const char **)
static const char * if_exists_else_spec_function (int, const char **)
static const char * sanitize_spec_function (int, const char **)
static const char * replace_outfile_spec_function (int, const char **)
static const char * remove_outfile_spec_function (int, const char **)
static const char * version_compare_spec_function (int, const char **)
static const char * include_spec_function (int, const char **)
static const char * find_file_spec_function (int, const char **)
static const char * find_plugindir_spec_function (int, const char **)
static const char * print_asm_header_spec_function (int, const char **)
static const char * compare_debug_dump_opt_spec_function (int, const char **)
static const char * compare_debug_self_opt_spec_function (int, const char **)
static const char * compare_debug_auxbase_opt_spec_function (int, const char **)
static const char * pass_through_libs_spec_func (int, const char **)
static const char * replace_extension_spec_func (int, const char **)
static char * convert_white_space (char *)
static char * skip_whitespace ()
static void set_spec ()
static void store_arg ()
static char * load_specs ()
static void read_specs ()
void record_temp_file ()
static void delete_if_ordinary ()
static void * for_each_path (const struct path_prefix *paths, bool do_multi, size_t extra_space, void *(*callback)(char *, void *), void *callback_info)
static void * add_to_obstack ()
static void xputenv ()
static int access_check ()
static void * file_at_path ()
static void add_preprocessor_option ()
static void add_assembler_option ()
static void add_linker_option ()
static void alloc_infile ()
static void add_infile ()
static void alloc_switch ()
static void save_switch (const char *opt, size_t n_args, const char *const *args, bool validated, bool known)
static bool driver_unknown_option_callback ()
static void driver_wrong_lang_callback (const struct cl_decoded_option *decoded, unsigned int lang_mask)
static bool driver_handle_option (struct gcc_options *opts, struct gcc_options *opts_set, const struct cl_decoded_option *decoded, unsigned int lang_mask, int kind, location_t loc, const struct cl_option_handlers *handlers, diagnostic_context *dc)
static void set_option_handlers ()
static void end_going_arg ()
static void insert_wrapper ()
int do_spec ()
static int do_spec_2 ()
static void do_option_spec ()
static void do_self_spec ()
static void * spec_path ()
static void create_at_file ()
static bool compile_input_file_p ()
static void do_specs_vec ()
static int do_spec_1 ()
static struct spec_functionlookup_spec_function ()
static const char * eval_spec_function ()
static const char * handle_spec_function ()
static bool input_suffix_matches ()
static bool input_spec_matches ()
static bool switch_matches ()
static void mark_matching_switches ()
static const char * handle_braces ()
static int check_live_switch ()
static void give_switch ()
static const char * find_file ()
static int is_directory ()
void set_input ()
static void fatal_signal ()
static int compare_files ()
int main (int, char **)
int main ()
static struct compilerlookup_compiler ()
static char * save_string ()
void pfatal_with_name ()
static void perror_with_name ()
static void validate_switches_from_spec ()
static const char * validate_switches ()
static int used_arg ()
static int default_arg ()
static const char * getenv_spec_function ()
static const char * if_exists_spec_function ()
static const char * if_exists_else_spec_function ()
static const char * sanitize_spec_function ()
static const char * replace_outfile_spec_function ()
static const char * remove_outfile_spec_function ()
static int compare_version_strings ()
static const char * version_compare_spec_function ()
static const char * include_spec_function ()
static const char * find_file_spec_function ()
static const char * find_plugindir_spec_function ()
static unsigned HOST_WIDE_INT get_random_number ()
const char * pass_through_libs_spec_func ()
const char * replace_extension_spec_func ()
static char * convert_white_space ()


static const char dir_separator_str [] = { DIR_SEPARATOR, 0 }
int is_cpp_driver
static bool at_file_supplied
static int print_help_list
static int print_version
static int verbose_only_flag
static int print_subprocess_help
FILE * report_times_to_file = NULL
static const char * target_system_root = TARGET_SYSTEM_ROOT
static int target_system_root_changed
static const char * target_sysroot_suffix = 0
static const char * target_sysroot_hdrs_suffix = 0
static enum save_temps save_temps_flag
static char * save_temps_prefix = 0
static size_t save_temps_length = 0
static const char * compiler_version
static const char *const spec_version = DEFAULT_TARGET_VERSION
static const char * spec_machine = DEFAULT_TARGET_MACHINE
static const char * cross_compile = "1"
static int greatest_status = 1
static struct obstack obstack
static struct obstack collect_obstack
static const char * asm_debug = ASM_DEBUG_SPEC
static const char * cpp_spec = CPP_SPEC
static const char * cc1_spec = CC1_SPEC
static const char * cc1plus_spec = CC1PLUS_SPEC
static const char * link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC
static const char * link_ssp_spec = LINK_SSP_SPEC
static const char * asm_spec = ASM_SPEC
static const char * asm_final_spec = ASM_FINAL_SPEC
static const char * link_spec = LINK_SPEC
static const char * lib_spec = LIB_SPEC
static const char * link_gomp_spec = ""
static const char * libgcc_spec = LIBGCC_SPEC
static const char * endfile_spec = ENDFILE_SPEC
static const char * startfile_spec = STARTFILE_SPEC
static const char * linker_name_spec = LINKER_NAME
static const char * linker_plugin_file_spec = ""
static const char * lto_wrapper_spec = ""
static const char * lto_gcc_spec = ""
static const char * link_command_spec = LINK_COMMAND_SPEC
static const char * link_libgcc_spec = LINK_LIBGCC_SPEC
static const char * startfile_prefix_spec = STARTFILE_PREFIX_SPEC
static const char * sysroot_spec = SYSROOT_SPEC
static const char * sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC
static const char * sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC
static const char * self_spec = ""
static const char * trad_capable_cpp = "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}"
static const char * cpp_unique_options
static const char * cpp_options
static const char * cpp_debug_options = "%{d*}"
static const char * cc1_options
static const char * asm_options = "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}"
static const char * invoke_as
!fwpa __pad0__
static struct obstack multilib_obstack
static const char * multilib_select
static const char * multilib_matches
static const char * multilib_defaults
static const char * multilib_exclusions
static const char * multilib_reuse
static const char *const multilib_defaults_raw [] = MULTILIB_DEFAULTS
static const char *const driver_self_specs []
static struct default_spec option_default_specs [] = { OPTION_DEFAULT_SPECS }
static struct user_specsuser_specs_head
static struct user_specsuser_specs_tail
static struct compilercompilers
static int n_compilers
static struct compiler default_compilers []
static const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1
static vec< char_plinker_options
static vec< char_passembler_options
static vec< char_ppreprocessor_options
static struct path_prefix exec_prefixes = { 0, 0, "exec" }
static struct path_prefix startfile_prefixes = { 0, 0, "startfile" }
static struct path_prefix include_prefixes = { 0, 0, "include" }
static const char * machine_suffix = 0
static const char * just_machine_suffix = 0
static const char * gcc_exec_prefix
static const char * gcc_libexec_prefix
static const char *const standard_exec_prefix = STANDARD_EXEC_PREFIX
static const char *const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX
static const char *const standard_bindir_prefix = STANDARD_BINDIR_PREFIX
static const char *const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX
static const char * md_exec_prefix = MD_EXEC_PREFIX
static const char * md_startfile_prefix = MD_STARTFILE_PREFIX
static const char * md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1
static const char *const standard_startfile_prefix_1 = STANDARD_STARTFILE_PREFIX_1
static const char *const standard_startfile_prefix_2 = STANDARD_STARTFILE_PREFIX_2
static const char *const tooldir_base_prefix = TOOLDIR_BASE_PREFIX
static const char * multilib_dir
static const char * multilib_os_dir
static const char * multiarch_dir
static struct spec_list static_specs []
static struct spec_list_1 extra_specs_1 [] = { EXTRA_SPECS }
static struct spec_listextra_specs = (struct spec_list *) 0
static struct spec_listspecs = (struct spec_list *) 0
static struct spec_function static_spec_functions []
static int processing_spec_function
static vec< const_char_pargbuf
static int have_o_argbuf_index = 0
static int have_c = 0
static int have_o = 0
static struct temp_nametemp_names
static int execution_count
static int signal_count
static const char * temp_filename
static int temp_filename_length
static struct temp_filealways_delete_queue
static struct temp_filefailure_delete_queue
static struct switchstrswitches
static int n_switches
static int n_switches_alloc
int compare_debug
int compare_debug_second
const char * compare_debug_opt
static struct switchstrswitches_debug_check [2]
static int n_switches_debug_check [2]
static int n_switches_alloc_debug_check [2]
static char * debug_check_temp_file [2]
static struct infileinfiles
int n_infiles
static int n_infiles_alloc
static bool combine_inputs
static int added_libraries
const char ** outfiles
static const char * spec_lang = 0
static int last_language_n_infiles
static const char * gcc_input_filename
static int input_file_number
size_t input_filename_length
static int basename_length
static int suffixed_basename_length
static const char * input_basename
static const char * input_suffix
static struct stat input_stat
static int input_stat_set
static struct compilerinput_file_compiler
static int arg_going
static int delete_this_arg
static int this_is_output_file
static int this_is_library_file
static int this_is_linker_script
static int input_from_pipe
static const char * suffix_subst
static struct mdswitchstrmdswitches
static int n_mdswitches
static const char * debug_auxbase_opt

Typedef Documentation

typedef char* char_p
typedef const char* const_char_p
   Accumulate a command (program name and args), and run it.  

Enumeration Type Documentation

   Ranking of prefixes in the sort list. -B prefixes are put before
   all others.  
enum save_temps
   Nonzero means write "temp" files in source directory
   and use the source file's name in them, and don't delete them.  

Function Documentation

static int access_check ( const char *  ,
static int access_check ( )
   Check whether NAME can be accessed in MODE.  This is like access,
   except that it never considers directories to be executable.  
static void add_assembler_option ( const char *  ,

Referenced by display_help(), and save_switch().

static void add_assembler_option ( )
static void add_infile ( )
   Store an input file with the given NAME and LANGUAGE in
static void add_linker_option ( const char *  ,

Referenced by display_help().

static void add_linker_option ( )
static void add_prefix ( struct path_prefix pprefix,
const char *  prefix,
const char *  component,
int  priority,
int  require_machine_suffix,
int  os_multilib 
   Add an entry for PREFIX in PLIST.  The PLIST is kept in ascending
   order according to PRIORITY.  Within each PRIORITY, new entries are

   If WARN is nonzero, we will warn if no file is found
   through this prefix.  WARN should point to an int
   which will be set to 1 if this entry is used.

   COMPONENT is the value to be passed to update_path.

   REQUIRE_MACHINE_SUFFIX is 1 if this prefix can't be used without
   the complete value of machine_suffix.
   2 means try both machine_suffix and just_machine_suffix.  
     Keep track of the longest prefix.  
     Insert after PREV.  
static void add_preprocessor_option ( const char *  ,

Referenced by display_help().

static void add_preprocessor_option ( )
static void add_sysrooted_prefix ( struct path_prefix pprefix,
const char *  prefix,
const char *  component,
int  priority,
int  require_machine_suffix,
int  os_multilib 
   Same as add_prefix, but prepending target_system_root to prefix.  
   The target_system_root prefix has been relocated by gcc_exec_prefix.  
         We have to override this because GCC's notion of sysroot
         moves along with GCC.  
                         enum prefix_priority 
static void* add_to_obstack ( )
static void alloc_args ( )
   Allocate the argument vector.  
static void alloc_infile ( )
   Allocate space for an input file in infiles.  
static void alloc_switch ( )
   Allocate space for a switch in switches.  
static char * build_search_list ( const struct path_prefix paths,
const char *  prefix,
bool  check_dir,
bool  do_multi 
   Build a list of search directories from PATHS.
   PREFIX is a string to prepend to the list.
   If CHECK_DIR_P is true we ensure the directory exists.
   If DO_MULTI is true, multilib paths are output first, then
   non-multilib paths.
   This is used mostly by putenv_from_prefixes so we use `collect_obstack'.
   It is also used by the --print-search-dirs flag.  
static int check_live_switch ( int  ,

Referenced by handle_spec_function().

static int check_live_switch ( )
   Return 0 iff switch number SWITCHNUM is obsoleted by a later switch
   on the command line.  PREFIX_LENGTH is the length of XXX in an {XXX*}
   spec, or -1 if either exact match or %* is used.

   A -O switch is obsoleted by a later -O switch.  A -f, -g, -m, or -W switch
   whose value does not begin with "no-" is obsoleted by the same value
   with the "no-", similarly for a switch with the "no-" prefix.  
     If we already processed this switch and determined if it was
     live or not, return our past determination.  
     In the common case of {<at-most-one-letter>*}, a negating
     switch would always match, so ignore that case.  We will just
     send the conflicting switches to the compiler phase.  
     Now search for duplicate in a manner that depends on the name.  
             We have Xno-YYY, search for XYYY.  
                   --specs are validated with the validate_switches mechanism.  
             We have XYYY, search for Xno-YYY.  
                   --specs are validated with the validate_switches mechanism.  
     Otherwise the switch is live.  
static void clear_args ( )
   Clear out the vector of arguments (after a command is executed).  
static void clear_failure_queue ( void  )
static const char * compare_debug_auxbase_opt_spec_function ( int  arg,
const char **  argv 
   %:compare-debug-auxbase-opt spec function.  Expands to the auxbase
    options that are to be passed in the second compilation of
    compare-debug.  It expects, as an argument, the basename of the
    current input file name, with the .gk suffix appended to it.  
static const char * compare_debug_dump_opt_spec_function ( int  arg,
const char **  argv 
   %:compare-debug-dump-opt spec function.  Save the last argument,
   expected to be the last -fdump-final-insns option, or generate a
static const char * compare_debug_self_opt_spec_function ( int  arg,
const char **  argv 
   %:compare-debug-self-opt spec function.  Expands to the options
    that are to be passed in the second compilation of
static int compare_files ( )
   Compare the contents of the two files named CMPFILE[0] and
   CMPFILE[1].  Return zero if they're identical, nonzero

References compare_debug, do_self_spec(), n_switches, n_switches_alloc, save_temps_flag, SAVE_TEMPS_NONE, and switches.

static int compare_version_strings ( )

Given two version numbers, compares the two numbers. A version number must match the regular expression ([1-9][0-9]*|0)(.([1-9][0-9]*|0))*

static bool compile_input_file_p ( )
   True if we should compile INFILE. 

References memcpy().

static const char * convert_filename ( const char *  name,
int  do_exe,
int  do_obj 
   Convert NAME to a new name if it is the standard suffix.  DO_EXE
   is true if we should look for an executable suffix.  DO_OBJ
   is true if we should look for an object suffix.  
     Convert x.o to x.obj if TARGET_OBJECT_SUFFIX is ".obj".  
     If there is no filetype, make it the executable suffix (which includes
     the ".").  But don't get confused if we have just "-o".  

References cl_decoded_option::arg, cl_decoded_option::canonical_option, cl_decoded_option::canonical_option_num_elements, cl_decoded_option::errors, cl_decoded_option::opt_index, and save_switch().

Referenced by set_option_handlers().

static char* convert_white_space ( char *  )
static char* convert_white_space ( )
   Insert backslash before spaces in ORIG (usually a file path), to 
   avoid being broken by spec parser.

   This function is needed as do_spec_1 treats white space (' ' and '\t')
   as the end of an argument. But in case of -plugin /usr/gcc install/xxx.so,
   the file name should be treated as a single argument rather than being
   broken into multiple. Solution is to insert '\\' before the space in a 
   file name.
   This function converts and only converts all occurrence of ' ' 
   to '\\' + ' ' and '\t' to '\\' + '\t'.  For example:
   "a b"  -> "a\\ b"
   "a  b" -> "a\\ \\ b"
   "a\tb" -> "a\\\tb"
   "a\\ b" -> "a\\\\ b"

   orig: input null-terminating string that was allocated by xalloc. The
   memory it points to might be freed in this function. Behavior undefined
   if ORIG wasn't xalloced or was freed already at entry.

   Return: ORIG if no conversion needed. Otherwise a newly allocated string
   that was converted from ORIG.  
static void create_at_file ( )
   Create a temporary FILE with the contents of ARGV. Add @FILE to the
   argument list. 
static int default_arg ( const char *  ,
static int default_arg ( )
static void delete_failure_queue ( )
   Delete all the files to be deleted on error.  
static void delete_if_ordinary ( const char *  )
static void delete_if_ordinary ( )
static void delete_temp_files ( void  )
static void display_help ( )
static void do_option_spec ( const char *  ,
const char *   
static void do_option_spec ( )
   Process the given spec string and add any new options to the end
   of the switches/n_switches array.  
     Compute the size of the final spec.  
     Replace each %(VALUE) by the specified value.  
static void do_self_spec ( const char *  )

Referenced by compare_files().

static void do_self_spec ( )
   Process the given spec string and add any new options to the end
   of the switches/n_switches array.  
     Mark %<S switches processed by do_self_spec to be ignored permanently.
     do_self_specs adds the replacements to switches array, so it shouldn't
     be processed afterwards.  
         Create a copy of argbuf with a dummy argv[0] entry for
                 Specs should only generate options, not input
                 Avoid duplicate processing of some options from
                 compare-debug specs; just save them here.  

References spec_path_info::append_len, for_each_path(), spec_path_info::omit_relative, spec_path_info::option, spec_path_info::separate_options, and spec_path().

int do_spec ( )
   Process the spec SPEC and run the commands specified therein.
   Returns 0 if the spec is successfully processed; -1 if failed.  
     Force out any unfinished command.
     If -pipe, this forces out the last command if it ended in `|'.  

References end_going_arg().

static int do_spec_1 ( const char *  ,
int  ,
const char *   
static int do_spec_1 ( )
   Process the sub-spec SPEC as a portion of a larger spec.
   This is like processing a whole spec except that we do
   not initialize at the beginning and we do not supply a
   newline by default at the end.
   INSWITCH nonzero means don't process %-sequences in SPEC;
   in this case, % is treated as an ordinary character.
   This is used while substituting switches.
   INSWITCH nonzero also causes SPC not to terminate an argument.

   Value is zero unless a line was finished
   and the command on that line reported an error.  
     If it's an empty string argument to a switch, keep it as is.  
       If substituting a switch, treat all chars like letters.
       Otherwise, NL, SPC, TAB and % are special.  
               A `|' before the newline means use a pipe here,
               but only if -pipe was specified.
               Otherwise, execute now and don't pass the `|' as an arg.  
           Reinitialize for a new command, and for a new argument.  
           Use pipe 
           Reinitialize for a new argument.  
             Dump out the directories specified with LIBRARY_PATH,
             followed by the absolute directories
             that we search for startfiles.  
                 Used on systems which record the specified -L dirs
                 and use them to search for dynamic linking.
                 Relative directories always come from -B,
                 and it is better not to use them for searching
                 at run time.  In particular, stage1 loses.  
               %efoo means report an error with `foo' as error message
               and don't execute any more commands for this file.  
               %nfoo means report a notice with `foo' on stderr.  
                 If save_temps_flag is off, and the HOST_BIT_BUCKET is
                 defined, and it is not a directory, and it is
                 writable, use it.  Otherwise, treat this like any
                 other temporary file.  
                   consume suffix 
                   consume suffix 
                       We don't support extra suffix characters after %O.  
                   If -save-temps=obj and -o were specified, use that for the
                   temp file.  
                   If the gcc_input_filename has the same suffix specified
                   for the %g, %u, or %U, and -save-temps is specified,
                   we could end up using that file as an intermediate
                   thus clobbering the user's source file (.e.g.,
                   gcc -save-temps foo.s would clobber foo.s with the
                   output of cpp0).  So check for this condition and
                   generate a temp file as the intermediate.  
                           Note, set_input() resets input_stat_set to 0.  
                           If we have the stat for the gcc_input_filename
                           and we can do the stat for the temp_filename
                           then the they could still refer to the same
                           file if st_dev/st_ino's are the same.  
                           Just compare canonical pathnames.  
                   See if we already have an association of %g/%u/%U and
                   Make a new association if needed.  %u and %j
                   require one.  
                       We are going to expand `%i' to `@FILE', where FILE
                       is a newly-created temporary filename.  The filenames
                       that would usually be expanded in place of %o will be
                       written to the temporary file.  
                       Copy the strings over.  
                     Make this a separate argument.  
                     Make this a separate argument.  
                     Make this a separate argument.  
                     Make this a separate argument.  
                     We are going to expand `%o' to `@FILE', where FILE
                     is a newly-created temporary filename.  The filenames
                     that would usually be expanded in place of %o will be
                     written to the temporary file.  
                     Convert OUTFILES into a form suitable for writeargv.  
                     Determine how many are non-NULL.  
                     Copy the strings over.  
                 Handle the {...} following the %W.  
                 If any args were output, mark the last one for deletion
                 on failure.  
             %x{OPTION} records OPTION for %X to output.  
                 Skip past the option value and make a copy.  
                 See if we already recorded this option.  
                 This option is new; add it.  
             Dump out the options accumulated previously using %x.  
             Dump out the options accumulated previously using -Wa,.  
             Dump out the options accumulated previously using -Wp,.  
               Here are digits and numbers that just process
               a certain constant string as a spec.  
               We assume there is a directory
               separator at the end of this string.  
               Here we define characters other than letters and digits.  
              Henceforth ignore the option(s) matching the pattern
              after the %<.  
                       User switch be validated from validate_all_switches.
                       when the definition is seen from the spec file.
                       If not defined anywhere, will be rejected.  
                 Catch the case where a spec string contains something like
                 '%{foo:%*}'.  i.e. there is no * in the pattern on the left
                 hand side of the :.  
               Process a string found as the value of a spec given by name.
               This feature allows individual machine descriptions
               to add and use their own specs.  
                 The string after the S/P is the name of a spec that is to be
                 See if it's in the list.  
                 Discard the closing paren.  
           Backslash: treat next character as ordinary.  
           Fall through.  
           Ordinary character: put it into the current argument.  
     End of string.  If we are processing a spec function, we need to
     end any pending argument.  

References obstack, and save_string().

static int do_spec_2 ( const char *  )
static int do_spec_2 ( )
static void do_specs_vec ( )
   Process each member of VEC as a spec.  
         Make each accumulated option a separate argument.  

References free(), and input_stat.

static bool driver_handle_option ( struct gcc_options *  opts,
struct gcc_options *  opts_set,
const struct cl_decoded_option decoded,
unsigned int  lang_mask,
int  kind,
location_t  loc,
const struct cl_option_handlers handlers,
diagnostic_context dc 
   Handle a driver option; arguments and return value as for
         CPP driver cannot obtain switch from cc1_options.  
         CPP driver cannot obtain switch from cc1_options.  
         CPP driver cannot obtain switch from cc1_options.  
         These options set the variables specified in common.opt
         automatically, and do not need to be saved for spec
           Pass the rest of this option to the assembler.  
           Split the argument at commas.  
           Record the part after the last comma.  
           Pass the rest of this option to the preprocessor.  
           Split the argument at commas.  
           Record the part after the last comma.  
           Split the argument at commas.  
           Record the part after the last comma.  
         POSIX allows separation of -l and the lib arg; canonicalize
         by concatenating -l with its arg 
         Similarly, canonicalize -L for linkers that may not accept
         separate arguments.  
         Likewise -F.  
         Already handled as a special case, so ignored here.  
         These options set the variables specified in common.opt
         automatically, but do need to be saved for spec
         This is similar to -v except that there is no execution
         of the commands and the echoed arguments are quoted.  It
         is intended for use in shell scripts to capture the
         driver-generated command line.  
           Catch the case where the user has forgotten to append a
           directory separator to the path.  Note, they may be using
           -B to add an executable name prefix, eg "i386-elf-", in
           order to distinguish between multiple installations of
           GCC in the same directory.  Hence we must check to see
           if appending a directory separator actually makes a
           valid directory name.  
           Suppress the warning if -xnone comes after the last input
           file, because alternate command interfaces like g++ might
           find it useful to place -xnone after each input file.  
         Save the output name in case -save-temps=obj was used.  
         On some systems, ld cannot handle "-o" without a space.  So
         split the option from its argument.  
         These are always valid, since gcc.c itself understands the
         first two, gfortranspec.c understands -static-libgfortran and
         g++spec.c understands -static-libstdc++ 
         Various driver options need no special processing at this
         point, having been handled in a prescan above or being
         handled by specs.  
static bool driver_unknown_option_callback ( )
   Handle an option DECODED that is unknown to the option-processing
         Leave unknown -Wno-* options for the compiler proper, to be
         diagnosed only if there are warnings.  
         Give it a chance to define it a a spec file.  
static void driver_wrong_lang_callback ( const struct cl_decoded_option decoded,
unsigned int  lang_mask 
   Handle an option DECODED that is not marked as CL_DRIVER.
   LANG_MASK will always be CL_DRIVER.  
     At this point, non-driver options are accepted (and expected to
     be passed down by specs) unless marked to be rejected by the
     driver.  Options to be rejected by the driver but accepted by the
     compilers proper are treated just like completely unknown
static void end_going_arg ( )
   If there is an argument being accumulated, terminate it and store it.  
                 Script was not found on search path.  

Referenced by do_spec().

static const char* eval_spec_function ( const char *  ,
const char *   
static const char* eval_spec_function ( )
   Evaluate a spec function.  
     Saved spec processing context.  
     Push the spec processing context.  
     If we have some object growing now, finalize it so the args and function
     eval proceed from a cleared context.  This is needed to prevent the first
     constructed arg from mistakenly including the growing value.  We'll push
     this value back on the obstack once the function evaluation is done, to
     restore a consistent processing context for our caller.  This is fine as
     the address of growing objects isn't guaranteed to remain stable until
     they are finalized, and we expect this situation to be rare enough for
     the extra copy not to be an issue.  
     Create a new spec processing context, and build the function
     argbuf_index is an index for the next argument to be inserted, and
     so contains the count of the args already inserted.  
     Pop the spec processing context.  
static int execute ( )
   Execute the command specified by the arguments on the current line of spec.
   When using pipes, this includes several piped-together commands
   with `|' between them.

   Return 0 if successful, -1 if failed.  
     Count # of piped commands.  
     Get storage for each command.  
     Split argbuf into its separate piped processes,
     and record info about each one.
     Also search for the programs that are to be run.  
     If -v, print what we are about to do, and maybe query.  
         For help listings, put a blank line between sub-processes.  
         Print each piped command as a separate line.  
                     If it's empty, print "".  
                 If it's empty, print "".  
             Print a pipe symbol after all but the last command.  
             verbose_only_flag should act as if the spec was
             executed, so increment execution_count before
             returning.  This prevents spurious warnings about
             unused linker input files, etc.  
     Run the each command through valgrind.  To simplify prepending the
     path to valgrind and the option "-q" (for quiet operation unless
     something triggers), we allocate a separate argv array.  
     Run each piped subprocess.  
     Wait for all the subprocesses to finish.  
               SIGPIPE is a special case.  It happens in -pipe mode
               when the compiler dies before the preprocessor is done,
               or the assembler dies before the compiler is done.
               There's generally been an error already, and this is
               just fallout.  So don't generate another error unless
               we would otherwise have succeeded.  

References errno.

Referenced by uncprop_dom_walker::before_dom_children(), compute_ld_motion_mems(), cse_change_cc_mode_insns(), delete_points_to_sets(), delete_redundant_insns_1(), diagnose_tm_blocks(), eliminate_const_or_copy(), execute_build_cfg(), free_inline_summary(), gate_dce(), gate_pass_return_slot(), gate_tracer(), gate_tree_complete_unroll(), gate_vect_slp(), instantiate_decls_1(), invalidate_any_buried_refs(), make_pass_tm_mark(), move_deaths(), one_cprop_pass(), ps_has_conflicts(), remove_cgraph_callee_edges(), rest_of_handle_initialize_regs(), rest_of_handle_ud_dce(), run_word_dce(), schedule_insns(), tree_call_cdce(), and validate_value_data().

static void fatal_signal ( int  )
static void fatal_signal ( )
   On fatal signals, delete all the temporary files.  
     Get the same signal again, this time not handled,
     so its normal effect occurs.  

References user_specs::filename, find_a_file(), and read_specs().

static void* file_at_path ( )
     Some systems have a suffix for executable files.
     So try appending that first.  
static char * find_a_file ( const struct path_prefix pprefix,
const char *  name,
int  mode,
bool  do_multi 
   Search for NAME using the prefix list PREFIXES.  MODE is passed to
   access to check permissions.  If DO_MULTI is true, search multilib
   paths then non-multilib paths, otherwise do not search multilib paths.
   Return 0 if not found, otherwise return its name, allocated with malloc.  
     Determine the filename to execute (special case for absolute paths).  
static const char* find_file ( const char *  )
static const char* find_file ( )
   Search for a file named NAME trying various prefixes including the
   user's -B prefix and some standard ones.
   Return the absolute file name found.  If nothing is found, return NAME.  
static const char* find_file_spec_function ( int  ,
const char **   
static const char* find_file_spec_function ( )
   %:find-file spec function.  This function replaces its argument by
    the file found through find_file, that is the -print-file-name gcc
    program option. 
static const char* find_plugindir_spec_function ( int  ,
const char **   
static const char* find_plugindir_spec_function ( )
   %:find-plugindir spec function.  This function replaces its argument
    by the -iplugindir=<dir> option.  `dir' is found through find_file, that
    is the -print-file-name gcc program option. 
static void* for_each_path ( const struct path_prefix paths,
bool  do_multi,
size_t  extra_space,
void *(*)(char *, void *)  callback,
void *  callback_info 
   Call CALLBACK for each path in PATHS, breaking out early if CALLBACK
   returns non-NULL.
   If DO_MULTI is true iterate over the paths twice, first with multilib
   suffix then without, otherwise iterate over the paths once without
   adding a multilib suffix.  When DO_MULTI is true, some attempt is made
   to avoid visiting the same path twice, but we could do better.  For
   instance, /usr/lib/../lib is considered different from /usr/lib.
   At least EXTRA_SPACE chars past the end of the path passed to
   CALLBACK are available for use by the callback.
   CALLBACK_INFO allows extra parameters to be passed to CALLBACK.

   Returns the value returned by CALLBACK.  
             Look first in MACHINE/VERSION subdirectory.  
             Some paths are tried with just the machine (ie. target)
             subdir.  This is used for finding as, ld, etc.  
             Now try the multiarch path.  
             Now try the base path.  
         Run through the paths again, this time without multilibs.
         Don't repeat any we have already seen.  

References add_to_obstack_info::check_dir, add_to_obstack_info::first_time, is_directory(), add_to_obstack_info::ob, and strlen().

Referenced by do_self_spec().

static unsigned HOST_WIDE_INT get_random_number ( )
   Get a random number for -frandom-seed 
     Get some more or less random data.  
static const char* getenv_spec_function ( int  ,
const char **   
static const char* getenv_spec_function ( )
   getenv built-in spec function.

   Returns the value of the environment variable given by its first
   argument, concatenated with the second argument.  If the
   environment variable is not defined, a fatal error is issued.  
     We have to escape every character of the environment variable so
     they are not interpreted as active spec characters.  A
     particularly painful case is when we are reading a variable
     holding a windows path complete with \ separators.  
static void give_switch ( int  ,

Referenced by handle_spec_function().

static void give_switch ( )
   Pass a switch to the current accumulating command
   in the same form that we received it.
   SWITCHNUM identifies the switch; it is an index into
   the vector of switches gcc received, which is `switches'.
   This cannot fail since it never finishes a command line.

   If OMIT_FIRST_WORD is nonzero, then we omit .part1 of the argument.  
static const char* handle_braces ( const char *  )
static const char* handle_braces ( )
   Handle a %{ ... } construct.  P points just inside the leading {.
   Returns a pointer one past the end of the brace block, or 0
   if we call do_spec_1 and that returns -1.  
         Scan one "atom" (S in the description above of %{}, possibly
         with '!', '.', '@', ',', or '*' modifiers).  
             Substitute the switch(es) indicated by the current atom.  
             Substitute some text if the current atom appears as a switch
             or suffix.  
                 An empty term may appear as the last choice of an
                 N-way choice set; it means "otherwise".  
                 Don't bother testing this atom if we already have a
                       a_matched is already set by handle_spec_function.  
                 Found the body, that is, the text to substitute if the
                 current disjunction matches.  
                 If we have an N-way choice, reset state for the next

References find_a_file(), and spec_function::name.

static const char* handle_spec_function ( const char *  ,
bool *   
static const char* handle_spec_function ( )
   Handle a spec function call of the form:


   ARGS is processed as a spec in a separate context and split into an
   argument vector in the normal fashion.  The function returns a string
   containing a spec which we then process in the caller's context, or
   NULL if no processing is required.

   If RETVAL_NONNULL is not NULL, then store a bool whether function
   returned non-NULL.  
     Get the function name.  
         Only allow [A-Za-z0-9], -, and _ in function names.  
     Get the arguments.  
     p now points to just past the end of the spec function expression.  

References check_live_switch(), do_spec_1(), give_switch(), and n_switches.

static const char* if_exists_else_spec_function ( int  ,
const char **   
static const char* if_exists_else_spec_function ( )
   if-exists-else built-in spec function.

   This is like if-exists, but takes an additional argument which
   is returned if the first argument does not exist.  
     Must have exactly two arguments.  
static const char* if_exists_spec_function ( int  ,
const char **   
static const char* if_exists_spec_function ( )
   if-exists built-in spec function.

   Checks to see if the file specified by the absolute pathname in
   ARGS exists.  Returns that pathname if found.

   The usual use for this function is to check for a library file
   (whose name has been expanded with %s).  
     Must have only one argument.  
static const char* include_spec_function ( int  ,
const char **   
static const char* include_spec_function ( )
   %:include builtin spec function.  This differs from %include in that it
   can be nested inside a spec, and thus be conditionalized.  It takes
   one argument, the filename, and looks for it in the startfile path.
   The result is always NULL, i.e. an empty expansion.  
static void init_gcc_specs ( struct obstack obstack,
const char *  shared_name,
const char *  static_name,
const char *  eh_name 
static void init_spec ( )
   Initialize the specs lookup routines.  
     ??? If neither -shared-libgcc nor --static-libgcc was
     seen, then we should be making an educated guess.  Some proposed
     heuristics for ELF include:

        (1) If "-Wl,--export-dynamic", then it's a fair bet that the
            program will be doing dynamic loading, which will likely
            need the shared libgcc.

        (2) If "-ldl", then it's also a fair bet that we're doing
            dynamic loading.

        (3) For each ET_DYN we're linking against (either through -lfoo
            or /some/path/foo.so), check to see whether it or one of
            its dependencies depends on a shared libgcc.

        (4) If "-shared"

            If the runtime is fixed to look for program headers instead
            of calling __register_frame_info at all, for each object,
            use the shared libgcc if any EH symbol referenced.

            If crtstuff is fixed to not invoke __register_frame_info
            automatically, for each object, use the shared libgcc if
            any non-empty unwind section found.

     Doing any of this probably requires invoking an external program to
     do the actual object file scanning.  
       Transform the extant libgcc_spec into one that uses the shared libgcc
       when given the proper command line arguments.  
               Ug.  We don't know shared library extensions.  Hope that
               systems that use this form don't do shared libraries.  
     Prepend "--traditional-format" to whatever asm_spec we had before.  
     Prepend LINK_BUILDID_SPEC to whatever link_spec we had before.  
     Prepend LINK_EH_SPEC to whatever link_spec we had before.  
     Prepend --hash-style=LINKER_HASH_STYLE to whatever link_spec we had

Referenced by display_help().

static bool input_spec_matches ( )
   Subroutine of handle_braces.  Returns true if the current
   input file's spec name matches the atom bracketed by ATOM and END_ATOM.  
static bool input_suffix_matches ( const char *  ,
const char *   
static bool input_suffix_matches ( )
   Inline subroutine of handle_braces.  Returns true if the current
   input suffix matches the atom bracketed by ATOM and END_ATOM.  

References n_switches.

static void insert_wrapper ( const char *  )
static void insert_wrapper ( )
   Parse the WRAPPER string which is a comma separated list of the command line
   and insert them into the beginning of argbuf.  
static int is_directory ( const char *  ,

Referenced by for_each_path().

static int is_directory ( )
   Determine whether a directory exists.  If LINKER, return 0 for
   certain fixed names not needed by the linker.  
     Ensure the string ends with "/.".  The resulting path will be a
     directory even if the given path is a symbolic link.  
     Exclude directories that the linker is known to search.  

References link_spec, obstack, set_spec(), and strlen().

static char* load_specs ( const char *  )
static char* load_specs ( )
   Load specs from a file name named FILENAME, replacing occurrences of
   various different types of line-endings, \r\n, \n\r and just \r, with
   a single \n.  
     Open and stat the file.  
     Read contents of file into BUFFER.  

References fatal_error(), fnotice(), spec_list::name, spec_list::name_len, spec_list::next, and sl.

static struct compiler* lookup_compiler ( const char *  ,
size_t  ,
const char *   
static struct compiler* lookup_compiler ( )
   Find the proper compilation spec for the file name NAME,
   whose length is LENGTH.  LANGUAGE is the specified language,
   or 0 if this file is to be passed to the linker.  
     If this was specified by the user to be a linker input, indicate that.  
     Otherwise, look for the language, if one is spec'd.  
     Look for a suffix.  
                 See if the suffix matches the end of NAME.  
     Look again, but case-insensitively this time.  
                   See if the suffix matches the end of NAME.  
           A non-alias entry: return it.  
         An alias entry maps a suffix to a language.
         Search for the language; pass 0 for NAME and LENGTH
         to avoid infinite recursion if language not found.  
static struct spec_function* lookup_spec_function ( const char *  )
static struct spec_function* lookup_spec_function ( )
   Look up a spec function.  
int main ( int  ,
char **   
int main ( )
     Determine if any expansions were made.  
     Register the language-independent parameters.  
     Unlock the stdio streams.  
     Perform host dependent initialization when needed.  
     We *MUST* set SIGCHLD to SIG_DFL so that the wait4() call will
     receive the signal.  A different setting is inheritable 
     Parsing and gimplification sometimes need quite large stack.
     Increase stack size limits if possible.  
     Allocate the argument vector.  
     Build multilib_select, et. al from the separate lines that make up each
     multilib selection.  
     Set up any other necessary machine specific environment variables.  
     Make a table of what switches there are (switches, n_switches).
     Make a table of specified input files (infiles, n_infiles).
     Decode switches that are handled locally.  
     Initialize the vector of specs to just the default.
     This means one element containing 0s, as a terminator.  
     Read specs from a file if there is one.  
     Read the specs file unless it is a default one.  
     We need to check standard_exec_prefix/just_machine_suffix/specs
     for any override of as, ld and libraries.  
     Process any configure-time defaults specified for the command line
     options, via OPTION_DEFAULT_SPECS.  
     Process DRIVER_SELF_SPECS, adding any new options to the end
     of the command line.  
     If not cross-compiling, look for executables in the standard
     Process sysroot_suffix_spec.  
     Pass the --sysroot option to the linker, if it supports that.  If
     there is a sysroot_suffix_spec, it has already been processed by
     this point, so target_system_root really is the system root we
     should be using.  
     Process sysroot_hdrs_suffix_spec.  
     Look for startfiles in the standard places.  
     We should eventually get rid of all these and stick to
     startfile_prefix_spec exclusively.  
         If standard_startfile_prefix is relative, base it on
         standard_exec_prefix.  This lets us move the installed tree
         as a unit.  If GCC_EXEC_PREFIX is defined, base
         standard_startfile_prefix on that as well.

         If the prefix is relative, only search it for native compilers;
         otherwise we will search a directory containing host libraries.  
         Sysrooted prefixes are relocated because target_system_root is
         also relocated by gcc_exec_prefix.  
     Process any user specified specs in the order given on the command
     Process any user self specs.  
         Avoid crash when computing %j in this early.  
     If we have a GCC_EXEC_PREFIX envvar, modify it for cpp's sake.  
     Now we have the specs.
     Set the `valid' bits for switches that match anything in any spec.  
     Now that we have the switches and the specs, set
     the subdirectory based on the options.  
     Set up to remember the pathname of gcc and any options
     needed for collect.  We use argv[0] instead of progname because
     we need the complete pathname.  
     Set up to remember the pathname of the lto wrapper. 
     Reject switches that no pass was interested in.  
     Obey some of the options.  
           The error status indicates that only one set of fixed
           headers should be built.  
         We do not exit here.  Instead we have created a fake input file
         called 'help-dummy' which needs to be compiled, and we pass this
         on the various sub-processes, along with the --help switch.
         Ensure their output appears after ours.  
         We do not exit here. We use the same mechanism of --help to print
         the version of the sub-processes. 
         We could have defined THREAD_MODEL_SPEC to "%*" by default,
         but there's no point in doing all this processing just to get
         thread_model back.  
         compiler_version is truncated at the first space when initialized
         from version string, so truncate version_string at the first space
         before comparing.  
     Make a place to record the compiler output file names
     that correspond to the input files.  
     Record which files were specified explicitly as link input.  
             Since there is no compiler for this input file, assume it is a
             linker file.  
         Tell do_spec what to substitute for %i.  
         Use the same thing in %o, unless cp->spec says otherwise.  
         Figure out which compiler from the file's suffix.  
             Ok, we found an applicable compiler.  Run its spec.  
         If this file's name does not contain a recognized suffix,
         record it as explicit linker input.  
         Clear the delete-on-failure queue, deleting the files in it
         if this compilation failed.  
         If this compilation succeeded, don't delete those files later.  
     Reset the input file name to the first compile/object file name, for use
     with %b in LINK_SPEC. We use the first input file that we can find
     a compiler to compile it instead of using infiles.language since for
     languages other than C we use aliases that we then lookup later.  
         Make sure INPUT_FILE_NUMBER points to first available open
     Determine if there are any linker input files.  
     Run ld to link all the compiler output files.  
             We'll use ld if we can't find collect2.  
         Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
         for collect.  
     If options said don't run linker,
     complain about input files to be given to the linker.  
     Delete some or all of the temporary files we made.  

References print_multilib_info().

static void mark_matching_switches ( const char *  ,
const char *  ,
static void mark_matching_switches ( )
   Inline subroutine of handle_braces.  Mark all of the switches which
   match ATOM (extends to END_ATOM; STARRED indicates whether there
   was a star after the atom) for later processing.  

References do_spec_1(), and strlen().

static const char* pass_through_libs_spec_func ( int  ,
const char **   
const char* pass_through_libs_spec_func ( )
   %:pass-through-libs spec function.  Finds all -l options and input
   file names in the lib spec passed to it, and makes a list of them
   prepended with the plugin option to cause them to be passed through
   to the final link after all the new object files have been added.  
     Shlemiel the painter's algorithm.  Innately horrible, but at least
     we know that there will never be more than a handful of strings to
     concat, and it's only once per run, so it's not worth optimising.  
         Anything that isn't an option is a full path to an output
         file; pass it through if it ends in '.a'.  Among options,
         pass only -l.  
             Handle both joined and non-joined -l options.  If for any
             reason there's a trailing -l with no joined or following
             arg just discard it.  
static void perror_with_name ( const char *  )
static void perror_with_name ( )
void pfatal_with_name ( )
static const char * print_asm_header_spec_function ( int  arg,
const char **  argv 
   %:print-asm-header spec function.  Print a banner to say that the
   following output is from the assembler.  
static void print_multilib_info ( )
   Print out the multiple library subdirectory selection
   information.  This prints out a series of lines.  Each line looks
   like SUBDIRECTORY;@OPTION@OPTION, with as many options as is
   required.  Only the desired options are printed out, the negative
   matches.  The options are print without a leading dash.  There are
   no spaces to make it easy to use the information in the shell.
   Each subdirectory is printed only once.  This assumes the ordering
   generated by the genmultilib script. Also, we leave out ones that match
   the exclusions.  
         Ignore newlines.  
         Get the initial path.  
         When --disable-multilib was used but target defines
         MULTILIB_OSDIRNAMES, entries starting with .: (and not starting
         with .:: for multiarch configurations) are there just to find
         multilib_os_dir, so skip them from output.  
         Check for matches with the multilib_exclusions. We don't bother
         with the '!' in either list. If any of the exclusion rules match
         all of its options with the select rule, we skip it.  
               Ignore newlines.  
               Check the arguments.  
             If this is a duplicate, skip it.  
         If this directory requires any default arguments, we can skip
         it.  We will already have printed a directory identical to
         this one which does not require that default argument.  
             If there are extra options, print them now.  

References abort(), find_a_file(), and read_specs().

Referenced by main().

static const char * process_brace_body ( const char *  p,
const char *  atom,
const char *  end_atom,
int  starred,
int  matched 
   Subroutine of handle_braces.  Scan and process a brace substitution body
   (X in the description of %{} syntax).  P points one past the colon;
   ATOM and END_ATOM bracket the first atom which was found to be true
   (present) in the current disjunction; STARRED indicates whether all
   the atoms in the current disjunction were starred (for syntax validation);
   MATCHED indicates whether the disjunction matched or not, and therefore
   whether or not the body is to be processed through do_spec_1 or just
   skipped.  Returns a pointer to the closing } or ;, or 0 if do_spec_1
   returns -1.  
     Locate the closing } or ;, honoring nested braces.
     Trim trailing whitespace.  
         Copy the substitution body to permanent storage and execute it.
         If have_subst is false, this is a simple matter of running the
         body through do_spec_1...  
             ... but if have_subst is true, we have to process the
             body once for each matching switch, with %* set to the
             variant part of the switch.  
                   Pass any arguments this switch has.  
static void process_command ( unsigned int  decoded_options_count,
struct cl_decoded_option decoded_options 
   Create the vector `switches' and its contents.
   Store its length in `n_switches'.  
     Figure compiler version from version string.  
     Handle any -no-canonical-prefixes flag early, to assign the function
     that builds relative prefixes.  This function creates default search
     paths that are needed later in normal option handling.  
     Set up the default search paths.  If there is no GCC_EXEC_PREFIX,
     see if we can create it from the pathname specified in
     FIXME: make_relative_prefix doesn't yet work for VMS.  
         make_relative_prefix requires a program name, but
         GCC_EXEC_PREFIX is typically a directory name with a trailing
         / (which is ignored by make_relative_prefix), so append a
         program name.  
         The path is unrelocated, so fallback to the original setting.  
     From this point onward, gcc_exec_prefix is non-null if the toolchain
     is relocated. The toolchain was either relocated using GCC_EXEC_PREFIX
     or an automatically created GCC_EXEC_PREFIX from
     Do language-specific adjustment/addition of flags.  
     COMPILER_PATH and LIBRARY_PATH have values
     that are lists of directory names with colons.  
     Use LPATH like LIBRARY_PATH (for the CMU build program).  
     Process the options and store input files and switches in their
             For LTO static archive support we handle input file
             specifications that are composed of a filename and
             an offset like FNAME@OFFSET.  
                 Only accept non-stdin and existing FNAME parts, otherwise
                 try with the full name.  
     If -save-temps=obj and -o name, create the prefix to use for %b.
     Otherwise just make -save-temps=obj the same as -save-temps=cwd.  
         -save-temps overrides -pipe, so that temp files are produced 
     Set up the search paths.  We add directories that we expect to
     contain GNU Toolchain components before directories specified by
     the machine description so that we will find GNU components (like
     the GNU assembler) before those of the host system.  
     If we don't know where the toolchain has been installed, use the
     configured-in locations.  
     Look for tools relative to the location from which the driver is
     running, or, if that is not available, the configured prefix.  
     If the normal TARGET_SYSTEM_ROOT is inside of $exec_prefix,
     then consider it to relocate with the rest of the GCC installation
     if GCC_EXEC_PREFIX is set.
     ``make_relative_prefix'' is not compiled for VMS, so don't call it.  
     More prefixes are enabled in main, after we read the specs file
     and determine whether this is cross-compilation or not.  
     Synthesize -fcompare-debug flag from the GCC_COMPARE_DEBUG
     environment variable.  
     Ensure we only invoke each subprocess once.  
         Create a dummy input file, so that we can pass
         the help option on to the various sub-processes.  

References free(), and memcpy().

static void process_marked_switches ( )
   Inline subroutine of handle_braces.  Process all the currently
   marked switches through give_switch, and clear the marks.  
static void putenv_from_prefixes ( const struct path_prefix paths,
const char *  env_var,
bool  do_multi 
   Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
   for collect.  
static void read_specs ( const char *  ,
bool  ,
static void read_specs ( )
   Read compilation specs from a file named FILENAME,
   replacing the default ones.

   A suffix which starts with `*' is a definition for
   one of the machine-specific sub-specs.  The "suffix" should be
   *asm, *cc1, *cpp, *link, *startfile, etc.
   The corresponding spec is stored in asm_spec, etc.,
   rather than in the `compilers' vector.

   Anything invalid in the file is a fatal error.  
     Scan BUFFER for specs, putting them in the vector.  
         Advance P in BUFFER to the next nonblank nocomment line.  
         Is this a special command that starts with '%'? 
         Don't allow this for the main specs file, since it would
         encourage people to overwrite it.  
             Skip '\n'.  
                 Get original name.  
                 Get new spec name.  
         Find the colon that should end the suffix.  
         The colon shouldn't be missing.  
         Skip back over trailing whitespace.  
         Copy the suffix to a string.  
         Find the next line.  
         Find next blank line or end of string.  
         Specs end at the blank line and do not include the newline.  
         Delete backslash-newline sequences from the spec.  
             Add this pair to the vector.  
void record_temp_file ( )
   Record FILENAME as a file to be deleted automatically.
   ALWAYS_DELETE nonzero means delete it if all compilation succeeds;
   otherwise delete it in any case.
   FAIL_DELETE nonzero means delete it if a compilation step fails;
   otherwise delete it in any case.  

References memcpy(), prefix_list::os_multilib, prefix_list::prefix, prefix_list::require_machine_suffix, and strlen().

Referenced by set_spec().

static const char* remove_outfile_spec_function ( int  ,
const char **   
static const char* remove_outfile_spec_function ( )
   remove-outfile built-in spec function.
 *    This looks for the first argument in the outfiles array's name and
 *       removes it.  
     Must have exactly one argument.  
static const char* replace_extension_spec_func ( int  ,
const char **   
const char* replace_extension_spec_func ( )
   %:replace-extension spec function.  Replaces the extension of the
   first argument with the second argument.  
static const char* replace_outfile_spec_function ( int  ,
const char **   
static const char* replace_outfile_spec_function ( )
   replace-outfile built-in spec function.

   This looks for the first argument in the outfiles array's name and
   replaces it with the second argument.  
     Must have exactly two arguments.  
static const char* sanitize_spec_function ( int  ,
const char **   
static const char* sanitize_spec_function ( )
   sanitize built-in spec function.

   This returns non-NULL, if sanitizing address, thread or
   any of the undefined behavior sanitizers.  

References free(), and len.

static char* save_string ( const char *  ,

Referenced by do_spec_1().

static char* save_string ( )
static void save_switch ( const char *  opt,
size_t  n_args,
const char *const *  args,
bool  validated,
bool  known 
   Save an option OPT with N_ARGS arguments in array ARGS, marking it
   as validated if VALIDATED and KNOWN if it is an internal switch.  

References add_assembler_option().

Referenced by convert_filename().

static void set_collect_gcc_options ( )
   Store switches not filtered out by %<S in spec in COLLECT_GCC_OPTIONS
   and place that in the environment.  
     Build COLLECT_GCC_OPTIONS to have all of the options specified to
     the compiler.  
         Ignore elided switches.  
void set_input ( )
   Set up the various global variables to indicate that we're processing
   the input file named FILENAME.  
     Find a suffix starting with the last period,
     and set basename_length to exclude that suffix.  
     If a spec for 'g', 'u', or 'U' is seen with -save-temps then
     we will need to do a stat on the gcc_input_filename.  The
     INPUT_STAT_SET signals that the stat is needed.  
static void set_multilib_dir ( )
   Work out the subdirectory to use based on the options. The format of
   multilib_select is a list of elements. Each element is a subdirectory
   name followed by a list of options followed by a semicolon. The format
   of multilib_exclusions is the same, but without the preceding
   directory. First gcc will check the exclusions, if none of the options
   beginning with an exclamation point are present, and all of the other
   options are present, then we will ignore this completely. Passing
   that, gcc will consider each multilib_select in turn using the same
   rules for matching the options. If a match is found, that subdirectory
   will be used.
   A subdirectory name is optionally followed by a colon and the corresponding
   multiarch name.  
         Ignore newlines.  
         Check the arguments.  
     Append multilib reuse rules if any.  With those rules, we can reuse
     one multilib for certain different options sets.  
         Ignore newlines.  
         Get the initial path.  
         Check the arguments.  
             If this is a default argument, we can just ignore it.
             This is true even if this_arg begins with '!'.  Beginning
             with '!' does not mean that this argument is necessarily
             inappropriate for this library: it merely means that
             there is a more specific library which uses this
             argument.  If this argument is a default, we need not
             consider that more specific library.  
static void set_option_handlers ( )
   Put the driver's standard set of option handlers in *HANDLERS.  

References cl_decoded_option::arg, convert_filename(), offset, and strlen().

static void set_spec ( const char *  ,
const char *  ,

Referenced by is_directory().

static void set_spec ( )
   Change the value of spec NAME to SPEC.  If SPEC is empty, then the spec is
   removed; If the spec starts with a + then SPEC is added to the end of the
   current spec.  
     If this is the first call, initialize the statically allocated specs.  
     See if the spec already exists.  
         Not found - make it.  
     Free the old spec.  

References record_temp_file().

static char* skip_whitespace ( char *  )
static char* skip_whitespace ( )
         A fully-blank line is a delimiter in the SPEC file and shouldn't
         be considered whitespace.  
static void* spec_path ( )
     Must not damage the original path.  

Referenced by do_self_spec().

static void store_arg ( const char *  ,
int  ,
static void store_arg ( )
   Add one argument to the vector at the end.
   This is done when a space is seen or at the end of the line.
   If DELETE_ALWAYS is nonzero, the arg is a filename
    and the file should be deleted eventually.
   If DELETE_FAILURE is nonzero, the arg is a filename
    and the file should be deleted if this compilation fails.  
         If the temporary file we should delete is specified as
         part of a joined argument extract the filename.  
static bool switch_matches ( const char *  ,
const char *  ,
static bool switch_matches ( )
   Subroutine of handle_braces.  Returns true if a switch
   matching the atom bracketed by ATOM and END_ATOM appeared on the
   command line.  
       Check if a switch with separated form matching the atom.
       We check -D and -U switches. 
static int used_arg ( const char *  ,
static int used_arg ( )
   Check whether a particular argument was used.  The first time we
   canonicalize the switches to keep only the ones we care about.  
         Break multilib_matches into the component strings of string
         and replacement string.  
         Now build a list of the replacement string for switches that we care
         about.  Make sure we allocate at least one entry.  This prevents
         xmalloc from calling fatal, and prevents us from re-executing this
         block of code.  
         Add MULTILIB_DEFAULTS switches too, as long as they were not present
         on the command line nor any options mutually incompatible with
static void validate_all_switches ( void  )
     Look through the linked list of specs read from the specs file.  
static const char* validate_switches ( const char *  ,
static const char* validate_switches ( )
   Look at the switch-name that comes after START
   and mark as valid all supplied switches that match it.  
         Mark all matching switches as valid.  

References free().

static void validate_switches_from_spec ( const char *  ,
static void validate_switches_from_spec ( )
         We have a switch spec.  
static const char* version_compare_spec_function ( int  ,
const char **   
static const char* version_compare_spec_function ( )
   version_compare built-in spec function.

   This takes an argument of the following form:

   <comparison-op> <arg1> [<arg2>] <switch> <result>

   and produces "result" if the comparison evaluates to true,
   and nothing if it doesn't.

   The supported <comparison-op> values are:

   >=  true if switch is a later (or same) version than arg1
   !>  opposite of >=
   <   true if switch is an earlier version than arg1
   !<  opposite of <
   ><  true if switch is arg1 or later, and earlier than arg2
   <>  true if switch is earlier than arg1 or is arg2 or later

   If the switch is not present, the condition is false unless
   the first character of the <comparison-op> is '!'.

   For example,
   %:version-compare(>= 10.3 mmacosx-version-min= -lmx)
   adds -lmx if -mmacosx-version-min=10.3.9 was passed.  
static void xputenv ( const char *  )
static void xputenv ( )
   Add or change the value of an environment variable, outputting the
   change to standard error if in verbose mode.  

Variable Documentation

!fwpa __pad0__
int added_libraries
   This counts the number of libraries added by lang_specific_driver, so that
   we can tell if there were any user supplied any files or libraries.  
struct temp_file* always_delete_queue
   Queue of files to delete on success or failure of compilation.  
int arg_going
   These are variables used within do_spec and do_spec_1.  
   Nonzero if an arg has been started and not yet terminated
   (with space, tab or newline).  
vec<const_char_p> argbuf
   Vector of pointers to arguments in the current line of specifications.  
const char* asm_debug = ASM_DEBUG_SPEC
const char* asm_final_spec = ASM_FINAL_SPEC
const char* asm_options = "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}"
const char* asm_spec = ASM_SPEC
vec<char_p> assembler_options
   A vector of options to give to the assembler.
   These options are accumulated by -Wa,
   and substituted into the assembler command with %Y.  
bool at_file_supplied
   Flag set to nonzero if an @file argument has been supplied to gcc.  
int basename_length
const char* cc1_options
Initial value:
"%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
%1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*}\
%{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)} \
%{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}} \
%{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs}\
%{v:-version} %{pg:-p} %{p} %{f*} %{undef}\
%{Qn:-fno-ident} %{Qy:} %{-help:--help}\
%{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
%{fsyntax-only:-o %j} %{-param*}\
%{coverage:-fprofile-arcs -ftest-coverage}"
   NB: This is shared amongst all front-ends, except for Ada.  
const char* cc1_spec = CC1_SPEC
const char* cc1plus_spec = CC1PLUS_SPEC
struct obstack collect_obstack
   This is the obstack to build an environment variable to pass to
   collect2 that describes all of the relevant switches of what to
   pass the compiler in building the list of pointers to constructors
   and destructors.  
bool combine_inputs
   True if multiple input files are being compiled to a single
   assembly file.  
int compare_debug
   Set to zero if -fcompare-debug is disabled, positive if it's
   enabled and we're running the first compilation, negative if it's
   enabled and we're running the second compilation.  For most of the
   time, it's in the range -1..1, but it can be temporarily set to 2
   or 3 to indicate that the -fcompare-debug flags didn't come from
   the command-line, but rather from the GCC_COMPARE_DEBUG environment
   variable, until a synthesized -fcompare-debug flag is added to the
   command line.  

Referenced by compare_files().

const char* compare_debug_opt
   Set to the flags that should be passed to the second compilation in
   a -fcompare-debug compilation.  
int compare_debug_second
   Set to nonzero if we've seen the -fcompare-debug-second flag.  
const char* compiler_version
   The compiler version.  
struct compiler* compilers
   Pointer to a vector of `struct compiler' that gives the spec for
   compiling a file, based on its suffix.
   A file that does not end in any of these suffixes will be passed
   unchanged to the loader and nothing else will be done to it.

   An entry containing two 0s is used to terminate the vector.

   If multiple entries match a file, the last matching one is used.  
const char* cpp_debug_options = "%{d*}"
   This contains cpp options which are not passed when the preprocessor
   output will be used by another program.  
const char* cpp_options
Initial value:
"%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w}\
%{f*} %{g*:%{!g0:%{g*} %{!fno-working-directory:-fworking-directory}}} %{O*}\
%{undef} %{save-temps*:-fpch-preprocess}"
   This contains cpp options which are common with cc1_options and are passed
   only when preprocessing only to avoid duplication.  We pass the cc1 spec
   options to the preprocessor so that it the cc1 spec may manipulate
   options used to set target flags.  Those special target flags settings may
   in turn cause preprocessor symbols to be defined specially.  

Referenced by remove_duplicates().

const char* cpp_spec = CPP_SPEC
const char* cpp_unique_options
Initial value:
"%{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I\
%{MD:-MD %{!o:%b.d}%{o*:%.d%*}}\
%{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}}\
%{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*}\
%{!E:%{!M:%{!MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}}\
%{remap} %{g3|ggdb3|gstabs3|gcoff3|gxcoff3|gvms3:-dD}\
%{H} %C %{D*&U*&A*} %{i*} %Z %i\
   We don't wrap .d files in %W{} since a missing .d file, and
   therefore no dependency entry, confuses make into thinking a .o
   file that happens to exist is up-to-date.  
static const char * cross_compile = "1"
   Nonzero if cross-compiling.
   When -b is used, the value comes from the `specs' file.  
const char* debug_auxbase_opt
char* debug_check_temp_file[2]
struct compiler default_compilers[]
   The default list of file name suffixes and their compilation specs.  
int delete_this_arg
   Nonzero means %d or %g has been seen; the next arg to be terminated
   is a temporary file name.  
const char dir_separator_str[] = { DIR_SEPARATOR, 0 }
const char* const driver_self_specs[]
Initial value:
"%{fdump-final-insns:-fdump-final-insns=.} %<fdump-final-insns",
const char* endfile_spec = ENDFILE_SPEC
struct path_prefix exec_prefixes = { 0, 0, "exec" }
   List of prefixes to try when looking for executables.  
int execution_count
   Number of commands executed so far.  
struct spec_list* extra_specs = (struct spec_list *) 0
struct spec_list_1 extra_specs_1[] = { EXTRA_SPECS }
struct temp_file* failure_delete_queue
   Queue of files to delete on failure of compilation.  
const char* gcc_exec_prefix
   Adjusted value of GCC_EXEC_PREFIX envvar.  
const char* gcc_input_filename
   Process a spec string, accumulating and running commands.  
   These variables describe the input file name.
   input_file_number is the index on outfiles of this file,
   so that the output file name can be stored for later use by %o.
   input_basename is the start of the part of the input file
   sans all directory names, and basename_length is the number
   of characters starting there excluding the suffix .c or whatever.  
const char* gcc_libexec_prefix
   Adjusted value of standard_libexec_prefix.  
int greatest_status = 1
   Greatest exit code of sub-processes that has been encountered up to
int have_c = 0
   Were the options -c, -S or -E passed.  
int have_o = 0
   Was the option -o passed.  
int have_o_argbuf_index = 0
   Position in the argbuf vector containing the name of the output file
   (the value associated with the "-o" flag).  
struct path_prefix include_prefixes = { 0, 0, "include" }
   List of prefixes to try when looking for include files.  
struct infile* infiles
   Also a vector of input files specified.  
const char* input_basename
struct compiler* input_file_compiler
   The compiler used to process the current input file.  
int input_file_number
size_t input_filename_length
int input_from_pipe
   Nonzero means that the input of this command is coming from a pipe.  
struct stat input_stat

Referenced by do_specs_vec().

int input_stat_set
const char* input_suffix
const char* invoke_as
Initial value:
%{!S:-o %|.s |\n as %(asm_options) %|.s %A }\
int is_cpp_driver
   Flag set by cppspec.c to 1.  

Referenced by display_help().

const char* just_machine_suffix = 0
   Suffix to attach to directories searched for commands.
   This is just `MACHINE/'.  

Referenced by delete_temp_files().

int last_language_n_infiles
const char* lib_spec = LIB_SPEC
const char* libgcc_spec = LIBGCC_SPEC
const char* link_command_spec = LINK_COMMAND_SPEC

Referenced by display_help().

const char* link_gcc_c_sequence_spec = LINK_GCC_C_SEQUENCE_SPEC
const char* link_gomp_spec = ""
const char* link_libgcc_spec = LINK_LIBGCC_SPEC
const char* link_spec = LINK_SPEC

Referenced by is_directory().

const char* link_ssp_spec = LINK_SSP_SPEC
const char* linker_name_spec = LINKER_NAME
vec<char_p> linker_options
   A vector of options to give to the linker.
   These options are accumulated by %x,
   and substituted into the linker command with %X.  
const char* linker_plugin_file_spec = ""
const char* lto_gcc_spec = ""
const char* lto_wrapper_spec = ""
const char* machine_suffix = 0
   Suffix to attach to directories searched for commands.
   This looks like `MACHINE/VERSION/'.  

Referenced by delete_temp_files().

const char* md_exec_prefix = MD_EXEC_PREFIX
   For native compilers, these are well-known paths containing
   components that may be provided by the system.  For cross
   compilers, these paths are not used.  
const char* md_startfile_prefix = MD_STARTFILE_PREFIX
const char* md_startfile_prefix_1 = MD_STARTFILE_PREFIX_1
struct mdswitchstr* mdswitches
const char* multiarch_dir
   Subdirectory to use for locating libraries in multiarch conventions.  Set by
   set_multilib_dir based on the compilation options.  
const char* multilib_defaults
const char* const multilib_defaults_raw[] = MULTILIB_DEFAULTS
const char* multilib_dir
   Subdirectory to use for locating libraries.  Set by
   set_multilib_dir based on the compilation options.  
const char* multilib_exclusions
const char* multilib_matches
struct obstack multilib_obstack
   Some compilers have limits on line lengths, and the multilib_select
   and/or multilib_matches strings can be very long, so we build them at
   run time.  
const char* multilib_os_dir
   Subdirectory to use for locating libraries in OS conventions.  Set by
   set_multilib_dir based on the compilation options.  
const char* multilib_reuse
const char* multilib_select
int n_compilers
   Number of entries in `compilers', not counting the null terminator.  
const int n_default_compilers = ARRAY_SIZE (default_compilers) - 1
   Number of elements in default_compilers, not counting the terminator.  
int n_infiles
int n_infiles_alloc
int n_mdswitches
int n_switches
int n_switches_alloc

Referenced by compare_files().

int n_switches_alloc_debug_check[2]
int n_switches_debug_check[2]
struct obstack obstack
   This is the obstack which we use to allocate many strings.  

Referenced by do_spec_1(), get_attr_order(), is_directory(), lambda_matrix_row_exchange(), pp_last_position_in_text(), and pretty_printer::pretty_printer().

struct default_spec option_default_specs[] = { OPTION_DEFAULT_SPECS }
const char** outfiles
   And a vector of corresponding output files is made up later.  
vec<char_p> preprocessor_options
   A vector of options to give to the preprocessor.
   These options are accumulated by -Wp,
   and substituted into the preprocessor command with %Z.  
int print_help_list
   Definition of string containing the arguments given to configure.  
   Flag saying to print the command line options understood by gcc and its

Referenced by display_help().

int print_subprocess_help
   Flag indicating how to print command line options of sub-processes.  

Referenced by display_help().

int print_version
   Flag saying to print the version of gcc and its sub-processes.  

Referenced by display_help(), and main().

int processing_spec_function
FILE* report_times_to_file = NULL
   Whether we should report subprocess execution times to a file.  
enum save_temps save_temps_flag

Referenced by compare_files().

size_t save_temps_length = 0
char* save_temps_prefix = 0
   Output file to use to get the object directory for -save-temps=obj  
const char* self_spec = ""
int signal_count
   Number of commands that exited with a signal.  
const char* spec_lang = 0
const char* spec_machine = DEFAULT_TARGET_MACHINE
   The target machine.  

Referenced by display_help().

const char* const spec_version = DEFAULT_TARGET_VERSION
   The target version.  

Referenced by display_help().

struct spec_list* specs = (struct spec_list *) 0
   List of dynamically allocates specs that have been defined so far.  
const char* const standard_bindir_prefix = STANDARD_BINDIR_PREFIX
const char* const standard_exec_prefix = STANDARD_EXEC_PREFIX
   These directories are locations set at configure-time based on the
   --prefix option provided to configure.  Their initializers are
   defined in Makefile.in.  These paths are not *directly* used when
   gcc_exec_prefix is set because, in that case, we know where the
   compiler has been installed, and use paths relative to that
   location instead.  
const char* const standard_libexec_prefix = STANDARD_LIBEXEC_PREFIX
const char* const standard_startfile_prefix = STANDARD_STARTFILE_PREFIX
const char* const standard_startfile_prefix_1 = STANDARD_STARTFILE_PREFIX_1
const char* const standard_startfile_prefix_2 = STANDARD_STARTFILE_PREFIX_2
const char* startfile_prefix_spec = STARTFILE_PREFIX_SPEC
struct path_prefix startfile_prefixes = { 0, 0, "startfile" }
   List of prefixes to try when looking for startup (crt0) files.  
const char* startfile_spec = STARTFILE_SPEC
struct spec_function static_spec_functions[]
Initial value:
{ "getenv", getenv_spec_function },
{ "if-exists", if_exists_spec_function },
{ "if-exists-else", if_exists_else_spec_function },
{ "sanitize", sanitize_spec_function },
{ "replace-outfile", replace_outfile_spec_function },
{ "remove-outfile", remove_outfile_spec_function },
{ "version-compare", version_compare_spec_function },
{ "include", include_spec_function },
{ "find-file", find_file_spec_function },
{ "find-plugindir", find_plugindir_spec_function },
{ "print-asm-header", print_asm_header_spec_function },
{ "compare-debug-dump-opt", compare_debug_dump_opt_spec_function },
{ "compare-debug-self-opt", compare_debug_self_opt_spec_function },
{ "compare-debug-auxbase-opt", compare_debug_auxbase_opt_spec_function },
{ "pass-through-libs", pass_through_libs_spec_func },
{ "replace-extension", replace_extension_spec_func },
{ 0, 0 }
   List of static spec functions.  
struct spec_list static_specs[]
   List of statically defined specs.  
const char* suffix_subst
   Nonnull means substitute this for any suffix when outputting a switches
int suffixed_basename_length
struct switchstr* switches

Referenced by compare_files().

struct switchstr* switches_debug_check[2]
const char* sysroot_hdrs_suffix_spec = SYSROOT_HEADERS_SUFFIX_SPEC
const char* sysroot_spec = SYSROOT_SPEC
const char* sysroot_suffix_spec = SYSROOT_SUFFIX_SPEC
const char* target_sysroot_hdrs_suffix = 0
   Nonzero means append this string to target_system_root for headers.  
const char* target_sysroot_suffix = 0
   Nonzero means append this string to target_system_root.  
static const char * target_system_root = TARGET_SYSTEM_ROOT
   Nonzero means place this string before uses of /, so that include
   and library files can be found in an alternate location.  
int target_system_root_changed
   Nonzero means pass the updated target_system_root to the compiler.  
const char* temp_filename
   Record the names of temporary files we tell compilers to write,
   and delete them at the end of the run.  
   This is the common prefix we use to make temp file names.
   It is chosen once for each run of this program.
   It is substituted into a spec by %g or %j.
   Thus, all temp file names contain this prefix.
   In practice, all temp file names start with this prefix.

   This prefix comes from the envvar TMPDIR if it is defined;
   otherwise, from the P_tmpdir macro if that is defined;
   otherwise, in /usr/tmp or /tmp;
   or finally the current directory if all else fails.  
int temp_filename_length
   Length of the prefix.  
struct temp_name * temp_names
int this_is_library_file
   Nonzero means %s has been seen; the next arg to be terminated
   is the name of a library file and we should try the standard
   search dirs for it.  
int this_is_linker_script
   Nonzero means %T has been seen; the next arg to be terminated
   is the name of a linker script and we should try all of the
   standard search dirs for it.  If it is found insert a --script
   command line switch and then substitute the full path in place,
   otherwise generate an error message.  
int this_is_output_file
   Nonzero means %w has been seen; the next arg to be terminated
   is the output file name of this compilation.  
const char* const tooldir_base_prefix = TOOLDIR_BASE_PREFIX
   A relative path to be used in finding the location of tools
   relative to the driver.  
const char* trad_capable_cpp = "cc1 -E %{traditional|traditional-cpp:-traditional-cpp}"
   Standard options to cpp, cc1, and as, to reduce duplication in specs.
   There should be no need to override these in target dependent files,
   but we need to copy them to the specs file so that newer versions
   of the GCC driver can correctly drive older tool chains with the
   appropriate -B options.  
   When cpplib handles traditional preprocessing, get rid of this, and
   call cc1 (or cc1obj in objc/lang-specs.h) from the main specs so
   that we default the front end language better.  
struct user_specs* user_specs_head
struct user_specs * user_specs_tail
int verbose_only_flag
   Flag indicating whether we should ONLY print the command and
   arguments (like verbose_flag) without executing the command.
   Displayed arguments are quoted so that the generated command
   line is suitable for execution.  This is intended for use in
   shell scripts to capture the driver-generated command line.