Ivo Raisr [Fri, 29 Jul 2016 20:52:21 +0000 (20:52 +0000)]
Fix test memcheck/tests/descr_belowsp a bit on Solaris.
On Solaris, '%p' outputs just a hexadecimal number
without '0x' prefix. This is perfectly valid but not
understood by VG_(strtok_get_address_and_size)().
Therefore use universal PRIxPTR.
n-i-bz
Carl Love [Thu, 28 Jul 2016 16:51:53 +0000 (16:51 +0000)]
When running the valgrind tests, the jm-insns test is segfaulting when it
attempts to patch instructions as it deals with the ppc64 (BE) function
descriptor. This is actually due to the RELRO option being enabled by default
for the ppc64 (BE) platform, per an upstream binutils change.
Bugzilla 365912 reported by Will Schmidt, Will supplied the patch to fix the
make file none/tests/ppc64/Makefile.a
Add test cases for PCMPxSTRx cases 0x62 and 0x72, and reformat the associated
switch statements a bit more consistently. Pertains to #353384 and #353727.
Regression test for n-i-bz amd64: memcheck false positive with shr %edx
Valgrind side : reproducer for the false positive memcheck
+ announce the fix (VEX side in next commit)
Fix leak in m_redir.c
See below discussion for more details.
On Sat, 2016-07-02 at 14:20 +0200, Philippe Waroquiers wrote:
> I am testing a patch (provided by Julian) that solves a false positive
> memcheck found at my work.
>
> Testing this, I decided to run valgrind under valgrind (not done since
> a long time).
>
> This shows a leak in many tests, the stack trace being such as:
> ==26246== 336 bytes in 21 blocks are definitely lost in loss record 72 of 141
> ==26246== at 0x2801C01D: vgPlain_arena_malloc (m_mallocfree.c:1855)
> ==26246== by 0x2801D616: vgPlain_arena_strdup (m_mallocfree.c:2528)
> ==26246== by 0x2801D616: vgPlain_strdup (m_mallocfree.c:2600)
> ==26246== by 0x2801F5AD: vgPlain_redir_notify_new_DebugInfo (m_redir.c:619)
> ==26246== by 0x2803B650: di_notify_ACHIEVE_ACCEPT_STATE (debuginfo.c:771)
> ==26246== by 0x2803B650: vgPlain_di_notify_mmap (debuginfo.c:1067)
> ==26246== by 0x2806589C: vgModuleLocal_generic_PRE_sys_mmap (syswrap-generic.c:2368)
> ==26246== by 0x2809932A: vgSysWrap_amd64_linux_sys_mmap_before (syswrap-amd64-linux.c:637)
> ==26246== by 0x28061E11: vgPlain_client_syscall (syswrap-main.c:1906)
> ==26246== by 0x2805E9D2: handle_syscall (scheduler.c:1118)
> ==26246== by 0x280604A6: vgPlain_scheduler (scheduler.c:1435)
> ==26246== by 0x2806FF87: thread_wrapper (syswrap-linux.c:103)
> ==26246== by 0x2806FF87: run_a_thread_NORETURN (syswrap-linux.c:156)
>
>
> The strdup call in m_redir.c:619 was introduced by r15726.
>
> However, I am not sure this is a bug that is introduced by this change,
> or if it just reveals a leak that was already there.
> The "very original" replacement logic did not do memory allocation for
> the replacement: see m_redir.c in valgrind 3.10.1 : it was just copying
> some chars from VG_(clo_soname_synonyms) to demangled_sopatt
Yes, it should do exactly the same as the other code paths. If
replaced_sopatt != NULL then it is an allocated string that has been
assigned to demangled_sopatt. I had assumed that would take care of the
life-time issues of the allocated string. But now that I read the code
it is indeed not so clear.
> Then in 3.11, the fixed size demangled_sopatt was changed to be
> a dynamically allocated buffer.
> The revision log 14664 that introduced this explains that the ownership of
> returned buffer is not easy. It tells at the end:
> "So the rule of thunb here is: if in doubt strdup the string."
>
> but now we have to see when to free what, it seems ???
>
> Any thoughts ?
So if replaced_sopatt != NULL, then demangled_sopatt contains the
allocated string, and it is then immediately copied and assigned to
spec->from_sopatt. After that it is used under check_ppcTOCs. But there
it will first be reassigned a new value through maybe_Z_demangle
(overwriting any existing string being pointed to). So for this
particular leak it seem fine to free it right after the spec[List] has
been initialized (line 642).
Carl Love [Mon, 27 Jun 2016 15:50:29 +0000 (15:50 +0000)]
Add the HW register support for missing registers in get_otrack_shadow_offset_wrk(). The registers are: NRADDR, NRADDR_GPR2, (REDIR_STACK, TFHAR, TEXASR, TEXASRU, TFIAR, PPR, PSPB.
Don't check or try to copy sigmask if it is NULL. The sigmask might be
given in a struct, where the length is non-zero, but the signal set
pointer is NULL.
Testcase provided by Paul Eggert <eggert@cs.ucla.edu>.
Rhys Kidd [Sat, 4 Jun 2016 15:34:56 +0000 (15:34 +0000)]
Fix tst->os_state.pthread - magic_delta assertion failure on OSX 10.11
bz#354883
Whilst I’ve seen different magic_delta values on one of my older development machines (Intel Nehalem-based), enough other users have reported success with this change.
If this causes regressions, please report your hardware details in our Bugzilla.
Petar Jovanovic [Fri, 6 May 2016 17:34:55 +0000 (17:34 +0000)]
mips32: raise the limit for sizeof(TTEntryC)
Raise limit for sizeof(TTEntryC) due to 8-byte alignement requirement for
ULong on mips32 platforms. It is a follow up to the same change on ppc32
(see r15875), and it un-breaks mips32-linux (broken with r15784).
Un-break ppc32-linux following r15784. It appears that ppc32-ELF
layout constraints are different from x86-ELF and so the assertion on
the sizeof(TTEntryC) fails on ppc32-linux.
Split the structure TTEntry into hot (small) and cold (large) parts,
TTEntryH and TTEntryC. TTEntryH is a VexGuestExtents plus one more
field. For scenarios involving a lot of code discarding, when the
fast-path discard mechanism does not apply, this change reduces
significantly the number of LLC misses, because such discarding
involves sequentially searching the arrays of TTEntryH's. For recent
Firefoxes the miss rate in a 6MB L3 cache is reduced by about 1/3, as
measured by /usr/bin/perf.
Carl Love [Tue, 26 Apr 2016 19:53:56 +0000 (19:53 +0000)]
Power PC Fix V bit error in 128-bit BCD add and subtract instructions
The original code was using the bcdadd / bcdsub instruction on the operand
shadow bits to calculate the shadow bits for the result. This introduced
non-zero bits shadow bits in the result. The shadow bits for these
instructions should be set to all valid or all invalid. If one of the
argument shadow bits was one, then all of the shadow bits of the result should
be one. Otherwise the result shadow bits should be zero.
This patch fixes the above bug in memcheck/mc_translate.c
Fixing the above bug broke the v-bit test. The issue is the v-bit tester
assumes the shadow bits for the operands of a given Iop can be set to one
for testing purposes. The implementation of the bcdadd and bcdsub was passing
a constant value for the variable ps. The ps value is an argument to the
instruction that specifies how to set the sign code of the result. The
implementation of the instructions was changed to issue the instruction with
ps=0. Then the result of the instruction is updated in the VEX code if ps=1.
This changed also results in cleaning up the vbit test code.
This patch also fixes the issues with the v-bit test program.
Fix compilation breakage on platforms that do already have a definition
for Elf{32,64}_Chdr. This is fallout from r15868. That commit provided
a configure test, but the resulting config.h was not included here, causing
the test results to be ignored.
Ivo Raisr [Sat, 23 Apr 2016 20:28:27 +0000 (20:28 +0000)]
Valgrind is able to read compressed debuginfo sections in two formats:
- zlib ELF gABI format with SHF_COMPRESSED flag (gcc option -gz=zlib)
- zlib GNU format with .zdebug sections (gcc option -gz=zlib-gnu)
Patch by: Aleksandar Rikalo <aleksandar.rikalo@imgtec.com>
Fixes BZ#303877
Ivo Raisr [Sat, 23 Apr 2016 19:35:11 +0000 (19:35 +0000)]
Fix Valgrind coredump when VG_(unimplemented)() is called
early during main initialization, before the threads are
created and scheduler is initialized.
Fixes BZ#362009
Carl Love [Thu, 21 Apr 2016 18:21:26 +0000 (18:21 +0000)]
PPC64, Valgrind with GDB does not display 64-bit and 128-bit registers
correctly
1) Fix Endianess issue that was missed in the BE to LE port. GDB was
not displaying the contents of the 64-bit and 128-bit registers
correctly due to an Endianess issue.
2) Fix displaying the shadow registers for the 64-bit and 128-bit
registers.
Ivo Raisr [Mon, 18 Apr 2016 10:28:53 +0000 (10:28 +0000)]
Clean up properly Valgrind coredump after tests
none/tests/solaris/reserve_sysstat_addr and reserve_sysstat_zone_addr.
The coredump is expected there as the test cases trigger unsupported
functionality.
n-i-bz
Ivo Raisr [Sun, 17 Apr 2016 19:28:04 +0000 (19:28 +0000)]
Fix compiler warnings on Solaris 12 about assigning a function pointer
of an incompatible type to signal handler.
Untyped function pointer sa_handler() is no longer available
so we leverage sa_sigaction(int, siginfo_t *, void *) instead.
n-i-bz
Ivo Raisr [Sun, 17 Apr 2016 15:57:11 +0000 (15:57 +0000)]
Fix build on newer illumos distributions which streamlined inclusion of sys/regset.h.
This means that sys/regset.h needs to be included explicitly now.
n-i-bz
Ivo Raisr [Fri, 8 Apr 2016 20:38:30 +0000 (20:38 +0000)]
Kludge for multiple .rodata sections on Solaris introduced by BZ#353802
is no longer needed. The situation with multiple ".rodata" sections existed
only between dozens of builds of Solaris 12.
Fixes BZ#360749
Ivo Raisr [Mon, 4 Apr 2016 02:25:40 +0000 (02:25 +0000)]
Fix expected output of massif/tests/{new-cpp,overloaded-new}
for libstdc++ from gcc5.
Even with fix for bug 345307 we still see allocations for
the emergency pool in libstdc++ which skew the expected results.
Mark Wielaard [Sun, 3 Apr 2016 20:33:11 +0000 (20:33 +0000)]
Bug 361354 ppc64[le]: wire up separate socketcalls system calls
Newer glibc will use separate socket related syscalls instead of using
the multiplexing socketcall systemcall. On Fedora rawhide this causes
several tests to fail.
Mark Wielaard [Sun, 3 Apr 2016 15:24:20 +0000 (15:24 +0000)]
Update gdbserver_tests filter for newer GDB version.
- Newer gdb say Thread .... hit Breakpoint, we expect just Breakpoint.
- We expect "Program received" instead of "Thread .... received"
- Ordering of ' Thread .... (tid .' might differ between gdb version,
so remove all such lines except the "current" one (starts with '*').
Both tests define a execute_native_thread_routine function that we
took from libstdc++. Unfortunately because of a bug this function
is not local in some versions of libstdc++ and so our similar named
function will clash when trying to link.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70476#c2
Simply rename our version to work around this.
Since we don't build this part of the test code for gcc >= 6, this
issue only happens if the buggy libstdc++ thread code is used together
with gcc 5. This is the case with for example devtoolset-4-gcc-5.
Ivo Raisr [Wed, 30 Mar 2016 17:53:03 +0000 (17:53 +0000)]
Run __gnu_cxx::__freeres() cleanup function available
from libstdc++ when available, similar to existing __libc_freeres().
New option --run-cxx-freeres=<yes|no> can be used to change whether
this cleanup function is called or not.
Note that __gnu_cxx::__freeres() is currently available
only in gcc 6. It is not yet decided what to do about
libstdc++ from gcc 5.
Tracked under https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69945
for libstdc++.
The following file was modified:
none/tests/ppc64/Makefile.am
Note, the NEWS file was not updated as the ISA 3.0 support is not complete yet. This is the
first of five sets of commits needed to add all of the ISA 3.0 support.
Carl Love [Tue, 29 Mar 2016 21:28:43 +0000 (21:28 +0000)]
Power PC Add support for ISA 3.0, part 1
The Floating-point condition code bits FPCC is bits[15:12] of the FPSCR.
The instructions fcmpu, fcmpo, dcmpu, dcmpq, dtstdc, dtstdcq, xscmpodq
and xscmpudq set the FPCC bits in addition to the BE field of the CC
register. This support is needed by the ISA 3.0 instructions to be added.
Julian Seward [Fri, 25 Mar 2016 14:27:20 +0000 (14:27 +0000)]
MC_(helperc_MAKE_STACK_UNINIT): make the #if 0'd bits of code actually
compile. This is clearly pointless but is done for a cleanliness
point of view. No functional change.
Julian Seward [Mon, 21 Mar 2016 20:04:05 +0000 (20:04 +0000)]
VG_(discard_translations):
* fix off-by-one error that forced use of the slow case unnecessarily
* change ECLASS_SHIFT from 11 to 13 so that ranges up to 8KB can fall
within an equivalence class, and increase ECLASS_WIDTH by 1 so as to
double the number of hash buckets (effectively).
These measures noticably improve the performance of modern Firefoxes,
since they do a lot of 4KB and 8KB discards as a result of mprotect
trickery used to implement W^X protection on JIT code pages.
Petar Jovanovic [Mon, 21 Mar 2016 14:05:23 +0000 (14:05 +0000)]
[mips] update stderr exp file for tc19_shadowmem
A few changes have had impact on expected output of tc19_shadowmem recently.
These are:
- r14175 (added extra "Block was alloc'd by thread #x" output)
- r13983 (removed "pthread_create_WRK (hg_intercepts.c:" output)
- r13965 (a few empty lines removed)
However, expected stderr file for mips32 has not been updated accordingly.
Update it now. This fixes helgrind/tests/tc19_shadowmem failure on mips32.
Mark Wielaard [Tue, 15 Mar 2016 13:56:19 +0000 (13:56 +0000)]
Bug #360519 none/tests/arm64/memory.vgtest might fail with newer gcc
The LDR (literal, int reg) testcase takes a code label and compares the
instructions around the label with known instructions in the code stream.
There were only fixed insns on either side of the checking instruction
which isn't enough given that offsets of +/-8 are used, instructions are
only 4 wide and the values loaded are 64bit. Newer gcc versions would
generate different code around the label and cause the tests to fail.
Add enough nops around the actual instruction to really give known
expected constant values to check against.
Mark Wielaard [Wed, 9 Mar 2016 16:18:37 +0000 (16:18 +0000)]
Bug 359503 - Add missing syscalls for aarch64 (arm64)
Enable more arm64 syscalls. ioprio_set, ioprio_get, preadv, pwritev,
vmsplice, splice, tee, waitid, clock_nanosleep and perf_event_open.
Reported and patch (mostly) by Marcin Juszkiewicz.
Mark Wielaard [Wed, 9 Mar 2016 16:18:36 +0000 (16:18 +0000)]
Add arm64 scalar test. Enable tested syscalls.
The new memcheck/tests/arm64-linux/scalar test is based on the
memcheck/tests/x86-linux/scalar test and contains all syscalls
that are also available on arm64. To make comparison of exp results
easier the order of the tested syscalls is the same as on x86.
This enables a couple extra arm64 syscalls. Part of the fix for
bug #359503 - Add missing syscalls for aarch64 (arm64).
Mark Wielaard [Wed, 9 Mar 2016 16:18:34 +0000 (16:18 +0000)]
Use correct syscall numbers on arm64. Fix rename, dup2 and getpgrp.
We were using some wrong syscall numbers in vki-scnums-arm64-linux.h
arm64 doesn't implement a couple of old deprecated system calls like
rename, dup2, getpgrp and fork. Adjust m_libcfile.c rename and dup2
functions to use renameat (also on tilegx) and dup3 (with fcntl fallback
for bad oldfd). And in m_libcproc.c implement getpgrp as getpgid(0).
Also don't compile the fork syswrap on arm64 (it only supports clone).
In practice this only affected callgrind which was unable to rename
dump files in some cases and ELF core dumps might have contained some
bogus prstatus fields.
Related to bug #359503 - Add missing syscalls for aarch64 (arm64)
Reported by Marcin Juszkiewicz who also posted a nice overview
of system calls on different linux architectures:
https://marcin.juszkiewicz.com.pl/2016/03/05/from-a-diary-of-aarch64-porter-system-calls/