about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-03-08 17:31:08 -0300
committerShu-Chun Weng <scw@google.com>2024-11-18 12:50:33 -0800
commit04a99db8c73cb8804fa56a7487d6aa1bf26ee752 (patch)
tree257ebea3d0d6abc4ed3fb13de27dc00a3a1cceea
parent82dcfc6d7bdd5b24a42d8180d31ee403999b9215 (diff)
downloadglibc-google/grte/v5-2.27/master.tar.gz
glibc-google/grte/v5-2.27/master.tar.xz
glibc-google/grte/v5-2.27/master.zip
nptl: x86_64: Use same code for CURRENT_STACK_FRAME and stackinfo_get_sp google/grte/v5-2.27/master
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.
-rw-r--r--sysdeps/x86_64/nptl/pthreaddef.h4
-rw-r--r--sysdeps/x86_64/stackinfo.h4
2 files changed, 6 insertions, 2 deletions
diff --git a/sysdeps/x86_64/nptl/pthreaddef.h b/sysdeps/x86_64/nptl/pthreaddef.h
index 036deb5772..7cf6677114 100644
--- a/sysdeps/x86_64/nptl/pthreaddef.h
+++ b/sysdeps/x86_64/nptl/pthreaddef.h
@@ -41,4 +41,6 @@
 
 /* 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__; })
diff --git a/sysdeps/x86_64/stackinfo.h b/sysdeps/x86_64/stackinfo.h
index f7a5672f27..1301c5e197 100644
--- a/sysdeps/x86_64/stackinfo.h
+++ b/sysdeps/x86_64/stackinfo.h
@@ -34,7 +34,9 @@
    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));	\