[llvm] 4eef2e3 - [ThreadSanitizer] Add fallback DebugLocation for memintrinsic calls

Marco Elver via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 17 08:52:47 PDT 2023


Author: Marco Elver
Date: 2023-07-17T17:52:16+02:00
New Revision: 4eef2e30d6f89328a16d4f1d6b37f1c79afe850c

URL: https://github.com/llvm/llvm-project/commit/4eef2e30d6f89328a16d4f1d6b37f1c79afe850c
DIFF: https://github.com/llvm/llvm-project/commit/4eef2e30d6f89328a16d4f1d6b37f1c79afe850c.diff

LOG: [ThreadSanitizer] Add fallback DebugLocation for memintrinsic calls

When building with debug info enabled, some load/store instructions do
not have a DebugLocation attached. When using the default IRBuilder, it
attempts to copy the DebugLocation from the insertion-point instruction.
When there's no DebugLocation, no attempt is made to add one.

Add a fallback DebugLocation with the help of InstrumentationIRBuilder for
memintrinsics. In particular, the compiler may optimize load/store without
debug info into memintrinsics, which then are missing debug info as well.

Added: 
    

Modified: 
    llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
    llvm/test/Instrumentation/ThreadSanitizer/missing_dbg.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
index f8aa37957136fc..9d24c155f50c39 100644
--- a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
@@ -689,7 +689,7 @@ static ConstantInt *createOrdering(IRBuilder<> *IRB, AtomicOrdering ord) {
 // replaced back with intrinsics. If that becomes wrong at some point,
 // we will need to call e.g. __tsan_memset to avoid the intrinsics.
 bool ThreadSanitizer::instrumentMemIntrinsic(Instruction *I) {
-  IRBuilder<> IRB(I);
+  InstrumentationIRBuilder IRB(I);
   if (MemSetInst *M = dyn_cast<MemSetInst>(I)) {
     IRB.CreateCall(
         MemsetFn,

diff  --git a/llvm/test/Instrumentation/ThreadSanitizer/missing_dbg.ll b/llvm/test/Instrumentation/ThreadSanitizer/missing_dbg.ll
index 160856d586fa1d..a9d6bcd5191487 100644
--- a/llvm/test/Instrumentation/ThreadSanitizer/missing_dbg.ll
+++ b/llvm/test/Instrumentation/ThreadSanitizer/missing_dbg.ll
@@ -9,9 +9,22 @@ entry:
 }
 ; CHECK-LABEL: @with_dbg
 ; CHECK-NEXT:  entry:
-; CHECK:       call void @__tsan_func_entry(ptr %0), !dbg [[DBG:![0-9]+]]
-; CHECK:       call void @__tsan_read4(ptr %a), !dbg [[DBG]]
-; CHECK:       call void @__tsan_func_exit(), !dbg [[DBG]]
+; CHECK:       call void @__tsan_func_entry(ptr %0), !dbg [[DBG1:![0-9]+]]
+; CHECK:       call void @__tsan_read4(ptr %a), !dbg [[DBG1]]
+; CHECK:       call void @__tsan_func_exit(), !dbg [[DBG1]]
+
+declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1)
+
+define void @memintrinsic(ptr nocapture %x, ptr nocapture %y) sanitize_thread !dbg !7 {
+entry:
+    tail call void @llvm.memcpy.p0.p0.i64(ptr align 4 %x, ptr align 4 %y, i64 16, i1 false)
+    ret void
+}
+; CHECK-LABEL: @memintrinsic
+; CHECK-NEXT:  entry:
+; CHECK:       call void @__tsan_func_entry(ptr %0), !dbg [[DBG2:![0-9]+]]
+; CHECK:       call ptr @__tsan_memcpy(ptr %x, ptr %y, i64 16), !dbg [[DBG2]]
+; CHECK:       call void @__tsan_func_exit(), !dbg [[DBG2]]
 
 define i32 @without_dbg(ptr %a) sanitize_thread {
 entry:
@@ -36,5 +49,7 @@ entry:
 !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 = !{}
+!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 195, type: !4, scopeLine: 199, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !0)
 
-; CHECK:       [[DBG]] = !DILocation(line: 0, scope: !3)
+; CHECK:       [[DBG1]] = !DILocation(line: 0, scope: !3)
+; CHECK:       [[DBG2]] = !DILocation(line: 0, scope: !7)


        


More information about the llvm-commits mailing list