mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-15 07:39:35 +08:00
re PR lto/61886 (LTO breaks fread with _FORTIFY_SOURCE=2)
PR ipa/61886 * symtab.c (symtab_node::equal_address_to): New parameter MEMORY_ACCESSED. * cgraph.h (symtab_node::equal_address_to): Update prototype. From-SVN: r231440
This commit is contained in:
parent
eb457a8c59
commit
b2539e1e8d
@ -1,3 +1,10 @@
|
||||
2015-12-08 Jan Hubicka <hubicka@ucw.cz>
|
||||
|
||||
PR ipa/61886
|
||||
* symtab.c (symtab_node::equal_address_to): New parameter
|
||||
MEMORY_ACCESSED.
|
||||
* cgraph.h (symtab_node::equal_address_to): Update prototype.
|
||||
|
||||
2015-12-08 DJ Delorie <dj@redhat.com>
|
||||
|
||||
* config/rx/rx.opt (-mjsr): Add.
|
||||
|
@ -355,8 +355,13 @@ public:
|
||||
|
||||
/* Return 0 if symbol is known to have different address than S2,
|
||||
Return 1 if symbol is known to have same address as S2,
|
||||
return 2 otherwise. */
|
||||
int equal_address_to (symtab_node *s2);
|
||||
return 2 otherwise.
|
||||
|
||||
If MEMORY_ACCESSED is true, assume that both memory pointer to THIS
|
||||
and S2 is going to be accessed. This eliminates the situations when
|
||||
either THIS or S2 is NULL and is seful for comparing bases when deciding
|
||||
about memory aliasing. */
|
||||
int equal_address_to (symtab_node *s2, bool memory_accessed = false);
|
||||
|
||||
/* Return true if symbol's address may possibly be compared to other
|
||||
symbol's address. */
|
||||
|
33
gcc/symtab.c
33
gcc/symtab.c
@ -1878,9 +1878,14 @@ symtab_node::nonzero_address ()
|
||||
|
||||
/* Return 0 if symbol is known to have different address than S2,
|
||||
Return 1 if symbol is known to have same address as S2,
|
||||
return 2 otherwise. */
|
||||
return 2 otherwise.
|
||||
|
||||
If MEMORY_ACCESSED is true, assume that both memory pointer to THIS
|
||||
and S2 is going to be accessed. This eliminates the situations when
|
||||
either THIS or S2 is NULL and is seful for comparing bases when deciding
|
||||
about memory aliasing. */
|
||||
int
|
||||
symtab_node::equal_address_to (symtab_node *s2)
|
||||
symtab_node::equal_address_to (symtab_node *s2, bool memory_accessed)
|
||||
{
|
||||
enum availability avail1, avail2;
|
||||
|
||||
@ -1888,6 +1893,16 @@ symtab_node::equal_address_to (symtab_node *s2)
|
||||
if (this == s2)
|
||||
return 1;
|
||||
|
||||
/* Unwind transparent aliases first; those are always equal to their
|
||||
target. */
|
||||
if (this->transparent_alias && this->analyzed)
|
||||
return this->get_alias_target ()->equal_address_to (s2);
|
||||
while (s2->transparent_alias && s2->analyzed)
|
||||
s2 = s2->get_alias_target();
|
||||
|
||||
if (this == s2)
|
||||
return 1;
|
||||
|
||||
/* For non-interposable aliases, lookup and compare their actual definitions.
|
||||
Also check if the symbol needs to bind to given definition. */
|
||||
symtab_node *rs1 = ultimate_alias_target (&avail1);
|
||||
@ -1924,8 +1939,9 @@ symtab_node::equal_address_to (symtab_node *s2)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* If both symbols may resolve to NULL, we can not really prove them different. */
|
||||
if (!nonzero_address () && !s2->nonzero_address ())
|
||||
/* If both symbols may resolve to NULL, we can not really prove them
|
||||
different. */
|
||||
if (!memory_accessed && !nonzero_address () && !s2->nonzero_address ())
|
||||
return 2;
|
||||
|
||||
/* Except for NULL, functions and variables never overlap. */
|
||||
@ -1956,11 +1972,12 @@ symtab_node::equal_address_to (symtab_node *s2)
|
||||
}
|
||||
|
||||
/* TODO: Alias oracle basically assume that addresses of global variables
|
||||
are different unless they are declared as alias of one to another.
|
||||
We probably should be consistent and use this fact here, too, and update
|
||||
alias oracle to use this predicate. */
|
||||
are different unless they are declared as alias of one to another while
|
||||
the code folding comparsions doesn't.
|
||||
We probably should be consistent and use this fact here, too, but for
|
||||
the moment return false only when we are called from the alias oracle. */
|
||||
|
||||
return 2;
|
||||
return memory_accessed && rs1 != rs2 ? 0 : 2;
|
||||
}
|
||||
|
||||
/* Worker for call_for_symbol_and_aliases. */
|
||||
|
Loading…
Reference in New Issue
Block a user