Make ios_base::xalloc non-atomic with LIBCXX_ENABLE_THREADS=OFF. - #208356
Conversation
762b77a moved the definition of "xindex" out of the header, and in the process dropped the _LIBCPP_HAS_THREADS check. Re-add the check to maintain the status quo. The discussion on llvm#198994 indicates it's not clear whether LIBCXX_ENABLE_THREADS=OFF is actually supposed to mean single-threaded. But it clearly does in practice: atomic_support.h uses non-atomic ops when threads are disabled, and a few other APIs have explicit non-atomic fallback paths.
|
@llvm/pr-subscribers-libcxx Author: Eli Friedman (efriedma-quic) Changes762b77a moved the definition of "xindex" out of the header, and in the process dropped the _LIBCPP_HAS_THREADS check. Re-add the check to maintain the status quo. The discussion on #198994 indicates it's not clear whether LIBCXX_ENABLE_THREADS=OFF is actually supposed to mean single-threaded. But it clearly does in practice: atomic_support.h uses non-atomic ops when threads are disabled, and a few other APIs have explicit non-atomic fallback paths. My team ran into this trying to run libc++ tests for a RISC-V core without the "a" extension. Full diff: https://github.com/llvm/llvm-project/pull/208356.diff 1 Files Affected:
diff --git a/libcxx/src/ios.cpp b/libcxx/src/ios.cpp
index 2e049098740dc..db6ca50f7f6ca 100644
--- a/libcxx/src/ios.cpp
+++ b/libcxx/src/ios.cpp
@@ -122,7 +122,14 @@ static size_t __ios_new_cap(size_t __req_size, size_t __current_cap) { // Precon
}
int ios_base::xalloc() {
+#if _LIBCPP_HAS_THREADS
constinit static atomic<int> xindex = 0;
+#else
+ // If we don't have atomics, fall back to single-threaded implementation.
+ // FIXME: Should "single-threaded" be a separate option from
+ // _LIBCPP_HAS_THREADS?
+ static int xindex = 0;
+#endif // _LIBCPP_HAS_THREADS
return xindex++;
}
|
|
See also #131365 . |
ldionne
left a comment
There was a problem hiding this comment.
I dislike the fact that this is basically a workaround for not having a proper setup with the atomics library, but this is a pragmatic and minimal restoration of previous behavior that changed unintentionally, so I think it's acceptable.
|
/cherry-pick 3eb929b |
|
/pull-request #209631 |
…m#208356) 762b77a moved the definition of "xindex" out of the header, and in the process dropped the _LIBCPP_HAS_THREADS check. Re-add the check to maintain the status quo. The discussion on llvm#198994 indicates it's not clear whether LIBCXX_ENABLE_THREADS=OFF is actually supposed to mean single-threaded. But it clearly does in practice: atomic_support.h uses non-atomic ops when threads are disabled, and a few other APIs have explicit non-atomic fallback paths. My team ran into this trying to run libc++ tests for a RISC-V core without the "a" extension. (cherry picked from commit 3eb929b)
This test failed due to ios_base::xalloc requiring an atomic function namely atomic_fetch_add_4. llvm/llvm-project#208356 fixes it by removing dependence on atomic. Signed-off-by: Shreeyash Pandey <shrpand@qti.qualcomm.com>
…m#208356) 762b77a moved the definition of "xindex" out of the header, and in the process dropped the _LIBCPP_HAS_THREADS check. Re-add the check to maintain the status quo. The discussion on llvm#198994 indicates it's not clear whether LIBCXX_ENABLE_THREADS=OFF is actually supposed to mean single-threaded. But it clearly does in practice: atomic_support.h uses non-atomic ops when threads are disabled, and a few other APIs have explicit non-atomic fallback paths. My team ran into this trying to run libc++ tests for a RISC-V core without the "a" extension.
…m#208356) 762b77a moved the definition of "xindex" out of the header, and in the process dropped the _LIBCPP_HAS_THREADS check. Re-add the check to maintain the status quo. The discussion on llvm#198994 indicates it's not clear whether LIBCXX_ENABLE_THREADS=OFF is actually supposed to mean single-threaded. But it clearly does in practice: atomic_support.h uses non-atomic ops when threads are disabled, and a few other APIs have explicit non-atomic fallback paths. My team ran into this trying to run libc++ tests for a RISC-V core without the "a" extension. (cherry picked from commit 3eb929b)
This test failed due to ios_base::xalloc requiring an atomic function namely atomic_fetch_add_4. llvm/llvm-project#208356 fixes it by removing dependence on atomic. (Cherry-pick from qualcomm-software to release branch.) Signed-off-by: Shreeyash Pandey <shrpand@qti.qualcomm.com> Co-authored-by: Shreeyash Pandey <shrpand@qti.qualcomm.com>
762b77a moved the definition of "xindex" out of the header, and in the process dropped the _LIBCPP_HAS_THREADS check. Re-add the check to maintain the status quo.
The discussion on #198994 indicates it's not clear whether LIBCXX_ENABLE_THREADS=OFF is actually supposed to mean single-threaded. But it clearly does in practice: atomic_support.h uses non-atomic ops when threads are disabled, and a few other APIs have explicit non-atomic fallback paths.
My team ran into this trying to run libc++ tests for a RISC-V core without the "a" extension.