memcheck: Allow unaligned loads of words on ppc64[le].

On powerpc partial unaligned loads of words from partially invalid
addresses are OK and could be generated by our translation of ldbrx.

Adjust partial_load memcheck tests to allow partial loads of words
on powerpc64.

Part of resolving bug #386945.
This commit is contained in:
Mark Wielaard 2018-12-08 13:47:43 -05:00
parent 0ed17bc9f6
commit 5ecdecdcd3
5 changed files with 57 additions and 6 deletions

View File

@ -1508,6 +1508,9 @@ ULong mc_LOADVn_slow ( Addr a, SizeT nBits, Bool bigendian )
# if defined(VGA_mips64) && defined(VGABI_N32)
if (szB == VG_WORDSIZE * 2 && VG_IS_WORD_ALIGNED(a)
&& n_addrs_bad < VG_WORDSIZE * 2)
# elif defined(VGA_ppc64be) || defined(VGA_ppc64le)
/* On power unaligned loads of words are OK. */
if (szB == VG_WORDSIZE && n_addrs_bad < VG_WORDSIZE)
# else
if (szB == VG_WORDSIZE && VG_IS_WORD_ALIGNED(a)
&& n_addrs_bad < VG_WORDSIZE)

View File

@ -235,8 +235,10 @@ EXTRA_DIST = \
partiallydefinedeq.stdout.exp \
partial_load_ok.vgtest partial_load_ok.stderr.exp \
partial_load_ok.stderr.exp64 \
partial_load_ok.stderr.exp-ppc64 \
partial_load_dflt.vgtest partial_load_dflt.stderr.exp \
partial_load_dflt.stderr.exp64 \
partial_load_dflt.stderr.exp-ppc64 \
partial_load_dflt.stderr.expr-s390x-mvc \
pdb-realloc.stderr.exp pdb-realloc.vgtest \
pdb-realloc2.stderr.exp pdb-realloc2.stdout.exp pdb-realloc2.vgtest \

View File

@ -1,14 +1,14 @@
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main ( void )
{
long w;
int i;
char* p;
long w; int i; char* p;
assert(sizeof(long) == sizeof(void*));
#if defined(__powerpc64__)
fprintf (stderr, "powerpc64\n"); /* Used to select correct .exp file. */
#endif
/* partial load, which --partial-loads-ok=yes should suppress */
p = calloc( sizeof(long)-1, 1 );
@ -16,7 +16,7 @@ int main ( void )
w = *(long*)p;
free(p);
/* partial but misaligned, cannot be suppressed */
/* partial but misaligned, ppc64[le] ok, but otherwise cannot be suppressed */
p = calloc( sizeof(long), 1 );
assert(p);
p++;

View File

@ -0,0 +1,23 @@
powerpc64
Invalid read of size 2
at 0x........: main (partial_load.c:30)
Address 0x........ is 0 bytes inside a block of size 1 alloc'd
at 0x........: calloc (vg_replace_malloc.c:...)
by 0x........: main (partial_load.c:28)
Invalid read of size 8
at 0x........: main (partial_load.c:37)
Address 0x........ is 0 bytes inside a block of size 8 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (partial_load.c:36)
HEAP SUMMARY:
in use at exit: ... bytes in ... blocks
total heap usage: ... allocs, ... frees, ... bytes allocated
For a detailed leak analysis, rerun with: --leak-check=full
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

View File

@ -0,0 +1,23 @@
powerpc64
Invalid read of size 2
at 0x........: main (partial_load.c:30)
Address 0x........ is 0 bytes inside a block of size 1 alloc'd
at 0x........: calloc (vg_replace_malloc.c:...)
by 0x........: main (partial_load.c:28)
Invalid read of size 8
at 0x........: main (partial_load.c:37)
Address 0x........ is 0 bytes inside a block of size 8 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (partial_load.c:36)
HEAP SUMMARY:
in use at exit: ... bytes in ... blocks
total heap usage: ... allocs, ... frees, ... bytes allocated
For a detailed leak analysis, rerun with: --leak-check=full
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)