[PATCH] D79983: [TSAN] Add option to allow instrumenting reads of reads-before-writes
Marco Elver via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri May 15 00:08:36 PDT 2020
melver created this revision.
melver added a reviewer: dvyukov.
Herald added subscribers: llvm-commits, jfb, hiraditya.
Herald added a project: LLVM.
melver added a reviewer: glider.
Add -tsan-instrument-read-before-write which allows instrumenting reads
of reads-before-writes.
This is required for KCSAN [1], where under certain configurations plain
writes behave differently (e.g. aligned writes up to word size may be
treated as atomic). In order to avoid missing potential data races due
to plain RMW operations ("x++" etc.), we will require instrumenting
reads of reads-before-writes.
[1] https://github.com/google/ktsan/wiki/KCSAN
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D79983
Files:
llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
llvm/test/Instrumentation/ThreadSanitizer/read_before_write.ll
Index: llvm/test/Instrumentation/ThreadSanitizer/read_before_write.ll
===================================================================
--- llvm/test/Instrumentation/ThreadSanitizer/read_before_write.ll
+++ llvm/test/Instrumentation/ThreadSanitizer/read_before_write.ll
@@ -1,4 +1,5 @@
; RUN: opt < %s -tsan -S | FileCheck %s
+; RUN: opt < %s -tsan -tsan-instrument-read-before-write -S | FileCheck %s --check-prefixes=CHECK,CHECK-UNOPT
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"
@@ -11,6 +12,7 @@
}
; CHECK: define void @IncrementMe
; CHECK-NOT: __tsan_read
+; CHECK-UNOPT: __tsan_read
; CHECK: __tsan_write
; CHECK: ret void
Index: llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
===================================================================
--- llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp
@@ -72,6 +72,10 @@
"tsan-distinguish-volatile", cl::init(false),
cl::desc("Emit special instrumentation for accesses to volatiles"),
cl::Hidden);
+static cl::opt<bool> ClInstrumentReadBeforeWrite(
+ "tsan-instrument-read-before-write", cl::init(false),
+ cl::desc("Do not eliminate read instrumentation for read-before-writes"),
+ cl::Hidden);
STATISTIC(NumInstrumentedReads, "Number of instrumented reads");
STATISTIC(NumInstrumentedWrites, "Number of instrumented writes");
@@ -413,7 +417,7 @@
Value *Addr = Load->getPointerOperand();
if (!shouldInstrumentReadWriteFromAddress(I->getModule(), Addr))
continue;
- if (WriteTargets.count(Addr)) {
+ if (!ClInstrumentReadBeforeWrite && WriteTargets.count(Addr)) {
// We will write to this temp, so no reason to analyze the read.
NumOmittedReadsBeforeWrite++;
continue;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79983.264165.patch
Type: text/x-patch
Size: 1924 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200515/8d8eef2a/attachment.bin>
More information about the llvm-commits
mailing list