summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2017-08-22 08:50:56 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2017-08-22 08:50:56 +0000
commit1e94ca115d014500df6f6cc920d58d6746043eb1 (patch)
tree5b62d11db59b6c42557a58f6c6d8f96214d1088c /llvm
parent3a1af22099f8193c077ba594d78482daa39ca3fa (diff)
downloadbcm5719-llvm-1e94ca115d014500df6f6cc920d58d6746043eb1.tar.gz
bcm5719-llvm-1e94ca115d014500df6f6cc920d58d6746043eb1.zip
[lib/Analysis] - Mark personality functions as live.
This is PR33245. Case I am fixing is next: Imagine we have 2 BC files, one defines and uses personality routine, second has only declaration and also uses it. Previously algorithm computing dead symbols (llvm::computeDeadSymbols) did not know about personality routines and leaved them dead even if function that has routine was live. As a result thinLTOInternalizeAndPromoteGUID() method changed binding for such symbol to local. Later when LLD tried to link these objects it failed because one object had undefined global symbol for routine and second object contained local definition instead of global. Patch set the live root flag on the corresponding FunctionSummary for personality routines when we build the per-module summaries during the compile step. Differential revision: https://reviews.llvm.org/D36834 llvm-svn: 311432
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Analysis/ModuleSummaryAnalysis.cpp6
-rw-r--r--llvm/test/ThinLTO/X86/Inputs/personality-local.ll6
-rw-r--r--llvm/test/ThinLTO/X86/Inputs/personality.ll10
-rw-r--r--llvm/test/ThinLTO/X86/personality-local.ll39
-rw-r--r--llvm/test/ThinLTO/X86/personality.ll40
5 files changed, 101 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
index cb735562fa6..886dac8314e 100644
--- a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
+++ b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
@@ -403,6 +403,12 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
CantBePromoted);
}
+ // Set live flag for all personality functions. That allows to
+ // preserve them during DCE.
+ for (const llvm::Function &F : M)
+ if (!F.isDeclaration() && F.hasPersonalityFn())
+ setLiveRoot(Index, F.getPersonalityFn()->getName());
+
// Compute summaries for all variables defined in module, and save in the
// index.
for (const GlobalVariable &G : M.globals()) {
diff --git a/llvm/test/ThinLTO/X86/Inputs/personality-local.ll b/llvm/test/ThinLTO/X86/Inputs/personality-local.ll
new file mode 100644
index 00000000000..dc27a375e1a
--- /dev/null
+++ b/llvm/test/ThinLTO/X86/Inputs/personality-local.ll
@@ -0,0 +1,6 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+define void @foo() {
+ ret void
+}
diff --git a/llvm/test/ThinLTO/X86/Inputs/personality.ll b/llvm/test/ThinLTO/X86/Inputs/personality.ll
new file mode 100644
index 00000000000..88c32cb11a2
--- /dev/null
+++ b/llvm/test/ThinLTO/X86/Inputs/personality.ll
@@ -0,0 +1,10 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+define void @bar() personality i32 (i32, i32, i64, i8*, i8*)* @personality_routine {
+ ret void
+}
+
+define protected i32 @personality_routine(i32, i32, i64, i8*, i8*) {
+ ret i32 0
+}
diff --git a/llvm/test/ThinLTO/X86/personality-local.ll b/llvm/test/ThinLTO/X86/personality-local.ll
new file mode 100644
index 00000000000..650e882a0cc
--- /dev/null
+++ b/llvm/test/ThinLTO/X86/personality-local.ll
@@ -0,0 +1,39 @@
+; RUN: opt -module-summary %s -o %t1.bc
+; RUN: opt -module-summary %S/Inputs/personality-local.ll -o %t2.bc
+
+; RUN: llvm-lto2 run -o %t.o %t1.bc %t2.bc -save-temps \
+; RUN: -r %t2.bc,foo,p \
+; RUN: -r %t1.bc,foo,l \
+; RUN: -r %t1.bc,bar,p \
+; RUN: -r %t1.bc,main,xp
+; RUN: llvm-readobj -t %t.o.1 | FileCheck %s
+
+; CHECK: Symbol {
+; CHECK: Name: foo
+; CHECK-NEXT: Value: 0x0
+; CHECK-NEXT: Size: 1
+; CHECK-NEXT: Binding: Global
+; CHECK-NEXT: Type: Function
+; CHECK-NEXT: Other: 0
+; CHECK-NEXT: Section: .text
+; CHECK-NEXT: }
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+declare void @foo()
+
+define void @bar() personality i32 (i32, i32, i64, i8*, i8*)* @personality_routine {
+ ret void
+}
+
+define internal i32 @personality_routine(i32, i32, i64, i8*, i8*) {
+ call void @foo()
+ ret i32 0
+}
+
+define i32 @main() {
+ call void @bar()
+ ret i32 0
+}
+
diff --git a/llvm/test/ThinLTO/X86/personality.ll b/llvm/test/ThinLTO/X86/personality.ll
new file mode 100644
index 00000000000..4b77cb34f72
--- /dev/null
+++ b/llvm/test/ThinLTO/X86/personality.ll
@@ -0,0 +1,40 @@
+; RUN: opt -module-summary %s -o %t1.bc
+; RUN: opt -module-summary %S/Inputs/personality.ll -o %t2.bc
+
+; RUN: llvm-lto2 run -o %t.o %t1.bc %t2.bc -save-temps \
+; RUN: -r %t2.bc,bar,p \
+; RUN: -r %t2.bc,personality_routine,p \
+; RUN: -r %t1.bc,foo,p \
+; RUN: -r %t1.bc,personality_routine,l \
+; RUN: -r %t1.bc,main,xp \
+; RUN: -r %t1.bc,bar,l
+; RUN: llvm-readobj -t %t.o.1 | FileCheck %s --check-prefix=BINDING
+
+; BINDING: Symbol {
+; BINDING: Name: personality_routine
+; BINDING-NEXT: Value:
+; BINDING-NEXT: Size:
+; BINDING-NEXT: Binding: Global
+; BINDING-NEXT: Type: Function
+; BINDING-NEXT: Other [
+; BINDING-NEXT: STV_PROTECTED
+; BINDING-NEXT: ]
+; BINDING-NEXT: Section: .text
+; BINDING-NEXT: }
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+declare protected i32 @personality_routine(i32, i32, i64, i8*, i8*)
+declare void @bar()
+
+define void @foo() personality i32 (i32, i32, i64, i8*, i8*)* @personality_routine {
+ ret void
+}
+
+define i32 @main() {
+ call void @foo()
+ call void @bar()
+ ret i32 0
+}
+
OpenPOWER on IntegriCloud