mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
5bba48ed3c
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 llvm-svn: 342574
75 lines
2.1 KiB
LLVM
75 lines
2.1 KiB
LLVM
; REQUIRES: x86-registered-target
|
|
|
|
; Test to ensure that only referenced type ID records are emitted into
|
|
; each distributed index file.
|
|
|
|
; RUN: opt -thinlto-bc -o %t1.o %s
|
|
; RUN: opt -thinlto-bc -o %t2.o %p/Inputs/cfi-distributed.ll
|
|
|
|
; RUN: llvm-lto2 run -thinlto-distributed-indexes %t1.o %t2.o \
|
|
; RUN: -o %t3 \
|
|
; RUN: -r=%t1.o,test,px \
|
|
; 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,_ZTV1B3, \
|
|
; RUN: -r=%t2.o,_ZTV1B3,px
|
|
|
|
; 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"
|
|
|
|
; 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"
|
|
|
|
%struct.B = type { %struct.A }
|
|
%struct.A = type { i32 (...)** }
|
|
|
|
@_ZTV1B = constant { [3 x i8*] } { [3 x i8*] [i8* undef, i8* undef, i8* undef] }, !type !0
|
|
|
|
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")
|
|
br i1 %1, label %cont, label %trap
|
|
|
|
trap:
|
|
tail call void @llvm.trap()
|
|
unreachable
|
|
|
|
cont:
|
|
ret void
|
|
}
|
|
|
|
declare void @test2(i8*)
|
|
declare void @test3(i8*)
|
|
declare i1 @llvm.type.test(i8*, metadata)
|
|
declare void @llvm.trap()
|
|
|
|
!0 = !{i64 16, !"_ZTS1A"}
|
|
!1 = !{i64 16, !"_ZTS1B"}
|