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