From: Mark Wielaard Date: Wed, 12 Dec 2018 13:15:28 +0000 (+0100) Subject: Mark helper regs defined in final_tidyup before freeres_wrapper call. X-Git-Tag: VALGRIND_3_15_0~136 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=be7a73004583aab5d4c97cf55276ca58d5b3090b;p=thirdparty%2Fvalgrind.git Mark helper regs defined in final_tidyup before freeres_wrapper call. In final_tidyup we setup the guest to call the freeres_wrapper, which will (possibly) call __gnu_cxx::__freeres() and/or __libc_freeres(). In a couple of cases (ppc64be, ppc64le and mips32) this involves setting up one or more helper registers. Since we setup these guest registers we should make sure to mark them as fully defined. Otherwise we might see spurious warnings about undefined value usage if the guest register happened to not be fully defined before. This fixes PR402006. --- diff --git a/NEWS b/NEWS index 562291fa6c..d2a42073b5 100644 --- a/NEWS +++ b/NEWS @@ -70,6 +70,7 @@ where XXXXXX is the bug number as listed below. 401578 drd: crashes sometimes on fork() 401627 memcheck errors with glibc avx2 optimized wcsncmp 401822 none/tests/ppc64/jm-vmx fails and produces assembler warnings +402006 mark helper regs defined in final_tidyup before freeres_wrapper call Release 3.14.0 (9 October 2018) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/coregrind/m_main.c b/coregrind/m_main.c index 00702fc225..22872a25a0 100644 --- a/coregrind/m_main.c +++ b/coregrind/m_main.c @@ -2304,22 +2304,35 @@ static void final_tidyup(ThreadId tid) "Caught __NR_exit; running %s wrapper\n", msgs[to_run - 1]); } - /* set thread context to point to freeres_wrapper */ - /* ppc64be-linux note: freeres_wrapper gives us the real + /* Set thread context to point to freeres_wrapper. + ppc64be-linux note: freeres_wrapper gives us the real function entry point, not a fn descriptor, so can use it directly. However, we need to set R2 (the toc pointer) appropriately. */ VG_(set_IP)(tid, freeres_wrapper); + # if defined(VGP_ppc64be_linux) VG_(threads)[tid].arch.vex.guest_GPR2 = r2; + VG_TRACK(post_reg_write, Vg_CoreClientReq, tid, + offsetof(VexGuestPPC64State, guest_GPR2), + sizeof(VG_(threads)[tid].arch.vex.guest_GPR2)); # elif defined(VGP_ppc64le_linux) /* setting GPR2 but not really needed, GPR12 is needed */ VG_(threads)[tid].arch.vex.guest_GPR2 = freeres_wrapper; + VG_TRACK(post_reg_write, Vg_CoreClientReq, tid, + offsetof(VexGuestPPC64State, guest_GPR2), + sizeof(VG_(threads)[tid].arch.vex.guest_GPR2)); VG_(threads)[tid].arch.vex.guest_GPR12 = freeres_wrapper; + VG_TRACK(post_reg_write, Vg_CoreClientReq, tid, + offsetof(VexGuestPPC64State, guest_GPR12), + sizeof(VG_(threads)[tid].arch.vex.guest_GPR12)); # endif /* mips-linux note: we need to set t9 */ # if defined(VGP_mips32_linux) || defined(VGP_mips64_linux) VG_(threads)[tid].arch.vex.guest_r25 = freeres_wrapper; + VG_TRACK(post_reg_write, Vg_CoreClientReq, tid, + offsetof(VexGuestMIPS32State, guest_r25), + sizeof(VG_(threads)[tid].arch.vex.guest_r25)); # endif /* Pass a parameter to freeres_wrapper(). */