This matches the behavior of Clang, and makes it easier to work with
cross compilers without heeding to hard-code paths at build time.
gcc/ChangeLog:
* gcc.cc (file_at_path): Remove program suffix logic (it is
moving elsewhere). This function no longer cares about programs
in particular, matching its name.
(program_at_path): New function that does care about programs in
particular. It has the preexisting suffixing logic (moved here)
and the new prefixing logic.
(find_a_program): Instead work by using for_each_path with
file_at_path, just as find_a_file uses file_at_path.
(driver::set_up_specs): Initial just_machine_prefix, a constant
used above.
Signed-off-by: John Ericson <[email protected]>
---
gcc/gcc.cc | 76 +++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 66 insertions(+), 10 deletions(-)
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index bfa588ee5f0..d3ba4d6565b 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -1600,6 +1600,11 @@ static const char *machine_suffix = 0;
static const char *just_machine_suffix = 0;
+/* Prefix to attach to *basename* of commands being searched.
+ This is just `MACHINE-'. */
+
+static const char *just_machine_prefix = 0;
+
/* Adjusted value of GCC_EXEC_PREFIX envvar. */
static const char *gcc_exec_prefix;
@@ -3043,15 +3048,6 @@ file_at_path (char *path, void *data)
memcpy (path + len, info->name, info->name_len);
len += info->name_len;
- /* Some systems have a suffix for executable files.
- So try appending that first. */
- if (info->suffix_len)
- {
- memcpy (path + len, info->suffix, info->suffix_len + 1);
- if (access_check (path, info->mode) == 0)
- return path;
- }
-
path[len] = '\0';
if (access_check (path, info->mode) == 0)
return path;
@@ -3091,6 +3087,44 @@ find_a_file (const struct path_prefix *pprefix, const
char *name, int mode,
file_at_path, &info);
}
+/* Callback for find_a_program. Appends the file name to the directory
+ path. Like file_at_path but tries machine prefix and exe suffix too. */
+
+static void *
+program_at_path (char *path, void *data)
+{
+ /* try first with machine-prefixed name */
+ struct file_at_path_info *info = (struct file_at_path_info *) data;
+ size_t path_len = strlen (path);
+
+ for (auto prefix : { just_machine_prefix, "" })
+ {
+ auto len = path_len;
+
+ auto prefix_len = strlen(prefix);
+ memcpy (path + len, prefix, prefix_len);
+ len += prefix_len;
+
+ memcpy (path + len, info->name, info->name_len);
+ len += info->name_len;
+
+ /* Some systems have a suffix for executable files.
+ So try appending that first. */
+ if (info->suffix_len)
+ {
+ memcpy (path + len, info->suffix, info->suffix_len + 1);
+ if (access_check (path, info->mode) == 0)
+ return path;
+ }
+
+ path[len] = '\0';
+ if (access_check (path, info->mode) == 0)
+ return path;
+ }
+
+ return NULL;
+}
+
/* Specialization of find_a_file for programs that also takes into account
configure-specified default programs. */
@@ -3114,7 +3148,28 @@ find_a_program (const char *name)
return xstrdup (DEFAULT_DSYMUTIL);
#endif
- return find_a_file (&exec_prefixes, name, X_OK, false);
+ /* Find the filename in question (special case for absolute paths). */
+
+ if (IS_ABSOLUTE_PATH (name))
+ {
+ if (access (name, mode) == 0)
+ return xstrdup (name);
+
+ return NULL;
+ }
+
+ struct file_at_path_info info;
+
+ info.name = name;
+ info.suffix = HOST_EXECUTABLE_SUFFIX;
+ info.name_len = strlen (info.name);
+ info.suffix_len = strlen (info.suffix);
+ info.mode = X_OK;
+
+ return (char*) for_each_path (
+ &exec_prefixes, false,
+ info.name_len + info.suffix_len + strlen(just_machine_prefix),
+ program_at_path, &info);
}
/* Ranking of prefixes in the sort list. -B prefixes are put before
@@ -8493,6 +8548,7 @@ driver::set_up_specs () const
machine_suffix = concat (spec_host_machine, dir_separator_str, spec_version,
accel_dir_suffix, dir_separator_str, NULL);
just_machine_suffix = concat (spec_machine, dir_separator_str, NULL);
+ just_machine_prefix = concat (spec_machine, "-", NULL);
specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true);
/* Read the specs file unless it is a default one. */
--
2.49.0