Fix stack unwinding on ppc.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5022 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_libcassert.c b/coregrind/m_libcassert.c
index fb9ab3e..d0c4e98 100644
--- a/coregrind/m_libcassert.c
+++ b/coregrind/m_libcassert.c
@@ -61,12 +61,19 @@
"=r" (sp),\
"=r" (fp));
#elif defined(VGP_ppc32_linux)
-# define GET_REAL_PC_SP_AND_FP(pc, sp, fp) \
- asm("mr %0,1;" \
- "mr %1,1;" \
- : "=r" (pc),\
- "=r" (sp),\
- "=r" (fp));
+# define GET_REAL_PC_SP_AND_FP(pc, sp, fp) \
+ asm("mflr 0;" /* r0 = lr */ \
+ "bl m_libcassert_get_ip;" /* lr = pc */ \
+ "m_libcassert_get_ip:\n" \
+ "mflr %0;" \
+ "mtlr 0;" /* restore lr */ \
+ "mr %1,1;" \
+ "mr %2,1;" \
+ : "=r" (pc), \
+ "=r" (sp), \
+ "=r" (fp) \
+ : /* reads none */ \
+ : "r0" /* trashed */ );
#else
# error Unknown platform
#endif