233 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --version 52//3// N.B. although the clang driver defaults to merge, clang_cc1 defaults to non-merge.4// (This is similar to -fsanitize-recover, for which the default is also applied5// at the driver level only.)6// If optimization is disabled, merging is disabled (overrides -fsanitize-merge).7 8// RUN: %clang_cc1 -O3 -triple x86_64-unknown-linux -fsanitize-cfi-cross-dso \9// RUN: -fsanitize=cfi-icall,cfi-nvcall,cfi-vcall,cfi-unrelated-cast,cfi-derived-cast \10// RUN: -fsanitize-trap=cfi-icall,cfi-nvcall \11// RUN: -fsanitize-merge=cfi-icall,cfi-nvcall \12// RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix=MERGE13 14// RUN: %clang_cc1 -O3 -triple x86_64-unknown-linux -fsanitize-cfi-cross-dso \15// RUN: -fsanitize=cfi-icall,cfi-nvcall,cfi-vcall,cfi-unrelated-cast,cfi-derived-cast \16// RUN: -fsanitize-trap=cfi-icall,cfi-nvcall \17// RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix=NO-MERGE18 19// NOMERGE-LABEL: define dso_local void @caller(20// NOMERGE-SAME: ptr noundef [[F:%.*]]) #[[ATTR0:[0-9]+]] !type [[META4:![0-9]+]] !type [[META5:![0-9]+]] !type [[META6:![0-9]+]] {21// NOMERGE-NEXT: [[ENTRY:.*:]]22// NOMERGE-NEXT: [[F_ADDR:%.*]] = alloca ptr, align 823// NOMERGE-NEXT: store ptr [[F]], ptr [[F_ADDR]], align 824// NOMERGE-NEXT: [[TMP0:%.*]] = load ptr, ptr [[F_ADDR]], align 825// NOMERGE-NEXT: [[TMP1:%.*]] = call i1 @llvm.type.test(ptr [[TMP0]], metadata !"_ZTSFvvE"), !nosanitize [[META7:![0-9]+]]26// NOMERGE-NEXT: br i1 [[TMP1]], label %[[CFI_CONT:.*]], label %[[CFI_SLOWPATH:.*]], !prof [[PROF8:![0-9]+]], !nosanitize [[META7]]27// NOMERGE: [[CFI_SLOWPATH]]:28// NOMERGE-NEXT: call void @__cfi_slowpath(i64 9080559750644022485, ptr [[TMP0]]) #[[ATTR7:[0-9]+]], !nosanitize [[META7]]29// NOMERGE-NEXT: br label %[[CFI_CONT]], !nosanitize [[META7]]30// NOMERGE: [[CFI_CONT]]:31// NOMERGE-NEXT: call void [[TMP0]]()32// NOMERGE-NEXT: ret void33void caller(void (*f)(void)) {34 f();35}36 37 38 39// MERGE-LABEL: define dso_local void @caller(40// MERGE-SAME: ptr noundef [[F:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] !type [[META4:![0-9]+]] !type [[META5:![0-9]+]] !type [[META6:![0-9]+]] {41// MERGE-NEXT: [[ENTRY:.*:]]42// MERGE-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[F]], metadata !"_ZTSFvvE"), !nosanitize [[META7:![0-9]+]]43// MERGE-NEXT: br i1 [[TMP0]], label %[[CFI_CONT:.*]], label %[[CFI_SLOWPATH:.*]], !prof [[PROF8:![0-9]+]], !nosanitize [[META7]]44// MERGE: [[CFI_SLOWPATH]]:45// MERGE-NEXT: tail call void @__cfi_slowpath(i64 9080559750644022485, ptr [[F]]) #[[ATTR5:[0-9]+]], !nosanitize [[META7]]46// MERGE-NEXT: br label %[[CFI_CONT]], !nosanitize [[META7]]47// MERGE: [[CFI_CONT]]:48// MERGE-NEXT: tail call void [[F]]() #[[ATTR5]]49// MERGE-NEXT: ret void50//51//52// MERGE-LABEL: define weak_odr hidden void @__cfi_check_fail(53// MERGE-SAME: ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR0]] {54// MERGE-NEXT: [[ENTRY:.*:]]55// MERGE-NEXT: [[DOTNOT:%.*]] = icmp eq ptr [[TMP0]], null, !nosanitize [[META7]]56// MERGE-NEXT: br i1 [[DOTNOT]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF9:![0-9]+]], !nosanitize [[META7]]57// MERGE: [[TRAP]]:58// MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR6:[0-9]+]], !nosanitize [[META7]]59// MERGE-NEXT: unreachable, !nosanitize [[META7]]60// MERGE: [[CONT]]:61// MERGE-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP0]], align 4, !nosanitize [[META7]]62// MERGE-NEXT: [[TMP3:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META7]]63// MERGE-NEXT: [[TMP4:%.*]] = zext i1 [[TMP3]] to i64, !nosanitize [[META7]]64// MERGE-NEXT: switch i8 [[TMP2]], label %[[CONT8:.*]] [65// MERGE-NEXT: i8 0, label %[[HANDLER_CFI_CHECK_FAIL:.*]]66// MERGE-NEXT: i8 1, label %[[TRAP]]67// MERGE-NEXT: i8 2, label %[[HANDLER_CFI_CHECK_FAIL4:.*]]68// MERGE-NEXT: i8 3, label %[[HANDLER_CFI_CHECK_FAIL6:.*]]69// MERGE-NEXT: i8 4, label %[[TRAP]]70// MERGE-NEXT: ], !prof [[PROF10:![0-9]+]]71// MERGE: [[HANDLER_CFI_CHECK_FAIL]]:72// MERGE-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]73// MERGE-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]74// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP5]], i64 [[TMP6]], i64 [[TMP4]]) #[[ATTR7:[0-9]+]], !nosanitize [[META7]]75// MERGE-NEXT: unreachable, !nosanitize [[META7]]76// MERGE: [[HANDLER_CFI_CHECK_FAIL4]]:77// MERGE-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]78// MERGE-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]79// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP7]], i64 [[TMP8]], i64 [[TMP4]]) #[[ATTR7]], !nosanitize [[META7]]80// MERGE-NEXT: unreachable, !nosanitize [[META7]]81// MERGE: [[HANDLER_CFI_CHECK_FAIL6]]:82// MERGE-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]83// MERGE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]84// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP9]], i64 [[TMP10]], i64 [[TMP4]]) #[[ATTR7]], !nosanitize [[META7]]85// MERGE-NEXT: unreachable, !nosanitize [[META7]]86// MERGE: [[CONT8]]:87// MERGE-NEXT: ret void, !nosanitize [[META7]]88//89//90// MERGE-LABEL: define weak void @__cfi_check(91// MERGE-SAME: i64 noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) local_unnamed_addr #[[ATTR4:[0-9]+]] align 4096 {92// MERGE-NEXT: [[ENTRY:.*:]]93// MERGE-NEXT: [[DOTNOT_I:%.*]] = icmp eq ptr [[TMP2]], null, !nosanitize [[META7]]94// MERGE-NEXT: br i1 [[DOTNOT_I]], label %[[TRAP_I:.*]], label %[[CONT_I:.*]], !prof [[PROF9]], !nosanitize [[META7]]95// MERGE: [[TRAP_I]]:96// MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR6]], !nosanitize [[META7]]97// MERGE-NEXT: unreachable, !nosanitize [[META7]]98// MERGE: [[CONT_I]]:99// MERGE-NEXT: [[TMP3:%.*]] = load i8, ptr [[TMP2]], align 4, !nosanitize [[META7]]100// MERGE-NEXT: [[TMP4:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META7]]101// MERGE-NEXT: [[TMP5:%.*]] = zext i1 [[TMP4]] to i64, !nosanitize [[META7]]102// MERGE-NEXT: switch i8 [[TMP3]], label %[[__CFI_CHECK_FAIL_EXIT:.*]] [103// MERGE-NEXT: i8 0, label %[[HANDLER_CFI_CHECK_FAIL_I:.*]]104// MERGE-NEXT: i8 1, label %[[TRAP_I]]105// MERGE-NEXT: i8 2, label %[[HANDLER_CFI_CHECK_FAIL4_I:.*]]106// MERGE-NEXT: i8 3, label %[[HANDLER_CFI_CHECK_FAIL6_I:.*]]107// MERGE-NEXT: i8 4, label %[[TRAP_I]]108// MERGE-NEXT: ], !prof [[PROF10]]109// MERGE: [[HANDLER_CFI_CHECK_FAIL_I]]:110// MERGE-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]111// MERGE-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]112// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP6]], i64 [[TMP7]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]113// MERGE-NEXT: unreachable, !nosanitize [[META7]]114// MERGE: [[HANDLER_CFI_CHECK_FAIL4_I]]:115// MERGE-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]116// MERGE-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]117// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP8]], i64 [[TMP9]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]118// MERGE-NEXT: unreachable, !nosanitize [[META7]]119// MERGE: [[HANDLER_CFI_CHECK_FAIL6_I]]:120// MERGE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]121// MERGE-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]122// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP10]], i64 [[TMP11]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]123// MERGE-NEXT: unreachable, !nosanitize [[META7]]124// MERGE: [[__CFI_CHECK_FAIL_EXIT]]:125// MERGE-NEXT: ret void126//127//128// NO-MERGE-LABEL: define dso_local void @caller(129// NO-MERGE-SAME: ptr noundef [[F:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] !type [[META4:![0-9]+]] !type [[META5:![0-9]+]] !type [[META6:![0-9]+]] {130// NO-MERGE-NEXT: [[ENTRY:.*:]]131// NO-MERGE-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[F]], metadata !"_ZTSFvvE"), !nosanitize [[META7:![0-9]+]]132// NO-MERGE-NEXT: br i1 [[TMP0]], label %[[CFI_CONT:.*]], label %[[CFI_SLOWPATH:.*]], !prof [[PROF8:![0-9]+]], !nosanitize [[META7]]133// NO-MERGE: [[CFI_SLOWPATH]]:134// NO-MERGE-NEXT: tail call void @__cfi_slowpath(i64 9080559750644022485, ptr [[F]]) #[[ATTR5:[0-9]+]], !nosanitize [[META7]]135// NO-MERGE-NEXT: br label %[[CFI_CONT]], !nosanitize [[META7]]136// NO-MERGE: [[CFI_CONT]]:137// NO-MERGE-NEXT: tail call void [[F]]() #[[ATTR5]]138// NO-MERGE-NEXT: ret void139//140//141// NO-MERGE-LABEL: define weak_odr hidden void @__cfi_check_fail(142// NO-MERGE-SAME: ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR0]] {143// NO-MERGE-NEXT: [[ENTRY:.*:]]144// NO-MERGE-NEXT: [[DOTNOT:%.*]] = icmp eq ptr [[TMP0]], null, !nosanitize [[META7]]145// NO-MERGE-NEXT: br i1 [[DOTNOT]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF9:![0-9]+]], !nosanitize [[META7]]146// NO-MERGE: [[TRAP]]:147// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR6:[0-9]+]], !nosanitize [[META7]]148// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]149// NO-MERGE: [[CONT]]:150// NO-MERGE-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP0]], align 4, !nosanitize [[META7]]151// NO-MERGE-NEXT: [[TMP3:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META7]]152// NO-MERGE-NEXT: [[TMP4:%.*]] = zext i1 [[TMP3]] to i64, !nosanitize [[META7]]153// NO-MERGE-NEXT: switch i8 [[TMP2]], label %[[CONT10:.*]] [154// NO-MERGE-NEXT: i8 0, label %[[HANDLER_CFI_CHECK_FAIL:.*]]155// NO-MERGE-NEXT: i8 1, label %[[TRAP3:.*]]156// NO-MERGE-NEXT: i8 2, label %[[HANDLER_CFI_CHECK_FAIL5:.*]]157// NO-MERGE-NEXT: i8 3, label %[[HANDLER_CFI_CHECK_FAIL7:.*]]158// NO-MERGE-NEXT: i8 4, label %[[TRAP9:.*]]159// NO-MERGE-NEXT: ], !prof [[PROF10:![0-9]+]]160// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL]]:161// NO-MERGE-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]162// NO-MERGE-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]163// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP5]], i64 [[TMP6]], i64 [[TMP4]]) #[[ATTR7:[0-9]+]], !nosanitize [[META7]]164// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]165// NO-MERGE: [[TRAP3]]:166// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR7]], !nosanitize [[META7]]167// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]168// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL5]]:169// NO-MERGE-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]170// NO-MERGE-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]171// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP7]], i64 [[TMP8]], i64 [[TMP4]]) #[[ATTR7]], !nosanitize [[META7]]172// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]173// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL7]]:174// NO-MERGE-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]175// NO-MERGE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]176// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP9]], i64 [[TMP10]], i64 [[TMP4]]) #[[ATTR7]], !nosanitize [[META7]]177// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]178// NO-MERGE: [[TRAP9]]:179// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR7]], !nosanitize [[META7]]180// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]181// NO-MERGE: [[CONT10]]:182// NO-MERGE-NEXT: ret void, !nosanitize [[META7]]183//184//185// NO-MERGE-LABEL: define weak void @__cfi_check(186// NO-MERGE-SAME: i64 noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) local_unnamed_addr #[[ATTR4:[0-9]+]] align 4096 {187// NO-MERGE-NEXT: [[ENTRY:.*:]]188// NO-MERGE-NEXT: [[DOTNOT_I:%.*]] = icmp eq ptr [[TMP2]], null, !nosanitize [[META7]]189// NO-MERGE-NEXT: br i1 [[DOTNOT_I]], label %[[TRAP_I:.*]], label %[[CONT_I:.*]], !prof [[PROF9]], !nosanitize [[META7]]190// NO-MERGE: [[TRAP_I]]:191// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR6]], !nosanitize [[META7]]192// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]193// NO-MERGE: [[CONT_I]]:194// NO-MERGE-NEXT: [[TMP3:%.*]] = load i8, ptr [[TMP2]], align 4, !nosanitize [[META7]]195// NO-MERGE-NEXT: [[TMP4:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META7]]196// NO-MERGE-NEXT: [[TMP5:%.*]] = zext i1 [[TMP4]] to i64, !nosanitize [[META7]]197// NO-MERGE-NEXT: switch i8 [[TMP3]], label %[[__CFI_CHECK_FAIL_EXIT:.*]] [198// NO-MERGE-NEXT: i8 0, label %[[HANDLER_CFI_CHECK_FAIL_I:.*]]199// NO-MERGE-NEXT: i8 1, label %[[TRAP3_I:.*]]200// NO-MERGE-NEXT: i8 2, label %[[HANDLER_CFI_CHECK_FAIL5_I:.*]]201// NO-MERGE-NEXT: i8 3, label %[[HANDLER_CFI_CHECK_FAIL7_I:.*]]202// NO-MERGE-NEXT: i8 4, label %[[TRAP9_I:.*]]203// NO-MERGE-NEXT: ], !prof [[PROF10]]204// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL_I]]:205// NO-MERGE-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]206// NO-MERGE-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]207// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP6]], i64 [[TMP7]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]208// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]209// NO-MERGE: [[TRAP3_I]]:210// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR7]], !nosanitize [[META7]]211// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]212// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL5_I]]:213// NO-MERGE-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]214// NO-MERGE-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]215// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP8]], i64 [[TMP9]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]216// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]217// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL7_I]]:218// NO-MERGE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]219// NO-MERGE-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]220// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP10]], i64 [[TMP11]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]221// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]222// NO-MERGE: [[TRAP9_I]]:223// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR7]], !nosanitize [[META7]]224// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]225// NO-MERGE: [[__CFI_CHECK_FAIL_EXIT]]:226// NO-MERGE-NEXT: ret void227 228// MERGE: [[ATTR5]] = { nounwind }229// MERGE: [[ATTR6]] = { noreturn nounwind }230 231// NO-MERGE: [[ATTR6]] = { noreturn nounwind }232// NO-MERGE: [[ATTR7]] = { nomerge noreturn nounwind }233