brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.6 KiB · 76ebec9 Raw
207 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --version 52// __cfi_check_fail codegen when not all CFI checkers are enabled.3 4// RUN: %clang_cc1 -triple x86_64-unknown-linux -O3 -fsanitize-cfi-cross-dso \5// RUN:     -fsanitize=cfi-vcall \6// RUN:     -emit-llvm -o - %s | FileCheck %s --check-prefix=NO-MERGE7 8// RUN: %clang_cc1 -triple x86_64-unknown-linux -O3 -fsanitize-cfi-cross-dso \9// RUN:     -fsanitize=cfi-vcall \10// RUN:     -fsanitize-merge=cfi-vcall \11// RUN:     -emit-llvm -o - %s | FileCheck %s --check-prefix=MERGE12 13void caller(void (*f)(void)) {14  f();15}16 17// CHECK: define weak_odr hidden void @__cfi_check_fail(ptr noundef %0, ptr noundef %1)18// CHECK: store ptr %0, ptr %[[ALLOCA0:.*]], align 819// CHECK: store ptr %1, ptr %[[ALLOCA1:.*]], align 820// CHECK: %[[DATA:.*]] = load ptr, ptr %[[ALLOCA0]], align 821// CHECK: %[[ADDR:.*]] = load ptr, ptr %[[ALLOCA1]], align 822// CHECK: %[[ICMP_NOT_NULL:.*]] = icmp ne ptr %[[DATA]], null23// CHECK: br i1 %[[ICMP_NOT_NULL]], label %[[CONT0:.*]], label %[[TRAP:.*]], !prof24 25// CHECK: [[TRAP]]:26// CHECK-NEXT:   call void @llvm.ubsantrap(i8 2)27// CHECK-NEXT:   unreachable28 29// CHECK: [[CONT0]]:30// CHECK:   %[[KINDPTR:.*]] = getelementptr {{.*}} %[[DATA]], i32 0, i32 031// CHECK:   %[[KIND:.*]] = load i8, ptr %[[KINDPTR]], align 432// CHECK:   %[[VTVALID0:.*]] = call i1 @llvm.type.test(ptr %[[ADDR]], metadata !"all-vtables")33// CHECK:   %[[VTVALID:.*]] = zext i1 %[[VTVALID0]] to i6434// CHECK:   %[[NOT_0:.*]] = icmp ne i8 %[[KIND]], 035// CHECK:   br i1 %[[NOT_0]], label %[[CONT1:.*]], label %[[HANDLE0:.*]], !prof36 37// CHECK: [[HANDLE0]]:38// CHECK:   %[[DATA0:.*]] = ptrtoint ptr %[[DATA]] to i64,39// CHECK:   %[[ADDR0:.*]] = ptrtoint ptr %[[ADDR]] to i64,40// CHECK:   call void @__ubsan_handle_cfi_check_fail_abort(i64 %[[DATA0]], i64 %[[ADDR0]], i64 %[[VTVALID]])41// CHECK:   unreachable42 43// CHECK: [[CONT1]]:44// CHECK:   %[[NOT_1:.*]] = icmp ne i8 %[[KIND]], 145// CHECK:   br i1 %[[NOT_1]], label %[[CONT2:.*]], label %[[HANDLE1:.*]], !prof46 47// CHECK: [[HANDLE1]]:48// CHECK-NEXT:   call void @llvm.ubsantrap(i8 2)49// CHECK-NEXT:   unreachable50 51// CHECK: [[CONT2]]:52// CHECK:   %[[NOT_2:.*]] = icmp ne i8 %[[KIND]], 253// CHECK:   br i1 %[[NOT_2]], label %[[CONT3:.*]], label %[[HANDLE2:.*]], !prof54 55// CHECK: [[HANDLE2]]:56// CHECK-NEXT:   call void @llvm.ubsantrap(i8 2)57// CHECK-NEXT:   unreachable58 59// CHECK: [[CONT3]]:60// CHECK:   %[[NOT_3:.*]] = icmp ne i8 %[[KIND]], 361// CHECK:   br i1 %[[NOT_3]], label %[[CONT4:.*]], label %[[HANDLE3:.*]], !prof62 63// CHECK: [[HANDLE3]]:64// CHECK-NEXT:   call void @llvm.ubsantrap(i8 2)65// CHECK-NEXT:   unreachable66 67// CHECK: [[CONT4]]:68// CHECK:   %[[NOT_4:.*]] = icmp ne i8 %[[KIND]], 469// CHECK:   br i1 %[[NOT_4]], label %[[CONT5:.*]], label %[[HANDLE4:.*]], !prof70 71// CHECK: [[HANDLE4]]:72// CHECK-NEXT:   call void @llvm.ubsantrap(i8 2)73// CHECK-NEXT:   unreachable74 75// CHECK: [[CONT5]]:76// CHECK:   ret void77// NO-MERGE-LABEL: define dso_local void @caller(78// NO-MERGE-SAME: ptr noundef readonly captures(none) [[F:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {79// NO-MERGE-NEXT:  [[ENTRY:.*:]]80// NO-MERGE-NEXT:    tail call void [[F]]() #[[ATTR5:[0-9]+]]81// NO-MERGE-NEXT:    ret void82//83//84// NO-MERGE-LABEL: define weak_odr hidden void @__cfi_check_fail(85// NO-MERGE-SAME: ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR0]] {86// NO-MERGE-NEXT:  [[ENTRY:.*:]]87// NO-MERGE-NEXT:    [[DOTNOT:%.*]] = icmp eq ptr [[TMP0]], null, !nosanitize [[META3:![0-9]+]]88// NO-MERGE-NEXT:    br i1 [[DOTNOT]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF4:![0-9]+]], !nosanitize [[META3]]89// NO-MERGE:       [[TRAP]]:90// NO-MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR6:[0-9]+]], !nosanitize [[META3]]91// NO-MERGE-NEXT:    unreachable, !nosanitize [[META3]]92// NO-MERGE:       [[CONT]]:93// NO-MERGE-NEXT:    [[TMP2:%.*]] = load i8, ptr [[TMP0]], align 4, !nosanitize [[META3]]94// NO-MERGE-NEXT:    switch i8 [[TMP2]], label %[[CONT6:.*]] [95// NO-MERGE-NEXT:      i8 0, label %[[HANDLER_CFI_CHECK_FAIL:.*]]96// NO-MERGE-NEXT:      i8 1, label %[[TRAP]]97// NO-MERGE-NEXT:      i8 2, label %[[TRAP]]98// NO-MERGE-NEXT:      i8 3, label %[[TRAP]]99// NO-MERGE-NEXT:      i8 4, label %[[TRAP]]100// NO-MERGE-NEXT:    ], !prof [[PROF5:![0-9]+]]101// NO-MERGE:       [[HANDLER_CFI_CHECK_FAIL]]:102// NO-MERGE-NEXT:    [[TMP3:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META3]]103// NO-MERGE-NEXT:    [[TMP4:%.*]] = zext i1 [[TMP3]] to i64, !nosanitize [[META3]]104// NO-MERGE-NEXT:    [[TMP5:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META3]]105// NO-MERGE-NEXT:    [[TMP6:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META3]]106// NO-MERGE-NEXT:    tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP5]], i64 [[TMP6]], i64 [[TMP4]]) #[[ATTR7:[0-9]+]], !nosanitize [[META3]]107// NO-MERGE-NEXT:    unreachable, !nosanitize [[META3]]108// NO-MERGE:       [[CONT6]]:109// NO-MERGE-NEXT:    ret void, !nosanitize [[META3]]110//111//112// NO-MERGE-LABEL: define weak void @__cfi_check(113// NO-MERGE-SAME: i64 noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) local_unnamed_addr #[[ATTR4:[0-9]+]] align 4096 {114// NO-MERGE-NEXT:  [[ENTRY:.*:]]115// NO-MERGE-NEXT:    [[DOTNOT_I:%.*]] = icmp eq ptr [[TMP2]], null, !nosanitize [[META3]]116// NO-MERGE-NEXT:    br i1 [[DOTNOT_I]], label %[[TRAP_I:.*]], label %[[CONT_I:.*]], !prof [[PROF4]], !nosanitize [[META3]]117// NO-MERGE:       [[TRAP_I]]:118// NO-MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR6]], !nosanitize [[META3]]119// NO-MERGE-NEXT:    unreachable, !nosanitize [[META3]]120// NO-MERGE:       [[CONT_I]]:121// NO-MERGE-NEXT:    [[TMP3:%.*]] = load i8, ptr [[TMP2]], align 4, !nosanitize [[META3]]122// NO-MERGE-NEXT:    switch i8 [[TMP3]], label %[[__CFI_CHECK_FAIL_EXIT:.*]] [123// NO-MERGE-NEXT:      i8 0, label %[[HANDLER_CFI_CHECK_FAIL_I:.*]]124// NO-MERGE-NEXT:      i8 1, label %[[TRAP_I]]125// NO-MERGE-NEXT:      i8 2, label %[[TRAP_I]]126// NO-MERGE-NEXT:      i8 3, label %[[TRAP_I]]127// NO-MERGE-NEXT:      i8 4, label %[[TRAP_I]]128// NO-MERGE-NEXT:    ], !prof [[PROF5]]129// NO-MERGE:       [[HANDLER_CFI_CHECK_FAIL_I]]:130// NO-MERGE-NEXT:    [[TMP4:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META3]]131// NO-MERGE-NEXT:    [[TMP5:%.*]] = zext i1 [[TMP4]] to i64, !nosanitize [[META3]]132// NO-MERGE-NEXT:    [[TMP6:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META3]]133// NO-MERGE-NEXT:    [[TMP7:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META3]]134// NO-MERGE-NEXT:    tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP6]], i64 [[TMP7]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META3]]135// NO-MERGE-NEXT:    unreachable, !nosanitize [[META3]]136// NO-MERGE:       [[__CFI_CHECK_FAIL_EXIT]]:137// NO-MERGE-NEXT:    ret void138//139//140// MERGE-LABEL: define dso_local void @caller(141// MERGE-SAME: ptr noundef readonly captures(none) [[F:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {142// MERGE-NEXT:  [[ENTRY:.*:]]143// MERGE-NEXT:    tail call void [[F]]() #[[ATTR5:[0-9]+]]144// MERGE-NEXT:    ret void145//146//147// MERGE-LABEL: define weak_odr hidden void @__cfi_check_fail(148// MERGE-SAME: ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR0]] {149// MERGE-NEXT:  [[ENTRY:.*:]]150// MERGE-NEXT:    [[DOTNOT:%.*]] = icmp eq ptr [[TMP0]], null, !nosanitize [[META3:![0-9]+]]151// MERGE-NEXT:    br i1 [[DOTNOT]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF4:![0-9]+]], !nosanitize [[META3]]152// MERGE:       [[TRAP]]:153// MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR6:[0-9]+]], !nosanitize [[META3]]154// MERGE-NEXT:    unreachable, !nosanitize [[META3]]155// MERGE:       [[CONT]]:156// MERGE-NEXT:    [[TMP2:%.*]] = load i8, ptr [[TMP0]], align 4, !nosanitize [[META3]]157// MERGE-NEXT:    switch i8 [[TMP2]], label %[[CONT6:.*]] [158// MERGE-NEXT:      i8 0, label %[[HANDLER_CFI_CHECK_FAIL:.*]]159// MERGE-NEXT:      i8 1, label %[[TRAP]]160// MERGE-NEXT:      i8 2, label %[[TRAP]]161// MERGE-NEXT:      i8 3, label %[[TRAP]]162// MERGE-NEXT:      i8 4, label %[[TRAP]]163// MERGE-NEXT:    ], !prof [[PROF5:![0-9]+]]164// MERGE:       [[HANDLER_CFI_CHECK_FAIL]]:165// MERGE-NEXT:    [[TMP3:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META3]]166// MERGE-NEXT:    [[TMP4:%.*]] = zext i1 [[TMP3]] to i64, !nosanitize [[META3]]167// MERGE-NEXT:    [[TMP5:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META3]]168// MERGE-NEXT:    [[TMP6:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META3]]169// MERGE-NEXT:    tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP5]], i64 [[TMP6]], i64 [[TMP4]]) #[[ATTR6]], !nosanitize [[META3]]170// MERGE-NEXT:    unreachable, !nosanitize [[META3]]171// MERGE:       [[CONT6]]:172// MERGE-NEXT:    ret void, !nosanitize [[META3]]173//174//175// MERGE-LABEL: define weak void @__cfi_check(176// MERGE-SAME: i64 noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) local_unnamed_addr #[[ATTR4:[0-9]+]] align 4096 {177// MERGE-NEXT:  [[ENTRY:.*:]]178// MERGE-NEXT:    [[DOTNOT_I:%.*]] = icmp eq ptr [[TMP2]], null, !nosanitize [[META3]]179// MERGE-NEXT:    br i1 [[DOTNOT_I]], label %[[TRAP_I:.*]], label %[[CONT_I:.*]], !prof [[PROF4]], !nosanitize [[META3]]180// MERGE:       [[TRAP_I]]:181// MERGE-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR6]], !nosanitize [[META3]]182// MERGE-NEXT:    unreachable, !nosanitize [[META3]]183// MERGE:       [[CONT_I]]:184// MERGE-NEXT:    [[TMP3:%.*]] = load i8, ptr [[TMP2]], align 4, !nosanitize [[META3]]185// MERGE-NEXT:    switch i8 [[TMP3]], label %[[__CFI_CHECK_FAIL_EXIT:.*]] [186// MERGE-NEXT:      i8 0, label %[[HANDLER_CFI_CHECK_FAIL_I:.*]]187// MERGE-NEXT:      i8 1, label %[[TRAP_I]]188// MERGE-NEXT:      i8 2, label %[[TRAP_I]]189// MERGE-NEXT:      i8 3, label %[[TRAP_I]]190// MERGE-NEXT:      i8 4, label %[[TRAP_I]]191// MERGE-NEXT:    ], !prof [[PROF5]]192// MERGE:       [[HANDLER_CFI_CHECK_FAIL_I]]:193// MERGE-NEXT:    [[TMP4:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META3]]194// MERGE-NEXT:    [[TMP5:%.*]] = zext i1 [[TMP4]] to i64, !nosanitize [[META3]]195// MERGE-NEXT:    [[TMP6:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META3]]196// MERGE-NEXT:    [[TMP7:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META3]]197// MERGE-NEXT:    tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP6]], i64 [[TMP7]], i64 [[TMP5]]) #[[ATTR6]], !nosanitize [[META3]]198// MERGE-NEXT:    unreachable, !nosanitize [[META3]]199// MERGE:       [[__CFI_CHECK_FAIL_EXIT]]:200// MERGE-NEXT:    ret void201 202// MERGE: [[ATTR5]] = { nounwind }203// MERGE: [[ATTR6]] = { noreturn nounwind }204 205// NO-MERGE: [[ATTR6]] = { noreturn nounwind }206// NO-MERGE: [[ATTR7]] = { nomerge noreturn nounwind }207