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(). */