| [4fc5a87] | 1 | Submitted By: Ryan Oliver <ryan at pha dot com dot au> | 
|---|
|  | 2 | Date: 2006-03-10 | 
|---|
|  | 3 | Initial Package Version: 4.1.0 | 
|---|
|  | 4 | Origin: GCC SVN Revision 108635 (diffed against 4.1.0 release) | 
|---|
|  | 5 | Upstream Status: In GCC trunk | 
|---|
|  | 6 | Description: Fix for PR20425 | 
|---|
|  | 7 |  | 
|---|
| [89d1048] | 8 | Modified by Jim Gifford for 4.1.1 | 
|---|
|  | 9 |  | 
|---|
| [4fc5a87] | 10 | From http://gcc.gnu.org/ml/gcc-patches/2005-12/msg00818.html | 
|---|
|  | 11 | ---------------------------------8<------------------------------------ | 
|---|
|  | 12 | This gives the gcc driver a new path iteration function, for_each_path, | 
|---|
|  | 13 | and uses it everywhere, making path iteration a little more consistent. | 
|---|
|  | 14 | for_each_path uses the same path ordering as the existing find_file | 
|---|
|  | 15 | function.  I've also tweaked some of the existing find_a_file calls for | 
|---|
|  | 16 | consistency, and uncovered and fixed some other bugs.. | 
|---|
|  | 17 |  | 
|---|
|  | 18 | Functional changes are: | 
|---|
|  | 19 |  | 
|---|
|  | 20 | o  %D library paths are printed in the same order as gcc uses elsewhere | 
|---|
|  | 21 | when searching library directories, ie. all multilib paths are first. | 
|---|
|  | 22 | http://gcc.gnu.org/ml/gcc-patches/2005-03/msg02044.html effectively | 
|---|
|  | 23 | reverted by the rewrite because I believe the same speedup is gained | 
|---|
|  | 24 | by searching the right dirs first. | 
|---|
|  | 25 |  | 
|---|
|  | 26 | o  gcc -print-search-dirs prints library multilib paths followed by | 
|---|
|  | 27 | non-multilib paths where before we just printed non-multilib paths. | 
|---|
|  | 28 |  | 
|---|
|  | 29 | o  LIBRARY_PATH_ENV similarly includes multilib directories. | 
|---|
|  | 30 |  | 
|---|
|  | 31 | o  All searches of startfile_prefixes now look in multilib dirs first | 
|---|
|  | 32 | followed by non-multilib dirs.  This changes the dirs we search for | 
|---|
|  | 33 | spec files, and %include and %include_noerr in specs.  Previously | 
|---|
|  | 34 | we only searched the non-multilib dirs for specs files.  I think this | 
|---|
|  | 35 | change is worthwhile just for consistency, and the extension is | 
|---|
|  | 36 | reasonable.  For instance, it would allow different spec files to be | 
|---|
|  | 37 | used for gcc -m64 vs. gcc -m32.  However, if others think this wrong, | 
|---|
|  | 38 | I won't argue.  Consistency isn't everything. | 
|---|
|  | 39 |  | 
|---|
|  | 40 | o  Some attempt made to prevent searching of duplicate paths.  The old | 
|---|
|  | 41 | find_file would search some paths twice (when multilib_dir was NULL | 
|---|
|  | 42 | but multilib_os_dir non-NULL).  We still search twice in some cases, | 
|---|
|  | 43 | eg. /usr/lib/../lib and /usr/lib are considered different paths. | 
|---|
|  | 44 |  | 
|---|
|  | 45 | o  find_a_file with last param (do_multi) true now searches both | 
|---|
|  | 46 | multilib and non-multilib paths.  Before, do_multi (well, the old | 
|---|
|  | 47 | param name was multilib) meant just search multilib paths.  This | 
|---|
|  | 48 | isn't a user-visible change as the only place where find_a_file was | 
|---|
|  | 49 | invoked with the last param true was from find_file, where we | 
|---|
|  | 50 | immediately followed with a non-multilib find_a_file. | 
|---|
|  | 51 |  | 
|---|
|  | 52 | o  Memory leaks fixed in is_directory. | 
|---|
|  | 53 |  | 
|---|
|  | 54 | o  LIBRARY_PATH_ENV and COMPILER_PATH now only have existing | 
|---|
|  | 55 | directories, making LIBRARY_PATH_ENV closer to %D paths.  The | 
|---|
|  | 56 | following lines (which I remove) in is_directory meant that | 
|---|
|  | 57 | is_directory didn't do much for LIBRARY_PATH_ENV, except on | 
|---|
|  | 58 | SMALL_ARG_MAX machines. | 
|---|
|  | 59 |  | 
|---|
|  | 60 | 4278        ian #ifndef SMALL_ARG_MAX | 
|---|
|  | 61 | 4278        ian   if (! linker) | 
|---|
|  | 62 | 4278        ian     return 1; | 
|---|
|  | 63 | 4278        ian #endif | 
|---|
|  | 64 |  | 
|---|
|  | 65 | I'll also remove mention of SMALL_ARG_MAX in config and doc files | 
|---|
|  | 66 | when I commit this change as this is the only place it is used. | 
|---|
|  | 67 |  | 
|---|
|  | 68 | o  gcc -Bnon-dir-prefix- now works properly.  The previously mentioned | 
|---|
|  | 69 | is_directory peculiarity affected the following code. | 
|---|
|  | 70 |  | 
|---|
|  | 71 | 43664      nickc /* Catch the case where the user has forgotten to append a | 
|---|
|  | 72 | 46063      jsm28    directory separator to the path.  Note, they may be using | 
|---|
|  | 73 | 43664      nickc    -B to add an executable name prefix, eg "i386-elf-", in | 
|---|
|  | 74 | 43664      nickc    order to distinguish between multiple installations of | 
|---|
|  | 75 | 43664      nickc    GCC in the same directory.  Hence we must check to see | 
|---|
|  | 76 | 43664      nickc    if appending a directory separator actually makes a | 
|---|
|  | 77 | 43664      nickc    valid directory name.  */ | 
|---|
|  | 78 | 43664      nickc if (! IS_DIR_SEPARATOR (value [len - 1]) | 
|---|
|  | 79 | 43664      nickc     && is_directory (value, "", 0)) | 
|---|
|  | 80 | 43664      nickc   { | 
|---|
|  | 81 | 43767      ghazi     char *tmp = xmalloc (len + 2); | 
|---|
|  | 82 | 43767      ghazi     strcpy (tmp, value); | 
|---|
|  | 83 | 43767      ghazi     tmp[len] = DIR_SEPARATOR; | 
|---|
|  | 84 | 43767      ghazi     tmp[++ len] = 0; | 
|---|
|  | 85 | 43767      ghazi     value = tmp; | 
|---|
|  | 86 | 43664      nickc   } | 
|---|
|  | 87 |  | 
|---|
|  | 88 | Bootstrapped and regression tested powerpc64-linux and powerpc-linux on | 
|---|
|  | 89 | a previous iteration of this patch missing is_directory fixes. | 
|---|
|  | 90 | Currently running tests on this patch. | 
|---|
|  | 91 | ---------------------------------8<------------------------------------ | 
|---|
|  | 92 |  | 
|---|
|  | 93 | diff -uNr gcc-4.1.0/gcc/config.build gcc-4.1.0-PR20425/gcc/config.build | 
|---|
|  | 94 | --- gcc-4.1.0/gcc/config.build  2005-06-25 12:02:01.000000000 +1000 | 
|---|
|  | 95 | +++ gcc-4.1.0-PR20425/gcc/config.build  2006-03-10 23:47:02.000000000 +1100 | 
|---|
|  | 96 | @@ -90,15 +90,10 @@ | 
|---|
|  | 97 | build_install_headers_dir=install-headers-cpio | 
|---|
|  | 98 | ;; | 
|---|
|  | 99 | i[34567]86-sequent-ptx4* | i[34567]86-sequent-sysv4* ) | 
|---|
|  | 100 | -    build_xm_defines="SMALL_ARG_MAX" | 
|---|
|  | 101 | build_install_headers_dir=install-headers-cpio | 
|---|
|  | 102 | ;; | 
|---|
|  | 103 | -  i[34567]86-*-solaris2*) | 
|---|
|  | 104 | -    build_xm_defines="SMALL_ARG_MAX" | 
|---|
|  | 105 | -    ;; | 
|---|
|  | 106 | i[34567]86-*-sysv4*) | 
|---|
|  | 107 | # Intel x86 running system V r4 | 
|---|
|  | 108 | -    build_xm_defines="SMALL_ARG_MAX" | 
|---|
|  | 109 | build_install_headers_dir=install-headers-cpio | 
|---|
|  | 110 | ;; | 
|---|
|  | 111 | i[34567]86-*-udk*) | 
|---|
|  | 112 | diff -uNr gcc-4.1.0/gcc/config.gcc gcc-4.1.0-PR20425/gcc/config.gcc | 
|---|
|  | 113 | --- gcc-4.1.0/gcc/config.gcc    2006-02-07 03:07:46.000000000 +1100 | 
|---|
|  | 114 | +++ gcc-4.1.0-PR20425/gcc/config.gcc    2006-03-10 23:47:20.000000000 +1100 | 
|---|
|  | 115 | @@ -994,7 +994,6 @@ | 
|---|
|  | 116 | then | 
|---|
|  | 117 | tm_file="${tm_file} usegas.h" | 
|---|
|  | 118 | fi | 
|---|
|  | 119 | -       xm_defines="SMALL_ARG_MAX" | 
|---|
|  | 120 | tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h ptx4.h i386/ptx4-i.h" | 
|---|
|  | 121 | tmake_file=t-svr4 | 
|---|
|  | 122 | extra_parts="crtbegin.o crtend.o" | 
|---|
|  | 123 | @@ -1125,7 +1124,6 @@ | 
|---|
|  | 124 | use_fixproto=yes | 
|---|
|  | 125 | ;; | 
|---|
|  | 126 | i[34567]86-*-solaris2*) | 
|---|
|  | 127 | -       xm_defines="SMALL_ARG_MAX" | 
|---|
|  | 128 | tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h i386/sysv4.h sol2.h" | 
|---|
|  | 129 | case ${target} in | 
|---|
|  | 130 | *-*-solaris2.[0-6] | *-*-solaris2.[0-6].*) | 
|---|
|  | 131 | @@ -1192,7 +1190,6 @@ | 
|---|
|  | 132 | use_fixproto=yes | 
|---|
|  | 133 | ;; | 
|---|
|  | 134 | i[34567]86-*-sysv4*)           # Intel 80386's running system V.4 | 
|---|
|  | 135 | -       xm_defines="SMALL_ARG_MAX" | 
|---|
|  | 136 | tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h i386/sysv4.h i386/sysv4-cpp.h" | 
|---|
|  | 137 | if test x$stabs = xyes | 
|---|
|  | 138 | then | 
|---|
|  | 139 | diff -uNr gcc-4.1.0/gcc/config.host gcc-4.1.0-PR20425/gcc/config.host | 
|---|
|  | 140 | --- gcc-4.1.0/gcc/config.host   2006-02-06 03:18:20.000000000 +1100 | 
|---|
|  | 141 | +++ gcc-4.1.0-PR20425/gcc/config.host   2006-03-10 23:47:52.000000000 +1100 | 
|---|
|  | 142 | @@ -135,17 +135,10 @@ | 
|---|
|  | 143 | i370-*-opened* | i370-*-mvs* ) # IBM 360/370/390 Architecture | 
|---|
|  | 144 | host_xm_defines='FATAL_EXIT_CODE=12' | 
|---|
|  | 145 | ;; | 
|---|
|  | 146 | -  i[34567]86-sequent-ptx4*) | 
|---|
|  | 147 | -    host_xm_defines="SMALL_ARG_MAX" | 
|---|
|  | 148 | -    ;; | 
|---|
|  | 149 | i[34567]86-*-solaris2*) | 
|---|
|  | 150 | -    host_xm_defines="SMALL_ARG_MAX" | 
|---|
|  | 151 | out_host_hook_obj=host-solaris.o | 
|---|
|  | 152 | host_xmake_file=x-solaris | 
|---|
|  | 153 | ;; | 
|---|
|  | 154 | -  i[34567]86-*-sysv4*) # Intel 80386's running System V Release 4 | 
|---|
|  | 155 | -    host_xm_defines="SMALL_ARG_MAX" | 
|---|
|  | 156 | -    ;; | 
|---|
|  | 157 | i[34567]86-pc-msdosdjgpp*) | 
|---|
|  | 158 | host_xm_file=i386/xm-djgpp.h | 
|---|
|  | 159 | host_exeext=.exe | 
|---|
|  | 160 | diff -uNr gcc-4.1.0/gcc/doc/hostconfig.texi gcc-4.1.0-PR20425/gcc/doc/hostconfig.texi | 
|---|
|  | 161 | --- gcc-4.1.0/gcc/doc/hostconfig.texi   2004-11-24 15:31:58.000000000 +1100 | 
|---|
|  | 162 | +++ gcc-4.1.0-PR20425/gcc/doc/hostconfig.texi   2006-03-10 23:48:20.000000000 +1100 | 
|---|
|  | 163 | @@ -208,11 +208,6 @@ | 
|---|
|  | 164 | If defined, a C statement (sans semicolon) that performs host-dependent | 
|---|
|  | 165 | initialization when a compilation driver is being initialized. | 
|---|
|  | 166 |  | 
|---|
|  | 167 | -@item SMALL_ARG_MAX | 
|---|
|  | 168 | -Define this macro if the host system has a small limit on the total | 
|---|
|  | 169 | -size of an argument vector.  This causes the driver to take more care | 
|---|
|  | 170 | -not to pass unnecessary arguments to subprocesses. | 
|---|
|  | 171 | - | 
|---|
|  | 172 | @item HOST_LONG_LONG_FORMAT | 
|---|
|  | 173 | If defined, the string used to indicate an argument of type @code{long | 
|---|
|  | 174 | long} to functions like @code{printf}.  The default value is | 
|---|
|  | 175 | diff -uNr gcc-4.1.0/gcc/gcc.c gcc-4.1.0-PR20425/gcc/gcc.c | 
|---|
|  | 176 | --- gcc-4.1.0/gcc/gcc.c 2006-01-22 05:29:08.000000000 +1100 | 
|---|
|  | 177 | +++ gcc-4.1.0-PR20425/gcc/gcc.c 2006-03-10 22:14:35.000000000 +1100 | 
|---|
|  | 178 | @@ -287,10 +287,12 @@ | 
|---|
|  | 179 | static void read_specs (const char *, int); | 
|---|
|  | 180 | static void set_spec (const char *, const char *); | 
|---|
|  | 181 | static struct compiler *lookup_compiler (const char *, size_t, const char *); | 
|---|
|  | 182 | -static char *build_search_list (struct path_prefix *, const char *, int); | 
|---|
|  | 183 | -static void putenv_from_prefixes (struct path_prefix *, const char *); | 
|---|
|  | 184 | +static char *build_search_list (const struct path_prefix *, const char *, | 
|---|
|  | 185 | +                               bool, bool); | 
|---|
|  | 186 | +static void putenv_from_prefixes (const struct path_prefix *, const char *, | 
|---|
|  | 187 | +                                 bool); | 
|---|
|  | 188 | static int access_check (const char *, int); | 
|---|
|  | 189 | -static char *find_a_file (struct path_prefix *, const char *, int, int); | 
|---|
|  | 190 | +static char *find_a_file (const struct path_prefix *, const char *, int, bool); | 
|---|
|  | 191 | static void add_prefix (struct path_prefix *, const char *, const char *, | 
|---|
|  | 192 | int, int, int); | 
|---|
|  | 193 | static void add_sysrooted_prefix (struct path_prefix *, const char *, | 
|---|
|  | 194 | @@ -313,13 +315,12 @@ | 
|---|
|  | 195 | static const char *handle_spec_function (const char *); | 
|---|
|  | 196 | static char *save_string (const char *, int); | 
|---|
|  | 197 | static void set_collect_gcc_options (void); | 
|---|
|  | 198 | -static void do_spec_path (struct prefix_list *, const char *, int, int, int, const char *, const char *); | 
|---|
|  | 199 | static int do_spec_1 (const char *, int, const char *); | 
|---|
|  | 200 | static int do_spec_2 (const char *); | 
|---|
|  | 201 | static void do_option_spec (const char *, const char *); | 
|---|
|  | 202 | static void do_self_spec (const char *); | 
|---|
|  | 203 | static const char *find_file (const char *); | 
|---|
|  | 204 | -static int is_directory (const char *, const char *, int); | 
|---|
|  | 205 | +static int is_directory (const char *, bool); | 
|---|
|  | 206 | static const char *validate_switches (const char *); | 
|---|
|  | 207 | static void validate_all_switches (void); | 
|---|
|  | 208 | static inline void validate_switches_from_spec (const char *); | 
|---|
|  | 209 | @@ -2036,7 +2037,7 @@ | 
|---|
|  | 210 | (long) (p1 - buffer + 1)); | 
|---|
|  | 211 |  | 
|---|
|  | 212 | p[-2] = '\0'; | 
|---|
|  | 213 | -             new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0); | 
|---|
|  | 214 | +             new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true); | 
|---|
|  | 215 | read_specs (new_filename ? new_filename : p1, FALSE); | 
|---|
|  | 216 | continue; | 
|---|
|  | 217 | } | 
|---|
|  | 218 | @@ -2055,7 +2056,7 @@ | 
|---|
|  | 219 | (long) (p1 - buffer + 1)); | 
|---|
|  | 220 |  | 
|---|
|  | 221 | p[-2] = '\0'; | 
|---|
|  | 222 | -             new_filename = find_a_file (&startfile_prefixes, p1, R_OK, 0); | 
|---|
|  | 223 | +             new_filename = find_a_file (&startfile_prefixes, p1, R_OK, true); | 
|---|
|  | 224 | if (new_filename) | 
|---|
|  | 225 | read_specs (new_filename, FALSE); | 
|---|
|  | 226 | else if (verbose_flag) | 
|---|
|  | 227 | @@ -2352,65 +2353,214 @@ | 
|---|
|  | 228 | failure_delete_queue = 0; | 
|---|
|  | 229 | } | 
|---|
|  | 230 |  | 
|---|
|  | 231 |  | 
|---|
|  | 232 | -/* Build a list of search directories from PATHS. | 
|---|
|  | 233 | -   PREFIX is a string to prepend to the list. | 
|---|
|  | 234 | -   If CHECK_DIR_P is nonzero we ensure the directory exists. | 
|---|
|  | 235 | -   This is used mostly by putenv_from_prefixes so we use `collect_obstack'. | 
|---|
|  | 236 | -   It is also used by the --print-search-dirs flag.  */ | 
|---|
|  | 237 | - | 
|---|
|  | 238 | -static char * | 
|---|
|  | 239 | -build_search_list (struct path_prefix *paths, const char *prefix, | 
|---|
|  | 240 | -                  int check_dir_p) | 
|---|
|  | 241 | +/* Call CALLBACK for each path in PATHS, breaking out early if CALLBACK | 
|---|
|  | 242 | +   returns non-NULL. | 
|---|
|  | 243 | +   If DO_MULTI is true iterate over the paths twice, first with multilib | 
|---|
|  | 244 | +   suffix then without, otherwise iterate over the paths once without | 
|---|
|  | 245 | +   adding a multilib suffix.  When DO_MULTI is true, some attempt is made | 
|---|
|  | 246 | +   to avoid visiting the same path twice, but we could do better.  For | 
|---|
|  | 247 | +   instance, /usr/lib/../lib is considered different from /usr/lib. | 
|---|
|  | 248 | +   At least EXTRA_SPACE chars past the end of the path passed to | 
|---|
|  | 249 | +   CALLBACK are available for use by the callback. | 
|---|
|  | 250 | +   CALLBACK_INFO allows extra parameters to be passed to CALLBACK. | 
|---|
|  | 251 | + | 
|---|
|  | 252 | +   Returns the value returned by CALLBACK.  */ | 
|---|
|  | 253 | + | 
|---|
|  | 254 | +static void * | 
|---|
|  | 255 | +for_each_path (const struct path_prefix *paths, | 
|---|
|  | 256 | +              bool do_multi, | 
|---|
|  | 257 | +              size_t extra_space, | 
|---|
|  | 258 | +              void *(*callback) (char *, void *), | 
|---|
|  | 259 | +              void *callback_info) | 
|---|
|  | 260 | { | 
|---|
|  | 261 | -  int suffix_len = (machine_suffix) ? strlen (machine_suffix) : 0; | 
|---|
|  | 262 | -  int just_suffix_len | 
|---|
|  | 263 | -    = (just_machine_suffix) ? strlen (just_machine_suffix) : 0; | 
|---|
|  | 264 | -  int first_time = TRUE; | 
|---|
|  | 265 | -  struct prefix_list *pprefix; | 
|---|
|  | 266 | - | 
|---|
|  | 267 | -  obstack_grow (&collect_obstack, prefix, strlen (prefix)); | 
|---|
|  | 268 | -  obstack_1grow (&collect_obstack, '='); | 
|---|
|  | 269 | +  struct prefix_list *pl; | 
|---|
|  | 270 | +  const char *multi_dir = NULL; | 
|---|
|  | 271 | +  const char *multi_os_dir = NULL; | 
|---|
|  | 272 | +  const char *multi_suffix; | 
|---|
|  | 273 | +  const char *just_multi_suffix; | 
|---|
|  | 274 | +  char *path = NULL; | 
|---|
|  | 275 | +  void *ret = NULL; | 
|---|
|  | 276 | +  bool skip_multi_dir = false; | 
|---|
|  | 277 | +  bool skip_multi_os_dir = false; | 
|---|
|  | 278 | + | 
|---|
|  | 279 | +  multi_suffix = machine_suffix; | 
|---|
|  | 280 | +  just_multi_suffix = just_machine_suffix; | 
|---|
|  | 281 | +  if (do_multi && multilib_dir && strcmp (multilib_dir, ".") != 0) | 
|---|
|  | 282 | +    { | 
|---|
|  | 283 | +      multi_dir = concat (multilib_dir, dir_separator_str, NULL); | 
|---|
|  | 284 | +      multi_suffix = concat (multi_suffix, multi_dir, NULL); | 
|---|
|  | 285 | +      just_multi_suffix = concat (just_multi_suffix, multi_dir, NULL); | 
|---|
|  | 286 | +    } | 
|---|
|  | 287 | +  if (do_multi && multilib_os_dir && strcmp (multilib_os_dir, ".") != 0) | 
|---|
|  | 288 | +    multi_os_dir = concat (multilib_os_dir, dir_separator_str, NULL); | 
|---|
|  | 289 |  | 
|---|
|  | 290 | -  for (pprefix = paths->plist; pprefix != 0; pprefix = pprefix->next) | 
|---|
|  | 291 | +  while (1) | 
|---|
|  | 292 | { | 
|---|
|  | 293 | -      int len = strlen (pprefix->prefix); | 
|---|
|  | 294 | +      size_t multi_dir_len = 0; | 
|---|
|  | 295 | +      size_t multi_os_dir_len = 0; | 
|---|
|  | 296 | +      size_t suffix_len; | 
|---|
|  | 297 | +      size_t just_suffix_len; | 
|---|
|  | 298 | +      size_t len; | 
|---|
|  | 299 | + | 
|---|
|  | 300 | +      if (multi_dir) | 
|---|
|  | 301 | +       multi_dir_len = strlen (multi_dir); | 
|---|
|  | 302 | +      if (multi_os_dir) | 
|---|
|  | 303 | +       multi_os_dir_len = strlen (multi_os_dir); | 
|---|
|  | 304 | +      suffix_len = strlen (multi_suffix); | 
|---|
|  | 305 | +      just_suffix_len = strlen (just_multi_suffix); | 
|---|
|  | 306 | + | 
|---|
|  | 307 | +      if (path == NULL) | 
|---|
|  | 308 | +       { | 
|---|
|  | 309 | +         len = paths->max_len + extra_space + 1; | 
|---|
|  | 310 | +         if (suffix_len > multi_os_dir_len) | 
|---|
|  | 311 | +           len += suffix_len; | 
|---|
|  | 312 | +         else | 
|---|
|  | 313 | +           len += multi_os_dir_len; | 
|---|
|  | 314 | +         path = xmalloc (len); | 
|---|
|  | 315 | +       } | 
|---|
|  | 316 |  | 
|---|
|  | 317 | -      if (machine_suffix | 
|---|
|  | 318 | -         && (! check_dir_p | 
|---|
|  | 319 | -             || is_directory (pprefix->prefix, machine_suffix, 0))) | 
|---|
|  | 320 | +      for (pl = paths->plist; pl != 0; pl = pl->next) | 
|---|
|  | 321 | { | 
|---|
|  | 322 | -         if (!first_time) | 
|---|
|  | 323 | -           obstack_1grow (&collect_obstack, PATH_SEPARATOR); | 
|---|
|  | 324 | +         len = strlen (pl->prefix); | 
|---|
|  | 325 | +         memcpy (path, pl->prefix, len); | 
|---|
|  | 326 |  | 
|---|
|  | 327 | -         first_time = FALSE; | 
|---|
|  | 328 | -         obstack_grow (&collect_obstack, pprefix->prefix, len); | 
|---|
|  | 329 | -         obstack_grow (&collect_obstack, machine_suffix, suffix_len); | 
|---|
|  | 330 | -       } | 
|---|
|  | 331 | +         /* Look first in MACHINE/VERSION subdirectory.  */ | 
|---|
|  | 332 | +         if (!skip_multi_dir) | 
|---|
|  | 333 | +           { | 
|---|
|  | 334 | +             memcpy (path + len, multi_suffix, suffix_len + 1); | 
|---|
|  | 335 | +             ret = callback (path, callback_info); | 
|---|
|  | 336 | +             if (ret) | 
|---|
|  | 337 | +               break; | 
|---|
|  | 338 | +           } | 
|---|
|  | 339 |  | 
|---|
|  | 340 | -      if (just_machine_suffix | 
|---|
|  | 341 | -         && pprefix->require_machine_suffix == 2 | 
|---|
|  | 342 | -         && (! check_dir_p | 
|---|
|  | 343 | -             || is_directory (pprefix->prefix, just_machine_suffix, 0))) | 
|---|
|  | 344 | -       { | 
|---|
|  | 345 | -         if (! first_time) | 
|---|
|  | 346 | -           obstack_1grow (&collect_obstack, PATH_SEPARATOR); | 
|---|
|  | 347 | +         /* Some paths are tried with just the machine (ie. target) | 
|---|
|  | 348 | +            subdir.  This is used for finding as, ld, etc.  */ | 
|---|
|  | 349 | +         if (!skip_multi_dir | 
|---|
|  | 350 | +             && pl->require_machine_suffix == 2) | 
|---|
|  | 351 | +           { | 
|---|
|  | 352 | +             memcpy (path + len, just_multi_suffix, just_suffix_len + 1); | 
|---|
|  | 353 | +             ret = callback (path, callback_info); | 
|---|
|  | 354 | +             if (ret) | 
|---|
|  | 355 | +               break; | 
|---|
|  | 356 | +           } | 
|---|
|  | 357 | + | 
|---|
|  | 358 | +         /* Now try the base path.  */ | 
|---|
|  | 359 | +         if (!pl->require_machine_suffix | 
|---|
|  | 360 | +             && !(pl->os_multilib ? skip_multi_os_dir : skip_multi_dir)) | 
|---|
|  | 361 | +           { | 
|---|
|  | 362 | +             const char *this_multi; | 
|---|
|  | 363 | +             size_t this_multi_len; | 
|---|
|  | 364 | + | 
|---|
|  | 365 | +             if (pl->os_multilib) | 
|---|
|  | 366 | +               { | 
|---|
|  | 367 | +                 this_multi = multi_os_dir; | 
|---|
|  | 368 | +                 this_multi_len = multi_os_dir_len; | 
|---|
|  | 369 | +               } | 
|---|
|  | 370 | +             else | 
|---|
|  | 371 | +               { | 
|---|
|  | 372 | +                 this_multi = multi_dir; | 
|---|
|  | 373 | +                 this_multi_len = multi_dir_len; | 
|---|
|  | 374 | +               } | 
|---|
|  | 375 |  | 
|---|
|  | 376 | -         first_time = FALSE; | 
|---|
|  | 377 | -         obstack_grow (&collect_obstack, pprefix->prefix, len); | 
|---|
|  | 378 | -         obstack_grow (&collect_obstack, just_machine_suffix, | 
|---|
|  | 379 | -                       just_suffix_len); | 
|---|
|  | 380 | +             if (this_multi_len) | 
|---|
|  | 381 | +               memcpy (path + len, this_multi, this_multi_len + 1); | 
|---|
|  | 382 | +             else | 
|---|
|  | 383 | +               path[len] = '\0'; | 
|---|
|  | 384 | + | 
|---|
|  | 385 | +             ret = callback (path, callback_info); | 
|---|
|  | 386 | +             if (ret) | 
|---|
|  | 387 | +               break; | 
|---|
|  | 388 | +           } | 
|---|
|  | 389 | } | 
|---|
|  | 390 | +      if (pl) | 
|---|
|  | 391 | +       break; | 
|---|
|  | 392 |  | 
|---|
|  | 393 | -      if (! pprefix->require_machine_suffix) | 
|---|
|  | 394 | -       { | 
|---|
|  | 395 | -         if (! first_time) | 
|---|
|  | 396 | -           obstack_1grow (&collect_obstack, PATH_SEPARATOR); | 
|---|
|  | 397 | +      if (multi_dir == NULL && multi_os_dir == NULL) | 
|---|
|  | 398 | +       break; | 
|---|
|  | 399 |  | 
|---|
|  | 400 | -         first_time = FALSE; | 
|---|
|  | 401 | -         obstack_grow (&collect_obstack, pprefix->prefix, len); | 
|---|
|  | 402 | +      /* Run through the paths again, this time without multilibs. | 
|---|
|  | 403 | +        Don't repeat any we have already seen.  */ | 
|---|
|  | 404 | +      if (multi_dir) | 
|---|
|  | 405 | +       { | 
|---|
|  | 406 | +         free ((char *) multi_dir); | 
|---|
|  | 407 | +         multi_dir = NULL; | 
|---|
|  | 408 | +         free ((char *) multi_suffix); | 
|---|
|  | 409 | +         multi_suffix = machine_suffix; | 
|---|
|  | 410 | +         free ((char *) just_multi_suffix); | 
|---|
|  | 411 | +         just_multi_suffix = just_machine_suffix; | 
|---|
|  | 412 | +       } | 
|---|
|  | 413 | +      else | 
|---|
|  | 414 | +       skip_multi_dir = true; | 
|---|
|  | 415 | +      if (multi_os_dir) | 
|---|
|  | 416 | +       { | 
|---|
|  | 417 | +         free ((char *) multi_os_dir); | 
|---|
|  | 418 | +         multi_os_dir = NULL; | 
|---|
|  | 419 | } | 
|---|
|  | 420 | +      else | 
|---|
|  | 421 | +       skip_multi_os_dir = true; | 
|---|
|  | 422 | } | 
|---|
|  | 423 |  | 
|---|
|  | 424 | +  if (multi_dir) | 
|---|
|  | 425 | +    { | 
|---|
|  | 426 | +      free ((char *) multi_dir); | 
|---|
|  | 427 | +      free ((char *) multi_suffix); | 
|---|
|  | 428 | +      free ((char *) just_multi_suffix); | 
|---|
|  | 429 | +    } | 
|---|
|  | 430 | +  if (multi_os_dir) | 
|---|
|  | 431 | +    free ((char *) multi_os_dir); | 
|---|
|  | 432 | +  if (ret != path) | 
|---|
|  | 433 | +    free (path); | 
|---|
|  | 434 | +  return ret; | 
|---|
|  | 435 | +} | 
|---|
|  | 436 | + | 
|---|
|  | 437 | +/* Callback for build_search_list.  Adds path to obstack being built.  */ | 
|---|
|  | 438 | + | 
|---|
|  | 439 | +struct add_to_obstack_info { | 
|---|
|  | 440 | +  struct obstack *ob; | 
|---|
|  | 441 | +  bool check_dir; | 
|---|
|  | 442 | +  bool first_time; | 
|---|
|  | 443 | +}; | 
|---|
|  | 444 | + | 
|---|
|  | 445 | +static void * | 
|---|
|  | 446 | +add_to_obstack (char *path, void *data) | 
|---|
|  | 447 | +{ | 
|---|
|  | 448 | +  struct add_to_obstack_info *info = data; | 
|---|
|  | 449 | + | 
|---|
|  | 450 | +  if (info->check_dir && !is_directory (path, false)) | 
|---|
|  | 451 | +    return NULL; | 
|---|
|  | 452 | + | 
|---|
|  | 453 | +  if (!info->first_time) | 
|---|
|  | 454 | +    obstack_1grow (info->ob, PATH_SEPARATOR); | 
|---|
|  | 455 | + | 
|---|
|  | 456 | +  obstack_grow (info->ob, path, strlen (path)); | 
|---|
|  | 457 | + | 
|---|
|  | 458 | +  info->first_time = false; | 
|---|
|  | 459 | +  return NULL; | 
|---|
|  | 460 | +} | 
|---|
|  | 461 | + | 
|---|
|  | 462 | +/* Build a list of search directories from PATHS. | 
|---|
|  | 463 | +   PREFIX is a string to prepend to the list. | 
|---|
|  | 464 | +   If CHECK_DIR_P is true we ensure the directory exists. | 
|---|
|  | 465 | +   If DO_MULTI is true, multilib paths are output first, then | 
|---|
|  | 466 | +   non-multilib paths. | 
|---|
|  | 467 | +   This is used mostly by putenv_from_prefixes so we use `collect_obstack'. | 
|---|
|  | 468 | +   It is also used by the --print-search-dirs flag.  */ | 
|---|
|  | 469 | + | 
|---|
|  | 470 | +static char * | 
|---|
|  | 471 | +build_search_list (const struct path_prefix *paths, const char *prefix, | 
|---|
|  | 472 | +                  bool check_dir, bool do_multi) | 
|---|
|  | 473 | +{ | 
|---|
|  | 474 | +  struct add_to_obstack_info info; | 
|---|
|  | 475 | + | 
|---|
|  | 476 | +  info.ob = &collect_obstack; | 
|---|
|  | 477 | +  info.check_dir = check_dir; | 
|---|
|  | 478 | +  info.first_time = true; | 
|---|
|  | 479 | + | 
|---|
|  | 480 | +  obstack_grow (&collect_obstack, prefix, strlen (prefix)); | 
|---|
|  | 481 | +  obstack_1grow (&collect_obstack, '='); | 
|---|
|  | 482 | + | 
|---|
|  | 483 | +  for_each_path (paths, do_multi, 0, add_to_obstack, &info); | 
|---|
|  | 484 | + | 
|---|
|  | 485 | obstack_1grow (&collect_obstack, '\0'); | 
|---|
|  | 486 | return XOBFINISH (&collect_obstack, char *); | 
|---|
|  | 487 | } | 
|---|
|  | 488 | @@ -2419,9 +2569,10 @@ | 
|---|
|  | 489 | for collect.  */ | 
|---|
|  | 490 |  | 
|---|
|  | 491 | static void | 
|---|
|  | 492 | -putenv_from_prefixes (struct path_prefix *paths, const char *env_var) | 
|---|
|  | 493 | +putenv_from_prefixes (const struct path_prefix *paths, const char *env_var, | 
|---|
|  | 494 | +                     bool do_multi) | 
|---|
|  | 495 | { | 
|---|
|  | 496 | -  putenv (build_search_list (paths, env_var, 1)); | 
|---|
|  | 497 | +  putenv (build_search_list (paths, env_var, true, do_multi)); | 
|---|
|  | 498 | } | 
|---|
|  | 499 |  | 
|---|
|  | 500 |  | 
|---|
|  | 501 | /* Check whether NAME can be accessed in MODE.  This is like access, | 
|---|
|  | 502 | @@ -2442,20 +2593,53 @@ | 
|---|
|  | 503 | return access (name, mode); | 
|---|
|  | 504 | } | 
|---|
|  | 505 |  | 
|---|
|  | 506 | +/* Callback for find_a_file.  Appends the file name to the directory | 
|---|
|  | 507 | +   path.  If the resulting file exists in the right mode, return the | 
|---|
|  | 508 | +   full pathname to the file.  */ | 
|---|
|  | 509 | + | 
|---|
|  | 510 | +struct file_at_path_info { | 
|---|
|  | 511 | +  const char *name; | 
|---|
|  | 512 | +  const char *suffix; | 
|---|
|  | 513 | +  int name_len; | 
|---|
|  | 514 | +  int suffix_len; | 
|---|
|  | 515 | +  int mode; | 
|---|
|  | 516 | +}; | 
|---|
|  | 517 | + | 
|---|
|  | 518 | +static void * | 
|---|
|  | 519 | +file_at_path (char *path, void *data) | 
|---|
|  | 520 | +{ | 
|---|
|  | 521 | +  struct file_at_path_info *info = data; | 
|---|
|  | 522 | +  size_t len = strlen (path); | 
|---|
|  | 523 | + | 
|---|
|  | 524 | +  memcpy (path + len, info->name, info->name_len); | 
|---|
|  | 525 | +  len += info->name_len; | 
|---|
|  | 526 | + | 
|---|
|  | 527 | +  /* Some systems have a suffix for executable files. | 
|---|
|  | 528 | +     So try appending that first.  */ | 
|---|
|  | 529 | +  if (info->suffix_len) | 
|---|
|  | 530 | +    { | 
|---|
|  | 531 | +      memcpy (path + len, info->suffix, info->suffix_len + 1); | 
|---|
|  | 532 | +      if (access_check (path, info->mode) == 0) | 
|---|
|  | 533 | +       return path; | 
|---|
|  | 534 | +    } | 
|---|
|  | 535 | + | 
|---|
|  | 536 | +  path[len] = '\0'; | 
|---|
|  | 537 | +  if (access_check (path, info->mode) == 0) | 
|---|
|  | 538 | +    return path; | 
|---|
|  | 539 | + | 
|---|
|  | 540 | +  return NULL; | 
|---|
|  | 541 | +} | 
|---|
|  | 542 | + | 
|---|
|  | 543 | /* Search for NAME using the prefix list PREFIXES.  MODE is passed to | 
|---|
|  | 544 | -   access to check permissions. | 
|---|
|  | 545 | +   access to check permissions.  If DO_MULTI is true, search multilib | 
|---|
|  | 546 | +   paths then non-multilib paths, otherwise do not search multilib paths. | 
|---|
|  | 547 | Return 0 if not found, otherwise return its name, allocated with malloc.  */ | 
|---|
|  | 548 |  | 
|---|
|  | 549 | static char * | 
|---|
|  | 550 | -find_a_file (struct path_prefix *pprefix, const char *name, int mode, | 
|---|
|  | 551 | -            int multilib) | 
|---|
|  | 552 | +find_a_file (const struct path_prefix *pprefix, const char *name, int mode, | 
|---|
|  | 553 | +            bool do_multi) | 
|---|
|  | 554 | { | 
|---|
|  | 555 | -  char *temp; | 
|---|
|  | 556 | -  const char *const file_suffix = | 
|---|
|  | 557 | -    ((mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : ""); | 
|---|
|  | 558 | -  struct prefix_list *pl; | 
|---|
|  | 559 | -  int len = pprefix->max_len + strlen (name) + strlen (file_suffix) + 1; | 
|---|
|  | 560 | -  const char *multilib_name, *multilib_os_name; | 
|---|
|  | 561 | +  struct file_at_path_info info; | 
|---|
|  | 562 |  | 
|---|
|  | 563 | #ifdef DEFAULT_ASSEMBLER | 
|---|
|  | 564 | if (! strcmp (name, "as") && access (DEFAULT_ASSEMBLER, mode) == 0) | 
|---|
|  | 565 | @@ -2467,112 +2651,24 @@ | 
|---|
|  | 566 | return xstrdup (DEFAULT_LINKER); | 
|---|
|  | 567 | #endif | 
|---|
|  | 568 |  | 
|---|
|  | 569 | -  if (machine_suffix) | 
|---|
|  | 570 | -    len += strlen (machine_suffix); | 
|---|
|  | 571 | - | 
|---|
|  | 572 | -  multilib_name = name; | 
|---|
|  | 573 | -  multilib_os_name = name; | 
|---|
|  | 574 | -  if (multilib && multilib_os_dir) | 
|---|
|  | 575 | -    { | 
|---|
|  | 576 | -      int len1 = multilib_dir ? strlen (multilib_dir) + 1 : 0; | 
|---|
|  | 577 | -      int len2 = strlen (multilib_os_dir) + 1; | 
|---|
|  | 578 | - | 
|---|
|  | 579 | -      len += len1 > len2 ? len1 : len2; | 
|---|
|  | 580 | -      if (multilib_dir) | 
|---|
|  | 581 | -       multilib_name = ACONCAT ((multilib_dir, dir_separator_str, name, | 
|---|
|  | 582 | -                                 NULL)); | 
|---|
|  | 583 | -      if (strcmp (multilib_os_dir, ".") != 0) | 
|---|
|  | 584 | -       multilib_os_name = ACONCAT ((multilib_os_dir, dir_separator_str, name, | 
|---|
|  | 585 | -                                   NULL)); | 
|---|
|  | 586 | -    } | 
|---|
|  | 587 | - | 
|---|
|  | 588 | -  temp = xmalloc (len); | 
|---|
|  | 589 | - | 
|---|
|  | 590 | /* Determine the filename to execute (special case for absolute paths).  */ | 
|---|
|  | 591 |  | 
|---|
|  | 592 | if (IS_ABSOLUTE_PATH (name)) | 
|---|
|  | 593 | { | 
|---|
|  | 594 | if (access (name, mode) == 0) | 
|---|
|  | 595 | -       { | 
|---|
|  | 596 | -         strcpy (temp, name); | 
|---|
|  | 597 | -         return temp; | 
|---|
|  | 598 | -       } | 
|---|
|  | 599 | -    } | 
|---|
|  | 600 | -  else | 
|---|
|  | 601 | -    for (pl = pprefix->plist; pl; pl = pl->next) | 
|---|
|  | 602 | -      { | 
|---|
|  | 603 | -       const char *this_name | 
|---|
|  | 604 | -         = pl->os_multilib ? multilib_os_name : multilib_name; | 
|---|
|  | 605 | +       return xstrdup (name); | 
|---|
|  | 606 |  | 
|---|
|  | 607 | -       if (machine_suffix) | 
|---|
|  | 608 | -         { | 
|---|
|  | 609 | -           /* Some systems have a suffix for executable files. | 
|---|
|  | 610 | -              So try appending that first.  */ | 
|---|
|  | 611 | -           if (file_suffix[0] != 0) | 
|---|
|  | 612 | -             { | 
|---|
|  | 613 | -               strcpy (temp, pl->prefix); | 
|---|
|  | 614 | -               strcat (temp, machine_suffix); | 
|---|
|  | 615 | -               strcat (temp, multilib_name); | 
|---|
|  | 616 | -               strcat (temp, file_suffix); | 
|---|
|  | 617 | -               if (access_check (temp, mode) == 0) | 
|---|
|  | 618 | -                 return temp; | 
|---|
|  | 619 | -             } | 
|---|
|  | 620 | - | 
|---|
|  | 621 | -           /* Now try just the multilib_name.  */ | 
|---|
|  | 622 | -           strcpy (temp, pl->prefix); | 
|---|
|  | 623 | -           strcat (temp, machine_suffix); | 
|---|
|  | 624 | -           strcat (temp, multilib_name); | 
|---|
|  | 625 | -           if (access_check (temp, mode) == 0) | 
|---|
|  | 626 | -             return temp; | 
|---|
|  | 627 | -         } | 
|---|
|  | 628 | - | 
|---|
|  | 629 | -       /* Certain prefixes are tried with just the machine type, | 
|---|
|  | 630 | -          not the version.  This is used for finding as, ld, etc.  */ | 
|---|
|  | 631 | -       if (just_machine_suffix && pl->require_machine_suffix == 2) | 
|---|
|  | 632 | -         { | 
|---|
|  | 633 | -           /* Some systems have a suffix for executable files. | 
|---|
|  | 634 | -              So try appending that first.  */ | 
|---|
|  | 635 | -           if (file_suffix[0] != 0) | 
|---|
|  | 636 | -             { | 
|---|
|  | 637 | -               strcpy (temp, pl->prefix); | 
|---|
|  | 638 | -               strcat (temp, just_machine_suffix); | 
|---|
|  | 639 | -               strcat (temp, multilib_name); | 
|---|
|  | 640 | -               strcat (temp, file_suffix); | 
|---|
|  | 641 | -               if (access_check (temp, mode) == 0) | 
|---|
|  | 642 | -                 return temp; | 
|---|
|  | 643 | -             } | 
|---|
|  | 644 | - | 
|---|
|  | 645 | -           strcpy (temp, pl->prefix); | 
|---|
|  | 646 | -           strcat (temp, just_machine_suffix); | 
|---|
|  | 647 | -           strcat (temp, multilib_name); | 
|---|
|  | 648 | -           if (access_check (temp, mode) == 0) | 
|---|
|  | 649 | -             return temp; | 
|---|
|  | 650 | -         } | 
|---|
|  | 651 | - | 
|---|
|  | 652 | -       /* Certain prefixes can't be used without the machine suffix | 
|---|
|  | 653 | -          when the machine or version is explicitly specified.  */ | 
|---|
|  | 654 | -       if (! pl->require_machine_suffix) | 
|---|
|  | 655 | -         { | 
|---|
|  | 656 | -           /* Some systems have a suffix for executable files. | 
|---|
|  | 657 | -              So try appending that first.  */ | 
|---|
|  | 658 | -           if (file_suffix[0] != 0) | 
|---|
|  | 659 | -             { | 
|---|
|  | 660 | -               strcpy (temp, pl->prefix); | 
|---|
|  | 661 | -               strcat (temp, this_name); | 
|---|
|  | 662 | -               strcat (temp, file_suffix); | 
|---|
|  | 663 | -               if (access_check (temp, mode) == 0) | 
|---|
|  | 664 | -                 return temp; | 
|---|
|  | 665 | -             } | 
|---|
|  | 666 | +      return NULL; | 
|---|
|  | 667 | +    } | 
|---|
|  | 668 |  | 
|---|
|  | 669 | -           strcpy (temp, pl->prefix); | 
|---|
|  | 670 | -           strcat (temp, this_name); | 
|---|
|  | 671 | -           if (access_check (temp, mode) == 0) | 
|---|
|  | 672 | -             return temp; | 
|---|
|  | 673 | -         } | 
|---|
|  | 674 | -      } | 
|---|
|  | 675 | +  info.name = name; | 
|---|
|  | 676 | +  info.suffix = (mode & X_OK) != 0 ? HOST_EXECUTABLE_SUFFIX : ""; | 
|---|
|  | 677 | +  info.name_len = strlen (info.name); | 
|---|
|  | 678 | +  info.suffix_len = strlen (info.suffix); | 
|---|
|  | 679 | +  info.mode = mode; | 
|---|
|  | 680 |  | 
|---|
|  | 681 | -  free (temp); | 
|---|
|  | 682 | -  return 0; | 
|---|
|  | 683 | +  return for_each_path (pprefix, do_multi, info.name_len + info.suffix_len, | 
|---|
|  | 684 | +                       file_at_path, &info); | 
|---|
|  | 685 | } | 
|---|
|  | 686 |  | 
|---|
|  | 687 | /* Ranking of prefixes in the sort list. -B prefixes are put before | 
|---|
|  | 688 | @@ -2691,7 +2787,7 @@ | 
|---|
|  | 689 |  | 
|---|
|  | 690 | commands[0].prog = argbuf[0]; /* first command.  */ | 
|---|
|  | 691 | commands[0].argv = &argbuf[0]; | 
|---|
|  | 692 | -  string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, 0); | 
|---|
|  | 693 | +  string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false); | 
|---|
|  | 694 |  | 
|---|
|  | 695 | if (string) | 
|---|
|  | 696 | commands[0].argv[0] = string; | 
|---|
|  | 697 | @@ -2706,7 +2802,7 @@ | 
|---|
|  | 698 | commands[n_commands].prog = argbuf[i + 1]; | 
|---|
|  | 699 | commands[n_commands].argv = &argbuf[i + 1]; | 
|---|
|  | 700 | string = find_a_file (&exec_prefixes, commands[n_commands].prog, | 
|---|
|  | 701 | -                             X_OK, 0); | 
|---|
|  | 702 | +                             X_OK, false); | 
|---|
|  | 703 | if (string) | 
|---|
|  | 704 | commands[n_commands].argv[0] = string; | 
|---|
|  | 705 | n_commands++; | 
|---|
|  | 706 | @@ -3643,7 +3739,7 @@ | 
|---|
|  | 707 | if appending a directory separator actually makes a | 
|---|
|  | 708 | valid directory name.  */ | 
|---|
|  | 709 | if (! IS_DIR_SEPARATOR (value [len - 1]) | 
|---|
|  | 710 | -                   && is_directory (value, "", 0)) | 
|---|
|  | 711 | +                   && is_directory (value, false)) | 
|---|
|  | 712 | { | 
|---|
|  | 713 | char *tmp = xmalloc (len + 2); | 
|---|
|  | 714 | strcpy (tmp, value); | 
|---|
|  | 715 | @@ -4391,108 +4487,55 @@ | 
|---|
|  | 716 | } | 
|---|
|  | 717 | } | 
|---|
|  | 718 |  | 
|---|
|  | 719 | -void | 
|---|
|  | 720 | -do_spec_path (struct prefix_list *pl, const char *option, | 
|---|
|  | 721 | -             int omit_if_relative, int separate_options, | 
|---|
|  | 722 | -             int only_subdir, | 
|---|
|  | 723 | -             const char *dir_for_machine_suffix, | 
|---|
|  | 724 | -             const char *dir_for_no_suffix) | 
|---|
|  | 725 | -{ | 
|---|
|  | 726 | -  static size_t bufsize = 0; | 
|---|
|  | 727 | -  static char *buffer; | 
|---|
|  | 728 | -  int idx; | 
|---|
|  | 729 | -  bool multilib_p = false; | 
|---|
|  | 730 | - | 
|---|
|  | 731 | -  /* Used on systems which record the specified -L dirs | 
|---|
|  | 732 | -     and use them to search for dynamic linking.  */ | 
|---|
|  | 733 | -  /* Relative directories always come from -B, | 
|---|
|  | 734 | -     and it is better not to use them for searching | 
|---|
|  | 735 | -     at run time.  In particular, stage1 loses.  */ | 
|---|
|  | 736 | -  if (omit_if_relative | 
|---|
|  | 737 | -      && !IS_ABSOLUTE_PATH (pl->prefix)) | 
|---|
|  | 738 | -    return; | 
|---|
|  | 739 | +/* Callback for processing %D and %I specs.  */ | 
|---|
|  | 740 |  | 
|---|
|  | 741 | -  /* Try subdirectory if there is one.  */ | 
|---|
|  | 742 | -  if (machine_suffix && dir_for_machine_suffix) | 
|---|
|  | 743 | -    { | 
|---|
|  | 744 | -      if (strlen (pl->prefix) + strlen (machine_suffix) | 
|---|
|  | 745 | -         >= bufsize) | 
|---|
|  | 746 | -       bufsize = (strlen (pl->prefix) | 
|---|
|  | 747 | -                 + strlen (machine_suffix)) * 2 + 1; | 
|---|
|  | 748 | -      buffer = xrealloc (buffer, bufsize); | 
|---|
|  | 749 | -      strcpy (buffer, pl->prefix); | 
|---|
|  | 750 | -      strcat (buffer, machine_suffix); | 
|---|
|  | 751 | -      if (is_directory (buffer, dir_for_machine_suffix, 1)) | 
|---|
|  | 752 | -       { | 
|---|
|  | 753 | -         multilib_p = true; | 
|---|
|  | 754 | -         do_spec_1 (option, separate_options, NULL); | 
|---|
|  | 755 | -         if (separate_options) | 
|---|
|  | 756 | -           do_spec_1 (" ", 0, NULL); | 
|---|
|  | 757 | -         do_spec_1 (buffer, 1, NULL); | 
|---|
|  | 758 | -         do_spec_1 (dir_for_machine_suffix, 1, NULL); | 
|---|
|  | 759 | -         /* Make this a separate argument.  */ | 
|---|
|  | 760 | -         do_spec_1 (" ", 0, NULL); | 
|---|
|  | 761 | -       } | 
|---|
|  | 762 | -    } | 
|---|
|  | 763 | -  if (!pl->require_machine_suffix && dir_for_no_suffix) | 
|---|
|  | 764 | +struct spec_path_info { | 
|---|
|  | 765 | +  const char *option; | 
|---|
|  | 766 | +  const char *append; | 
|---|
|  | 767 | +  size_t append_len; | 
|---|
|  | 768 | +  bool omit_relative; | 
|---|
|  | 769 | +  bool separate_options; | 
|---|
|  | 770 | +}; | 
|---|
|  | 771 | + | 
|---|
|  | 772 | +static void * | 
|---|
|  | 773 | +spec_path (char *path, void *data) | 
|---|
|  | 774 | +{ | 
|---|
|  | 775 | +  struct spec_path_info *info = data; | 
|---|
|  | 776 | +  size_t len = 0; | 
|---|
|  | 777 | +  char save = 0; | 
|---|
|  | 778 | + | 
|---|
|  | 779 | +  if (info->omit_relative && !IS_ABSOLUTE_PATH (path)) | 
|---|
|  | 780 | +    return NULL; | 
|---|
|  | 781 | + | 
|---|
|  | 782 | +  if (info->append_len != 0) | 
|---|
|  | 783 | { | 
|---|
|  | 784 | -      if (is_directory (pl->prefix, dir_for_no_suffix, 1)) | 
|---|
|  | 785 | -       { | 
|---|
|  | 786 | -         multilib_p = true; | 
|---|
|  | 787 | -         do_spec_1 (option, separate_options, NULL); | 
|---|
|  | 788 | -         if (separate_options) | 
|---|
|  | 789 | -           do_spec_1 (" ", 0, NULL); | 
|---|
|  | 790 | -         do_spec_1 (pl->prefix, 1, NULL); | 
|---|
|  | 791 | -         do_spec_1 (dir_for_no_suffix, 1, NULL); | 
|---|
|  | 792 | -         /* Make this a separate argument.  */ | 
|---|
|  | 793 | -         do_spec_1 (" ", 0, NULL); | 
|---|
|  | 794 | -       } | 
|---|
|  | 795 | +      len = strlen (path); | 
|---|
|  | 796 | +      memcpy (path + len, info->append, info->append_len + 1); | 
|---|
|  | 797 | } | 
|---|
|  | 798 |  | 
|---|
|  | 799 | -  if (only_subdir || multilib_p) | 
|---|
|  | 800 | -    return; | 
|---|
|  | 801 | +  if (!is_directory (path, true)) | 
|---|
|  | 802 | +    return NULL; | 
|---|
|  | 803 | + | 
|---|
|  | 804 | +  do_spec_1 (info->option, 1, NULL); | 
|---|
|  | 805 | +  if (info->separate_options) | 
|---|
|  | 806 | +    do_spec_1 (" ", 0, NULL); | 
|---|
|  | 807 |  | 
|---|
|  | 808 | -  if (machine_suffix) | 
|---|
|  | 809 | +  if (info->append_len == 0) | 
|---|
|  | 810 | { | 
|---|
|  | 811 | -      if (is_directory (pl->prefix, machine_suffix, 1)) | 
|---|
|  | 812 | -       { | 
|---|
|  | 813 | -         do_spec_1 (option, separate_options, NULL); | 
|---|
|  | 814 | -         if (separate_options) | 
|---|
|  | 815 | -           do_spec_1 (" ", 0, NULL); | 
|---|
|  | 816 | -         do_spec_1 (pl->prefix, 1, NULL); | 
|---|
|  | 817 | -         /* Remove slash from machine_suffix.  */ | 
|---|
|  | 818 | -         if (strlen (machine_suffix) >= bufsize) | 
|---|
|  | 819 | -           bufsize = strlen (machine_suffix) * 2 + 1; | 
|---|
|  | 820 | -         buffer = xrealloc (buffer, bufsize); | 
|---|
|  | 821 | -         strcpy (buffer, machine_suffix); | 
|---|
|  | 822 | -         idx = strlen (buffer); | 
|---|
|  | 823 | -         if (IS_DIR_SEPARATOR (buffer[idx - 1])) | 
|---|
|  | 824 | -           buffer[idx - 1] = 0; | 
|---|
|  | 825 | -         do_spec_1 (buffer, 1, NULL); | 
|---|
|  | 826 | -         /* Make this a separate argument.  */ | 
|---|
|  | 827 | -         do_spec_1 (" ", 0, NULL); | 
|---|
|  | 828 | -       } | 
|---|
|  | 829 | -    } | 
|---|
|  | 830 | -  if (!pl->require_machine_suffix) | 
|---|
|  | 831 | -    { | 
|---|
|  | 832 | -      if (is_directory (pl->prefix, "", 1)) | 
|---|
|  | 833 | -       { | 
|---|
|  | 834 | -         do_spec_1 (option, separate_options, NULL); | 
|---|
|  | 835 | -         if (separate_options) | 
|---|
|  | 836 | -           do_spec_1 (" ", 0, NULL); | 
|---|
|  | 837 | -         /* Remove slash from pl->prefix.  */ | 
|---|
|  | 838 | -         if (strlen (pl->prefix) >= bufsize) | 
|---|
|  | 839 | -           bufsize = strlen (pl->prefix) * 2 + 1; | 
|---|
|  | 840 | -         buffer = xrealloc (buffer, bufsize); | 
|---|
|  | 841 | -         strcpy (buffer, pl->prefix); | 
|---|
|  | 842 | -         idx = strlen (buffer); | 
|---|
|  | 843 | -         if (IS_DIR_SEPARATOR (buffer[idx - 1])) | 
|---|
|  | 844 | -           buffer[idx - 1] = 0; | 
|---|
|  | 845 | -         do_spec_1 (buffer, 1, NULL); | 
|---|
|  | 846 | -         /* Make this a separate argument.  */ | 
|---|
|  | 847 | -         do_spec_1 (" ", 0, NULL); | 
|---|
|  | 848 | -       } | 
|---|
|  | 849 | +      len = strlen (path); | 
|---|
|  | 850 | +      save = path[len - 1]; | 
|---|
|  | 851 | +      if (IS_DIR_SEPARATOR (path[len - 1])) | 
|---|
|  | 852 | +       path[len - 1] = '\0'; | 
|---|
|  | 853 | } | 
|---|
|  | 854 | + | 
|---|
|  | 855 | +  do_spec_1 (path, 1, NULL); | 
|---|
|  | 856 | +  do_spec_1 (" ", 0, NULL); | 
|---|
|  | 857 | + | 
|---|
|  | 858 | +  /* Must not damage the original path.  */ | 
|---|
|  | 859 | +  if (info->append_len == 0) | 
|---|
|  | 860 | +    path[len - 1] = save; | 
|---|
|  | 861 | + | 
|---|
|  | 862 | +  return NULL; | 
|---|
|  | 863 | } | 
|---|
|  | 864 |  | 
|---|
|  | 865 | /* Process the sub-spec SPEC as a portion of a larger spec. | 
|---|
|  | 866 | @@ -4630,23 +4673,23 @@ | 
|---|
|  | 867 | that we search for startfiles.  */ | 
|---|
|  | 868 | case 'D': | 
|---|
|  | 869 | { | 
|---|
|  | 870 | -             struct prefix_list *pl = startfile_prefixes.plist; | 
|---|
|  | 871 | - | 
|---|
|  | 872 | -             for (; pl; pl = pl->next) | 
|---|
|  | 873 | -               { | 
|---|
|  | 874 | -                 const char *no_suffix_multilib_dir; | 
|---|
|  | 875 | +             struct spec_path_info info; | 
|---|
|  | 876 |  | 
|---|
|  | 877 | -                 no_suffix_multilib_dir = pl->os_multilib ? multilib_os_dir | 
|---|
|  | 878 | -                                          : multilib_dir; | 
|---|
|  | 879 | -                 /* Do not separate options, include non-multilibbed variant.  */ | 
|---|
|  | 880 | -                 do_spec_path (pl, "-L", | 
|---|
|  | 881 | +             info.option = "-L"; | 
|---|
|  | 882 | +             info.append_len = 0; | 
|---|
|  | 883 | #ifdef RELATIVE_PREFIX_NOT_LINKDIR | 
|---|
|  | 884 | -                               1, | 
|---|
|  | 885 | +             /* Used on systems which record the specified -L dirs | 
|---|
|  | 886 | +                and use them to search for dynamic linking. | 
|---|
|  | 887 | +                Relative directories always come from -B, | 
|---|
|  | 888 | +                and it is better not to use them for searching | 
|---|
|  | 889 | +                at run time.  In particular, stage1 loses.  */ | 
|---|
|  | 890 | +             info.omit_relative = true; | 
|---|
|  | 891 | #else | 
|---|
|  | 892 | -                               0, | 
|---|
|  | 893 | +             info.omit_relative = false; | 
|---|
|  | 894 | #endif | 
|---|
|  | 895 | -                               0, 0, multilib_dir, no_suffix_multilib_dir); | 
|---|
|  | 896 | -               } | 
|---|
|  | 897 | +             info.separate_options = false; | 
|---|
|  | 898 | + | 
|---|
|  | 899 | +             for_each_path (&startfile_prefixes, true, 0, spec_path, &info); | 
|---|
|  | 900 | } | 
|---|
|  | 901 | break; | 
|---|
|  | 902 |  | 
|---|
|  | 903 | @@ -4883,7 +4926,7 @@ | 
|---|
|  | 904 |  | 
|---|
|  | 905 | case 'I': | 
|---|
|  | 906 | { | 
|---|
|  | 907 | -             struct prefix_list *pl = include_prefixes.plist; | 
|---|
|  | 908 | +             struct spec_path_info info; | 
|---|
|  | 909 |  | 
|---|
|  | 910 | if (gcc_exec_prefix) | 
|---|
|  | 911 | { | 
|---|
|  | 912 | @@ -4906,9 +4949,14 @@ | 
|---|
|  | 913 | do_spec_1 (" ", 0, NULL); | 
|---|
|  | 914 | } | 
|---|
|  | 915 |  | 
|---|
|  | 916 | -             for (; pl; pl = pl->next) | 
|---|
|  | 917 | -               /* Separate options, don't include non-suffixed variant.  */ | 
|---|
|  | 918 | -               do_spec_path (pl, "-isystem", 0, 1, 1, "include", "include"); | 
|---|
|  | 919 | +             info.option = "-isystem"; | 
|---|
|  | 920 | +             info.append = "include"; | 
|---|
|  | 921 | +             info.append_len = strlen (info.append); | 
|---|
|  | 922 | +             info.omit_relative = false; | 
|---|
|  | 923 | +             info.separate_options = true; | 
|---|
|  | 924 | + | 
|---|
|  | 925 | +             for_each_path (&include_prefixes, false, info.append_len, | 
|---|
|  | 926 | +                            spec_path, &info); | 
|---|
|  | 927 | } | 
|---|
|  | 928 | break; | 
|---|
|  | 929 |  | 
|---|
|  | 930 | @@ -5894,48 +5942,27 @@ | 
|---|
|  | 931 | static const char * | 
|---|
|  | 932 | find_file (const char *name) | 
|---|
|  | 933 | { | 
|---|
|  | 934 | -  char *newname; | 
|---|
|  | 935 | - | 
|---|
|  | 936 | -  /* Try multilib_dir if it is defined.  */ | 
|---|
|  | 937 | -  if (multilib_os_dir != NULL) | 
|---|
|  | 938 | -    { | 
|---|
|  | 939 | -      newname = find_a_file (&startfile_prefixes, name, R_OK, 1); | 
|---|
|  | 940 | - | 
|---|
|  | 941 | -      /* If we don't find it in the multi library dir, then fall | 
|---|
|  | 942 | -        through and look for it in the normal places.  */ | 
|---|
|  | 943 | -      if (newname != NULL) | 
|---|
|  | 944 | -       return newname; | 
|---|
|  | 945 | -    } | 
|---|
|  | 946 | - | 
|---|
|  | 947 | -  newname = find_a_file (&startfile_prefixes, name, R_OK, 0); | 
|---|
|  | 948 | +  char *newname = find_a_file (&startfile_prefixes, name, R_OK, true); | 
|---|
|  | 949 | return newname ? newname : name; | 
|---|
|  | 950 | } | 
|---|
|  | 951 |  | 
|---|
|  | 952 | /* Determine whether a directory exists.  If LINKER, return 0 for | 
|---|
|  | 953 | -   certain fixed names not needed by the linker.  If not LINKER, it is | 
|---|
|  | 954 | -   only important to return 0 if the host machine has a small ARG_MAX | 
|---|
|  | 955 | -   limit.  */ | 
|---|
|  | 956 | +   certain fixed names not needed by the linker.  */ | 
|---|
|  | 957 |  | 
|---|
|  | 958 | static int | 
|---|
|  | 959 | -is_directory (const char *path1, const char *path2, int linker) | 
|---|
|  | 960 | +is_directory (const char *path1, bool linker) | 
|---|
|  | 961 | { | 
|---|
|  | 962 | -  int len1 = strlen (path1); | 
|---|
|  | 963 | -  int len2 = strlen (path2); | 
|---|
|  | 964 | -  char *path = alloca (3 + len1 + len2); | 
|---|
|  | 965 | +  int len1; | 
|---|
|  | 966 | +  char *path; | 
|---|
|  | 967 | char *cp; | 
|---|
|  | 968 | struct stat st; | 
|---|
|  | 969 |  | 
|---|
|  | 970 | -#ifndef SMALL_ARG_MAX | 
|---|
|  | 971 | -  if (! linker) | 
|---|
|  | 972 | -    return 1; | 
|---|
|  | 973 | -#endif | 
|---|
|  | 974 | - | 
|---|
|  | 975 | -  /* Construct the path from the two parts.  Ensure the string ends with "/.". | 
|---|
|  | 976 | -     The resulting path will be a directory even if the given path is a | 
|---|
|  | 977 | -     symbolic link.  */ | 
|---|
|  | 978 | +  /* Ensure the string ends with "/.".  The resulting path will be a | 
|---|
|  | 979 | +     directory even if the given path is a symbolic link.  */ | 
|---|
|  | 980 | +  len1 = strlen (path1); | 
|---|
|  | 981 | +  path = alloca (3 + len1); | 
|---|
|  | 982 | memcpy (path, path1, len1); | 
|---|
|  | 983 | -  memcpy (path + len1, path2, len2); | 
|---|
|  | 984 | -  cp = path + len1 + len2; | 
|---|
|  | 985 | +  cp = path + len1; | 
|---|
|  | 986 | if (!IS_DIR_SEPARATOR (cp[-1])) | 
|---|
|  | 987 | *cp++ = DIR_SEPARATOR; | 
|---|
|  | 988 | *cp++ = '.'; | 
|---|
|  | 989 | @@ -5943,13 +5970,13 @@ | 
|---|
|  | 990 |  | 
|---|
|  | 991 | /* Exclude directories that the linker is known to search.  */ | 
|---|
|  | 992 | if (linker | 
|---|
|  | 993 | +      && IS_DIR_SEPARATOR (path[0]) | 
|---|
|  | 994 | && ((cp - path == 6 | 
|---|
|  | 995 | -          && strcmp (path, concat (dir_separator_str, "lib", | 
|---|
|  | 996 | -                                   dir_separator_str, ".", NULL)) == 0) | 
|---|
|  | 997 | +          && strncmp (path + 1, "lib", 3) == 0) | 
|---|
|  | 998 | || (cp - path == 10 | 
|---|
|  | 999 | -             && strcmp (path, concat (dir_separator_str, "usr", | 
|---|
|  | 1000 | -                                      dir_separator_str, "lib", | 
|---|
|  | 1001 | -                                      dir_separator_str, ".", NULL)) == 0))) | 
|---|
|  | 1002 | +             && strncmp (path + 1, "usr", 3) == 0 | 
|---|
|  | 1003 | +             && IS_DIR_SEPARATOR (path[4]) | 
|---|
|  | 1004 | +             && strncmp (path + 5, "lib", 3) == 0))) | 
|---|
|  | 1005 | return 0; | 
|---|
|  | 1006 |  | 
|---|
|  | 1007 | return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode)); | 
|---|
|  | 1008 | @@ -6139,7 +6166,7 @@ | 
|---|
|  | 1009 | spec_version, dir_separator_str, NULL); | 
|---|
|  | 1010 | just_machine_suffix = concat (spec_machine, dir_separator_str, NULL); | 
|---|
|  | 1011 |  | 
|---|
|  | 1012 | -  specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, 0); | 
|---|
|  | 1013 | +  specs_file = find_a_file (&startfile_prefixes, "specs", R_OK, true); | 
|---|
|  | 1014 | /* Read the specs file unless it is a default one.  */ | 
|---|
|  | 1015 | if (specs_file != 0 && strcmp (specs_file, "specs")) | 
|---|
|  | 1016 | read_specs (specs_file, TRUE); | 
|---|
|  | 1017 | @@ -6275,7 +6302,7 @@ | 
|---|
|  | 1018 | for (uptr = user_specs_head; uptr; uptr = uptr->next) | 
|---|
|  | 1019 | { | 
|---|
|  | 1020 | char *filename = find_a_file (&startfile_prefixes, uptr->filename, | 
|---|
|  | 1021 | -                                   R_OK, 0); | 
|---|
|  | 1022 | +                                   R_OK, true); | 
|---|
|  | 1023 | read_specs (filename ? filename : uptr->filename, FALSE); | 
|---|
|  | 1024 | } | 
|---|
|  | 1025 |  | 
|---|
|  | 1026 | @@ -6304,8 +6331,10 @@ | 
|---|
|  | 1027 | if (print_search_dirs) | 
|---|
|  | 1028 | { | 
|---|
|  | 1029 | printf (_("install: %s%s\n"), standard_exec_prefix, machine_suffix); | 
|---|
|  | 1030 | -      printf (_("programs: %s\n"), build_search_list (&exec_prefixes, "", 0)); | 
|---|
|  | 1031 | -      printf (_("libraries: %s\n"), build_search_list (&startfile_prefixes, "", 0)); | 
|---|
|  | 1032 | +      printf (_("programs: %s\n"), | 
|---|
|  | 1033 | +             build_search_list (&exec_prefixes, "", false, false)); | 
|---|
|  | 1034 | +      printf (_("libraries: %s\n"), | 
|---|
|  | 1035 | +             build_search_list (&startfile_prefixes, "", false, true)); | 
|---|
|  | 1036 | return (0); | 
|---|
|  | 1037 | } | 
|---|
|  | 1038 |  | 
|---|
|  | 1039 | @@ -6622,14 +6651,14 @@ | 
|---|
|  | 1040 | /* We'll use ld if we can't find collect2.  */ | 
|---|
|  | 1041 | if (! strcmp (linker_name_spec, "collect2")) | 
|---|
|  | 1042 | { | 
|---|
|  | 1043 | -         char *s = find_a_file (&exec_prefixes, "collect2", X_OK, 0); | 
|---|
|  | 1044 | +         char *s = find_a_file (&exec_prefixes, "collect2", X_OK, false); | 
|---|
|  | 1045 | if (s == NULL) | 
|---|
|  | 1046 | linker_name_spec = "ld"; | 
|---|
|  | 1047 | } | 
|---|
|  | 1048 | /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables | 
|---|
|  | 1049 | for collect.  */ | 
|---|
|  | 1050 | -      putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH"); | 
|---|
|  | 1051 | -      putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV); | 
|---|
|  | 1052 | +      putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false); | 
|---|
|  | 1053 | +      putenv_from_prefixes (&startfile_prefixes, LIBRARY_PATH_ENV, true); | 
|---|
|  | 1054 |  | 
|---|
|  | 1055 | value = do_spec (link_command_spec); | 
|---|
|  | 1056 | if (value < 0) | 
|---|
|  | 1057 | diff -uNr gcc-4.1.0/gcc/system.h gcc-4.1.0-PR20425/gcc/system.h | 
|---|
|  | 1058 | --- gcc-4.1.0/gcc/system.h      2005-08-16 10:13:53.000000000 +1000 | 
|---|
|  | 1059 | +++ gcc-4.1.0-PR20425/gcc/system.h      2006-03-10 23:51:31.000000000 +1100 | 
|---|
|  | 1060 | @@ -728,7 +728,8 @@ | 
|---|
|  | 1061 | TARGET_ESC TARGET_FF TARGET_NEWLINE TARGET_TAB TARGET_VT          \ | 
|---|
|  | 1062 | LINK_LIBGCC_SPECIAL DONT_ACCESS_GBLS_AFTER_EPILOGUE               \ | 
|---|
|  | 1063 | TARGET_OPTIONS TARGET_SWITCHES EXTRA_CC_MODES FINALIZE_PIC         \ | 
|---|
|  | 1064 | -       PREDICATE_CODES SPECIAL_MODE_PREDICATES HOST_PTR_PRINTF | 
|---|
|  | 1065 | +       PREDICATE_CODES SPECIAL_MODE_PREDICATES HOST_PTR_PRINTF            \ | 
|---|
|  | 1066 | +       SMALL_ARG_MAX | 
|---|
|  | 1067 |  | 
|---|
|  | 1068 | /* Hooks that are no longer used.  */ | 
|---|
|  | 1069 | #pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE  \ | 
|---|