aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto-wrapper.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/lto-wrapper.c')
-rw-r--r--gcc/lto-wrapper.c157
1 files changed, 72 insertions, 85 deletions
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index e34b697..d565b08 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -53,6 +53,13 @@ along with GCC; see the file COPYING3. If not see
driver to lto-wrapper. */
#define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES"
+/* By default there is no special suffix for target executables. */
+#ifdef TARGET_EXECUTABLE_SUFFIX
+#define HAVE_TARGET_EXECUTABLE_SUFFIX
+#else
+#define TARGET_EXECUTABLE_SUFFIX ""
+#endif
+
enum lto_mode_d {
LTO_MODE_NONE, /* Not doing LTO. */
LTO_MODE_LTO, /* Normal LTO. */
@@ -126,7 +133,7 @@ maybe_unlink (const char *file)
}
/* Template of LTRANS dumpbase suffix. */
-#define DUMPBASE_SUFFIX ".ltrans18446744073709551615"
+#define DUMPBASE_SUFFIX "ltrans18446744073709551615"
/* Create decoded options from the COLLECT_GCC and COLLECT_GCC_OPTIONS
environment. */
@@ -1100,12 +1107,7 @@ debug_objcopy (const char *infile, bool rename)
}
if (save_temps)
- {
- outfile = (char *) xmalloc (strlen (orig_infile)
- + sizeof (".debug.temp.o") + 1);
- strcpy (outfile, orig_infile);
- strcat (outfile, ".debug.temp.o");
- }
+ outfile = concat (orig_infile, ".debug.temp.o", NULL);
else
outfile = make_temp_file (".debug.temp.o");
errmsg = simple_object_copy_lto_debug_sections (inobj, outfile, &err, rename);
@@ -1296,6 +1298,8 @@ run_gcc (unsigned argc, char *argv[])
bool linker_output_rel = false;
bool skip_debug = false;
unsigned n_debugobj;
+ const char *dumppfx = NULL, *incoming_dumppfx = NULL;
+ static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
/* Get the driver and options. */
collect_gcc = getenv ("COLLECT_GCC");
@@ -1407,6 +1411,10 @@ run_gcc (unsigned argc, char *argv[])
linker_output = option->arg;
break;
+ /* We don't have to distinguish between -save-temps=* and
+ -save-temps, -dumpdir already carries that
+ information. */
+ case OPT_save_temps_:
case OPT_save_temps:
save_temps = 1;
break;
@@ -1452,6 +1460,10 @@ run_gcc (unsigned argc, char *argv[])
skip_debug = option->arg && !strcmp (option->arg, "0");
break;
+ case OPT_dumpdir:
+ incoming_dumppfx = dumppfx = option->arg;
+ break;
+
default:
break;
}
@@ -1490,32 +1502,47 @@ run_gcc (unsigned argc, char *argv[])
}
}
- if (linker_output)
+ if (!dumppfx)
{
- char *output_dir, *base, *name;
- bool bit_bucket = strcmp (linker_output, HOST_BIT_BUCKET) == 0;
-
- output_dir = xstrdup (linker_output);
- base = output_dir;
- for (name = base; *name; name++)
- if (IS_DIR_SEPARATOR (*name))
- base = name + 1;
- *base = '\0';
-
- linker_output = &linker_output[base - output_dir];
- if (*output_dir == '\0')
- {
- static char current_dir[] = { '.', DIR_SEPARATOR, '\0' };
- output_dir = current_dir;
- }
- if (!bit_bucket)
+ if (!linker_output
+ || strcmp (linker_output, HOST_BIT_BUCKET) == 0)
+ dumppfx = "a.";
+ else
{
- obstack_ptr_grow (&argv_obstack, "-dumpdir");
- obstack_ptr_grow (&argv_obstack, output_dir);
+ const char *obase = lbasename (linker_output), *temp;
+
+ /* Strip the executable extension. */
+ size_t blen = strlen (obase), xlen;
+ if ((temp = strrchr (obase + 1, '.'))
+ && (xlen = strlen (temp))
+ && (strcmp (temp, ".exe") == 0
+#if defined(HAVE_TARGET_EXECUTABLE_SUFFIX)
+ || strcmp (temp, TARGET_EXECUTABLE_SUFFIX) == 0
+#endif
+ || strcmp (obase, "a.out") == 0))
+ dumppfx = xstrndup (linker_output,
+ obase - linker_output + blen - xlen + 1);
+ else
+ dumppfx = concat (linker_output, ".", NULL);
}
+ }
- obstack_ptr_grow (&argv_obstack, "-dumpbase");
+ /* If there's no directory component in the dumppfx, add one, so
+ that, when it is used as -dumpbase, it overrides any occurrence
+ of -dumpdir that might have been passed in. */
+ if (!dumppfx || lbasename (dumppfx) == dumppfx)
+ dumppfx = concat (current_dir, dumppfx, NULL);
+
+ /* Make sure some -dumpdir is passed, so as to get predictable
+ -dumpbase overriding semantics. If we got an incoming -dumpdir
+ argument, we'll pass it on, so don't bother with another one
+ then. */
+ if (!incoming_dumppfx)
+ {
+ obstack_ptr_grow (&argv_obstack, "-dumpdir");
+ obstack_ptr_grow (&argv_obstack, "");
}
+ obstack_ptr_grow (&argv_obstack, "-dumpbase");
/* Remember at which point we can scrub args to re-use the commons. */
new_head_argc = obstack_object_size (&argv_obstack) / sizeof (void *);
@@ -1621,15 +1648,11 @@ cont1:
if (lto_mode == LTO_MODE_LTO)
{
- if (linker_output)
- {
- obstack_ptr_grow (&argv_obstack, linker_output);
- flto_out = (char *) xmalloc (strlen (linker_output)
- + sizeof (".lto.o") + 1);
- strcpy (flto_out, linker_output);
- strcat (flto_out, ".lto.o");
- }
- else
+ /* -dumpbase argument for LTO. */
+ flto_out = concat (dumppfx, "lto.o", NULL);
+ obstack_ptr_grow (&argv_obstack, flto_out);
+
+ if (!save_temps)
flto_out = make_temp_file (".lto.o");
obstack_ptr_grow (&argv_obstack, "-o");
obstack_ptr_grow (&argv_obstack, flto_out);
@@ -1637,47 +1660,17 @@ cont1:
else
{
const char *list_option = "-fltrans-output-list=";
- size_t list_option_len = strlen (list_option);
- char *tmp;
- if (linker_output)
- {
- char *dumpbase = (char *) xmalloc (strlen (linker_output)
- + sizeof (".wpa") + 1);
- strcpy (dumpbase, linker_output);
- strcat (dumpbase, ".wpa");
- obstack_ptr_grow (&argv_obstack, dumpbase);
- }
+ /* -dumpbase argument for WPA. */
+ char *dumpbase = concat (dumppfx, "wpa", NULL);
+ obstack_ptr_grow (&argv_obstack, dumpbase);
- if (linker_output && save_temps)
- {
- ltrans_output_file = (char *) xmalloc (strlen (linker_output)
- + sizeof (".ltrans.out") + 1);
- strcpy (ltrans_output_file, linker_output);
- strcat (ltrans_output_file, ".ltrans.out");
- }
+ if (save_temps)
+ ltrans_output_file = concat (dumppfx, "ltrans.out", NULL);
else
- {
- char *prefix = NULL;
- if (linker_output)
- {
- prefix = (char *) xmalloc (strlen (linker_output) + 2);
- strcpy (prefix, linker_output);
- strcat (prefix, ".");
- }
-
- ltrans_output_file = make_temp_file_with_prefix (prefix,
- ".ltrans.out");
- free (prefix);
- }
- list_option_full = (char *) xmalloc (sizeof (char) *
- (strlen (ltrans_output_file) + list_option_len + 1));
- tmp = list_option_full;
-
- obstack_ptr_grow (&argv_obstack, tmp);
- strcpy (tmp, list_option);
- tmp += list_option_len;
- strcpy (tmp, ltrans_output_file);
+ ltrans_output_file = make_temp_file (".ltrans.out");
+ list_option_full = concat (list_option, ltrans_output_file, NULL);
+ obstack_ptr_grow (&argv_obstack, list_option_full);
if (jobserver)
{
@@ -1833,16 +1826,10 @@ cont:
output_name = XOBFINISH (&env_obstack, char *);
/* Adjust the dumpbase if the linker output file was seen. */
- if (linker_output)
- {
- char *dumpbase
- = (char *) xmalloc (strlen (linker_output)
- + sizeof (DUMPBASE_SUFFIX) + 1);
- snprintf (dumpbase,
- strlen (linker_output) + sizeof (DUMPBASE_SUFFIX),
- "%s.ltrans%u", linker_output, i);
- argv_ptr[0] = dumpbase;
- }
+ int dumpbase_len = (strlen (dumppfx) + sizeof (DUMPBASE_SUFFIX));
+ char *dumpbase = (char *) xmalloc (dumpbase_len + 1);
+ snprintf (dumpbase, dumpbase_len, "%sltrans%u.ltrans", dumppfx, i);
+ argv_ptr[0] = dumpbase;
argv_ptr[1] = "-fltrans";
argv_ptr[2] = "-o";