[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:
Vitaly Buka 2018-09-19 18:51:42 +00:00
parent 3c27669a0d
commit 6e5f07e042
3 changed files with 44 additions and 6 deletions

View File

@ -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()) {

View File

@ -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"}

View File

@ -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()