Commit af597536 by Martin Liska Committed by Martin Liska

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
parent 3c674e3e
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>
......
......@@ -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");
......
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.
2018-04-18 H.J. Lu <hongjiu.lu@intel.com>
PR target/85388
......
......@@ -2,7 +2,7 @@ struct Environment {
struct AsyncHooks {
int providers_[1];
};
AsyncHooks async_hooks_; // { dg-lto-message "a field of same name but different type is defined in another translation unit" }
AsyncHooks async_hooks_;
};
void fn1() { Environment a; }
int main ()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment