diff options
author | Thomas Preud'homme <thomas.preudhomme@arm.com> | 2017-06-20 11:19:36 +0000 |
---|---|---|
committer | Thomas Preud'homme <thomas.preudhomme@arm.com> | 2017-06-20 11:19:36 +0000 |
commit | e5d10596188607f91c424137fdd056992321a5a3 (patch) | |
tree | d6a039c64e55d31354a3a9d8f223e33110506bec | |
parent | 4ff2f4254efd9384a06f6d66e64e339a28c0257c (diff) |
Fix PR69866
2017-06-20 Thomas Preud'homme <thomas.preudhomme@arm.com>
Backport from mainline
2017-06-15 Jan Hubicka <hubicka@ucw.cz>
Thomas Preud'homme <thomas.preudhomme@arm.com>
gcc/
PR lto/69866
* lto-symtab.c (lto_symtab_merge_symbols): Drop useless definitions
that resolved externally.
2017-06-15 Thomas Preud'homme <thomas.preudhomme@arm.com>
gcc/testsuite/
PR lto/69866
* gcc.dg/lto/pr69866_0.c: New test.
* gcc.dg/lto/pr69866_1.c: Likewise.
Backport from mainline
2017-06-18 Jan Hubicka <hubicka@ucw.cz>
gcc/testsuite/
* gcc.dg/lto/pr69866_0.c: This test needs alias.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/ARM/embedded-6-branch@249406 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/lto/ChangeLog.arm | 9 | ||||
-rw-r--r-- | gcc/lto/lto-symtab.c | 36 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog.arm | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/lto/pr69866_0.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/lto/pr69866_1.c | 6 |
5 files changed, 79 insertions, 0 deletions
diff --git a/gcc/lto/ChangeLog.arm b/gcc/lto/ChangeLog.arm new file mode 100644 index 00000000000..5766abaf39d --- /dev/null +++ b/gcc/lto/ChangeLog.arm @@ -0,0 +1,9 @@ +2017-06-20 Thomas Preud'homme <thomas.preudhomme@arm.com> + + Backport from mainline + 2017-06-15 Jan Hubicka <hubicka@ucw.cz> + Thomas Preud'homme <thomas.preudhomme@arm.com> + + PR lto/69866 + * lto-symtab.c (lto_symtab_merge_symbols): Drop useless definitions + that resolved externally. diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index 94b919b53e6..c298fb6dd9f 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -942,6 +942,42 @@ lto_symtab_merge_symbols (void) if (tgt) node->resolve_alias (tgt, true); } + /* If the symbol was preempted outside IR, see if we want to get rid + of the definition. */ + if (node->analyzed + && !DECL_EXTERNAL (node->decl) + && (node->resolution == LDPR_PREEMPTED_REG + || node->resolution == LDPR_RESOLVED_IR + || node->resolution == LDPR_RESOLVED_EXEC + || node->resolution == LDPR_RESOLVED_DYN)) + { + DECL_EXTERNAL (node->decl) = 1; + /* If alias to local symbol was preempted by external definition, + we know it is not pointing to the local symbol. Remove it. */ + if (node->alias + && !node->weakref + && !node->transparent_alias + && node->get_alias_target ()->binds_to_current_def_p ()) + { + node->alias = false; + node->remove_all_references (); + node->definition = false; + node->analyzed = false; + node->cpp_implicit_alias = false; + } + else if (!node->alias + && node->definition + && node->get_availability () <= AVAIL_INTERPOSABLE) + { + if ((cnode = dyn_cast <cgraph_node *> (node)) != NULL) + cnode->reset (); + else + { + node->analyzed = node->definition = false; + node->remove_all_references (); + } + } + } if (!(cnode = dyn_cast <cgraph_node *> (node)) || !cnode->clone_of diff --git a/gcc/testsuite/ChangeLog.arm b/gcc/testsuite/ChangeLog.arm index 4dd6a22a5f8..acffbde59b7 100644 --- a/gcc/testsuite/ChangeLog.arm +++ b/gcc/testsuite/ChangeLog.arm @@ -1,6 +1,20 @@ 2017-06-20 Thomas Preud'homme <thomas.preudhomme@arm.com> Backport from mainline + 2017-06-15 Thomas Preud'homme <thomas.preudhomme@arm.com> + + PR lto/69866 + * gcc.dg/lto/pr69866_0.c: New test. + * gcc.dg/lto/pr69866_1.c: Likewise. + + Backport from mainline + 2017-06-18 Jan Hubicka <hubicka@ucw.cz> + + * gcc.dg/lto/pr69866_0.c: This test needs alias. + +2017-06-20 Thomas Preud'homme <thomas.preudhomme@arm.com> + + Backport from mainline 2017-06-20 Prakhar Bahuguna <prakhar.bahuguna@arm.com> * gcc.target/arm/acle/cdp.c: Add feature macro bitmap test. diff --git a/gcc/testsuite/gcc.dg/lto/pr69866_0.c b/gcc/testsuite/gcc.dg/lto/pr69866_0.c new file mode 100644 index 00000000000..8c90030a57d --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr69866_0.c @@ -0,0 +1,14 @@ +/* { dg-lto-do link } */ +/* { dg-require-alias "" } */ + +int _umh(int i) +{ + return i+1; +} + +int weaks(int i) __attribute__((weak, alias("_umh"))); + +int main() +{ + return weaks(10); +} diff --git a/gcc/testsuite/gcc.dg/lto/pr69866_1.c b/gcc/testsuite/gcc.dg/lto/pr69866_1.c new file mode 100644 index 00000000000..3a14f850eef --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/pr69866_1.c @@ -0,0 +1,6 @@ +/* { dg-options { -fno-lto } } */ + +int weaks(int i) +{ + return i+1; +} |