[compiler-rt] Pr patch hsa dlopen (PR #201081)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 2 03:00:28 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-compiler-rt-sanitizer
Author: Amit Kumar Pandey (ampandey-1995)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/201081.diff
7 Files Affected:
- (modified) compiler-rt/lib/asan/asan_interceptors.cpp (+1-1)
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_common.h (+3-1)
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc (+5-2)
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp (+23-1)
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp (+1-1)
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_win.cpp (+1-1)
- (modified) compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp (+2-2)
``````````diff
diff --git a/compiler-rt/lib/asan/asan_interceptors.cpp b/compiler-rt/lib/asan/asan_interceptors.cpp
index 6d024e58b27cf..5075919a47d50 100644
--- a/compiler-rt/lib/asan/asan_interceptors.cpp
+++ b/compiler-rt/lib/asan/asan_interceptors.cpp
@@ -163,7 +163,7 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void*)
({ \
if (flags()->strict_init_order) \
StopInitOrderChecking(); \
- CheckNoDeepBind(filename, flag); \
+ OnDlOpen(filename, flag); \
REAL(dlopen)(filename, flag); \
})
# define COMMON_INTERCEPTOR_ON_EXIT(ctx) OnExit()
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h
index 2aacec1cd8994..e7b47e1a6201c 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h
@@ -1092,7 +1092,9 @@ struct StackDepotStats {
// indicate that sanitizer allocator should not attempt to release memory to OS.
const s32 kReleaseToOSIntervalNever = -1;
-void CheckNoDeepBind(const char *filename, int flag);
+// Platform hook invoked before dlopen. Performs platform-specific dlopen flag
+// checks (e.g. RTLD_DEEPBIND on Linux).
+void OnDlOpen(const char *filename, int flag);
// Returns the requested amount of random data (up to 256 bytes) that can then
// be used to seed a PRNG. Defaults to blocking like the underlying syscall.
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index b10ce7fa44afc..c76010e77d1fa 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -277,8 +277,11 @@ extern const short *_tolower_tab_;
common_flags()->strict_string_checks ? (internal_strlen(s)) + 1 : (n) )
#ifndef COMMON_INTERCEPTOR_DLOPEN
-#define COMMON_INTERCEPTOR_DLOPEN(filename, flag) \
- ({ CheckNoDeepBind(filename, flag); REAL(dlopen)(filename, flag); })
+# define COMMON_INTERCEPTOR_DLOPEN(filename, flag) \
+ ({ \
+ OnDlOpen(filename, flag); \
+ REAL(dlopen)(filename, flag); \
+ })
#endif
#ifndef COMMON_INTERCEPTOR_GET_TLS_RANGE
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 1bdbccc0a03ec..2505019dc34c8 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -2886,7 +2886,25 @@ void CheckMPROTECT() {
# endif
}
-void CheckNoDeepBind(const char *filename, int flag) {
+# if SANITIZER_AMDGPU
+void PatchHsaRuntimeDlopenFlag(const char* filename, int& flag) {
+ if (filename &&
+ (internal_strstr(filename, "libamdhip64.so") ||
+ internal_strstr(filename, "libhsa-runtime64.so") ||
+ internal_strstr(filename, "libamdocl64.so")) &&
+ !(flag & RTLD_GLOBAL)) {
+ flag |= RTLD_GLOBAL;
+ if (Verbosity() >= 2) {
+ Printf(
+ "RTLD_GLOBAL flag on dlopen call forced on for %s due to AMDGPU "
+ "device sanitizer runtime requirements.\n",
+ filename);
+ }
+ }
+}
+# endif
+
+void OnDlOpen(const char *filename, int flag) {
# ifdef RTLD_DEEPBIND
if (flag & RTLD_DEEPBIND) {
Report(
@@ -2899,6 +2917,10 @@ void CheckNoDeepBind(const char *filename, int flag) {
Die();
}
# endif
+
+# if SANITIZER_AMDGPU
+ PatchHsaRuntimeDlopenFlag(filename, flag);
+# endif
}
uptr FindAvailableMemoryRange(uptr size, uptr alignment, uptr left_padding,
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp
index 6fafc04f557b4..90abcedcb2d98 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp
@@ -1533,7 +1533,7 @@ void DumpProcessMap() {
Printf("End of module map.\n");
}
-void CheckNoDeepBind(const char *filename, int flag) {
+void OnDlOpen(const char *filename, int flag) {
// Do nothing.
}
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp
index 70f4a936c1329..91d54e082eb3a 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_win.cpp
@@ -1223,7 +1223,7 @@ int WaitForProcess(pid_t pid) { return -1; }
// FIXME implement on this platform.
void GetMemoryProfile(fill_profile_f cb, uptr *stats) {}
-void CheckNoDeepBind(const char *filename, int flag) {
+void OnDlOpen(const char *filename, int flag) {
// Do nothing.
}
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
index 6ae871af11ea9..e00853bd1b426 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
+++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
@@ -2596,9 +2596,9 @@ static void HandleRecvmsg(ThreadState *thr, uptr pc,
#define COMMON_INTERCEPTOR_DLOPEN(filename, flag) \
({ \
- CheckNoDeepBind(filename, flag); \
+ OnDlOpen(filename, flag); \
ThreadIgnoreBegin(thr, 0); \
- void *res = REAL(dlopen)(filename, flag); \
+ void* res = REAL(dlopen)(filename, flag); \
ThreadIgnoreEnd(thr); \
res; \
})
``````````
</details>
https://github.com/llvm/llvm-project/pull/201081
More information about the llvm-commits
mailing list