[PATCH] D155377: [SanitizerCoverage] Add fallback DebugLocation for instrumented calls

Jakob via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 15 10:53:31 PDT 2023


jkl created this revision.
jkl added reviewers: dvyukov, nickdesaulniers, melver.
Herald added subscribers: Enna1, hiraditya.
Herald added a project: All.
jkl requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

When building the kernel with LTO, KCOV & debug information enabled,
multiple inlinable SanitizerCoverage functions require debug information
present.

In such cases we repurpose the InstrumentationIRBuilder that ensures
the necessary debug information is added if necessary.

This has been done analogous to the work for the ThreadSanitizer
in D124937 <https://reviews.llvm.org/D124937>. (I added reviewers based on that, feel free to ignore or add more if not relevant).

This has already been discussed a bit here: https://github.com/ClangBuiltLinux/linux/issues/1721


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D155377

Files:
  llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
  llvm/test/Instrumentation/SanitizerCoverage/missing_dbg.ll


Index: llvm/test/Instrumentation/SanitizerCoverage/missing_dbg.ll
===================================================================
--- /dev/null
+++ llvm/test/Instrumentation/SanitizerCoverage/missing_dbg.ll
@@ -0,0 +1,50 @@
+; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=2 -S | FileCheck %s
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+
+define i32 @with_dbg(ptr %a, ptr %b) sanitize_address !dbg !3 {
+entry:
+  %tmp1 = load i32, ptr %a, align 4
+  %cmp = icmp eq i32 %tmp1, 42
+  br i1 %cmp, label %0, label %1
+0:
+  store i32 %tmp1, ptr %b
+  br label %1
+1:
+  ret i32 %tmp1
+}
+; CHECK-LABEL: @with_dbg
+; CHECK-NEXT:  entry:
+; CHECK:       call void @__sanitizer_cov_trace_pc_guard(ptr @__sancov_gen_) #2, !dbg [[DBG1:![0-9]+]]
+; CHECK:       call void @__sanitizer_cov_trace_pc_guard(ptr inttoptr (i64 add (i64 ptrtoint (ptr @__sancov_gen_ to i64), i64 4) to ptr)) #2, !dbg [[DBG2:![0-9]+]]
+
+define i32 @without_dbg(ptr %a, ptr %b) sanitize_address {
+entry:
+  %tmp1 = load i32, ptr %a, align 4
+  %cmp = icmp eq i32 %tmp1, 42
+  br i1 %cmp, label %0, label %1
+0:
+  store i32 %tmp1, ptr %b
+  br label %1
+1:
+  ret i32 %tmp1
+}
+; CHECK-LABEL: @without_dbg
+; CHECK-NEXT:  entry:
+; CHECK:       call void @__sanitizer_cov_trace_pc_guard(ptr @__sancov_gen_.1) #2
+; CHECK:       call void @__sanitizer_cov_trace_pc_guard(ptr inttoptr (i64 add (i64 ptrtoint (ptr @__sancov_gen_.1 to i64), i64 4) to ptr)) #2
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C89, file: !1, producer: "", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly, splitDebugInlining: false, nameTableKind: None)
+!1 = !DIFile(filename: "foo.c", directory: "")
+!2 = !{i32 2, !"Debug Info Version", i32 3}
+!3 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 190, type: !4, scopeLine: 192, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!4 = !DISubroutineType(types: !5)
+!5 = !{}
+!6 = !DILocation(line: 192, scope: !3)
+!7 = !DILocation(line: 0, scope: !3)
+
+; CHECK:       [[DBG1]] = !DILocation(line: 192, scope: !3)
+; CHECK:       [[DBG2]] = !DILocation(line: 0, scope: !3)
Index: llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
===================================================================
--- llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
+++ llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
@@ -820,7 +820,7 @@
     Function &, ArrayRef<Instruction *> SwitchTraceTargets) {
   for (auto *I : SwitchTraceTargets) {
     if (SwitchInst *SI = dyn_cast<SwitchInst>(I)) {
-      IRBuilder<> IRB(I);
+      InstrumentationIRBuilder IRB(I);
       SmallVector<Constant *, 16> Initializers;
       Value *Cond = SI->getCondition();
       if (Cond->getType()->getScalarSizeInBits() >
@@ -921,7 +921,7 @@
     Function &, ArrayRef<Instruction *> CmpTraceTargets) {
   for (auto *I : CmpTraceTargets) {
     if (ICmpInst *ICMP = dyn_cast<ICmpInst>(I)) {
-      IRBuilder<> IRB(ICMP);
+      InstrumentationIRBuilder IRB(ICMP);
       Value *A0 = ICMP->getOperand(0);
       Value *A1 = ICMP->getOperand(1);
       if (!A0->getType()->isIntegerTy())


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D155377.540707.patch
Type: text/x-patch
Size: 3404 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230715/8cffc091/attachment.bin>


More information about the llvm-commits mailing list