On Tue, Aug 5, 2025 at 9:54 PM Andrew Pinski <pins...@gmail.com> wrote: > > On Tue, Aug 5, 2025 at 9:50 PM John Ericson <g...@johnericson.me> wrote: > > > > This matches the behavior of Clang, and makes it easier to work with > > cross compilers without heeding to hard-code paths at build time. > > Does it really make sense to match clang here? > The paths are relocable already too. > Can you expand on why you need/want this change? Since it changes > behavior that has been around for over 25 years now?
Also read https://inbox.sourceware.org/gcc-patches/20240522095404.1825269-1-...@gcc.gnu.org/ thread which was doing something slightly different but related. > > Thanks, > Andrew > > > > > 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 <g...@johnericson.me> > > --- > > 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 > >