Now that we have a way to mark GlobalValues as local we can use the symbol resolutions that the linker plugin provides as part of lto/thinlto link step to refine the compilers view on what symbols will end up being local. Originally commited as r317374, but reverted in r317395 to update some missed tests. Differential Revision: https://reviews.llvm.org/D35702 llvm-svn: 317408
109 lines
4.1 KiB
LLVM
109 lines
4.1 KiB
LLVM
; Test that we correctly import an indir resolution for type identifier "typeid1".
|
|
; RUN: opt -S -wholeprogramdevirt -wholeprogramdevirt-summary-action=import -wholeprogramdevirt-read-summary=%S/Inputs/import-indir.yaml -wholeprogramdevirt-write-summary=%t < %s | FileCheck %s
|
|
; RUN: FileCheck --check-prefix=SUMMARY %s < %t
|
|
|
|
; SUMMARY: GlobalValueMap:
|
|
; SUMMARY-NEXT: 42:
|
|
; SUMMARY-NEXT: - Linkage: 0
|
|
; SUMMARY-NEXT: NotEligibleToImport: false
|
|
; SUMMARY-NEXT: Live: true
|
|
; SUMMARY-NEXT: Local: false
|
|
; SUMMARY-NEXT: TypeTestAssumeVCalls:
|
|
; SUMMARY-NEXT: - GUID: 123
|
|
; SUMMARY-NEXT: Offset: 0
|
|
; SUMMARY-NEXT: - GUID: 456
|
|
; SUMMARY-NEXT: Offset: 4
|
|
; SUMMARY-NEXT: TypeCheckedLoadVCalls:
|
|
; SUMMARY-NEXT: - GUID: 789
|
|
; SUMMARY-NEXT: Offset: 8
|
|
; SUMMARY-NEXT: - GUID: 1234
|
|
; SUMMARY-NEXT: Offset: 16
|
|
; SUMMARY-NEXT: TypeTestAssumeConstVCalls:
|
|
; SUMMARY-NEXT: - VFunc:
|
|
; SUMMARY-NEXT: GUID: 123
|
|
; SUMMARY-NEXT: Offset: 4
|
|
; SUMMARY-NEXT: Args: [ 12, 24 ]
|
|
; SUMMARY-NEXT: TypeCheckedLoadConstVCalls:
|
|
; SUMMARY-NEXT: - VFunc:
|
|
; SUMMARY-NEXT: GUID: 456
|
|
; SUMMARY-NEXT: Offset: 8
|
|
; SUMMARY-NEXT: Args: [ 24, 12 ]
|
|
; SUMMARY-NEXT: TypeIdMap:
|
|
; SUMMARY-NEXT: typeid1:
|
|
; SUMMARY-NEXT: TTRes:
|
|
; SUMMARY-NEXT: Kind: Unsat
|
|
; SUMMARY-NEXT: SizeM1BitWidth: 0
|
|
; SUMMARY-NEXT: AlignLog2: 0
|
|
; SUMMARY-NEXT: SizeM1: 0
|
|
; SUMMARY-NEXT: BitMask: 0
|
|
; SUMMARY-NEXT: InlineBits: 0
|
|
; SUMMARY-NEXT: WPDRes:
|
|
; SUMMARY-NEXT: 0:
|
|
; SUMMARY-NEXT: Kind: Indir
|
|
; SUMMARY-NEXT: SingleImplName: ''
|
|
; SUMMARY-NEXT: ResByArg:
|
|
; SUMMARY-NEXT: 4:
|
|
; SUMMARY-NEXT: Kind: Indir
|
|
; SUMMARY-NEXT: SingleImplName: ''
|
|
; SUMMARY-NEXT: ResByArg:
|
|
; SUMMARY-NEXT: :
|
|
; SUMMARY-NEXT: Kind: UniformRetVal
|
|
; SUMMARY-NEXT: Info: 12
|
|
; SUMMARY-NEXT: Byte: 0
|
|
; SUMMARY-NEXT: Bit: 0
|
|
; SUMMARY-NEXT: 12:
|
|
; SUMMARY-NEXT: Kind: UniformRetVal
|
|
; SUMMARY-NEXT: Info: 24
|
|
; SUMMARY-NEXT: Byte: 0
|
|
; SUMMARY-NEXT: Bit: 0
|
|
; SUMMARY-NEXT: 12,24:
|
|
; SUMMARY-NEXT: Kind: UniformRetVal
|
|
; SUMMARY-NEXT: Info: 48
|
|
; SUMMARY-NEXT: Byte: 0
|
|
; SUMMARY-NEXT: Bit: 0
|
|
|
|
target datalayout = "e-p:32:32"
|
|
|
|
declare void @llvm.assume(i1)
|
|
declare void @llvm.trap()
|
|
declare {i8*, i1} @llvm.type.checked.load(i8*, i32, metadata)
|
|
declare i1 @llvm.type.test(i8*, metadata)
|
|
|
|
; CHECK: define i1 @f1
|
|
define i1 @f1(i8* %obj) {
|
|
%vtableptr = bitcast i8* %obj to [1 x i8*]**
|
|
%vtable = load [1 x i8*]*, [1 x i8*]** %vtableptr
|
|
%vtablei8 = bitcast [1 x i8*]* %vtable to i8*
|
|
%p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid1")
|
|
call void @llvm.assume(i1 %p)
|
|
%fptrptr = getelementptr [1 x i8*], [1 x i8*]* %vtable, i32 0, i32 0
|
|
%fptr = load i8*, i8** %fptrptr
|
|
%fptr_casted = bitcast i8* %fptr to i1 (i8*, i32)*
|
|
; CHECK: call i1 %
|
|
%result = call i1 %fptr_casted(i8* %obj, i32 5)
|
|
ret i1 %result
|
|
}
|
|
|
|
; CHECK: define i1 @f2
|
|
define i1 @f2(i8* %obj) {
|
|
%vtableptr = bitcast i8* %obj to [1 x i8*]**
|
|
%vtable = load [1 x i8*]*, [1 x i8*]** %vtableptr
|
|
%vtablei8 = bitcast [1 x i8*]* %vtable to i8*
|
|
%pair = call {i8*, i1} @llvm.type.checked.load(i8* %vtablei8, i32 4, metadata !"typeid1")
|
|
%fptr = extractvalue {i8*, i1} %pair, 0
|
|
%p = extractvalue {i8*, i1} %pair, 1
|
|
; CHECK: [[P:%.*]] = call i1 @llvm.type.test
|
|
; CHECK: br i1 [[P]]
|
|
br i1 %p, label %cont, label %trap
|
|
|
|
cont:
|
|
%fptr_casted = bitcast i8* %fptr to i1 (i8*, i32)*
|
|
; CHECK: call i1 %
|
|
%result = call i1 %fptr_casted(i8* %obj, i32 undef)
|
|
ret i1 %result
|
|
|
|
trap:
|
|
call void @llvm.trap()
|
|
unreachable
|
|
}
|