diff options
author | Martin Liska <mliska@suse.cz> | 2019-01-16 10:38:21 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-01-16 09:38:21 +0000 |
commit | 99b1b1fac08f2e62b6ef5486180a449396599ca9 (patch) | |
tree | 27e1eeb13ffb1c747f0fe076af34c37e544f6cce /gcc/gcc.c | |
parent | 0684a81665555e219edafa6f46edfed7b9340b4e (diff) | |
download | gcc-99b1b1fac08f2e62b6ef5486180a449396599ca9.zip gcc-99b1b1fac08f2e62b6ef5486180a449396599ca9.tar.gz gcc-99b1b1fac08f2e62b6ef5486180a449396599ca9.tar.bz2 |
Extend locations where to seach for Fortran pre-include.
2019-01-16 Martin Liska <mliska@suse.cz>
* Makefile.in: Set TOOL_INCLUDE_DIR and NATIVE_SYSTEM_HEADER_DIR
for GCC driver.
* config/gnu-user.h (TARGET_F951_OPTIONS): Add 'finclude%s/' as
a new argument.
* gcc.c (add_sysrooted_hdrs_prefix): New function.
(path_prefix_reset): Move up in the source file.
(find_fortran_preinclude_file): Make complex search for the
fortran header files.
From-SVN: r267967
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r-- | gcc/gcc.c | 103 |
1 files changed, 83 insertions, 20 deletions
@@ -2976,6 +2976,44 @@ add_sysrooted_prefix (struct path_prefix *pprefix, const char *prefix, add_prefix (pprefix, prefix, component, priority, require_machine_suffix, os_multilib); } + +/* Same as add_prefix, but prepending target_sysroot_hdrs_suffix to prefix. */ + +static void +add_sysrooted_hdrs_prefix (struct path_prefix *pprefix, const char *prefix, + const char *component, + /* enum prefix_priority */ int priority, + int require_machine_suffix, int os_multilib) +{ + if (!IS_ABSOLUTE_PATH (prefix)) + fatal_error (input_location, "system path %qs is not absolute", prefix); + + if (target_system_root) + { + char *sysroot_no_trailing_dir_separator = xstrdup (target_system_root); + size_t sysroot_len = strlen (target_system_root); + + if (sysroot_len > 0 + && target_system_root[sysroot_len - 1] == DIR_SEPARATOR) + sysroot_no_trailing_dir_separator[sysroot_len - 1] = '\0'; + + if (target_sysroot_hdrs_suffix) + prefix = concat (sysroot_no_trailing_dir_separator, + target_sysroot_hdrs_suffix, prefix, NULL); + else + prefix = concat (sysroot_no_trailing_dir_separator, prefix, NULL); + + free (sysroot_no_trailing_dir_separator); + + /* We have to override this because GCC's notion of sysroot + moves along with GCC. */ + component = "GCC"; + } + + add_prefix (pprefix, prefix, component, priority, + require_machine_suffix, os_multilib); +} + /* Execute the command specified by the arguments on the current line of spec. When using pipes, this includes several piped-together commands @@ -9896,20 +9934,61 @@ debug_level_greater_than_spec_func (int argc, const char **argv) return NULL; } -/* The function takes 2 arguments: OPTION name and file name. +static void +path_prefix_reset (path_prefix *prefix) +{ + struct prefix_list *iter, *next; + iter = prefix->plist; + while (iter) + { + next = iter->next; + free (const_cast <char *> (iter->prefix)); + XDELETE (iter); + iter = next; + } + prefix->plist = 0; + prefix->max_len = 0; +} + +/* The function takes 3 arguments: OPTION name, file name and location + where we search for Fortran modules. When the FILE is found by find_file, return OPTION=path_to_file. */ static const char * find_fortran_preinclude_file (int argc, const char **argv) { - if (argc != 2) + char *result = NULL; + if (argc != 3) return NULL; + struct path_prefix prefixes = { 0, 0, "preinclude" }; + + /* Search first for 'finclude' folder location for a header file + installed by the compiler (similar to omp_lib.h). */ + add_prefix (&prefixes, argv[2], NULL, 0, 0, false); +#ifdef TOOL_INCLUDE_DIR + /* Then search: <prefix>/<target>/<include>/finclude */ + add_prefix (&prefixes, TOOL_INCLUDE_DIR "/finclude/", + NULL, 0, 0, false); +#endif +#ifdef NATIVE_SYSTEM_HEADER_DIR + /* Then search: <sysroot>/usr/include/finclude/<multilib> */ + add_sysrooted_hdrs_prefix (&prefixes, NATIVE_SYSTEM_HEADER_DIR "/finclude/", + NULL, 0, 0, false); +#endif + const char *path = find_a_file (&include_prefixes, argv[1], R_OK, true); if (path != NULL) - return concat (argv[0], path, NULL); + result = concat (argv[0], path, NULL); + else + { + path = find_a_file (&prefixes, argv[1], R_OK, true); + if (path != NULL) + result = concat (argv[0], path, NULL); + } - return NULL; + path_prefix_reset (&prefixes); + return result; } @@ -9961,22 +10040,6 @@ convert_white_space (char *orig) return orig; } -static void -path_prefix_reset (path_prefix *prefix) -{ - struct prefix_list *iter, *next; - iter = prefix->plist; - while (iter) - { - next = iter->next; - free (const_cast <char *> (iter->prefix)); - XDELETE (iter); - iter = next; - } - prefix->plist = 0; - prefix->max_len = 0; -} - /* Restore all state within gcc.c to the initial state, so that the driver code can be safely re-run in-process. |