Skip to content

Commit d228952

Browse files
committed
[DevMSAN] Use global __msan_track_origins to indicate if track origin is enabled
Always propagate origin value will cause bad performance.
1 parent ece9569 commit d228952

File tree

7 files changed

+28
-7
lines changed

7 files changed

+28
-7
lines changed

libdevice/sanitizer/msan_rtl.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ DeviceGlobal<void *> __MsanLaunchInfo;
1414
((__SYCL_GLOBAL__ MsanRuntimeData *)__MsanLaunchInfo.get())
1515

1616
namespace {
17+
extern "C" __attribute__((weak)) const int __msan_track_origins;
1718

1819
constexpr int MSAN_REPORT_NONE = 0;
1920
constexpr int MSAN_REPORT_START = 1;
@@ -64,6 +65,8 @@ const __SYCL_CONSTANT__ char __msan_print_unknown[] = "unknown";
6465

6566
namespace {
6667

68+
inline bool IsTrackOriginsEnabled() { return __msan_track_origins; }
69+
6770
inline void ConvertGenericPointer(uptr &addr, uint32_t &as) {
6871
auto old = addr;
6972
if ((addr = (uptr)ToPrivate((void *)old))) {
@@ -337,7 +340,8 @@ inline void CopyShadowAndOrigin(uptr dst, uint32_t dst_as, uptr src,
337340
}
338341
auto *shadow_src = (__SYCL_GLOBAL__ char *)MemToShadow(src, src_as);
339342
Memcpy(shadow_dst, shadow_src, size);
340-
CopyOrigin(dst, dst_as, src, src_as, size);
343+
if (IsTrackOriginsEnabled())
344+
CopyOrigin(dst, dst_as, src, src_as, size);
341345

342346
MSAN_DEBUG(__spirv_ocl_printf(__msan_print_copy_shadow, dst, dst_as, src,
343347
src_as, shadow_dst, shadow_src, size));
@@ -365,7 +369,8 @@ inline void MoveShadowAndOrigin(uptr dst, uint32_t dst_as, uptr src,
365369
auto *shadow_dst = (__SYCL_GLOBAL__ char *)MemToShadow(dst, dst_as);
366370
auto *shadow_src = (__SYCL_GLOBAL__ char *)MemToShadow(src, src_as);
367371
// MoveOrigin transfers origins by refering to their shadows
368-
MoveOrigin(dst, dst_as, src, src_as, size);
372+
if (IsTrackOriginsEnabled())
373+
MoveOrigin(dst, dst_as, src, src_as, size);
369374
Memmove(shadow_dst, shadow_src, size);
370375

371376
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
@@ -168,7 +168,7 @@ ur_result_t MsanShadowMemoryCPU::EnqueuePoisonShadowWithOrigin(
168168
(void *)(uptr)Value);
169169
memset((void *)ShadowBegin, Value, ShadowEnd - ShadowBegin + 1);
170170
}
171-
{
171+
if (Origin) {
172172
const uptr OriginBegin = MemToOrigin(Ptr);
173173
const uptr OriginEnd =
174174
MemToOrigin(Ptr + Size - 1) + MSAN_ORIGIN_GRANULARITY;
@@ -328,7 +328,7 @@ ur_result_t MsanShadowMemoryGPU::EnqueuePoisonShadowWithOrigin(
328328
Events.data(), OutEvent));
329329
}
330330

331-
{
331+
if (Origin) {
332332
uptr OriginBegin = MemToOrigin(Ptr);
333333
uptr OriginEnd = MemToOrigin(Ptr + Size - 1) + sizeof(Origin) - 1;
334334
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)