mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
70e4a61c17
The current code that handles personality functions when creating a module summary does not correctly handle the case where a function's personality function operand refers to the function indirectly (e.g. via a bitcast). This patch handles such cases by treating personality function references like any other reference, i.e. by adding them to the function's reference list. This has the minor side benefit of allowing personality functions to participate in early dead stripping. We do this by calling findRefEdges on the function itself. This way we also end up handling other function operands (specifically prefix data and prologue data) for free. Differential Revision: https://reviews.llvm.org/D37553 llvm-svn: 312698
80 lines
2.2 KiB
LLVM
80 lines
2.2 KiB
LLVM
; 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 %t2.bc,personality_routine2,p \
|
|
; RUN: -r %t2.bc,personality_routine3,p \
|
|
; RUN: -r %t1.bc,foo,p \
|
|
; RUN: -r %t1.bc,foo2,p \
|
|
; RUN: -r %t1.bc,foo3,p \
|
|
; RUN: -r %t1.bc,personality_routine,l \
|
|
; RUN: -r %t1.bc,personality_routine2,l \
|
|
; RUN: -r %t1.bc,personality_routine3,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: }
|
|
|
|
; BINDING-NEXT: Symbol {
|
|
; BINDING-NEXT: Name: personality_routine2
|
|
; 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: }
|
|
|
|
; BINDING-NOT: Name: personality_routine3
|
|
|
|
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 protected i32 @personality_routine2(i32, i32, i64, i8*, i8*)
|
|
declare protected i32 @personality_routine3(i32, i32, i64, i8*, i8*)
|
|
declare void @bar()
|
|
|
|
define void @foo() personality i32 (i32, i32, i64, i8*, i8*)* @personality_routine {
|
|
ret void
|
|
}
|
|
|
|
define internal void @foo2b() personality i8* bitcast (i32 (i32, i32, i64, i8*, i8*)* @personality_routine2 to i8*) {
|
|
ret void
|
|
}
|
|
|
|
define internal void @foo2a() prologue void ()* @foo2b {
|
|
ret void
|
|
}
|
|
|
|
define void @foo2() prefix void ()* @foo2a {
|
|
ret void
|
|
}
|
|
|
|
define void @foo3() personality i8* bitcast (i32 (i32, i32, i64, i8*, i8*)* @personality_routine3 to i8*) {
|
|
ret void
|
|
}
|
|
|
|
define i32 @main() {
|
|
call void @foo()
|
|
call void @foo2()
|
|
call void @bar()
|
|
ret i32 0
|
|
}
|
|
|