commit c5a5bea00af75f6ac50da10967d956f117b956f1 Author: Mark Wielaard Date: Sat Dec 8 13:47:43 2018 -0500 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. diff --git a/memcheck/mc_main.c b/memcheck/mc_main.c index 3ef7cb9..737f79d 100644 --- a/memcheck/mc_main.c +++ b/memcheck/mc_main.c @@ -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) diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index 2af4dd1..70b8ada 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -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 \ diff --git a/memcheck/tests/partial_load.c b/memcheck/tests/partial_load.c index 0b2f10b..685ca8d 100644 --- a/memcheck/tests/partial_load.c +++ b/memcheck/tests/partial_load.c @@ -1,14 +1,14 @@ - +#include #include #include 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++; diff --git a/memcheck/tests/partial_load_dflt.stderr.exp-ppc64 b/memcheck/tests/partial_load_dflt.stderr.exp-ppc64 new file mode 100644 index 0000000..cf32bcf --- /dev/null +++ b/memcheck/tests/partial_load_dflt.stderr.exp-ppc64 @@ -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) diff --git a/memcheck/tests/partial_load_ok.stderr.exp-ppc64 b/memcheck/tests/partial_load_ok.stderr.exp-ppc64 new file mode 100644 index 0000000..cf32bcf --- /dev/null +++ b/memcheck/tests/partial_load_ok.stderr.exp-ppc64 @@ -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) diff -ur valgrind-3.14.0.orig/memcheck/tests/Makefile.in valgrind-3.14.0/memcheck/tests/Makefile.in --- valgrind-3.14.0.orig/memcheck/tests/Makefile.in 2018-12-12 23:17:07.525501080 +0100 +++ valgrind-3.14.0/memcheck/tests/Makefile.in 2018-12-12 23:18:13.404014757 +0100 @@ -1546,8 +1546,10 @@ 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 \