1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -cross-dso-cfi < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -passes=cross-dso-cfi < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; CHECK: define void @__cfi_check(i64 %[[TYPE:.*]], i8* %[[ADDR:.*]], i8* %[[DATA:.*]]) align 4096 5*9880d681SAndroid Build Coastguard Worker; CHECK: switch i64 %[[TYPE]], label %[[FAIL:.*]] [ 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64 111, label %[[L1:.*]] 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64 222, label %[[L2:.*]] 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64 333, label %[[L3:.*]] 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: i64 444, label %[[L4:.*]] 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: {{]$}} 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK: [[EXIT:.*]]: 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; CHECK: [[FAIL]]: 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @__cfi_check_fail(i8* %[[DATA]], i8* %[[ADDR]]) 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %[[EXIT]] 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; CHECK: [[L1]]: 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i1 @llvm.type.test(i8* %[[ADDR]], metadata i64 111) 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br {{.*}} label %[[EXIT]], label %[[FAIL]] 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; CHECK: [[L2]]: 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i1 @llvm.type.test(i8* %[[ADDR]], metadata i64 222) 25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br {{.*}} label %[[EXIT]], label %[[FAIL]] 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; CHECK: [[L3]]: 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i1 @llvm.type.test(i8* %[[ADDR]], metadata i64 333) 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br {{.*}} label %[[EXIT]], label %[[FAIL]] 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; CHECK: [[L4]]: 32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i1 @llvm.type.test(i8* %[[ADDR]], metadata i64 444) 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br {{.*}} label %[[EXIT]], label %[[FAIL]] 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 36*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker@_ZTV1A = constant i8 0, !type !4, !type !5 39*9880d681SAndroid Build Coastguard Worker@_ZTV1B = constant i8 0, !type !4, !type !5, !type !6, !type !7 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine signext i8 @f11() !type !0 !type !1 { 42*9880d681SAndroid Build Coastguard Workerentry: 43*9880d681SAndroid Build Coastguard Worker ret i8 1 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine signext i8 @f12() !type !0 !type !1 { 47*9880d681SAndroid Build Coastguard Workerentry: 48*9880d681SAndroid Build Coastguard Worker ret i8 2 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine signext i8 @f13() !type !0 !type !1 { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker ret i8 3 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine i32 @f21() !type !2 !type !3 { 57*9880d681SAndroid Build Coastguard Workerentry: 58*9880d681SAndroid Build Coastguard Worker ret i32 4 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine i32 @f22() !type !2 !type !3 { 62*9880d681SAndroid Build Coastguard Workerentry: 63*9880d681SAndroid Build Coastguard Worker ret i32 5 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine weak_odr hidden void @__cfi_check_fail(i8*, i8*) { 67*9880d681SAndroid Build Coastguard Workerentry: 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker!llvm.module.flags = !{!8} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker!0 = !{i64 0, !"_ZTSFcvE"} 74*9880d681SAndroid Build Coastguard Worker!1 = !{i64 0, i64 111} 75*9880d681SAndroid Build Coastguard Worker!2 = !{i64 0, !"_ZTSFivE"} 76*9880d681SAndroid Build Coastguard Worker!3 = !{i64 0, i64 222} 77*9880d681SAndroid Build Coastguard Worker!4 = !{i64 16, !"_ZTS1A"} 78*9880d681SAndroid Build Coastguard Worker!5 = !{i64 16, i64 333} 79*9880d681SAndroid Build Coastguard Worker!6 = !{i64 16, !"_ZTS1B"} 80*9880d681SAndroid Build Coastguard Worker!7 = !{i64 16, i64 444} 81*9880d681SAndroid Build Coastguard Worker!8 = !{i32 4, !"Cross-DSO CFI", i32 1} 82