Cherry-picked by scw@google.com from
8cd559cf5afe3894f92c2be6f972e1a4e38c56ca
with local modifications (different file path and not use macros introduced in
01bd62517cc242ae503aaa7002e9e94551803e4d). This fixes UB and code
removal when building with clang.
It avoids the possible warning of uninitialized 'frame' variable when
building with clang:
../sysdeps/nptl/jmp-unwind.c:27:42: error: variable 'frame' is
uninitialized when used here [-Werror,-Wuninitialized]
__pthread_cleanup_upto (env->__jmpbuf, CURRENT_STACK_FRAME);
The resulting code is similar to CURRENT_STACK_FRAME.
Checked on x86_64-linux-gnu.
/* Location of current stack frame. The frame pointer is not usable. */
#define CURRENT_STACK_FRAME \
- ({ register char *frame __asm__("rsp"); frame; })
+ ({ register void * p__ __asm__("rsp"); \
+ asm volatile("" : "=r" (p__)); \
+ p__; })
for which they need to act as barriers as well, hence the additional
(unnecessary) parameters. */
#define stackinfo_get_sp() \
- ({ void *p__; asm volatile ("mov %%" RSP_LP ", %0" : "=r" (p__)); p__; })
+ ({ register void * p__ __asm__(RSP_LP); \
+ asm volatile("" : "=r" (p__)); \
+ p__; })
#define stackinfo_sub_sp(ptr) \
({ ptrdiff_t d__; \
asm volatile ("sub %%" RSP_LP " , %0" : "=r" (d__) : "0" (ptr)); \