1; RUN: opt -S -wholeprogramdevirt %s | FileCheck %s 2 3target datalayout = "e-p:64:64" 4target triple = "x86_64-unknown-linux-gnu" 5 6@vt = global [2 x i8*] [i8* zeroinitializer, i8* bitcast (void (i8*)* @vf to i8*)], !type !0 7 8define void @vf(i8* %this) { 9 ret void 10} 11 12; CHECK: define void @unaligned 13define void @unaligned(i8* %obj) { 14 %vtableptr = bitcast i8* %obj to [1 x i8*]** 15 %vtable = load [1 x i8*]*, [1 x i8*]** %vtableptr 16 %vtablei8 = bitcast [1 x i8*]* %vtable to i8* 17 %p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid") 18 call void @llvm.assume(i1 %p) 19 %fptrptr = getelementptr i8, i8* %vtablei8, i32 1 20 %fptrptr_casted = bitcast i8* %fptrptr to i8** 21 %fptr = load i8*, i8** %fptrptr_casted 22 %fptr_casted = bitcast i8* %fptr to void (i8*)* 23 ; CHECK: call void % 24 call void %fptr_casted(i8* %obj) 25 ret void 26} 27 28; CHECK: define void @outofbounds 29define void @outofbounds(i8* %obj) { 30 %vtableptr = bitcast i8* %obj to [1 x i8*]** 31 %vtable = load [1 x i8*]*, [1 x i8*]** %vtableptr 32 %vtablei8 = bitcast [1 x i8*]* %vtable to i8* 33 %p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid") 34 call void @llvm.assume(i1 %p) 35 %fptrptr = getelementptr i8, i8* %vtablei8, i32 16 36 %fptrptr_casted = bitcast i8* %fptrptr to i8** 37 %fptr = load i8*, i8** %fptrptr_casted 38 %fptr_casted = bitcast i8* %fptr to void (i8*)* 39 ; CHECK: call void % 40 call void %fptr_casted(i8* %obj) 41 ret void 42} 43 44; CHECK: define void @nonfunction 45define void @nonfunction(i8* %obj) { 46 %vtableptr = bitcast i8* %obj to [1 x i8*]** 47 %vtable = load [1 x i8*]*, [1 x i8*]** %vtableptr 48 %vtablei8 = bitcast [1 x i8*]* %vtable to i8* 49 %p = call i1 @llvm.type.test(i8* %vtablei8, metadata !"typeid") 50 call void @llvm.assume(i1 %p) 51 %fptrptr = getelementptr i8, i8* %vtablei8, i32 0 52 %fptrptr_casted = bitcast i8* %fptrptr to i8** 53 %fptr = load i8*, i8** %fptrptr_casted 54 %fptr_casted = bitcast i8* %fptr to void (i8*)* 55 ; CHECK: call void % 56 call void %fptr_casted(i8* %obj) 57 ret void 58} 59 60declare i1 @llvm.type.test(i8*, metadata) 61declare void @llvm.assume(i1) 62 63!0 = !{i32 0, !"typeid"} 64