[llvm] [DeviceRTL] Make defined 'libc' functions weak in OpenMP (PR #97356)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 1 15:18:51 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-offload
Author: Joseph Huber (jhuber6)
<details>
<summary>Changes</summary>
Summary:
These functions provide special-case implementations internal to the
OpenMP device runtime. This can potentially conflict with the symbols
pulled in from the actual GPU `libc`. This patch makes these weak, so in
the case that the GPU libc functions exist they will be overridden. This
should not impact performance in the average case because the old
`-mlink-builtin-bitcode` version does internalization, deleting weak,
and the new LTO path will resolve to the strong reference and then
internalize it.
---
Full diff: https://github.com/llvm/llvm-project/pull/97356.diff
2 Files Affected:
- (modified) offload/DeviceRTL/src/Debug.cpp (+2-2)
- (modified) offload/DeviceRTL/src/LibC.cpp (+2-2)
``````````diff
diff --git a/offload/DeviceRTL/src/Debug.cpp b/offload/DeviceRTL/src/Debug.cpp
index 31cd54e3de35c..4e16591cc6c51 100644
--- a/offload/DeviceRTL/src/Debug.cpp
+++ b/offload/DeviceRTL/src/Debug.cpp
@@ -26,8 +26,8 @@ using namespace ompx;
extern "C" {
void __assert_assume(bool condition) { __builtin_assume(condition); }
-void __assert_fail(const char *expr, const char *file, unsigned line,
- const char *function) {
+[[gnu::weak]] void __assert_fail(const char *expr, const char *file,
+ unsigned line, const char *function) {
__assert_fail_internal(expr, nullptr, file, line, function);
}
void __assert_fail_internal(const char *expr, const char *msg, const char *file,
diff --git a/offload/DeviceRTL/src/LibC.cpp b/offload/DeviceRTL/src/LibC.cpp
index e587c3057f5ba..4bca5d29643fe 100644
--- a/offload/DeviceRTL/src/LibC.cpp
+++ b/offload/DeviceRTL/src/LibC.cpp
@@ -49,7 +49,7 @@ int32_t omp_vprintf(const char *Format, void *Arguments, uint32_t) {
extern "C" {
-int memcmp(const void *lhs, const void *rhs, size_t count) {
+[[gnu::weak]] int memcmp(const void *lhs, const void *rhs, size_t count) {
auto *L = reinterpret_cast<const unsigned char *>(lhs);
auto *R = reinterpret_cast<const unsigned char *>(rhs);
@@ -60,7 +60,7 @@ int memcmp(const void *lhs, const void *rhs, size_t count) {
return 0;
}
-void memset(void *dst, int C, size_t count) {
+[[gnu::weak]] void memset(void *dst, int C, size_t count) {
auto *dstc = reinterpret_cast<char *>(dst);
for (size_t I = 0; I < count; ++I)
dstc[I] = C;
``````````
</details>
https://github.com/llvm/llvm-project/pull/97356
More information about the llvm-commits
mailing list