mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 14:47:00 +00:00
[ThinLTO] Write TYPE_IDs for types used in functions imported by aliases
Summary: ThinLTO imports alias as a copy of a aliasee, so when we import such functions with type tests we will need type ids used by function. However after D49565 we pick types only during processing of FunctionSummary which is not happening for such aliesees. Example: Unit U1 with a type, a functions F with the type check, and an alias A to the function. Unit U2 with only call to the alias A. In particular, this happens when we use -mconstructor-aliases, which is default. So if c++ unit only creates instance of the class, without calling any other methods it will lack of necessary type ids, which will result in false CFI reports. Reviewers: tejohnson, eugenis Subscribers: pcc, mehdi_amini, inglorion, eraman, hiraditya, steven_wu, dexonsmith, llvm-commits Differential Revision: https://reviews.llvm.org/D52201 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342574 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3c27669a0d
commit
6e5f07e042
@ -3877,6 +3877,9 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
|
||||
Stream.EmitRecord(bitc::FS_COMBINED_ALIAS, NameVals, FSAliasAbbrev);
|
||||
NameVals.clear();
|
||||
MaybeEmitOriginalName(*AS);
|
||||
|
||||
if (auto *FS = dyn_cast<FunctionSummary>(&AS->getAliasee()))
|
||||
getReferencedTypeIds(FS, ReferencedTypeIds);
|
||||
}
|
||||
|
||||
if (!Index.cfiFunctionDefs().empty()) {
|
||||
|
@ -3,9 +3,13 @@ target triple = "x86_64-grtev4-linux-gnu"
|
||||
|
||||
%struct.B2 = type { %struct.A2 }
|
||||
%struct.A2 = type { i32 (...)** }
|
||||
%struct.B3 = type { %struct.A3 }
|
||||
%struct.A3 = type { i32 (...)** }
|
||||
|
||||
@_ZTV1B2 = constant { [3 x i8*] } { [3 x i8*] [i8* undef, i8* undef, i8* undef] }, !type !0
|
||||
|
||||
@_ZTV1B3 = constant { [3 x i8*] } { [3 x i8*] [i8* undef, i8* undef, i8* undef] }, !type !1
|
||||
|
||||
define void @test2(i8* %b) {
|
||||
entry:
|
||||
%0 = bitcast i8* %b to i8**
|
||||
@ -21,8 +25,25 @@ cont:
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test1(i8* %b) {
|
||||
entry:
|
||||
%0 = bitcast i8* %b to i8**
|
||||
%vtable2 = load i8*, i8** %0
|
||||
%1 = tail call i1 @llvm.type.test(i8* %vtable2, metadata !"_ZTS1A3")
|
||||
br i1 %1, label %cont, label %trap
|
||||
|
||||
trap:
|
||||
tail call void @llvm.trap()
|
||||
unreachable
|
||||
|
||||
cont:
|
||||
ret void
|
||||
}
|
||||
|
||||
@test3 = hidden unnamed_addr alias void (i8*), void (i8*)* @test1
|
||||
|
||||
declare i1 @llvm.type.test(i8*, metadata)
|
||||
declare void @llvm.trap()
|
||||
|
||||
!0 = !{i64 16, !"_ZTS1A2"}
|
||||
!1 = !{i64 16, !"_ZTS1B2"}
|
||||
!1 = !{i64 16, !"_ZTS1A3"}
|
||||
|
@ -12,21 +12,33 @@
|
||||
; RUN: -r=%t1.o,_ZTV1B, \
|
||||
; RUN: -r=%t1.o,_ZTV1B,px \
|
||||
; RUN: -r=%t1.o,test2, \
|
||||
; RUN: -r=%t1.o,test3, \
|
||||
; RUN: -r=%t2.o,test1, \
|
||||
; RUN: -r=%t2.o,test3,p \
|
||||
; RUN: -r=%t2.o,test2,px \
|
||||
; RUN: -r=%t2.o,_ZTV1B2, \
|
||||
; RUN: -r=%t2.o,_ZTV1B2,px
|
||||
; RUN: -r=%t2.o,_ZTV1B2,px \
|
||||
; RUN: -r=%t2.o,_ZTV1B3, \
|
||||
; RUN: -r=%t2.o,_ZTV1B3,px
|
||||
|
||||
; Since @test calls @test2, the latter should be imported here and the
|
||||
; first index file should reference both type ids.
|
||||
; Check that we have all needed type IDs.
|
||||
; RUN: llvm-dis %t1.o.thinlto.bc -o - | FileCheck %s --check-prefix=INDEX1
|
||||
|
||||
; Used by @llvm.type.test in @test
|
||||
; INDEX1: typeid: (name: "_ZTS1A"
|
||||
|
||||
; Used by @llvm.type.test in @test2 imported to be called from @test
|
||||
; INDEX1: typeid: (name: "_ZTS1A2"
|
||||
|
||||
; The second index file, corresponding to @test2, should only contain the
|
||||
; typeid for _ZTS1A.
|
||||
; Used by @llvm.type.test in @test1 imported to be called by alias
|
||||
; @test3 from @test
|
||||
; INDEX1: typeid: (name: "_ZTS1A3"
|
||||
|
||||
; The second index file, should only contain the type IDs used in @test1 and @test2.
|
||||
; RUN: llvm-dis %t2.o.thinlto.bc -o - | FileCheck %s --check-prefix=INDEX2
|
||||
; INDEX2-NOT: typeid: (name: "_ZTS1A"
|
||||
; INDEX2: typeid: (name: "_ZTS1A2"
|
||||
; INDEX2: typeid: (name: "_ZTS1A3"
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-grtev4-linux-gnu"
|
||||
@ -39,6 +51,7 @@ target triple = "x86_64-grtev4-linux-gnu"
|
||||
define void @test(i8* %b) {
|
||||
entry:
|
||||
tail call void @test2(i8* %b)
|
||||
tail call void @test3(i8* %b)
|
||||
%0 = bitcast i8* %b to i8**
|
||||
%vtable2 = load i8*, i8** %0
|
||||
%1 = tail call i1 @llvm.type.test(i8* %vtable2, metadata !"_ZTS1A")
|
||||
@ -53,6 +66,7 @@ cont:
|
||||
}
|
||||
|
||||
declare void @test2(i8*)
|
||||
declare void @test3(i8*)
|
||||
declare i1 @llvm.type.test(i8*, metadata)
|
||||
declare void @llvm.trap()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user