[llvm] r342574 - [ThinLTO] Write TYPE_IDs for types used in functions imported by aliases

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 19 11:51:42 PDT 2018


Author: vitalybuka
Date: Wed Sep 19 11:51:42 2018
New Revision: 342574

URL: http://llvm.org/viewvc/llvm-project?rev=342574&view=rev
Log:
[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

Modified:
    llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
    llvm/trunk/test/ThinLTO/X86/Inputs/cfi-distributed.ll
    llvm/trunk/test/ThinLTO/X86/cfi-distributed.ll

Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=342574&r1=342573&r2=342574&view=diff
==============================================================================
--- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
+++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Wed Sep 19 11:51:42 2018
@@ -3877,6 +3877,9 @@ void IndexBitcodeWriter::writeCombinedGl
     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()) {

Modified: llvm/trunk/test/ThinLTO/X86/Inputs/cfi-distributed.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/Inputs/cfi-distributed.ll?rev=342574&r1=342573&r2=342574&view=diff
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/Inputs/cfi-distributed.ll (original)
+++ llvm/trunk/test/ThinLTO/X86/Inputs/cfi-distributed.ll Wed Sep 19 11:51:42 2018
@@ -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
 
+ at _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
+}
+
+ at 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"}

Modified: llvm/trunk/test/ThinLTO/X86/cfi-distributed.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ThinLTO/X86/cfi-distributed.ll?rev=342574&r1=342573&r2=342574&view=diff
==============================================================================
--- llvm/trunk/test/ThinLTO/X86/cfi-distributed.ll (original)
+++ llvm/trunk/test/ThinLTO/X86/cfi-distributed.ll Wed Sep 19 11:51:42 2018
@@ -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()
 




More information about the llvm-commits mailing list