1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00
llvm-mirror/test/ThinLTO/X86/cfi-distributed.ll
Vitaly Buka 5bba48ed3c [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

llvm-svn: 342574
2018-09-19 18:51:42 +00:00

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