summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/lto-wrapper.cc39
1 files changed, 26 insertions, 13 deletions
diff --git a/gcc/lto-wrapper.cc b/gcc/lto-wrapper.cc
index 285e6e96af5..d070829bacb 100644
--- a/gcc/lto-wrapper.cc
+++ b/gcc/lto-wrapper.cc
@@ -170,13 +170,14 @@ get_options_from_collect_gcc_options (const char *collect_gcc,
return decoded;
}
-/* Find option in OPTIONS based on OPT_INDEX. -1 value is returned
- if the option is not present. */
+/* Find option in OPTIONS based on OPT_INDEX, starting at START. -1
+ value is returned if the option is not present. */
static int
-find_option (vec<cl_decoded_option> &options, size_t opt_index)
+find_option (vec<cl_decoded_option> &options, size_t opt_index,
+ unsigned start = 0)
{
- for (unsigned i = 0; i < options.length (); ++i)
+ for (unsigned i = start; i < options.length (); ++i)
if (options[i].opt_index == opt_index)
return i;
@@ -575,13 +576,16 @@ merge_and_complain (vec<cl_decoded_option> &decoded_options,
else
j++;
+ int existing_opt_index, existing_opt2_index;
if (!xassembler_options_error)
- for (i = j = 0; ; i++, j++)
+ for (existing_opt_index = existing_opt2_index = 0; ;
+ existing_opt_index++, existing_opt2_index++)
{
- int existing_opt_index
- = find_option (decoded_options, OPT_Xassembler);
- int existing_opt2_index
- = find_option (fdecoded_options, OPT_Xassembler);
+ existing_opt_index
+ = find_option (decoded_options, OPT_Xassembler, existing_opt_index);
+ existing_opt2_index
+ = find_option (fdecoded_options, OPT_Xassembler,
+ existing_opt2_index);
cl_decoded_option *existing_opt = NULL;
cl_decoded_option *existing_opt2 = NULL;
@@ -1100,7 +1104,7 @@ find_crtoffloadtable (int save_temps, const char *dumppfx)
static bool
find_and_merge_options (int fd, off_t file_offset, const char *prefix,
- vec<cl_decoded_option> decoded_cl_options,
+ vec<cl_decoded_option> decoded_cl_options, bool first,
vec<cl_decoded_option> *opts, const char *collect_gcc)
{
off_t offset, length;
@@ -1110,6 +1114,9 @@ find_and_merge_options (int fd, off_t file_offset, const char *prefix,
int err;
vec<cl_decoded_option> fdecoded_options;
+ if (!first)
+ fdecoded_options = *opts;
+
simple_object_read *sobj;
sobj = simple_object_start_read (fd, file_offset, "__GNU_LTO",
&errmsg, &err);
@@ -1130,7 +1137,6 @@ find_and_merge_options (int fd, off_t file_offset, const char *prefix,
data = (char *)xmalloc (length);
read (fd, data, length);
fopts = data;
- bool first = true;
do
{
vec<cl_decoded_option> f2decoded_options
@@ -1417,8 +1423,10 @@ run_gcc (unsigned argc, char *argv[])
int auto_parallel = 0;
bool no_partition = false;
const char *jobserver_error = NULL;
+ bool fdecoded_options_first = true;
vec<cl_decoded_option> fdecoded_options;
fdecoded_options.create (16);
+ bool offload_fdecoded_options_first = true;
vec<cl_decoded_option> offload_fdecoded_options = vNULL;
struct obstack argv_obstack;
int new_head_argc;
@@ -1511,11 +1519,13 @@ run_gcc (unsigned argc, char *argv[])
}
if (find_and_merge_options (fd, file_offset, LTO_SECTION_NAME_PREFIX,
- decoded_options, &fdecoded_options,
+ decoded_options, fdecoded_options_first,
+ &fdecoded_options,
collect_gcc))
{
have_lto = true;
ltoobj_argv[ltoobj_argc++] = argv[i];
+ fdecoded_options_first = false;
}
close (fd);
}
@@ -1774,9 +1784,12 @@ cont1:
fatal_error (input_location, "cannot open %s: %m", filename);
if (!find_and_merge_options (fd, file_offset,
OFFLOAD_SECTION_NAME_PREFIX,
- decoded_options, &offload_fdecoded_options,
+ decoded_options,
+ offload_fdecoded_options_first,
+ &offload_fdecoded_options,
collect_gcc))
fatal_error (input_location, "cannot read %s: %m", filename);
+ offload_fdecoded_options_first = false;
close (fd);
if (filename != offload_argv[i])
XDELETEVEC (filename);