This extends https://github.com/llvm/llvm-project/pull/138577 to more UBSan checks, by changing SanitizerDebugLocation (formerly SanitizerScope) to add annotations if enabled for the specified ordinals. Annotations will use the ordinal name if there is exactly one ordinal specified in the SanitizerDebugLocation; otherwise, it will use the handler name. Updates the tests from https://github.com/llvm/llvm-project/pull/141814. --------- Co-authored-by: Vitaly Buka <vitalybuka@google.com>
72 lines
5.5 KiB
C
72 lines
5.5 KiB
C
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
|
|
// RUN: %clang_cc1 -O2 -emit-llvm -triple x86_64 -std=c17 -fsanitize=function %s -o - \
|
|
// RUN: -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -debug-info-kind=limited \
|
|
// RUN: -fsanitize-annotate-debug-info=function \
|
|
// RUN: | FileCheck %s
|
|
|
|
// CHECK-LABEL: define dso_local void @call_no_prototype(
|
|
// CHECK-SAME: ptr noundef readonly captures(none) [[F:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] !dbg [[DBG5:![0-9]+]] !func_sanitize [[META14:![0-9]+]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: #dbg_value(ptr [[F]], [[META13:![0-9]+]], !DIExpression(), [[META15:![0-9]+]])
|
|
// CHECK-NEXT: tail call void (...) [[F]]() #[[ATTR2:[0-9]+]], !dbg [[DBG16:![0-9]+]]
|
|
// CHECK-NEXT: ret void, !dbg [[DBG17:![0-9]+]]
|
|
//
|
|
void call_no_prototype(void (*f)()) { f(); }
|
|
|
|
// CHECK-LABEL: define dso_local void @call_prototype(
|
|
// CHECK-SAME: ptr noundef [[F:%.*]]) local_unnamed_addr #[[ATTR0]] !dbg [[DBG18:![0-9]+]] !func_sanitize [[META26:![0-9]+]] {
|
|
// CHECK-NEXT: [[ENTRY:.*:]]
|
|
// CHECK-NEXT: #dbg_value(ptr [[F]], [[META25:![0-9]+]], !DIExpression(), [[META27:![0-9]+]])
|
|
// CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[F]], i64 -8, !dbg [[DBG28:![0-9]+]]
|
|
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4, !dbg [[DBG28]], !nosanitize [[META32:![0-9]+]]
|
|
// CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], -1056584962, !dbg [[DBG28]], !nosanitize [[META32]]
|
|
// CHECK-NEXT: br i1 [[TMP2]], label %[[TYPECHECK:.*]], label %[[CONT1:.*]], !dbg [[DBG28]], !nosanitize [[META32]]
|
|
// CHECK: [[TYPECHECK]]:
|
|
// CHECK-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[F]], i64 -4, !dbg [[DBG28]]
|
|
// CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 8, !dbg [[DBG28]], !nosanitize [[META32]]
|
|
// CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[TMP4]], 905068220, !dbg [[DBG28]], !nosanitize [[META32]]
|
|
// CHECK-NEXT: br i1 [[TMP5]], label %[[CONT1]], label %[[HANDLER_FUNCTION_TYPE_MISMATCH:.*]], !dbg [[DBG28]], !prof [[PROF33:![0-9]+]], !nosanitize [[META32]]
|
|
// CHECK: [[HANDLER_FUNCTION_TYPE_MISMATCH]]:
|
|
// CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[F]] to i64, !dbg [[DBG28]], !nosanitize [[META32]]
|
|
// CHECK-NEXT: tail call void @__ubsan_handle_function_type_mismatch_abort(ptr nonnull @[[GLOB1:[0-9]+]], i64 [[TMP6]]) #[[ATTR3:[0-9]+]], !dbg [[DBG28]], !nosanitize [[META32]]
|
|
// CHECK-NEXT: unreachable, !dbg [[DBG28]], !nosanitize [[META32]]
|
|
// CHECK: [[CONT1]]:
|
|
// CHECK-NEXT: tail call void [[F]]() #[[ATTR2]], !dbg [[DBG31:![0-9]+]]
|
|
// CHECK-NEXT: ret void, !dbg [[DBG34:![0-9]+]]
|
|
//
|
|
void call_prototype(void (*f)(void)) { f(); }
|
|
//.
|
|
// CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C11, file: [[META1:![0-9]+]], isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
|
|
// CHECK: [[META1]] = !DIFile(filename: "{{.*}}<stdin>", directory: {{.*}})
|
|
// CHECK: [[DBG5]] = distinct !DISubprogram(name: "call_no_prototype", scope: [[META6:![0-9]+]], file: [[META6]], line: 14, type: [[META7:![0-9]+]], scopeLine: 14, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META12:![0-9]+]])
|
|
// CHECK: [[META6]] = !DIFile(filename: "{{.*}}ubsan-function-debuginfo.c", directory: {{.*}})
|
|
// CHECK: [[META7]] = !DISubroutineType(types: [[META8:![0-9]+]])
|
|
// CHECK: [[META8]] = !{null, [[META9:![0-9]+]]}
|
|
// CHECK: [[META9]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[META10:![0-9]+]], size: 64)
|
|
// CHECK: [[META10]] = !DISubroutineType(types: [[META11:![0-9]+]])
|
|
// CHECK: [[META11]] = !{null, null}
|
|
// CHECK: [[META12]] = !{[[META13]]}
|
|
// CHECK: [[META13]] = !DILocalVariable(name: "f", arg: 1, scope: [[DBG5]], file: [[META6]], line: 14, type: [[META9]])
|
|
// CHECK: [[META14]] = !{i32 -1056584962, i32 187769638}
|
|
// CHECK: [[META15]] = !DILocation(line: 0, scope: [[DBG5]])
|
|
// CHECK: [[DBG16]] = !DILocation(line: 14, column: 39, scope: [[DBG5]])
|
|
// CHECK: [[DBG17]] = !DILocation(line: 14, column: 44, scope: [[DBG5]])
|
|
// CHECK: [[DBG18]] = distinct !DISubprogram(name: "call_prototype", scope: [[META6]], file: [[META6]], line: 37, type: [[META19:![0-9]+]], scopeLine: 37, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META24:![0-9]+]])
|
|
// CHECK: [[META19]] = !DISubroutineType(types: [[META20:![0-9]+]])
|
|
// CHECK: [[META20]] = !{null, [[META21:![0-9]+]]}
|
|
// CHECK: [[META21]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[META22:![0-9]+]], size: 64)
|
|
// CHECK: [[META22]] = !DISubroutineType(types: [[META23:![0-9]+]])
|
|
// CHECK: [[META23]] = !{null}
|
|
// CHECK: [[META24]] = !{[[META25]]}
|
|
// CHECK: [[META25]] = !DILocalVariable(name: "f", arg: 1, scope: [[DBG18]], file: [[META6]], line: 37, type: [[META21]])
|
|
// CHECK: [[META26]] = !{i32 -1056584962, i32 -747727454}
|
|
// CHECK: [[META27]] = !DILocation(line: 0, scope: [[DBG18]])
|
|
// CHECK: [[DBG28]] = !DILocation(line: 0, scope: [[META29:![0-9]+]], inlinedAt: [[DBG31]])
|
|
// CHECK: [[META29]] = distinct !DISubprogram(name: "__ubsan_check_function", scope: [[META6]], file: [[META6]], type: [[META30:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: [[META0]])
|
|
// CHECK: [[META30]] = !DISubroutineType(types: null)
|
|
// CHECK: [[DBG31]] = !DILocation(line: 37, column: 40, scope: [[DBG18]])
|
|
// CHECK: [[META32]] = !{}
|
|
// CHECK: [[PROF33]] = !{!"branch_weights", i32 1048575, i32 1}
|
|
// CHECK: [[DBG34]] = !DILocation(line: 37, column: 45, scope: [[DBG18]])
|
|
//.
|