| 32 | */ |
| 33 | |
| 34 | static inline void *my_get_stack_pointer(void *default_stack) |
| 35 | { |
| 36 | void *stack_ptr= NULL; |
| 37 | |
| 38 | #if defined(__GNUC__) || defined(__clang__) /* GCC and Clang compilers */ |
| 39 | #if defined(__i386__) /* Intel x86 (32-bit) */ |
| 40 | __asm__ volatile ("movl %%esp, %0" : "=r" (stack_ptr)); |
| 41 | #elif defined(__x86_64__) && defined (__ILP32__) /* Intel x86-64 (64-bit), X32 ABI */ |
| 42 | __asm__ volatile ("movl %%esp, %0" : "=r" (stack_ptr)); |
| 43 | #elif defined(__x86_64__) /* Intel x86-64 (64-bit) */ |
| 44 | __asm__ volatile ("movq %%rsp, %0" : "=r" (stack_ptr)); |
| 45 | #elif defined(__powerpc__) /* PowerPC (32-bit) */ |
| 46 | __asm__ volatile ("mr %0, 1" : "=r" (stack_ptr)); /* GPR1 is the stack pointer */ |
| 47 | #elif defined(__ppc64__) /* PowerPC (64-bit) */ |
| 48 | __asm__ volatile ("mr %0, 1" : "=r" (stack_ptr)); |
| 49 | #elif defined(__arm__) /* ARM 32-bit */ |
| 50 | __asm__ volatile ("mov %0, sp" : "=r" (stack_ptr)); |
| 51 | #elif defined(__aarch64__) /* ARM 64-bit */ |
| 52 | __asm__ volatile ("mov %0, sp" : "=r" (stack_ptr)); |
| 53 | #elif defined(__sparc__) /* SPARC 32-bit */ |
| 54 | __asm__ volatile ("mov %%sp, %0" : "=r" (stack_ptr)); |
| 55 | #elif defined(__sparc64__) /* SPARC 64-bit */ |
| 56 | __asm__ volatile ("mov %%sp, %0" : "=r" (stack_ptr)); |
| 57 | #elif defined(__s390x__) |
| 58 | stack_ptr= __builtin_frame_address(0); |
| 59 | #else |
| 60 | /* Generic fallback for unsupported architectures in GCC/Clang */ |
| 61 | stack_ptr= default_stack ? default_stack : (void*) &stack_ptr; |
| 62 | #endif |
| 63 | #elif defined(_MSC_VER) /* MSVC compiler (Intel only) */ |
| 64 | #if defined(_M_IX86) /* Intel x86 (32-bit) */ |
| 65 | __asm { mov stack_ptr, esp } |
| 66 | #elif defined(_M_X64) /* Intel x86-64 (64-bit) */ |
| 67 | /* rsp can’t be accessed directly in MSVC x64 */ |
| 68 | stack_ptr= _AddressOfReturnAddress(); |
| 69 | #else |
| 70 | /* Generic fallback for unsupported architectures in MSVC */ |
| 71 | stack_ptr= default_stack ? default_stack : (void*) &stack_ptr; |
| 72 | #endif |
| 73 | #else |
| 74 | /* Generic fallback for unsupported compilers */ |
| 75 | stack_ptr= default_stack ? default_stack : (void*) &stack_ptr; |
| 76 | #endif |
| 77 | return stack_ptr; |
| 78 | } |
| 79 | |
| 80 | |
| 81 | /* |
no outgoing calls