GCC Middle and Back End API 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 |
Typedefs | |
typedef char * | char_p |
typedef const char * | const_char_p |
Enumerations | |
enum | save_temps { SAVE_TEMPS_NONE, SAVE_TEMPS_CWD, SAVE_TEMPS_OBJ } |
enum | path_prefix_priority { PREFIX_PRIORITY_B_OPT, PREFIX_PRIORITY_LAST } |
Functions | |
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 compiler * | lookup_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_function * | lookup_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_function * | lookup_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 compiler * | lookup_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 () |
Variables | |
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_specs * | user_specs_head |
static struct user_specs * | user_specs_tail |
static struct compiler * | compilers |
static int | n_compilers |
static struct compiler | default_compilers [] |
static const int | n_default_compilers = ARRAY_SIZE (default_compilers) - 1 |
static vec< char_p > | linker_options |
static vec< char_p > | assembler_options |
static vec< char_p > | preprocessor_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_list * | extra_specs = (struct spec_list *) 0 |
static struct spec_list * | specs = (struct spec_list *) 0 |
static struct spec_function | static_spec_functions [] |
static int | processing_spec_function |
static vec< const_char_p > | argbuf |
static int | have_o_argbuf_index = 0 |
static int | have_c = 0 |
static int | have_o = 0 |
static struct temp_name * | temp_names |
static int | execution_count |
static int | signal_count |
static const char * | temp_filename |
static int | temp_filename_length |
static struct temp_file * | always_delete_queue |
static struct temp_file * | failure_delete_queue |
static struct switchstr * | switches |
static int | n_switches |
static int | n_switches_alloc |
int | compare_debug |
int | compare_debug_second |
const char * | compare_debug_opt |
static struct switchstr * | switches_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 infile * | infiles |
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 compiler * | input_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 mdswitchstr * | mdswitches |
static int | n_mdswitches |
static const char * | debug_auxbase_opt |
typedef char* char_p |
typedef const char* const_char_p |
Accumulate a command (program name and args), and run it.
enum path_prefix_priority |
enum save_temps |
|
static |
|
static |
Check whether NAME can be accessed in MODE. This is like access, except that it never considers directories to be executable.
|
static |
Referenced by display_help(), and save_switch().
|
static |
|
static |
Store an input file with the given NAME and LANGUAGE in infiles.
|
static |
Referenced by display_help().
|
static |
|
static |
Add an entry for PREFIX in PLIST. The PLIST is kept in ascending order according to PRIORITY. Within each PRIORITY, new entries are appended. 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 |
Referenced by display_help().
|
static |
|
static |
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.
priority | enum prefix_priority |
|
static |
References len, prefix_list::next, path_prefix::plist, and prefix_list::priority.
|
static |
Allocate the argument vector.
|
static |
Allocate space for an input file in infiles.
|
static |
Allocate space for a switch in switches.
|
static |
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 |
Referenced by handle_spec_function().
|
static |
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 |
Clear out the vector of arguments (after a command is executed).
|
static |
|
static |
%: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 |
%:compare-debug-dump-opt spec function. Save the last argument, expected to be the last -fdump-final-insns option, or generate a temporary.
|
static |
%:compare-debug-self-opt spec function. Expands to the options that are to be passed in the second compilation of compare-debug.
|
static |
Compare the contents of the two files named CMPFILE[0] and CMPFILE[1]. Return zero if they're identical, nonzero otherwise.
References compare_debug, do_self_spec(), n_switches, n_switches_alloc, save_temps_flag, SAVE_TEMPS_NONE, and switches.
|
static |
@verbatim
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 |
True if we should compile INFILE.
References memcpy().
|
static |
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 |
|
static |
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 |
Create a temporary FILE with the contents of ARGV. Add @FILE to the argument list.
|
static |
|
static |
|
static |
Delete all the files to be deleted on error.
|
static |
|
static |
|
static |
References free(), just_machine_suffix, and machine_suffix.
|
static |
Display the command line switches accepted by gcc.
The rest of the options are displayed by invocations of the various sub-processes.
References add_assembler_option(), add_linker_option(), add_preprocessor_option(), cl_decoded_option::arg, global_dc, init_spec(), is_cpp_driver, link_command_spec, spec_list::name, spec_list::next, cl_decoded_option::opt_index, print_help_list, print_subprocess_help, print_version, spec_list::ptr_spec, sl, spec_machine, spec_version, strlen(), and cl_decoded_option::value.
|
static |
|
static |
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 |
Referenced by compare_files().
|
static |
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 decode_cmdline_options_to_array.
Specs should only generate options, not input files.
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 |
Referenced by handle_spec_function(), and mark_matching_switches().
|
static |
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 suffix.
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 processed.
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 |
|
static |
|
static |
Process each member of VEC as a spec.
Make each accumulated option a separate argument.
References free(), and input_stat.
|
static |
Handle a driver option; arguments and return value as for handle_option.
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 processing.
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 processing.
"-###" 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 |
Handle an option DECODED that is unknown to the option-processing machinery.
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 |
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 options.
|
static |
If there is an argument being accumulated, terminate it and store it.
Script was not found on search path.
Referenced by do_spec().
|
static |
|
static |
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 arguments.
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 |
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 |
|
static |
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 |
Some systems have a suffix for executable files. So try appending that first.
|
static |
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 |
|
static |
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 |
|
static |
%: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 |
|
static |
%: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 |
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 |
Get a random number for -frandom-seed
Get some more or less random data.
|
static |
|
static |
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 |
Referenced by handle_spec_function().
|
static |
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 |
|
static |
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 match.
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 disjunction.
References find_a_file(), and spec_function::name.
|
static |
|
static |
Handle a spec function call of the form: %:function(args) 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 |
|
static |
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 |
|
static |
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 |
|
static |
%: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 |
|
static |
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 before.
Referenced by display_help().
|
static |
Subroutine of handle_braces. Returns true if the current input file's spec name matches the atom bracketed by ATOM and END_ATOM.
|
inlinestatic |
|
inlinestatic |
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 |
|
static |
Parse the WRAPPER string which is a comma separated list of the command line and insert them into the beginning of argbuf.
|
static |
Referenced by for_each_path().
|
static |
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 |
|
static |
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.
|
staticread |
|
staticread |
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.
|
staticread |
|
staticread |
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 places.
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 line.
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 slot.
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().
|
inlinestatic |
|
inlinestatic |
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 | ( | ) |
%: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 |
|
static |
void pfatal_with_name | ( | ) |
|
static |
%:print-asm-header spec function. Print a banner to say that the following output is from the assembler.
|
static |
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 |
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 |
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 decoded_options[0].arg.
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 decoded_options[0].arg.
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 vectors.
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.
|
inlinestatic |
Inline subroutine of handle_braces. Process all the currently marked switches through give_switch, and clear the marks.
|
static |
Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables for collect.
|
static |
Referenced by fatal_signal(), and print_multilib_info().
|
static |
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 |
|
static |
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 | ( | ) |
%:replace-extension spec function. Replaces the extension of the first argument with the second argument.
|
static |
|
static |
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 |
|
static |
|
static |
Referenced by do_spec_1().
|
static |
|
static |
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 |
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 |
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 |
Put the driver's standard set of option handlers in *HANDLERS.
References cl_decoded_option::arg, convert_filename(), offset, and strlen().
|
static |
Referenced by is_directory().
|
static |
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 |
|
static |
A fully-blank line is a delimiter in the SPEC file and shouldn't be considered whitespace.
|
static |
Must not damage the original path.
Referenced by do_self_spec().
|
static |
|
static |
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.
|
inlinestatic |
|
static |
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 |
|
static |
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 them.
|
static |
Look through the linked list of specs read from the specs file.
|
static |
|
static |
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().
|
inlinestatic |
|
inlinestatic |
We have a switch spec.
|
static |
|
static |
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 |
|
static |
Add or change the value of an environment variable, outputting the change to standard error if in verbose mode.
!fwpa __pad0__ |
|
static |
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.
|
static |
Queue of files to delete on success or failure of compilation.
|
static |
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).
|
static |
Vector of pointers to arguments in the current line of specifications.
|
static |
|
static |
|
static |
|
static |
A vector of options to give to the assembler. These options are accumulated by -Wa, and substituted into the assembler command with %Y.
|
static |
Flag set to nonzero if an @file argument has been supplied to gcc.
|
static |
|
static |
NB: This is shared amongst all front-ends, except for Ada.
|
static |
|
static |
|
static |
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.
|
static |
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.
|
static |
The compiler version.
|
static |
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.
|
static |
This contains cpp options which are not passed when the preprocessor output will be used by another program.
|
static |
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().
|
static |
|
static |
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 |
Nonzero if cross-compiling. When -b is used, the value comes from the `specs' file.
|
static |
|
static |
|
static |
The default list of file name suffixes and their compilation specs.
|
static |
Nonzero means %d or %g has been seen; the next arg to be terminated is a temporary file name.
|
static |
|
static |
|
static |
|
static |
List of prefixes to try when looking for executables.
|
static |
Number of commands executed so far.
|
static |
|
static |
Queue of files to delete on failure of compilation.
|
static |
Adjusted value of GCC_EXEC_PREFIX envvar.
|
static |
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.
|
static |
Adjusted value of standard_libexec_prefix.
|
static |
Greatest exit code of sub-processes that has been encountered up to now.
|
static |
Were the options -c, -S or -E passed.
|
static |
Was the option -o passed.
|
static |
Position in the argbuf vector containing the name of the output file (the value associated with the "-o" flag).
|
static |
List of prefixes to try when looking for include files.
|
static |
Also a vector of input files specified.
|
static |
|
static |
The compiler used to process the current input file.
|
static |
size_t input_filename_length |
|
static |
Nonzero means that the input of this command is coming from a pipe.
|
static |
Referenced by do_specs_vec().
|
static |
|
static |
|
static |
int is_cpp_driver |
Flag set by cppspec.c to 1.
Referenced by display_help().
|
static |
Suffix to attach to directories searched for commands. This is just `MACHINE/'.
Referenced by delete_temp_files().
|
static |
|
static |
|
static |
|
static |
Referenced by display_help().
|
static |
|
static |
|
static |
|
static |
Referenced by is_directory().
|
static |
|
static |
A vector of options to give to the linker. These options are accumulated by %x, and substituted into the linker command with %X.
|
static |
|
static |
|
static |
|
static |
Suffix to attach to directories searched for commands. This looks like `MACHINE/VERSION/'.
Referenced by delete_temp_files().
|
static |
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.
|
static |
|
static |
|
static |
|
static |
Subdirectory to use for locating libraries in multiarch conventions. Set by set_multilib_dir based on the compilation options.
|
static |
|
static |
|
static |
Subdirectory to use for locating libraries. Set by set_multilib_dir based on the compilation options.
|
static |
|
static |
|
static |
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.
|
static |
Subdirectory to use for locating libraries in OS conventions. Set by set_multilib_dir based on the compilation options.
|
static |
|
static |
|
static |
Number of entries in `compilers', not counting the null terminator.
|
static |
Number of elements in default_compilers, not counting the terminator.
int n_infiles |
|
static |
|
static |
|
static |
Referenced by compare_files(), handle_spec_function(), and input_suffix_matches().
|
static |
Referenced by compare_files().
|
static |
|
static |
|
static |
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().
|
static |
const char** outfiles |
And a vector of corresponding output files is made up later.
A vector of options to give to the preprocessor. These options are accumulated by -Wp, and substituted into the preprocessor command with %Z.
|
static |
Definition of string containing the arguments given to configure.
Flag saying to print the command line options understood by gcc and its sub-processes.
Referenced by display_help().
|
static |
Flag indicating how to print command line options of sub-processes.
Referenced by display_help().
|
static |
Flag saying to print the version of gcc and its sub-processes.
Referenced by display_help(), and main().
|
static |
FILE* report_times_to_file = NULL |
Whether we should report subprocess execution times to a file.
|
static |
Referenced by compare_files().
|
static |
|
static |
Output file to use to get the object directory for -save-temps=obj
|
static |
|
static |
Number of commands that exited with a signal.
|
static |
|
static |
The target machine.
Referenced by display_help().
|
static |
The target version.
Referenced by display_help().
List of dynamically allocates specs that have been defined so far.
|
static |
|
static |
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.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
List of prefixes to try when looking for startup (crt0) files.
|
static |
|
static |
List of static spec functions.
|
static |
List of statically defined specs.
|
static |
Nonnull means substitute this for any suffix when outputting a switches arguments.
|
static |
|
static |
Referenced by compare_files().
|
static |
|
static |
|
static |
|
static |
|
static |
Nonzero means append this string to target_system_root for headers.
|
static |
Nonzero means append this string to target_system_root.
|
static |
Nonzero means place this string before uses of /, so that include and library files can be found in an alternate location.
|
static |
Nonzero means pass the updated target_system_root to the compiler.
|
static |
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.
|
static |
Length of the prefix.
|
static |
|
static |
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.
|
static |
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.
|
static |
Nonzero means %w has been seen; the next arg to be terminated is the output file name of this compilation.
|
static |
A relative path to be used in finding the location of tools relative to the driver.
|
static |
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.
|
static |
|
static |
|
static |
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.