mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-30 00:32:53 +00:00
ThreadSanitizer: don't track swifterror memory addresses
They are register promoted by ISel and so it makes no sense to treat them as memory. Inserting calls to the thread sanitizer would also generate invalid IR. You would hit: "swifterror value can only be loaded and stored from, or as a swifterror argument!" git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295215 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2b723d3caf
commit
adb29843b7
@ -488,6 +488,13 @@ bool ThreadSanitizer::instrumentLoadOrStore(Instruction *I,
|
||||
Value *Addr = IsWrite
|
||||
? cast<StoreInst>(I)->getPointerOperand()
|
||||
: cast<LoadInst>(I)->getPointerOperand();
|
||||
|
||||
// swifterror memory addresses are mem2reg promoted by instruction selection.
|
||||
// As such they cannot have regular uses like an instrumentation function and
|
||||
// it makes no sense to track them as memory.
|
||||
if (Addr->isSwiftError())
|
||||
return false;
|
||||
|
||||
int Idx = getMemoryAccessFuncIndex(Addr, DL);
|
||||
if (Idx < 0)
|
||||
return false;
|
||||
|
@ -54,5 +54,29 @@ entry:
|
||||
; CHECK: ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @SwiftError
|
||||
; CHECK-NOT: __tsan_read
|
||||
; CHECK-NOT: __tsan_write
|
||||
; CHECK: ret
|
||||
define void @SwiftError(i8** swifterror) sanitize_thread {
|
||||
%swifterror_ptr_value = load i8*, i8** %0
|
||||
store i8* null, i8** %0
|
||||
%swifterror_addr = alloca swifterror i8*
|
||||
%swifterror_ptr_value_2 = load i8*, i8** %swifterror_addr
|
||||
store i8* null, i8** %swifterror_addr
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @SwiftErrorCall
|
||||
; CHECK-NOT: __tsan_read
|
||||
; CHECK-NOT: __tsan_write
|
||||
; CHECK: ret
|
||||
define void @SwiftErrorCall(i8** swifterror) sanitize_thread {
|
||||
%swifterror_addr = alloca swifterror i8*
|
||||
store i8* null, i8** %0
|
||||
call void @SwiftError(i8** %0)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: define internal void @tsan.module_ctor()
|
||||
; CHECK: call void @__tsan_init()
|
||||
|
Loading…
x
Reference in New Issue
Block a user