X-Git-Url: https://gcc.gnu.org/git/?a=blobdiff_plain;f=gcc%2Fgcc.c;h=6a6449d679caa53361e8d0961440ab44bd0fdc37;hb=2c325bb8de77846b7d5dc5ff1994302a2577912d;hp=c67fcb463a5fba41911f98ab74bfe6ce197c311f;hpb=2378088aa6f765f0da07cc7b9408cdcb09e4264e;p=gcc.git diff --git a/gcc/gcc.c b/gcc/gcc.c index c67fcb463a5f..6a6449d679ca 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -70,11 +70,12 @@ compilation is specified by a string called a "spec". */ /* By default there is no special suffix for executables. */ #ifndef EXECUTABLE_SUFFIX -#if __MSDOS__ -#define EXECUTABLE_SUFFIX ".exe" -#else #define EXECUTABLE_SUFFIX "" #endif + +/* By default, colon separates directories in a path. */ +#ifndef PATH_SEPARATOR +#define PATH_SEPARATOR ':' #endif #define obstack_chunk_alloc xmalloc @@ -124,7 +125,7 @@ static int cross_compile = 0; static struct obstack obstack; /* This is the obstack to build an environment variable to pass to - collect2 that describes all of the relavant switches of what 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. */ @@ -236,7 +237,7 @@ or with constant text in a single argument. %{S*:X} substitutes X if one or more switches whose names with -S are specified to CC. Note that the tail part of the -S option (i.e. the part matched by the `*') will be substituted for each - occurance of %* within X. + occurrence of %* within X. %{S:X} substitutes X, but only if the -S switch was given to CC. %{!S:X} substitutes X, but only if the -S switch was NOT given to CC. %{|S:X} like %{S:X}, but if no S switch, substitute `-'. @@ -534,21 +535,21 @@ static int n_default_compilers /* Have gcc do the search. */ /* -u* was put back because both BSD and SysV seem to support it. */ static char *link_command_spec = "\ -%{!c:%{!M:%{!MM:%{!E:%{!S:ld %X %l %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \ +%{!c:%{!M:%{!MM:%{!E:%{!S:ld %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \ %{r} %{s} %{T*} %{t} %{u*} %{x} %{z}\ %{!A:%{!nostdlib:%S}} \ %{L*} %D %o %{!nostdlib:libgcc.a%s %L libgcc.a%s %{!A:%E}}\n }}}}}"; #else /* Use -l and have the linker do the search. */ static char *link_command_spec = "\ -%{!c:%{!M:%{!MM:%{!E:%{!S:ld %X %l %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \ +%{!c:%{!M:%{!MM:%{!E:%{!S:ld %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} \ %{r} %{s} %{T*} %{t} %{u*} %{x} %{z}\ %{!A:%{!nostdlib:%S}} \ %{L*} %D %o %{!nostdlib:-lgcc %L -lgcc %{!A:%E}}\n }}}}}"; #endif /* A vector of options to give to the linker. - These options are accumlated by %x + These options are accumulated by %x and substituted into the linker command with %X. */ static int n_linker_options; static char **linker_options; @@ -1073,7 +1074,6 @@ choose_temp_base () putenv (str) char *str; { -#ifndef __MSDOS__ /* not sure about MS/DOS */ #ifndef VMS /* nor about VMS */ extern char **environ; @@ -1109,7 +1109,6 @@ putenv (str) bcopy (old_environ, environ+1, sizeof (char *) * (num_envs+1)); #endif /* VMS */ -#endif /* __MSDOS__ */ } #endif /* HAVE_PUTENV */ @@ -1371,19 +1370,28 @@ pexecute (func, program, argv, not_last) FILE *argfile; int i; - scmd = (char *)malloc(strlen(program) + strlen(temp_filename) + 6); - sprintf(scmd, "%s @%s.gp", program, temp_filename); - argfile = fopen(scmd+strlen(program)+2, "w"); + scmd = (char *)malloc (strlen (program) + strlen (temp_filename) + 6); + sprintf (scmd, "%s @%s.gp", program, temp_filename); + argfile = fopen (scmd+strlen (program) + 2, "w"); if (argfile == 0) - pfatal_with_name(scmd+strlen(program)+2); + pfatal_with_name (scmd + strlen (program) + 2); for (i=1; argv[i]; i++) - fprintf(argfile, "%s\n", argv[i]); - fclose(argfile); + { + char *cp; + for (cp = argv[i]; *cp; cp++) + { + if (*cp == '"' || *cp == '\'' || *cp == '\\' || isspace (*cp)) + fputc ('\\', argfile); + fputc (*cp, argfile); + } + fputc ('\n', argfile); + } + fclose (argfile); - i = system(scmd); + i = system (scmd); - remove(scmd+strlen(program)+2); + remove (scmd + strlen (program) + 2); return i << 8; } @@ -1694,7 +1702,7 @@ process_command (argc, argv) startp = endp = temp; while (1) { - if ((*endp == ':') || (*endp == 0)) + if (*endp == PATH_SEPARATOR || *endp == 0) { strncpy (nstore, startp, endp-startp); if (endp == startp) @@ -1727,7 +1735,7 @@ process_command (argc, argv) startp = endp = temp; while (1) { - if ((*endp == ':') || (*endp == 0)) + if (*endp == PATH_SEPARATOR || *endp == 0) { strncpy (nstore, startp, endp-startp); if (endp == startp) @@ -1763,7 +1771,7 @@ process_command (argc, argv) startp = endp = temp; while (1) { - if ((*endp == ':') || (*endp == 0)) + if (*endp == PATH_SEPARATOR || *endp == 0) { strncpy (nstore, startp, endp-startp); if (endp == startp) @@ -2210,6 +2218,10 @@ do_spec_1 (spec, inswitch, soft_matched_part) { struct prefix_list *pl = (i == 0 ? library_prefix.plist : startfile_prefix.plist); + int bufsize = 100; + char *buffer = (char *) xmalloc (bufsize); + int idx; + for (; pl; pl = pl->next) { #ifdef RELATIVE_PREFIX_NOT_LINKDIR @@ -2230,7 +2242,15 @@ do_spec_1 (spec, inswitch, soft_matched_part) do_spec_1 (" ", 0, 0); #endif do_spec_1 (pl->prefix, 1, 0); - do_spec_1 (machine_suffix, 1, 0); + /* Remove slash from machine_suffix. */ + if (strlen (machine_suffix) >= bufsize) + bufsize = strlen (machine_suffix) * 2 + 1; + buffer = (char *) xrealloc (buffer, bufsize); + strcpy (buffer, machine_suffix); + idx = strlen (buffer); + if (buffer[idx - 1] == '/') + buffer[idx - 1] = 0; + do_spec_1 (buffer, 1, 0); /* Make this a separate argument. */ do_spec_1 (" ", 0, 0); } @@ -2243,12 +2263,21 @@ do_spec_1 (spec, inswitch, soft_matched_part) #ifdef SPACE_AFTER_L_OPTION do_spec_1 (" ", 0, 0); #endif - do_spec_1 (pl->prefix, 1, 0); + /* Remove slash from pl->prefix. */ + if (strlen (pl->prefix) >= bufsize) + bufsize = strlen (pl->prefix) * 2 + 1; + buffer = (char *) xrealloc (buffer, bufsize); + strcpy (buffer, pl->prefix); + idx = strlen (buffer); + if (buffer[idx - 1] == '/') + buffer[idx - 1] = 0; + do_spec_1 (buffer, 1, 0); /* Make this a separate argument. */ do_spec_1 (" ", 0, 0); } } } + free (buffer); } break;