Skip to content

Commit fb071ab

Browse files
authored
[DeviceMSAN] Enable origin tracking (#18693)
Enable origin tracking for host/shared/device USM, which can provide the more debug information about the detected uninitialized memory.
1 parent a0a6c76 commit fb071ab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1695
-672
lines changed

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88
#include "clang/Driver/SanitizerArgs.h"
9+
#include "clang/Basic/DiagnosticDriver.h"
910
#include "clang/Basic/Sanitizers.h"
1011
#include "clang/Driver/Driver.h"
1112
#include "clang/Driver/Options.h"
@@ -1317,6 +1318,16 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
13171318

13181319
CmdArgs.push_back("-mllvm");
13191320
CmdArgs.push_back("-msan-poison-stack-with-call=1");
1321+
1322+
if (MsanTrackOrigins) {
1323+
// FIXME: Support enhanced origins tracking in device offloading.
1324+
if (MsanTrackOrigins != 1)
1325+
TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with)
1326+
<< "-fsanitize-memory-track-origins=1";
1327+
CmdArgs.push_back("-mllvm");
1328+
CmdArgs.push_back(Args.MakeArgString("-msan-track-origins=" +
1329+
Twine(MsanTrackOrigins)));
1330+
}
13201331
} else if (Sanitizers.has(SanitizerKind::Thread)) {
13211332
CmdArgs.push_back("-fsanitize=thread");
13221333
// The tsan function entry/exit builtins are used to record stack

clang/test/Driver/sycl-device-sanitizer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@
4848
// SYCL-MSAN-SAME: "-mllvm" "-msan-instrumentation-with-call-threshold=0"
4949
// SYCL-MSAN-SAME: "-mllvm" "-msan-eager-checks=1"
5050

51+
// RUN: %clangxx -fsycl -fsanitize=memory -fsanitize-memory-track-origins=1 -c %s -### 2>&1 \
52+
// RUN: | FileCheck --check-prefix=SYCL-MSAN-ORIGIN %s
53+
// SYCL-MSAN-ORIGIN: clang{{.*}} "-fsycl-is-device"
54+
// SYCL-MSAN-ORIGIN-SAME: -fsanitize=memory
55+
// SYCL-MSAN-ORIGIN-SAME: "-mllvm" "-msan-track-origins=1"
56+
5157
// RUN: %clangxx -fsycl -Xarch_device -fsanitize=memory -c %s -### 2>&1 \
5258
// RUN: | FileCheck --check-prefix=SYCL-MSAN-XARCH-DEVICE %s
5359
// SYCL-MSAN-XARCH-DEVICE: clang{{.*}} "-fsycl-is-device"

libdevice/atomic.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ extern DEVICE_EXTERNAL void __spirv_AtomicStore(int *, int, int, int) noexcept;
7575
extern DEVICE_EXTERNAL int __spirv_AtomicIAdd(SPIR_GLOBAL int *, int, int,
7676
int) noexcept;
7777

78+
extern DEVICE_EXTERNAL int __spirv_AtomicIAdd(SPIR_GLOBAL unsigned int *, int,
79+
int, int) noexcept;
80+
7881
/// Atomically set the value in *Ptr with Desired if and only if it is Expected
7982
/// Return the value which already was in *Ptr
8083
static inline int atomicCompareAndSet(SPIR_GLOBAL int *Ptr, int Desired,
@@ -113,4 +116,10 @@ static inline int atomicAdd(SPIR_GLOBAL int *Ptr, int V) {
113116
V);
114117
}
115118

119+
static inline int atomicAdd(SPIR_GLOBAL unsigned int *Ptr, int V) {
120+
return __spirv_AtomicIAdd(Ptr, __spv::Scope::Device,
121+
__spv::MemorySemanticsMask::SequentiallyConsistent,
122+
V);
123+
}
124+
116125
#endif // __SPIR__ || __SPIRV__

libdevice/cmake/modules/SYCLLibdevice.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ if (NOT MSVC AND UR_SANITIZER_INCLUDE_DIR)
246246
include/asan_rtl.hpp
247247
include/sanitizer_defs.hpp
248248
include/spir_global_var.hpp
249-
include/group_utils.hpp
249+
include/sanitizer_utils.hpp
250250
${sycl-compiler_deps})
251251

252252
set(sanitizer_generic_compile_opts ${compile_opts}
@@ -305,7 +305,7 @@ if (NOT MSVC AND UR_SANITIZER_INCLUDE_DIR)
305305
include/msan_rtl.hpp
306306
include/sanitizer_defs.hpp
307307
include/spir_global_var.hpp
308-
include/group_utils.hpp
308+
include/sanitizer_utils.hpp
309309
sycl-compiler)
310310

311311
set(tsan_obj_deps
@@ -314,7 +314,7 @@ if (NOT MSVC AND UR_SANITIZER_INCLUDE_DIR)
314314
include/tsan_rtl.hpp
315315
include/sanitizer_defs.hpp
316316
include/spir_global_var.hpp
317-
include/group_utils.hpp
317+
include/sanitizer_utils.hpp
318318
sycl-compiler)
319319
endif()
320320

libdevice/include/asan_rtl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#pragma once
99

1010
#include "sanitizer_defs.hpp"
11+
#include "sanitizer_utils.hpp"
1112
#include "spir_global_var.hpp"
1213
#include <cstdint>
1314

libdevice/include/msan_rtl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#pragma once
99

1010
#include "sanitizer_defs.hpp"
11+
#include "sanitizer_utils.hpp"
1112
#include "spir_global_var.hpp"
1213

1314
// Treat this header as system one to workaround frontend's restriction

libdevice/include/sanitizer_defs.hpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#pragma once
99

1010
#include "atomic.hpp"
11-
#include "group_utils.hpp"
1211
#include "spir_global_var.hpp"
1312
#include <cstdint>
1413

