Skip to content

Commit 3e875ec

Browse files
authored
[DevMSAN] Use global __msan_track_origins to indicate if track origin is enabled (#19828)
Always propagate origin value will cause bad performance.
1 parent 73d88dc commit 3e875ec

File tree

7 files changed

+29
-7
lines changed

7 files changed

+29
-7
lines changed

libdevice/sanitizer/msan_rtl.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ DeviceGlobal<void *> __MsanLaunchInfo;
1313
#define GetMsanLaunchInfo \
1414
((__SYCL_GLOBAL__ MsanRuntimeData *)__MsanLaunchInfo.get())
1515

16+
extern "C" __attribute__((weak)) const int __msan_track_origins;
17+
1618
namespace {
1719

1820
constexpr int MSAN_REPORT_NONE = 0;
@@ -64,6 +66,8 @@ const __SYCL_CONSTANT__ char __msan_print_unknown[] = "unknown";
6466

6567
namespace {
6668

69+
inline bool IsTrackOriginsEnabled() { return __msan_track_origins; }
70+
6771
inline void ConvertGenericPointer(uptr &addr, uint32_t &as) {
6872
auto old = addr;
6973
if ((addr = (uptr)ToPrivate((void *)old))) {
@@ -337,7 +341,8 @@ inline void CopyShadowAndOrigin(uptr dst, uint32_t dst_as, uptr src,
337341
}
338342
auto *shadow_src = (__SYCL_GLOBAL__ char *)MemToShadow(src, src_as);
339343
Memcpy(shadow_dst, shadow_src, size);
340-
CopyOrigin(dst, dst_as, src, src_as, size);
344+
if (IsTrackOriginsEnabled())
345+
CopyOrigin(dst, dst_as, src, src_as, size);
341346

342347
MSAN_DEBUG(__spirv_ocl_printf(__msan_print_copy_shadow, dst, dst_as, src,
343348
src_as, shadow_dst, shadow_src, size));
@@ -365,7 +370,8 @@ inline void MoveShadowAndOrigin(uptr dst, uint32_t dst_as, uptr src,
365370
auto *shadow_dst = (__SYCL_GLOBAL__ char *)MemToShadow(dst, dst_as);
366371
auto *shadow_src = (__SYCL_GLOBAL__ char *)MemToShadow(src, src_as);
367372
// MoveOrigin transfers origins by refering to their shadows
368-
MoveOrigin(dst, dst_as, src, src_as, size);
373+
if (IsTrackOriginsEnabled())
374+
MoveOrigin(dst, dst_as, src, src_as, size);
369375
Memmove(shadow_dst, shadow_src, size);
370376

371377
MSAN_DEBUG(__spirv_ocl_printf(__msan_print_move_shadow, dst, dst_as, src,

llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,6 +1216,14 @@ void MemorySanitizerOnSpirv::instrumentKernelsMetadata(int TrackOrigins) {
12161216
SmallVector<Constant *, 8> SpirKernelsMetadata;
12171217
SmallVector<uint8_t, 256> KernelNamesBytes;
12181218

1219+
// Insert global __msan_track_origins to indicate if origin track is enabled.
1220+
M.getOrInsertGlobal("__msan_track_origins", Int32Ty, [&] {
1221+
return new GlobalVariable(
1222+
M, Int32Ty, true, GlobalValue::WeakODRLinkage,
1223+
ConstantInt::get(Int32Ty, TrackOrigins), "__msan_track_origins",
1224+
nullptr, llvm::GlobalValue::NotThreadLocal, kSpirOffloadGlobalAS);
1225+
});
1226+
12191227
// SpirKernelsMetadata only saves fixed kernels, and is described by
12201228
// following structure:
12211229
// uptr unmangled_kernel_name

llvm/test/Instrumentation/MemorySanitizer/SPIRV/track_origins.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64-G1"
44
target triple = "spir64-unknown-unknown"
55

6+
; CHECK: __msan_track_origins
67
; CHECK: @__MsanKernelMetadata{{.*}}i64 8, i64 36
78
; CHECK-SAME: [[ATTR0:#[0-9]+]]
8-
; CHECK-NOT: __msan_track_origins
99
; CHECK-NOT: _tls
1010

1111
define spir_kernel void @MyKernel(ptr addrspace(1) noundef align 4 %_arg_array) sanitize_memory {

unified-runtime/source/loader/layers/sanitizer/msan/msan_ddi.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,7 +1598,8 @@ ur_result_t urEnqueueUSMMemcpy(
15981598
(void *)SrcShadow, size, 0, nullptr, &Event));
15991599
Events.push_back(Event);
16001600
}
1601-
{
1601+
if (getContext()->Options.MsanCheckHostAndSharedUSM ||
1602+
(IsDeviceUSM(hContext, pSrc) && IsDeviceUSM(hContext, pDst))) {
16021603
const auto SrcOriginBegin = SrcDI->Shadow->MemToOrigin((uptr)pSrc);
16031604
const auto SrcOriginEnd =
16041605
SrcDI->Shadow->MemToOrigin((uptr)pSrc + size - 1) +
@@ -1764,7 +1765,8 @@ ur_result_t urEnqueueUSMMemcpy2D(
17641765
Events.push_back(Event);
17651766
}
17661767

1767-
{
1768+
if (getContext()->Options.MsanCheckHostAndSharedUSM ||
1769+
(IsDeviceUSM(hContext, pSrc) && IsDeviceUSM(hContext, pDst))) {
17681770
auto pfnUSMMemcpy = getContext()->urDdiTable.Enqueue.pfnUSMMemcpy;
17691771

17701772
for (size_t HeightIndex = 0; HeightIndex < height; HeightIndex++) {

unified-runtime/source/loader/layers/sanitizer/msan/msan_shadow.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ ur_result_t MsanShadowMemoryCPU::EnqueuePoisonShadowWithOrigin(
163163
(void *)(uptr)Value);
164164
memset((void *)ShadowBegin, Value, ShadowEnd - ShadowBegin + 1);
165165
}
166-
{
166+
if (Origin) {
167167
const uptr OriginBegin = MemToOrigin(Ptr);
168168
const uptr OriginEnd =
169169
MemToOrigin(Ptr + Size - 1) + MSAN_ORIGIN_GRANULARITY;
@@ -323,7 +323,7 @@ ur_result_t MsanShadowMemoryGPU::EnqueuePoisonShadowWithOrigin(
323323
Events.data(), OutEvent));
324324
}
325325

326-
{
326+
if (Origin) {
327327
uptr OriginBegin = MemToOrigin(Ptr);
328328
uptr OriginEnd = MemToOrigin(Ptr + Size - 1) + sizeof(Origin) - 1;
329329
UR_CALL(EnqueueVirtualMemMap(OriginBegin, OriginEnd, Events, OutEvent));

unified-runtime/source/loader/layers/sanitizer/sanitizer_common/sanitizer_utils.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ bool IsHostUSM(ur_context_handle_t Context, const void *MemPtr) {
176176
return USMType == UR_USM_TYPE_HOST;
177177
}
178178

179+
bool IsDeviceUSM(ur_context_handle_t Context, const void *MemPtr) {
180+
ur_usm_type_t USMType = GetUSMType(Context, MemPtr);
181+
return USMType == UR_USM_TYPE_DEVICE;
182+
}
183+
179184
ur_device_handle_t GetUSMAllocDevice(ur_context_handle_t Context,
180185
const void *MemPtr) {
181186
assert(IsUSM(Context, MemPtr));

unified-runtime/source/loader/layers/sanitizer/sanitizer_common/sanitizer_utils.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ size_t GetDeviceLocalMemorySize(ur_device_handle_t Device);
5454
ur_program_handle_t GetProgram(ur_kernel_handle_t Kernel);
5555
bool IsUSM(ur_context_handle_t Context, const void *MemPtr);
5656
bool IsHostUSM(ur_context_handle_t Context, const void *MemPtr);
57+
bool IsDeviceUSM(ur_context_handle_t Context, const void *MemPtr);
5758
ur_device_handle_t GetUSMAllocDevice(ur_context_handle_t Context,
5859
const void *MemPtr);
5960
// Get the device of MemPtr. If MemPtr is host USM, then return the device

0 commit comments

Comments
 (0)