aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Preud'homme <thomas.preudhomme@arm.com>2017-06-20 11:19:36 +0000
committerThomas Preud'homme <thomas.preudhomme@arm.com>2017-06-20 11:19:36 +0000
commite5d10596188607f91c424137fdd056992321a5a3 (patch)
treed6a039c64e55d31354a3a9d8f223e33110506bec
parent4ff2f4254efd9384a06f6d66e64e339a28c0257c (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.arm9
-rw-r--r--gcc/lto/lto-symtab.c36
-rw-r--r--gcc/testsuite/ChangeLog.arm14
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr69866_0.c14
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr69866_1.c6
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;
+}