[llvm] r311432 - [lib/Analysis] - Mark personality functions as live.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 22 01:50:56 PDT 2017


Author: grimar
Date: Tue Aug 22 01:50:56 2017
New Revision: 311432

URL: http://llvm.org/viewvc/llvm-project?rev=311432&view=rev
Log:
[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

Added:
    llvm/trunk/test/ThinLTO/X86/Inputs/personality-local.ll
    llvm/trunk/test/ThinLTO/X86/Inputs/personality.ll
    llvm/trunk/test/ThinLTO/X86/personality-local.ll
    llvm/trunk/test/ThinLTO/X86/personality.ll
Modified:
    llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp

Modified: llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp?rev=311432&r1=311431&r2=311432&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp Tue Aug 22 01:50:56 2017
@@ -403,6 +403,12 @@ ModuleSummaryIndex llvm::buildModuleSumm
                            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()) {

Added: llvm/trunk/test/ThinLTO/X86/Inputs/personality-local.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/personality-local.ll?rev=311432&view=auto
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/Inputs/personality-local.ll (added)
+++ llvm/trunk/test/ThinLTO/X86/Inputs/personality-local.ll Tue Aug 22 01:50:56 2017
@@ -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
+}

Added: llvm/trunk/test/ThinLTO/X86/Inputs/personality.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/personality.ll?rev=311432&view=auto
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/Inputs/personality.ll (added)
+++ llvm/trunk/test/ThinLTO/X86/Inputs/personality.ll Tue Aug 22 01:50:56 2017
@@ -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
+}

Added: llvm/trunk/test/ThinLTO/X86/personality-local.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/personality-local.ll?rev=311432&view=auto
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/personality-local.ll (added)
+++ llvm/trunk/test/ThinLTO/X86/personality-local.ll Tue Aug 22 01:50:56 2017
@@ -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
+}
+

Added: llvm/trunk/test/ThinLTO/X86/personality.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/personality.ll?rev=311432&view=auto
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/personality.ll (added)
+++ llvm/trunk/test/ThinLTO/X86/personality.ll Tue Aug 22 01:50:56 2017
@@ -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
+}
+




More information about the llvm-commits mailing list