This re-applies r258525, and this time adds it to LOCAL_PATCHES.  Is this
okay for trunk?


Segher


2018-10-31  Segher Boessenkool  <seg...@kernel.crashing.org>

libsanitizer/
        * LOCAL_PATCHES: Add r258525.
        * sanitizer_common/sanitizer_stacktrace.cc
        (BufferedStackTrace::FastUnwindStack): Use the correct frame offset
        for PowerPC SYSV ABI.
---
 libsanitizer/LOCAL_PATCHES                            |  1 +
 libsanitizer/sanitizer_common/sanitizer_stacktrace.cc | 13 ++++++++++---
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/libsanitizer/LOCAL_PATCHES b/libsanitizer/LOCAL_PATCHES
index 56e74b8..06eb23e 100644
--- a/libsanitizer/LOCAL_PATCHES
+++ b/libsanitizer/LOCAL_PATCHES
@@ -1,3 +1,4 @@
+r258525
 r265667
 r265668
 r265669
diff --git a/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc 
b/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc
index 699fd9f..aa74b70 100644
--- a/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc
+++ b/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc
@@ -82,14 +82,21 @@ void BufferedStackTrace::FastUnwindStack(uptr pc, uptr bp, 
uptr stack_top,
          IsAligned((uptr)frame, sizeof(*frame)) &&
          size < max_depth) {
 #ifdef __powerpc__
-    // PowerPC ABIs specify that the return address is saved at offset
-    // 16 of the *caller's* stack frame.  Thus we must dereference the
-    // back chain to find the caller frame before extracting it.
+    // PowerPC ABIs specify that the return address is saved on the
+    // *caller's* stack frame.  Thus we must dereference the back chain
+    // to find the caller frame before extracting it.
     uhwptr *caller_frame = (uhwptr*)frame[0];
     if (!IsValidFrame((uptr)caller_frame, stack_top, bottom) ||
         !IsAligned((uptr)caller_frame, sizeof(uhwptr)))
       break;
+    // For most ABIs the offset where the return address is saved is two
+    // register sizes.  The exception is the SVR4 ABI, which uses an
+    // offset of only one register size.
+#ifdef _CALL_SYSV
+    uhwptr pc1 = caller_frame[1];
+#else
     uhwptr pc1 = caller_frame[2];
+#endif
 #elif defined(__s390__)
     uhwptr pc1 = frame[14];
 #else
-- 
1.8.3.1

Reply via email to