|
From: <sv...@va...> - 2012-09-09 01:57:06
|
petarj 2012-09-09 02:56:56 +0100 (Sun, 09 Sep 2012)
New Revision: 12962
Log:
Restore unwind regs structure if VG_(use_CF_info) fails on MIPS.
If VG_(use_CF_info) fails to find the next frame using loaded debug symbols, it
will still change the data in uregs. Thus, we need to have uregs_copy before
calling VG_(use_CF_info), and restore uregs if the call returns wrong data.
This fixes drd/tests/tc04_free_lock on MIPS.
Modified files:
trunk/coregrind/m_stacktrace.c
Modified: trunk/coregrind/m_stacktrace.c (+9 -6)
===================================================================
--- trunk/coregrind/m_stacktrace.c 2012-09-06 15:29:24 +01:00 (rev 12961)
+++ trunk/coregrind/m_stacktrace.c 2012-09-09 02:56:56 +01:00 (rev 12962)
@@ -925,16 +925,19 @@
if (i >= max_n_ips)
break;
+ D3UnwindRegs uregs_copy = uregs;
if (VG_(use_CF_info)( &uregs, fp_min, fp_max )) {
if (debug)
VG_(printf)("USING CFI: pc: 0x%lx, sp: 0x%lx, ra: 0x%lx\n",
uregs.pc, uregs.sp, uregs.ra);
- if (0 == uregs.pc || 1 == uregs.pc) break;
- if (sps) sps[i] = uregs.sp;
- if (fps) fps[i] = uregs.fp;
- ips[i++] = uregs.pc - 4;
- uregs.pc = uregs.pc - 4;
- continue;
+ if (0 != uregs.pc && 1 != uregs.pc) {
+ if (sps) sps[i] = uregs.sp;
+ if (fps) fps[i] = uregs.fp;
+ ips[i++] = uregs.pc - 4;
+ uregs.pc = uregs.pc - 4;
+ continue;
+ } else
+ uregs = uregs_copy;
}
int seen_sp_adjust = 0;
|