mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
73a3f62c9b
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
40 lines
931 B
LLVM
40 lines
931 B
LLVM
; 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
|
|
}
|
|
|