[PATCH] D155376: [AddressSanitizer] Add fallback DebugLocation for instrumented calls

Jakob via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 15 10:51:45 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, KASAN & debug information enabled,
multiple inlinable AddressSanitizer 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/D155376

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


Index: llvm/test/Instrumentation/AddressSanitizer/missing_dbg.ll
===================================================================
--- /dev/null
+++ llvm/test/Instrumentation/AddressSanitizer/missing_dbg.ll
@@ -0,0 +1,37 @@
+; RUN: opt < %s -passes=asan -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
+  store i32 32, ptr %b
+  ret i32 %tmp1
+}
+; CHECK-LABEL: @with_dbg
+; CHECK-NEXT:  entry:
+; CHECK:       call void @__asan_report_load4(i64 %0) #3, !dbg [[DBG:![0-9]+]]
+; CHECK:       call void @__asan_report_store4(i64 %13) #3, !dbg [[DBG]]
+
+define i32 @without_dbg(ptr %a, ptr %b) sanitize_address {
+entry:
+  %tmp1 = load i32, ptr %a, align 4
+  store i32 32, ptr %b
+  ret i32 %tmp1
+}
+; CHECK-LABEL: @without_dbg
+; CHECK-NEXT:  entry:
+; CHECK:       call void @__asan_report_load4(i64 %0) #3
+; CHECK:       call void @__asan_report_store4(i64 %13) #3
+
+!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 = !{}
+
+; CHECK:       [[DBG]] = !DILocation(line: 0, scope: !3)
Index: llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
===================================================================
--- llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -1230,7 +1230,7 @@
 
 // Instrument memset/memmove/memcpy
 void AddressSanitizer::instrumentMemIntrinsic(MemIntrinsic *MI) {
-  IRBuilder<> IRB(MI);
+  InstrumentationIRBuilder IRB(MI);
   if (isa<MemTransferInst>(MI)) {
     IRB.CreateCall(
         isa<MemMoveInst>(MI) ? AsanMemmove : AsanMemcpy,
@@ -1642,7 +1642,7 @@
                                                  size_t AccessSizeIndex,
                                                  Value *SizeArgument,
                                                  uint32_t Exp) {
-  IRBuilder<> IRB(InsertBefore);
+  InstrumentationIRBuilder IRB(InsertBefore);
   Value *ExpVal = Exp == 0 ? nullptr : ConstantInt::get(IRB.getInt32Ty(), Exp);
   CallInst *Call = nullptr;
   if (SizeArgument) {
@@ -1719,7 +1719,7 @@
       return;
   }
 
-  IRBuilder<> IRB(InsertBefore);
+  InstrumentationIRBuilder IRB(InsertBefore);
   size_t AccessSizeIndex = TypeStoreSizeToSizeIndex(TypeStoreSize);
   const ASanAccessInfo AccessInfo(IsWrite, CompileKernel, AccessSizeIndex);
 
@@ -1781,7 +1781,8 @@
 
   Instruction *Crash = generateCrashCode(CrashTerm, AddrLong, IsWrite,
                                          AccessSizeIndex, SizeArgument, Exp);
-  Crash->setDebugLoc(OrigIns->getDebugLoc());
+  if (OrigIns->getDebugLoc())
+    Crash->setDebugLoc(OrigIns->getDebugLoc());
 }
 
 // Instrument unusual size or unusual alignment.
@@ -1791,7 +1792,7 @@
 void AddressSanitizer::instrumentUnusualSizeOrAlignment(
     Instruction *I, Instruction *InsertBefore, Value *Addr, TypeSize TypeStoreSize,
     bool IsWrite, Value *SizeArgument, bool UseCalls, uint32_t Exp) {
-  IRBuilder<> IRB(InsertBefore);
+  InstrumentationIRBuilder IRB(InsertBefore);
   Value *NumBits = IRB.CreateTypeSize(IntptrTy, TypeStoreSize);
   Value *Size = IRB.CreateLShr(NumBits, ConstantInt::get(IntptrTy, 3));
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D155376.540705.patch
Type: text/x-patch
Size: 3893 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230715/4d041a24/attachment.bin>


More information about the llvm-commits mailing list