aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-04-18 22:08:44 +0200
committerMartin Liska <marxin@gcc.gnu.org>2018-04-18 20:08:44 +0000
commitaf5975362b21c2a1268aac5b02545de482a2cc7c (patch)
tree0cf3eaf62eae18fa7fecb4e5c9bc4e81c28ea5a5 /gcc/lto
parent3c674e3e41e8b983161b3af788f1ab09e163808d (diff)
downloadgcc-af5975362b21c2a1268aac5b02545de482a2cc7c.zip
gcc-af5975362b21c2a1268aac5b02545de482a2cc7c.tar.gz
gcc-af5975362b21c2a1268aac5b02545de482a2cc7c.tar.bz2
Make Wodr warnings stable.
2018-04-18 Martin Liska <mliska@suse.cz> PR ipa/83983 PR ipa/85391 * lto.c (cmp_type_location): New function. (lto_read_decls): First collect all types, then sort them according by location before register_odr_type is called. 2018-04-18 Martin Liska <mliska@suse.cz> PR ipa/83983 PR ipa/85391 * g++.dg/lto/pr83121_1.C (struct Environment): Adjust expected output. From-SVN: r259479
Diffstat (limited to 'gcc/lto')
-rw-r--r--gcc/lto/ChangeLog9
-rw-r--r--gcc/lto/lto.c46
2 files changed, 54 insertions, 1 deletions
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index fc0ecb7..3df8fe8 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,12 @@
+2018-04-18 Martin Liska <mliska@suse.cz>
+
+ PR ipa/83983
+ PR ipa/85391
+ * lto.c (cmp_type_location): New function.
+ (lto_read_decls): First collect all types, then
+ sort them according by location before register_odr_type
+ is called.
+
2018-04-18 Jan Hubicka <jh@suse.cz>
Martin Liska <mliska@suse.cz>
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 0099398..1a6b18d 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -1695,6 +1695,40 @@ unify_scc (struct data_in *data_in, unsigned from,
}
+/* Compare types based on source file location. */
+
+static int
+cmp_type_location (const void *p1_, const void *p2_)
+{
+ tree *p1 = (tree*)(const_cast<void *>(p1_));
+ tree *p2 = (tree*)(const_cast<void *>(p2_));
+ if (*p1 == *p2)
+ return 0;
+
+ tree tname1 = TYPE_NAME (*p1);
+ tree tname2 = TYPE_NAME (*p2);
+
+ const char *f1 = DECL_SOURCE_FILE (tname1);
+ const char *f2 = DECL_SOURCE_FILE (tname2);
+
+ int r = strcmp (f1, f2);
+ if (r == 0)
+ {
+ int l1 = DECL_SOURCE_LINE (tname1);
+ int l2 = DECL_SOURCE_LINE (tname2);
+ if (l1 == l2)
+ {
+ int l1 = DECL_SOURCE_COLUMN (tname1);
+ int l2 = DECL_SOURCE_COLUMN (tname2);
+ return l1 - l2;
+ }
+ else
+ return l1 - l2;
+ }
+ else
+ return r;
+}
+
/* Read all the symbols from buffer DATA, using descriptors in DECL_DATA.
RESOLUTIONS is the set of symbols picked by the linker (read from the
resolution file when the linker plugin is being used). */
@@ -1711,6 +1745,7 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
unsigned int i;
const uint32_t *data_ptr, *data_end;
uint32_t num_decl_states;
+ auto_vec<tree> odr_types;
lto_input_block ib_main ((const char *) data + main_offset,
header->main_size, decl_data->mode_table);
@@ -1780,7 +1815,7 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
if (!TYPE_CANONICAL (t))
gimple_register_canonical_type (t);
if (odr_type_p (t))
- register_odr_type (t);
+ odr_types.safe_push (t);
}
/* Link shared INTEGER_CSTs into TYPE_CACHED_VALUEs of its
type which is also member of this SCC. */
@@ -1842,6 +1877,15 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
*slot = state;
}
+ /* Sort types for the file before registering in ODR machinery. */
+ if (lto_location_cache::current_cache)
+ lto_location_cache::current_cache->apply_location_cache ();
+ odr_types.qsort (cmp_type_location);
+
+ /* Register ODR types. */
+ for (unsigned i = 0; i < odr_types.length (); i++)
+ register_odr_type (odr_types[i]);
+
if (data_ptr != data_end)
internal_error ("bytecode stream: garbage at the end of symbols section");