summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Bitcode/Writer/BitcodeWriter.cpp3
-rw-r--r--llvm/test/ThinLTO/X86/Inputs/cfi-distributed.ll23
-rw-r--r--llvm/test/ThinLTO/X86/cfi-distributed.ll24
3 files changed, 44 insertions, 6 deletions
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
index 576db06cf2e..adaa5865122 100644
--- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -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()) {
diff --git a/llvm/test/ThinLTO/X86/Inputs/cfi-distributed.ll b/llvm/test/ThinLTO/X86/Inputs/cfi-distributed.ll
index 376c3f5c157..cc1c4fd7875 100644
--- a/llvm/test/ThinLTO/X86/Inputs/cfi-distributed.ll
+++ b/llvm/test/ThinLTO/X86/Inputs/cfi-distributed.ll
@@ -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"}
diff --git a/llvm/test/ThinLTO/X86/cfi-distributed.ll b/llvm/test/ThinLTO/X86/cfi-distributed.ll
index 40753fd2bff..94f3f95c298 100644
--- a/llvm/test/ThinLTO/X86/cfi-distributed.ll
+++ b/llvm/test/ThinLTO/X86/cfi-distributed.ll
@@ -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()
OpenPOWER on IntegriCloud