diff options
author | Martin Liska <mliska@suse.cz> | 2018-04-18 22:08:44 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-04-18 20:08:44 +0000 |
commit | af5975362b21c2a1268aac5b02545de482a2cc7c (patch) | |
tree | 0cf3eaf62eae18fa7fecb4e5c9bc4e81c28ea5a5 /gcc/lto | |
parent | 3c674e3e41e8b983161b3af788f1ab09e163808d (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/lto/lto.c | 46 |
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"); |