|
Mark Wielaard |
edd3a7 |
commit be7a73004583aab5d4c97cf55276ca58d5b3090b
|
|
Mark Wielaard |
edd3a7 |
Author: Mark Wielaard <mark@klomp.org>
|
|
Mark Wielaard |
edd3a7 |
Date: Wed Dec 12 14:15:28 2018 +0100
|
|
Mark Wielaard |
edd3a7 |
|
|
Mark Wielaard |
edd3a7 |
Mark helper regs defined in final_tidyup before freeres_wrapper call.
|
|
Mark Wielaard |
edd3a7 |
|
|
Mark Wielaard |
edd3a7 |
In final_tidyup we setup the guest to call the freeres_wrapper, which
|
|
Mark Wielaard |
edd3a7 |
will (possibly) call __gnu_cxx::__freeres() and/or __libc_freeres().
|
|
Mark Wielaard |
edd3a7 |
|
|
Mark Wielaard |
edd3a7 |
In a couple of cases (ppc64be, ppc64le and mips32) this involves setting
|
|
Mark Wielaard |
edd3a7 |
up one or more helper registers. Since we setup these guest registers
|
|
Mark Wielaard |
edd3a7 |
we should make sure to mark them as fully defined. Otherwise we might
|
|
Mark Wielaard |
edd3a7 |
see spurious warnings about undefined value usage if the guest register
|
|
Mark Wielaard |
edd3a7 |
happened to not be fully defined before.
|
|
Mark Wielaard |
edd3a7 |
|
|
Mark Wielaard |
edd3a7 |
This fixes PR402006.
|
|
Mark Wielaard |
edd3a7 |
|
|
Mark Wielaard |
edd3a7 |
diff --git a/coregrind/m_main.c b/coregrind/m_main.c
|
|
Mark Wielaard |
edd3a7 |
index 00702fc..22872a2 100644
|
|
Mark Wielaard |
edd3a7 |
--- a/coregrind/m_main.c
|
|
Mark Wielaard |
edd3a7 |
+++ b/coregrind/m_main.c
|
|
Mark Wielaard |
edd3a7 |
@@ -2304,22 +2304,35 @@ static void final_tidyup(ThreadId tid)
|
|
Mark Wielaard |
edd3a7 |
"Caught __NR_exit; running %s wrapper\n", msgs[to_run - 1]);
|
|
Mark Wielaard |
edd3a7 |
}
|
|
Mark Wielaard |
edd3a7 |
|
|
Mark Wielaard |
edd3a7 |
- /* set thread context to point to freeres_wrapper */
|
|
Mark Wielaard |
edd3a7 |
- /* ppc64be-linux note: freeres_wrapper gives us the real
|
|
Mark Wielaard |
edd3a7 |
+ /* Set thread context to point to freeres_wrapper.
|
|
Mark Wielaard |
edd3a7 |
+ ppc64be-linux note: freeres_wrapper gives us the real
|
|
Mark Wielaard |
edd3a7 |
function entry point, not a fn descriptor, so can use it
|
|
Mark Wielaard |
edd3a7 |
directly. However, we need to set R2 (the toc pointer)
|
|
Mark Wielaard |
edd3a7 |
appropriately. */
|
|
Mark Wielaard |
edd3a7 |
VG_(set_IP)(tid, freeres_wrapper);
|
|
Mark Wielaard |
edd3a7 |
+
|
|
Mark Wielaard |
edd3a7 |
# if defined(VGP_ppc64be_linux)
|
|
Mark Wielaard |
edd3a7 |
VG_(threads)[tid].arch.vex.guest_GPR2 = r2;
|
|
Mark Wielaard |
edd3a7 |
+ VG_TRACK(post_reg_write, Vg_CoreClientReq, tid,
|
|
Mark Wielaard |
edd3a7 |
+ offsetof(VexGuestPPC64State, guest_GPR2),
|
|
Mark Wielaard |
edd3a7 |
+ sizeof(VG_(threads)[tid].arch.vex.guest_GPR2));
|
|
Mark Wielaard |
edd3a7 |
# elif defined(VGP_ppc64le_linux)
|
|
Mark Wielaard |
edd3a7 |
/* setting GPR2 but not really needed, GPR12 is needed */
|
|
Mark Wielaard |
edd3a7 |
VG_(threads)[tid].arch.vex.guest_GPR2 = freeres_wrapper;
|
|
Mark Wielaard |
edd3a7 |
+ VG_TRACK(post_reg_write, Vg_CoreClientReq, tid,
|
|
Mark Wielaard |
edd3a7 |
+ offsetof(VexGuestPPC64State, guest_GPR2),
|
|
Mark Wielaard |
edd3a7 |
+ sizeof(VG_(threads)[tid].arch.vex.guest_GPR2));
|
|
Mark Wielaard |
edd3a7 |
VG_(threads)[tid].arch.vex.guest_GPR12 = freeres_wrapper;
|
|
Mark Wielaard |
edd3a7 |
+ VG_TRACK(post_reg_write, Vg_CoreClientReq, tid,
|
|
Mark Wielaard |
edd3a7 |
+ offsetof(VexGuestPPC64State, guest_GPR12),
|
|
Mark Wielaard |
edd3a7 |
+ sizeof(VG_(threads)[tid].arch.vex.guest_GPR12));
|
|
Mark Wielaard |
edd3a7 |
# endif
|
|
Mark Wielaard |
edd3a7 |
/* mips-linux note: we need to set t9 */
|
|
Mark Wielaard |
edd3a7 |
# if defined(VGP_mips32_linux) || defined(VGP_mips64_linux)
|
|
Mark Wielaard |
edd3a7 |
VG_(threads)[tid].arch.vex.guest_r25 = freeres_wrapper;
|
|
Mark Wielaard |
edd3a7 |
+ VG_TRACK(post_reg_write, Vg_CoreClientReq, tid,
|
|
Mark Wielaard |
edd3a7 |
+ offsetof(VexGuestMIPS32State, guest_r25),
|
|
Mark Wielaard |
edd3a7 |
+ sizeof(VG_(threads)[tid].arch.vex.guest_r25));
|
|
Mark Wielaard |
edd3a7 |
# endif
|
|
Mark Wielaard |
edd3a7 |
|
|
Mark Wielaard |
edd3a7 |
/* Pass a parameter to freeres_wrapper(). */
|