From 98408605ba27f86ca3fa154db38e5919b1992299 Mon Sep 17 00:00:00 2001 From: Arendelle Date: Tue, 4 Nov 2025 21:56:41 +0800 Subject: [PATCH 1/7] Feature: get_stack_pointer - all listed arch have been tested by clang - will be used by linux_clone3_thread - MSVC is not supported --- include/fast_io_hosted/stack_pointer.h | 49 +++++++++++++++++++ tests/0038.stack_pointer/get_stack_pointer.cc | 9 ++++ 2 files changed, 58 insertions(+) create mode 100644 include/fast_io_hosted/stack_pointer.h create mode 100644 tests/0038.stack_pointer/get_stack_pointer.cc diff --git a/include/fast_io_hosted/stack_pointer.h b/include/fast_io_hosted/stack_pointer.h new file mode 100644 index 00000000..0254fcf5 --- /dev/null +++ b/include/fast_io_hosted/stack_pointer.h @@ -0,0 +1,49 @@ +#pragma once + +namespace fast_io +{ + +/** + * @brief Get the stack pointer. + * @return void* The stack pointer. + * + * @note MSVC is not supported. + */ +[[nodiscard]] +#if __has_cpp_attribute(__gnu__::__always_inline__) +[[__gnu__::__always_inline__]] +#endif +#if __has_cpp_attribute(__gnu__::__artificial__) +[[__gnu__::__artificial__]] +#endif +inline void *get_stack_pointer() noexcept +{ + void *result +#if __has_cpp_attribute(indeterminate) + [[indeterminate]] +#endif + ; + +#if defined(__x86_64__) && !defined(__arm64ec__) + __asm__ volatile("movq %%rsp, %0" : "=r"(result)); +#elif defined(__i386__) + __asm__ volatile("movl %%esp, %0" : "=r"(result)); +#elif defined(__aarch64__) || defined(__arm64ec__) + __asm__ volatile("mov %0, sp" : "=r"(result)); +#elif defined(__arm__) + __asm__ volatile("mov %0, sp" : "=r"(result)); +#elif defined(__loongarch__) + __asm__ volatile("move %0, $sp" : "=r"(result)); +#elif defined(__riscv) + __asm__ volatile("mv %0, sp" : "=r"(result)); +#elif defined(__mips__) + __asm__ volatile("move %0, $sp" : "=r"(result)); +#elif defined(__powerpc__) + __asm__ volatile("mr %0, 1" : "=r"(result)); +#else +#error "Unknown arch to get stack pointer" +#endif + return result; +} + +} // namespace fast_io diff --git a/tests/0038.stack_pointer/get_stack_pointer.cc b/tests/0038.stack_pointer/get_stack_pointer.cc new file mode 100644 index 00000000..75a57b05 --- /dev/null +++ b/tests/0038.stack_pointer/get_stack_pointer.cc @@ -0,0 +1,9 @@ +#include + +int main() noexcept { +#if defined (__GNUC__) || defined (__clang__) + [[maybe_unused]] void* _{::fast_io::get_stack_pointer()}; +#endif + + return 0; +} From 298bac72a2b4dd8fa4c34f52e1022351888ab669 Mon Sep 17 00:00:00 2001 From: Arendelle Date: Tue, 4 Nov 2025 22:14:14 +0800 Subject: [PATCH 2/7] fix test --- tests/0038.stack_pointer/get_stack_pointer.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/0038.stack_pointer/get_stack_pointer.cc b/tests/0038.stack_pointer/get_stack_pointer.cc index 75a57b05..bfe5f093 100644 --- a/tests/0038.stack_pointer/get_stack_pointer.cc +++ b/tests/0038.stack_pointer/get_stack_pointer.cc @@ -1,4 +1,6 @@ +#if defined (__GNUC__) || defined (__clang__) #include +#endif int main() noexcept { #if defined (__GNUC__) || defined (__clang__) From 2dabe9559d8dfa25d5f6a76a8e1754324fa3b853 Mon Sep 17 00:00:00 2001 From: Arendelle Date: Tue, 4 Nov 2025 22:16:40 +0800 Subject: [PATCH 3/7] add precompile fence to stack_pointer.h --- include/fast_io_hosted/stack_pointer.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/fast_io_hosted/stack_pointer.h b/include/fast_io_hosted/stack_pointer.h index 0254fcf5..cd4d82b1 100644 --- a/include/fast_io_hosted/stack_pointer.h +++ b/include/fast_io_hosted/stack_pointer.h @@ -1,5 +1,9 @@ #pragma once +#if defined (_MSC_VER) && !defined(__clang__) +#error "fast_io: get_stack_pointer is not supported on MSVC" +#endif + namespace fast_io { From 38103e714c55be877b039bfab6b18cc905fc7d18 Mon Sep 17 00:00:00 2001 From: Arendelle Date: Tue, 4 Nov 2025 22:43:03 +0800 Subject: [PATCH 4/7] add attribute fence during precompile --- include/fast_io_hosted/stack_pointer.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/fast_io_hosted/stack_pointer.h b/include/fast_io_hosted/stack_pointer.h index cd4d82b1..fd2e482d 100644 --- a/include/fast_io_hosted/stack_pointer.h +++ b/include/fast_io_hosted/stack_pointer.h @@ -16,6 +16,8 @@ namespace fast_io [[nodiscard]] #if __has_cpp_attribute(__gnu__::__always_inline__) [[__gnu__::__always_inline__]] +#else +#error "__gnu__::__always_inline__ is required" #endif #if __has_cpp_attribute(__gnu__::__artificial__) [[__gnu__::__artificial__]] From 9c652d092f4b65ee013adab6c94ef5c243fccd16 Mon Sep 17 00:00:00 2001 From: Arendelle Date: Wed, 5 Nov 2025 08:24:16 +0800 Subject: [PATCH 5/7] move stack_pointer.h to thread/ - as an internal dependency of linux clone3 thread --- .../{ => threads/thread}/stack_pointer.h | 4 ++-- tests/0038.stack_pointer/get_stack_pointer.cc | 11 ----------- 2 files changed, 2 insertions(+), 13 deletions(-) rename include/fast_io_hosted/{ => threads/thread}/stack_pointer.h (93%) delete mode 100644 tests/0038.stack_pointer/get_stack_pointer.cc diff --git a/include/fast_io_hosted/stack_pointer.h b/include/fast_io_hosted/threads/thread/stack_pointer.h similarity index 93% rename from include/fast_io_hosted/stack_pointer.h rename to include/fast_io_hosted/threads/thread/stack_pointer.h index fd2e482d..f8d2e674 100644 --- a/include/fast_io_hosted/stack_pointer.h +++ b/include/fast_io_hosted/threads/thread/stack_pointer.h @@ -4,7 +4,7 @@ #error "fast_io: get_stack_pointer is not supported on MSVC" #endif -namespace fast_io +namespace fast_io::details { /** @@ -47,7 +47,7 @@ inline void *get_stack_pointer() noexcept #elif defined(__powerpc__) __asm__ volatile("mr %0, 1" : "=r"(result)); #else -#error "Unknown arch to get stack pointer" + static_assert(false, "Unknown arch to get stack pointer"); #endif return result; } diff --git a/tests/0038.stack_pointer/get_stack_pointer.cc b/tests/0038.stack_pointer/get_stack_pointer.cc deleted file mode 100644 index bfe5f093..00000000 --- a/tests/0038.stack_pointer/get_stack_pointer.cc +++ /dev/null @@ -1,11 +0,0 @@ -#if defined (__GNUC__) || defined (__clang__) -#include -#endif - -int main() noexcept { -#if defined (__GNUC__) || defined (__clang__) - [[maybe_unused]] void* _{::fast_io::get_stack_pointer()}; -#endif - - return 0; -} From 2d132f85bc701c67ad4a8a7ee80abaffdd6d74db Mon Sep 17 00:00:00 2001 From: Arendelle Date: Wed, 5 Nov 2025 11:17:08 +0800 Subject: [PATCH 6/7] Avoid compile fail, use runtime terminate instead --- include/fast_io_hosted/threads/thread/stack_pointer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fast_io_hosted/threads/thread/stack_pointer.h b/include/fast_io_hosted/threads/thread/stack_pointer.h index f8d2e674..8194063d 100644 --- a/include/fast_io_hosted/threads/thread/stack_pointer.h +++ b/include/fast_io_hosted/threads/thread/stack_pointer.h @@ -47,7 +47,7 @@ inline void *get_stack_pointer() noexcept #elif defined(__powerpc__) __asm__ volatile("mr %0, 1" : "=r"(result)); #else - static_assert(false, "Unknown arch to get stack pointer"); + ::fast_io::fast_terminate(); #endif return result; } From 01e7f7bb4386e406ef11e6ed9710715b9746132a Mon Sep 17 00:00:00 2001 From: Arendelle Date: Wed, 5 Nov 2025 11:19:46 +0800 Subject: [PATCH 7/7] fix err msg --- include/fast_io_hosted/threads/thread/stack_pointer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fast_io_hosted/threads/thread/stack_pointer.h b/include/fast_io_hosted/threads/thread/stack_pointer.h index 8194063d..cd789a8e 100644 --- a/include/fast_io_hosted/threads/thread/stack_pointer.h +++ b/include/fast_io_hosted/threads/thread/stack_pointer.h @@ -1,7 +1,7 @@ #pragma once #if defined (_MSC_VER) && !defined(__clang__) -#error "fast_io: get_stack_pointer is not supported on MSVC" +#error "get_stack_pointer is not supported on MSVC" #endif namespace fast_io::details