@@ -30,6 +29,11 @@ enum ADDRESS_SPACE : uint32_t {
3029
ADDRESS_SPACE_GENERIC = 4,
3130
};
3231

32+
#define __SYCL_GLOBAL__ __attribute__((opencl_global))
33+
#define __SYCL_LOCAL__ __attribute__((opencl_local))
34+
#define __SYCL_PRIVATE__ __attribute__((opencl_private))
35+
#define __SYCL_CONSTANT__ __attribute__((opencl_constant))
36+
3337
#define LIKELY(x) __builtin_expect(!!(x), 1)
3438
#define UNLIKELY(x) __builtin_expect(!!(x), 0)
3539
#define NORETURN __declspec(noreturn)
@@ -56,14 +60,4 @@ __spirv_ControlBarrier(int32_t Execution, int32_t Memory,
5660

5761
extern "C" SYCL_EXTERNAL void __devicelib_exit();
5862

59-
__SYCL_GLOBAL__ void *ToGlobal(void *ptr) {
60-
return __spirv_GenericCastToPtrExplicit_ToGlobal(ptr, 5);
61-
}
62-
__SYCL_LOCAL__ void *ToLocal(void *ptr) {
63-
return __spirv_GenericCastToPtrExplicit_ToLocal(ptr, 4);
64-
}
65-
__SYCL_PRIVATE__ void *ToPrivate(void *ptr) {
66-
return __spirv_GenericCastToPtrExplicit_ToPrivate(ptr, 7);
67-
}
68-
6963
#endif // __SPIR__ || __SPIRV__

libdevice/include/group_utils.hpp renamed to libdevice/include/sanitizer_utils.hpp

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
//===----------------------------------------------------------------------===//
88
#pragma once
99

10+
#include "sanitizer_defs.hpp"
1011
#include "spirv_vars.h"
1112

1213
#if defined(__SPIR__) || defined(__SPIRV__)
1314

14-
static inline size_t WorkGroupLinearId() {
15+
inline size_t WorkGroupLinearId() {
1516
return __spirv_BuiltInWorkgroupId.x * __spirv_BuiltInNumWorkgroups.y *
1617
__spirv_BuiltInNumWorkgroups.z +
1718
__spirv_BuiltInWorkgroupId.y * __spirv_BuiltInNumWorkgroups.z +
@@ -26,15 +27,54 @@ static inline size_t LocalLinearId() {
2627
}
2728

2829
// For GPU device, each sub group is a hardware thread
29-
static inline size_t SubGroupLinearId() {
30+
inline size_t SubGroupLinearId() {
3031
return __spirv_BuiltInGlobalLinearId / __spirv_BuiltInSubgroupSize;
3132
}
3233

33-
static inline void SubGroupBarrier() {
34+
inline void SubGroupBarrier() {
3435
__spirv_ControlBarrier(__spv::Scope::Subgroup, __spv::Scope::Subgroup,
3536
__spv::MemorySemanticsMask::SequentiallyConsistent |
3637
__spv::MemorySemanticsMask::CrossWorkgroupMemory |
3738
__spv::MemorySemanticsMask::WorkgroupMemory);
3839
}
3940

41+
inline __SYCL_GLOBAL__ void *ToGlobal(void *ptr) {
42+
return __spirv_GenericCastToPtrExplicit_ToGlobal(ptr, 5);
43+
}
44+
inline __SYCL_LOCAL__ void *ToLocal(void *ptr) {
45+
return __spirv_GenericCastToPtrExplicit_ToLocal(ptr, 4);
46+
}
47+
inline __SYCL_PRIVATE__ void *ToPrivate(void *ptr) {
48+
return __spirv_GenericCastToPtrExplicit_ToPrivate(ptr, 7);
49+
}
50+
51+
template <typename T> T Memset(T ptr, int value, size_t size) {
52+
for (size_t i = 0; i < size; i++) {
53+
ptr[i] = value;
54+
}
55+
return ptr;
56+
}
57+
58+
template <typename DstT, typename SrcT>
59+
DstT Memcpy(DstT dst, SrcT src, size_t size) {
60+
for (size_t i = 0; i < size; i++) {
61+
dst[i] = src[i];
62+
}
63+
return dst;
64+
}
65+
66+
template <typename DstT, typename SrcT>
67+
DstT Memmove(DstT dst, SrcT src, size_t size) {
68+
if ((uptr)dst < (uptr)src) {
69+
for (size_t i = 0; i < size; i++) {
70+
dst[i] = src[i];
71+
}
72+
} else {
73+
for (size_t i = size; i > 0; i--) {
74+
dst[i - 1] = src[i - 1];
75+
}
76+
}
77+
return dst;
78+
}
79+
4080
#endif // __SPIR__ || __SPIRV__

libdevice/include/spir_global_var.hpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,6 @@ class
3838
T val;
3939
};
4040

41-
#define __SYCL_GLOBAL__ __attribute__((opencl_global))
42-
#define __SYCL_LOCAL__ __attribute__((opencl_local))
43-
#define __SYCL_PRIVATE__ __attribute__((opencl_private))
44-
#define __SYCL_CONSTANT__ __attribute__((opencl_constant))
45-
4641
#ifndef SPIR_GLOBAL_VAR
4742
#ifdef __SYCL_DEVICE_ONLY__
4843
#define SPIR_GLOBAL_VAR __attribute__((sycl_global_var))

libdevice/include/tsan_rtl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#pragma once
99

1010
#include "sanitizer_defs.hpp"
11+
#include "sanitizer_utils.hpp"
1112
#include "spir_global_var.hpp"
1213
#include "tsan/tsan_libdevice.hpp"
1314

0 commit comments

Comments
 (0)