Hello community, here is the log from the commit of package valgrind for openSUSE:11.4 checked in at Wed Aug 24 18:01:18 CEST 2011.
-------- --- old-versions/11.4/UPDATES/all/valgrind/valgrind.changes 2011-03-16 11:30:14.000000000 +0100 +++ 11.4/valgrind/valgrind.changes 2011-08-24 17:54:41.000000000 +0200 @@ -1,0 +2,34 @@ +Fri Aug 19 19:24:37 CEST 2011 - [email protected] + +- fix build against glibc 2.14 +- require the right version of glibc at runtime (part of fix for bnc#700362) + +------------------------------------------------------------------- +Tue Jul 5 13:09:46 UTC 2011 - [email protected] + +- Support Linux kernel 3.x + +------------------------------------------------------------------- +Wed Jun 22 18:54:13 UTC 2011 - [email protected] + +- fix merge error + +------------------------------------------------------------------- +Sat Jun 18 17:09:08 UTC 2011 - [email protected] + +- Improve Valgrind POWER6 and POWER7/P7 support (bnc#700358) + +------------------------------------------------------------------- +Tue May 17 11:46:04 UTC 2011 - [email protected] + +- revert removal for gcc-32bit requirement, breaks valgrinding + 32bit code on 64bit archs (bnc#705405) + +------------------------------------------------------------------- +Mon Apr 11 13:11:43 CEST 2011 - [email protected] + +- fix testsuite for s390 (kde#264800, kde#265762, kde#253206) +- Add folding rules for Clz32 and Clz64 (kde#243404) +- Refresh s390x port (kde#243404) + +------------------------------------------------------------------- calling whatdependson for 11.4-i586 Old: ---- deprecated.diff valgrind-3.5.90.svn11391-s390x-port.diff New: ---- glibc-2.14.diff valgrind-3.6.0.svn11566-s390x-port.diff valgrind-3.6.1-kernel3.patch valgrind-r11643.diff valgrind-r11644.diff valgrind-vex-r2106.diff valgrind-vex-r2109.diff valgrind_r12002.diff vg_bug259977_r11687.patch vg_bug259977_r11688.patch vg_bug259977_r11689.patch vg_bug259977_r11690.patch vg_bug267630_r2127.patch vg_bug270794_r11697.patch vg_bug270851_r2130.patch vg_bug270851_r2148.patch vg_bug270856_r2136.patch vg_bug271042_r11699.patch vg_bug271043_r11700.patch vg_bug271043_r11765.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ valgrind.spec ++++++ --- /var/tmp/diff_new_pack.6cEXzX/_old 2011-08-24 18:01:01.000000000 +0200 +++ /var/tmp/diff_new_pack.6cEXzX/_new 2011-08-24 18:01:01.000000000 +0200 @@ -20,7 +20,7 @@ Name: valgrind BuildRequires: docbook-xsl-stylesheets docbook_4 gcc-c++ glibc-devel-32bit libxslt xorg-x11-devel %ifarch x86_64 ppc64 -BuildRequires: glibc-devel-32bit +BuildRequires: gcc-32bit glibc-devel-32bit %endif Url: http://valgrind.org/ License: GPLv2+ @@ -28,13 +28,37 @@ Summary: Memory Management Debugger BuildRoot: %{_tmppath}/%{name}-%{version}-build Version: 3.6.1 -Release: 1.<RELEASE2> +Release: 1.<RELEASE5> Source0: %{name}-%{version}.tar.bz2 # svn di svn://svn.valgrind.org/valgrind/tags/VALGRIND_3_5_0 svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_5_BRANCH > 3_5_BRANCH.diff # svn di svn://svn.valgrind.org/vex/tags/VEX_3_5_0 svn://svn.valgrind.org/vex/branches/VEX_3_5_BRANCH > VEX_3_5_BRANCH.diff Patch1: jit-register-unregister.diff -Patch2: deprecated.diff -Patch3: valgrind-3.5.90.svn11391-s390x-port.diff +Patch3: valgrind-3.6.0.svn11566-s390x-port.diff +Patch5: valgrind-vex-r2109.diff +Patch6: valgrind-r11644.diff +Patch7: valgrind-r11643.diff +Patch8: valgrind-vex-r2106.diff +Patch9: vg_bug259977_r11687.patch +Patch10: vg_bug259977_r11688.patch +Patch11: vg_bug259977_r11689.patch +Patch12: vg_bug259977_r11690.patch +Patch14: vg_bug270794_r11697.patch +Patch15: vg_bug271042_r11699.patch +Patch16: vg_bug271043_r11700.patch +Patch17: vg_bug271043_r11765.patch + +Patch41: vg_bug267630_r2127.patch +Patch42: vg_bug270851_r2130.patch +Patch43: vg_bug270856_r2136.patch +Patch44: vg_bug270851_r2148.patch +Patch45: valgrind-3.6.1-kernel3.patch +Patch46: glibc-2.14.diff +Patch47: valgrind_r12002.diff +# during building the major version of glibc is built into the suppression file +%define glibc_main_version %(getconf GNU_LIBC_VERSION | cut -d' ' -f2 | cut -d. -f1) +%define glibc_major_version %(getconf GNU_LIBC_VERSION | cut -d' ' -f2 | cut -d. -f2) +Requires: glibc >= %glibc_main_version.%glibc_major_version +Requires: glibc < %glibc_main_version.%{lua: print(rpm.expand("%glibc_major_version")+1)} %if %suse_version <= 1100 Provides: valgrind-devel = %version %endif @@ -126,13 +150,31 @@ %prep %setup -q -n %{name}-%{version} cd VEX +%patch5 +%patch8 cd .. %patch1 -%ifarch s390x +#%ifarch s390x %patch3 -%endif -# probably no longer needed, kept around already for a long time (2010-10-12) -#%patch2 +#%endif +%patch6 +%patch7 +%patch9 +%patch10 +%patch11 +%patch12 +%patch14 +%patch15 +%patch16 +%patch17 + +%patch41 +%patch42 +%patch43 +%patch44 +%patch45 +%patch46 +%patch47 %build export CFLAGS="$RPM_OPT_FLAGS" @@ -162,15 +204,30 @@ %defattr(-,root,root) /usr/bin/* %doc %_defaultdocdir/%name -%_libdir/valgrind %doc %_mandir/*/* +%dir %_libdir/valgrind +%ifarch x86_64 +%_libdir/valgrind/*-amd64-linux +%endif +%ifarch %ix86 x86_64 +%_libdir/valgrind/*-x86-linux +%endif +%ifarch ppc ppc64 +%_libdir/valgrind/*-ppc32-linux +%_libdir/valgrind/*-ppc64-linux +%endif +%ifarch s390 s390x +%libdir/valgrind/*-s390x-linux +%endif +%_libdir/valgrind/*-linux.so +%_libdir/valgrind/*.supp %if %suse_version > 1100 %files devel %defattr(-,root,root) %endif - +%_libdir/valgrind/lib*.a /usr/include/valgrind /usr/%_lib/pkgconfig/valgrind.pc ++++++ glibc-2.14.diff ++++++ ------------------------------------------------------------------------ r11800 | tom | 2011-06-07 23:52:26 +0200 (Di, 07. Jun 2011) | 2 Zeilen Add glibc 2.14 support. Patch from Dmitry Djachenko <[email protected]>. ------------------------------------------------------------------------ Index: configure.in =================================================================== --- configure.in (Revision 11799) +++ configure.in (Revision 11800) @@ -779,6 +779,13 @@ case "${GLIBC_VERSION}" in DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}" DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}" ;; + 2.14) + AC_MSG_RESULT(2.14 family) + AC_DEFINE([GLIBC_2_14], 1, [Define to 1 if you're using glibc 2.14.x]) + DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}" + DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}" + DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}" + ;; aix5) AC_MSG_RESULT(AIX 5.1 or 5.2 or 5.3) AC_DEFINE([AIX5_LIBC], 1, [Define to 1 if you're using AIX 5.1 or 5.2 or 5.3]) @@ -792,7 +799,7 @@ case "${GLIBC_VERSION}" in *) AC_MSG_RESULT([unsupported version ${GLIBC_VERSION}]) - AC_MSG_ERROR([Valgrind requires glibc version 2.2 - 2.13]) + AC_MSG_ERROR([Valgrind requires glibc version 2.2 - 2.14]) AC_MSG_ERROR([or AIX 5.1 or 5.2 or 5.3 GLIBC_VERSION]) AC_MSG_ERROR([or Darwin libc]) ;; ++++++ jit-register-unregister.diff ++++++ --- /var/tmp/diff_new_pack.6cEXzX/_old 2011-08-24 18:01:01.000000000 +0200 +++ /var/tmp/diff_new_pack.6cEXzX/_new 2011-08-24 18:01:01.000000000 +0200 @@ -1,6 +1,8 @@ ---- include/valgrind.h +Index: include/valgrind.h +=================================================================== +--- include/valgrind.h.orig +++ include/valgrind.h -@@ -4306,7 +4306,12 @@ typedef +@@ -4328,7 +4328,12 @@ typedef VG_USERREQ__LOAD_PDB_DEBUGINFO = 0x1601, /* Querying of debug info. */ @@ -14,7 +16,7 @@ } Vg_ClientRequest; #if !defined(__GNUC__) -@@ -4758,6 +4763,19 @@ VALGRIND_PRINTF_BACKTRACE(const char *fo +@@ -4780,6 +4785,19 @@ VALGRIND_PRINTF_BACKTRACE(const char *fo addr, buf64, 0, 0, 0); \ } @@ -34,7 +36,9 @@ #undef PLAT_x86_linux #undef PLAT_amd64_linux ---- coregrind/m_debuginfo/debuginfo.c +Index: coregrind/m_debuginfo/debuginfo.c +=================================================================== +--- coregrind/m_debuginfo/debuginfo.c.orig +++ coregrind/m_debuginfo/debuginfo.c @@ -48,6 +48,7 @@ #include "pub_core_oset.h" @@ -198,7 +202,9 @@ VG_(demangle) ( do_cxx_demangling, do_z_demangling, di->symtab[sno].name, buf, nbuf ); ---- coregrind/pub_core_debuginfo.h +Index: coregrind/pub_core_debuginfo.h +=================================================================== +--- coregrind/pub_core_debuginfo.h.orig +++ coregrind/pub_core_debuginfo.h @@ -106,6 +106,12 @@ Bool VG_(get_fnname_raw) ( Addr a, Char* extern @@ -213,7 +219,9 @@ /* Use DWARF2/3 CFA information to do one step of stack unwinding. D3UnwindRegs holds the current register values, and is ---- coregrind/m_scheduler/scheduler.c +Index: coregrind/m_scheduler/scheduler.c +=================================================================== +--- coregrind/m_scheduler/scheduler.c.orig +++ coregrind/m_scheduler/scheduler.c @@ -1585,6 +1585,16 @@ void do_client_request ( ThreadId tid ) goto my_default; ++++++ valgrind-3.5.90.svn11391-s390x-port.diff -> valgrind-3.6.0.svn11566-s390x-port.diff ++++++ ++++ 89233 lines (skipped) ++++ between old-versions/11.4/UPDATES/all/valgrind/valgrind-3.5.90.svn11391-s390x-port.diff ++++ and 11.4/valgrind/valgrind-3.6.0.svn11566-s390x-port.diff ++++++ valgrind-3.6.1-kernel3.patch ++++++ --- configure.in +++ configure.in @@ -225,9 +225,9 @@ case "${host_os}" in kernel=`uname -r` case "${kernel}" in - 2.6.*) - AC_MSG_RESULT([2.6 family (${kernel})]) - AC_DEFINE([KERNEL_2_6], 1, [Define to 1 if you're using Linux 2.6.x]) + 2.6.*|3.*) + AC_MSG_RESULT([2.6.x/3.x family (${kernel})]) + AC_DEFINE([KERNEL_2_6], 1, [Define to 1 if you're using Linux 2.6.x or Linux 3.x]) ;; 2.4.*) ++++++ valgrind-r11643.diff ++++++ ------------------------------------------------------------------------ r11643 | sewardj | 2011-03-14 10:53:44 +0100 (Mo, 14. Mär 2011) | 3 Zeilen Build fix for older s390x-linux assemblers. Fixes #264800. (Florian Krohm, [email protected]) ------------------------------------------------------------------------ Index: helgrind/tests/tc03_re_excl.c =================================================================== --- helgrind/tests/tc03_re_excl.c (Revision 11642) +++ helgrind/tests/tc03_re_excl.c (Revision 11643) @@ -10,7 +10,7 @@ /* A simple function to "use" a value, so that gcc can't possibly optimise it into nothing. */ static void use ( int x ) { - __asm__ __volatile__( "nop" : : "r"(x) : "cc","memory" ); + __asm__ __volatile__( "" : : "r"(x) : "cc","memory" ); } static void* worker_thread ( void* argV ) ++++++ valgrind-r11644.diff ++++++ ------------------------------------------------------------------------ r11644 | sewardj | 2011-03-15 09:13:08 +0100 (Di, 15. Mär 2011) | 3 Zeilen Some fixes for the faultstatus testcase. Fixes #253206. (Christian Borntraeger, [email protected]) ------------------------------------------------------------------------ Index: none/tests/faultstatus.c =================================================================== --- none/tests/faultstatus.c (Revision 11643) +++ none/tests/faultstatus.c (Revision 11644) @@ -70,7 +70,13 @@ static int testcode(int code, int want) static int testaddr(void *addr, volatile void *want) { + /* Some architectures (e.g. s390) just provide enough information to + resolve the page fault, but do not provide the offset within a page */ +#if defined(__s390__) + if (addr != (void *) ((unsigned long) want & ~0xffful)) { +#else if (addr != want) { +#endif fprintf(stderr, " FAIL: expected si_addr==%p, not %p\n", want, addr); return 0; } @@ -132,7 +138,8 @@ int main() for(i = 0; i < sizeof(sigs)/sizeof(*sigs); i++) sigaction(sigs[i], &sa, NULL); - fd = open("faultstatus.tmp", O_CREAT|O_TRUNC|O_EXCL, 0600); + /* we need O_RDWR for the truncate below */ + fd = open("faultstatus.tmp", O_CREAT|O_TRUNC|O_EXCL|O_RDWR, 0600); if (fd == -1) { perror("tmpfile"); exit(1); ++++++ valgrind-vex-r2106.diff ++++++ ------------------------------------------------------------------------ r2106 | sewardj | 2011-03-07 19:34:34 +0100 (Mo, 07. Mär 2011) | 4 Zeilen Add folding rules for Clz32 and Clz64. See bug 243404 comment 52. (Florian Krohn, [email protected]). ------------------------------------------------------------------------ --- priv/ir_opt.c +++ priv/ir_opt.c @@ -956,6 +956,31 @@ static IRExpr* mkOnesOfPrimopResultType } } +/* Helpers for folding Clz32/64. */ +static UInt fold_Clz64 ( ULong value ) +{ + UInt i; + vassert(value != 0ULL); /* no defined semantics for arg==0 */ + for (i = 0; i < 64; ++i) { + if (value & (((ULong)1) << (63 - i))) return i; + } + vassert(0); + /*NOTREACHED*/ + return 0; +} + +static UInt fold_Clz32 ( UInt value ) +{ + UInt i; + vassert(value != 0); /* no defined semantics for arg==0 */ + for (i = 0; i < 32; ++i) { + if (value & (((UInt)1) << (31 - i))) return i; + } + vassert(0); + /*NOTREACHED*/ + return 0; +} + static IRExpr* fold_Expr ( IRExpr* e ) { @@ -1154,6 +1179,19 @@ static IRExpr* fold_Expr ( IRExpr* e ) break; } + case Iop_Clz32: { + UInt u32 = e->Iex.Unop.arg->Iex.Const.con->Ico.U32; + if (u32 != 0) + e2 = IRExpr_Const(IRConst_U32(fold_Clz32(u32))); + break; + } + case Iop_Clz64: { + ULong u64 = e->Iex.Unop.arg->Iex.Const.con->Ico.U64; + if (u64 != 0ULL) + e2 = IRExpr_Const(IRConst_U64(fold_Clz64(u64))); + break; + } + default: goto unhandled; } ++++++ valgrind-vex-r2109.diff ++++++ --- pub/libvex.h +++ pub/libvex.h @@ -381,15 +381,25 @@ /* Initialise the library. You must call this first. */ extern void LibVEX_Init ( + /* failure exit function */ +# if __cplusplus == 1 && __GNUC__ && __GNUC__ <= 3 + /* g++ 3.x doesn't understand attributes on function parameters. + See #265762. */ +# else __attribute__ ((noreturn)) +# endif void (*failure_exit) ( void ), + /* logging output function */ void (*log_bytes) ( HChar*, Int nbytes ), + /* debug paranoia level */ Int debuglevel, + /* Are we supporting valgrind checking? */ Bool valgrind_support, + /* Control ... */ /*READONLY*/VexControl* vcon ); ++++++ valgrind_r12002.diff ++++++ ------------------------------------------------------------------------ r12002 | dirk | 2011-08-23 22:29:10 +0200 (Tue, 23 Aug 2011) | 2 lines Changed paths: M /trunk/glibc-2.X.supp.in fix the suppressions to also match libc-2.XX.y.so ------------------------------------------------------------------------ Index: glibc-2.X.supp.in =================================================================== --- glibc-2.X.supp.in (revision 12001) +++ glibc-2.X.supp.in (revision 12002) @@ -168,9 +168,9 @@ Memcheck:Param socketcall.sendto(msg) fun:__sendto_nocancel - obj:/*libc-@[email protected] - obj:/*libc-@[email protected] - obj:/*libc-@[email protected] + obj:/*libc-@GLIBC_VERSION@*.so + obj:/*libc-@GLIBC_VERSION@*.so + obj:/*libc-@GLIBC_VERSION@*.so } { glibc24-64bit-padding-1c @@ -180,7 +180,7 @@ fun:__nscd_get_map_ref fun:nscd_get*_r fun:*nscd* - obj:/*libc-@[email protected] + obj:/*libc-@GLIBC_VERSION@*.so } @@ -199,18 +199,18 @@ Memcheck:Param socketcall.sendto(msg) fun:send - obj:/*libc-@[email protected] - obj:/*libc-@[email protected] - obj:/*libc-@[email protected] + obj:/*libc-@GLIBC_VERSION@*.so + obj:/*libc-@GLIBC_VERSION@*.so + obj:/*libc-@GLIBC_VERSION@*.so } { X11-64bit-padding-4b Memcheck:Param socketcall.send(msg) fun:send - obj:/*libc-@[email protected] - obj:/*libc-@[email protected] - obj:/*libc-@[email protected] + obj:/*libc-@GLIBC_VERSION@*.so + obj:/*libc-@GLIBC_VERSION@*.so + obj:/*libc-@GLIBC_VERSION@*.so } ##----------------------------------------------------------------------## ++++++ vg_bug259977_r11687.patch ++++++ ++++ 918 lines (skipped) ++++++ vg_bug259977_r11688.patch ++++++ Index: memcheck/mc_leakcheck.c =================================================================== --- memcheck/mc_leakcheck.c (revision 11687) +++ memcheck/mc_leakcheck.c (revision 11688) @@ -635,7 +635,7 @@ } -static VG_MINIMAL_JMP_BUF memscan_jmpbuf; +static VG_MINIMAL_JMP_BUF(memscan_jmpbuf); static void scan_all_valid_memory_catcher ( Int sigNo, Addr addr ) Index: include/pub_tool_libcsetjmp.h =================================================================== --- include/pub_tool_libcsetjmp.h (revision 11687) +++ include/pub_tool_libcsetjmp.h (revision 11688) @@ -64,10 +64,21 @@ second function (eg, VG_(minimal_setjmp)) doesn't seem to work for whatever reason -- returns via a VG_(minimal_longjmp) go wrong. */ -#define VG_MINIMAL_JMP_BUF jmp_buf + +#if defined(VGP_ppc32_linux) + +#define VG_MINIMAL_JMP_BUF(_name) UInt _name [32+1+1] +Int VG_MINIMAL_SETJMP(VG_MINIMAL_JMP_BUF(_env)); +void VG_MINIMAL_LONGJMP(VG_MINIMAL_JMP_BUF(_env)); + +#else + +/* The default implementation. */ +#define VG_MINIMAL_JMP_BUF(_name) jmp_buf _name #define VG_MINIMAL_SETJMP(_env) __builtin_setjmp((_env)) #define VG_MINIMAL_LONGJMP(_env) __builtin_longjmp((_env),1) +#endif #endif // __PUB_TOOL_LIBCSETJMP_H Index: coregrind/m_libcsetjmp.c =================================================================== --- coregrind/m_libcsetjmp.c (revision 11687) +++ coregrind/m_libcsetjmp.c (revision 11688) @@ -36,9 +36,114 @@ /* See include/pub_tool_libcsetjmp.h for background and rationale. */ -/* No alternative implementations at present. */ +/* The only alternative implementations are for ppc{32,64}-linux. See + #259977. */ +#if defined(VGP_ppc32_linux) +__asm__( +".text" "\n" +"" "\n" +".global VG_MINIMAL_SETJMP" "\n" // r3 = jmp_buf +"VG_MINIMAL_SETJMP:" "\n" +" stw 0, 0(3)" "\n" +" stw 1, 4(3)" "\n" +" stw 2, 8(3)" "\n" +" stw 3, 12(3)" "\n" +" stw 4, 16(3)" "\n" +" stw 5, 20(3)" "\n" +" stw 6, 24(3)" "\n" +" stw 7, 28(3)" "\n" +" stw 8, 32(3)" "\n" +" stw 9, 36(3)" "\n" +" stw 10, 40(3)" "\n" +" stw 11, 44(3)" "\n" +" stw 12, 48(3)" "\n" +" stw 13, 52(3)" "\n" +" stw 14, 56(3)" "\n" +" stw 15, 60(3)" "\n" +" stw 16, 64(3)" "\n" +" stw 17, 68(3)" "\n" +" stw 18, 72(3)" "\n" +" stw 19, 76(3)" "\n" +" stw 20, 80(3)" "\n" +" stw 21, 84(3)" "\n" +" stw 22, 88(3)" "\n" +" stw 23, 92(3)" "\n" +" stw 24, 96(3)" "\n" +" stw 25, 100(3)" "\n" +" stw 26, 104(3)" "\n" +" stw 27, 108(3)" "\n" +" stw 28, 112(3)" "\n" +" stw 29, 116(3)" "\n" +" stw 30, 120(3)" "\n" +" stw 31, 124(3)" "\n" + // must use a caller-save register here as scratch, hence r4 +" mflr 4" "\n" +" stw 4, 128(3)" "\n" +" mfcr 4" "\n" +" stw 4, 132(3)" "\n" +" li 3, 0" "\n" +" blr" "\n" +"" "\n" + + +".global VG_MINIMAL_LONGJMP" "\n" +"VG_MINIMAL_LONGJMP:" "\n" // r3 = jmp_buf + // do r4 = 1 + // and park it in the restore slot for r3 (the ret reg) +" li 4, 1" "\n" +" stw 4, 12(3)" "\n" + // restore everything except r3 + // then r3 last of all + // then blr +" lwz 0, 128(3)" "\n" +" mtlr 0" "\n" +" lwz 0, 132(3)" "\n" +" mtcr 0" "\n" +" lwz 0, 0(3)" "\n" +" lwz 1, 4(3)" "\n" +" lwz 2, 8(3)" "\n" + // r3 is done at the end +" lwz 4, 16(3)" "\n" +" lwz 5, 20(3)" "\n" +" lwz 6, 24(3)" "\n" +" lwz 7, 28(3)" "\n" +" lwz 8, 32(3)" "\n" +" lwz 9, 36(3)" "\n" +" lwz 10, 40(3)" "\n" +" lwz 11, 44(3)" "\n" +" lwz 12, 48(3)" "\n" +" lwz 13, 52(3)" "\n" +" lwz 14, 56(3)" "\n" +" lwz 15, 60(3)" "\n" +" lwz 16, 64(3)" "\n" +" lwz 17, 68(3)" "\n" +" lwz 18, 72(3)" "\n" +" lwz 19, 76(3)" "\n" +" lwz 20, 80(3)" "\n" +" lwz 21, 84(3)" "\n" +" lwz 22, 88(3)" "\n" +" lwz 23, 92(3)" "\n" +" lwz 24, 96(3)" "\n" +" lwz 25, 100(3)" "\n" +" lwz 26, 104(3)" "\n" +" lwz 27, 108(3)" "\n" +" lwz 28, 112(3)" "\n" +" lwz 29, 116(3)" "\n" +" lwz 30, 120(3)" "\n" +" lwz 31, 124(3)" "\n" +" lwz 3, 12(3)" "\n" +" blr" "\n" +"" "\n" + + +".previous" "\n" +); + +#endif /* VGP_ppc32_linux */ + + /*--------------------------------------------------------------------*/ /*--- end ---*/ /*--------------------------------------------------------------------*/ Index: coregrind/m_machine.c =================================================================== --- coregrind/m_machine.c (revision 11687) +++ coregrind/m_machine.c (revision 11688) @@ -423,7 +423,7 @@ #if defined(VGA_ppc32) || defined(VGA_ppc64) \ || defined(VGA_arm) || defined(VGA_s390x) #include "pub_tool_libcsetjmp.h" -static VG_MINIMAL_JMP_BUF env_unsup_insn; +static VG_MINIMAL_JMP_BUF(env_unsup_insn); static void handler_unsup_insn ( Int x ) { VG_MINIMAL_LONGJMP(env_unsup_insn); } Index: coregrind/m_debuginfo/readdwarf3.c =================================================================== --- coregrind/m_debuginfo/readdwarf3.c (revision 11687) +++ coregrind/m_debuginfo/readdwarf3.c (revision 11688) @@ -3955,7 +3955,7 @@ static Bool d3rd_jmpbuf_valid = False; static HChar* d3rd_jmpbuf_reason = NULL; -static VG_MINIMAL_JMP_BUF d3rd_jmpbuf; +static VG_MINIMAL_JMP_BUF(d3rd_jmpbuf); static __attribute__((noreturn)) void barf ( HChar* reason ) { vg_assert(d3rd_jmpbuf_valid); Index: coregrind/pub_core_threadstate.h =================================================================== --- coregrind/pub_core_threadstate.h (revision 11687) +++ coregrind/pub_core_threadstate.h (revision 11688) @@ -356,7 +356,7 @@ /* Per-thread jmp_buf to resume scheduler after a signal */ Bool sched_jmpbuf_valid; - VG_MINIMAL_JMP_BUF sched_jmpbuf; + VG_MINIMAL_JMP_BUF(sched_jmpbuf); } ThreadState; ++++++ vg_bug259977_r11689.patch ++++++ Index: include/pub_tool_libcsetjmp.h =================================================================== --- include/pub_tool_libcsetjmp.h (revision 11688) +++ include/pub_tool_libcsetjmp.h (revision 11689) @@ -71,6 +71,12 @@ Int VG_MINIMAL_SETJMP(VG_MINIMAL_JMP_BUF(_env)); void VG_MINIMAL_LONGJMP(VG_MINIMAL_JMP_BUF(_env)); +#elif defined(VGP_ppc64_linux) + +#define VG_MINIMAL_JMP_BUF(_name) ULong _name [32+1+1] +Int VG_MINIMAL_SETJMP(VG_MINIMAL_JMP_BUF(_env)); +void VG_MINIMAL_LONGJMP(VG_MINIMAL_JMP_BUF(_env)); + #else /* The default implementation. */ Index: coregrind/m_libcsetjmp.c =================================================================== --- coregrind/m_libcsetjmp.c (revision 11688) +++ coregrind/m_libcsetjmp.c (revision 11689) @@ -39,11 +39,13 @@ /* The only alternative implementations are for ppc{32,64}-linux. See #259977. */ +/* ------------ ppc32-linux ------------ */ + #if defined(VGP_ppc32_linux) __asm__( ".text" "\n" -"" "\n" +"" "\n" ".global VG_MINIMAL_SETJMP" "\n" // r3 = jmp_buf "VG_MINIMAL_SETJMP:" "\n" " stw 0, 0(3)" "\n" @@ -85,7 +87,7 @@ " stw 4, 132(3)" "\n" " li 3, 0" "\n" " blr" "\n" -"" "\n" +"" "\n" ".global VG_MINIMAL_LONGJMP" "\n" @@ -135,15 +137,140 @@ " lwz 31, 124(3)" "\n" " lwz 3, 12(3)" "\n" " blr" "\n" -"" "\n" +"" "\n" - ".previous" "\n" ); #endif /* VGP_ppc32_linux */ +/* ------------ ppc64-linux ------------ */ + +#if defined(VGP_ppc64_linux) + +__asm__( +".section \".toc\",\"aw\"" "\n" + +".section \".text\"" "\n" +".align 2" "\n" +".p2align 4,,15" "\n" +".globl VG_MINIMAL_SETJMP" "\n" + +".section \".opd\",\"aw\"" "\n" +".align 3" "\n" +"VG_MINIMAL_SETJMP:" "\n" +".quad .L.VG_MINIMAL_SETJMP,.TOC.@tocbase,0" "\n" +".previous" "\n" + +".type VG_MINIMAL_SETJMP, @function" "\n" +".L.VG_MINIMAL_SETJMP:" "\n" +" std 0, 0(3)" "\n" +" std 1, 8(3)" "\n" +" std 2, 16(3)" "\n" +" std 3, 24(3)" "\n" +" std 4, 32(3)" "\n" +" std 5, 40(3)" "\n" +" std 6, 48(3)" "\n" +" std 7, 56(3)" "\n" +" std 8, 64(3)" "\n" +" std 9, 72(3)" "\n" +" std 10, 80(3)" "\n" +" std 11, 88(3)" "\n" +" std 12, 96(3)" "\n" +" std 13, 104(3)" "\n" +" std 14, 112(3)" "\n" +" std 15, 120(3)" "\n" +" std 16, 128(3)" "\n" +" std 17, 136(3)" "\n" +" std 18, 144(3)" "\n" +" std 19, 152(3)" "\n" +" std 20, 160(3)" "\n" +" std 21, 168(3)" "\n" +" std 22, 176(3)" "\n" +" std 23, 184(3)" "\n" +" std 24, 192(3)" "\n" +" std 25, 200(3)" "\n" +" std 26, 208(3)" "\n" +" std 27, 216(3)" "\n" +" std 28, 224(3)" "\n" +" std 29, 232(3)" "\n" +" std 30, 240(3)" "\n" +" std 31, 248(3)" "\n" + // must use a caller-save register here as scratch, hence r4 +" mflr 4" "\n" +" std 4, 256(3)" "\n" +" mfcr 4" "\n" +" std 4, 264(3)" "\n" +" li 3, 0" "\n" +" blr" "\n" +"" "\n" + + +".globl VG_MINIMAL_LONGJMP" "\n" + +".section \".opd\",\"aw\"" "\n" +".align 3" "\n" +"VG_MINIMAL_LONGJMP:" "\n" +".quad .L.VG_MINIMAL_LONGJMP,.TOC.@tocbase,0" "\n" +".previous" "\n" + +".type VG_MINIMAL_LONGJMP, @function" "\n" +".L.VG_MINIMAL_LONGJMP:" "\n" + // do r4 = 1 + // and park it in the restore slot for r3 (the ret reg) +" li 4, 1" "\n" +" std 4, 24(3)" "\n" + // restore everything except r3 + // then r3 last of all + // then blr +" ld 0, 256(3)" "\n" +" mtlr 0" "\n" +" ld 0, 264(3)" "\n" +" mtcr 0" "\n" +" ld 0, 0(3)" "\n" +" ld 1, 8(3)" "\n" +" ld 2, 16(3)" "\n" + // r3 is done at the end +" ld 4, 32(3)" "\n" +" ld 5, 40(3)" "\n" +" ld 6, 48(3)" "\n" +" ld 7, 56(3)" "\n" +" ld 8, 64(3)" "\n" +" ld 9, 72(3)" "\n" +" ld 10, 80(3)" "\n" +" ld 11, 88(3)" "\n" +" ld 12, 96(3)" "\n" +" ld 13, 104(3)" "\n" +" ld 14, 112(3)" "\n" +" ld 15, 120(3)" "\n" +" ld 16, 128(3)" "\n" +" ld 17, 136(3)" "\n" +" ld 18, 144(3)" "\n" +" ld 19, 152(3)" "\n" +" ld 20, 160(3)" "\n" +" ld 21, 168(3)" "\n" +" ld 22, 176(3)" "\n" +" ld 23, 184(3)" "\n" +" ld 24, 192(3)" "\n" +" ld 25, 200(3)" "\n" +" ld 26, 208(3)" "\n" +" ld 27, 216(3)" "\n" +" ld 28, 224(3)" "\n" +" ld 29, 232(3)" "\n" +" ld 30, 240(3)" "\n" +" ld 31, 248(3)" "\n" +" ld 3, 24(3)" "\n" +" blr" "\n" +"" "\n" + +".previous" "\n" +".previous" "\n" +); + + +#endif /* VGP_ppc64_linux */ + /*--------------------------------------------------------------------*/ /*--- end ---*/ /*--------------------------------------------------------------------*/ ++++++ vg_bug259977_r11690.patch ++++++ Index: coregrind/m_sigframe/sigframe-x86-darwin.c =================================================================== --- coregrind/m_sigframe/sigframe-x86-darwin.c (revision 11689) +++ coregrind/m_sigframe/sigframe-x86-darwin.c (revision 11690) @@ -34,6 +34,7 @@ #include "pub_core_basics.h" #include "pub_core_vki.h" #include "pub_core_vkiscnums.h" +#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy #include "pub_core_threadstate.h" #include "pub_core_aspacemgr.h" #include "pub_core_libcbase.h" Index: coregrind/m_sigframe/sigframe-amd64-darwin.c =================================================================== --- coregrind/m_sigframe/sigframe-amd64-darwin.c (revision 11689) +++ coregrind/m_sigframe/sigframe-amd64-darwin.c (revision 11690) @@ -34,6 +34,7 @@ #include "pub_core_basics.h" #include "pub_core_vki.h" #include "pub_core_vkiscnums.h" +#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy #include "pub_core_threadstate.h" #include "pub_core_aspacemgr.h" #include "pub_core_libcbase.h" Index: coregrind/m_syswrap/syswrap-x86-darwin.c =================================================================== --- coregrind/m_syswrap/syswrap-x86-darwin.c (revision 11689) +++ coregrind/m_syswrap/syswrap-x86-darwin.c (revision 11690) @@ -32,6 +32,7 @@ #include "pub_core_basics.h" #include "pub_core_vki.h" +#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy #include "pub_core_threadstate.h" #include "pub_core_aspacemgr.h" #include "pub_core_xarray.h" Index: coregrind/m_syswrap/syswrap-amd64-darwin.c =================================================================== --- coregrind/m_syswrap/syswrap-amd64-darwin.c (revision 11689) +++ coregrind/m_syswrap/syswrap-amd64-darwin.c (revision 11690) @@ -32,6 +32,7 @@ #include "pub_core_basics.h" #include "pub_core_vki.h" +#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy #include "pub_core_threadstate.h" #include "pub_core_aspacemgr.h" #include "pub_core_xarray.h" Index: coregrind/m_syswrap/syswrap-main.c =================================================================== --- coregrind/m_syswrap/syswrap-main.c (revision 11689) +++ coregrind/m_syswrap/syswrap-main.c (revision 11690) @@ -2267,7 +2267,7 @@ sci->status.what = SsIdle; vg_assert(tst->sched_jmpbuf_valid); - VG_MINIMAL_LONGJMP(tst->sched_jmpbuf, True); + VG_MINIMAL_LONGJMP(tst->sched_jmpbuf); /* NOTREACHED */ vg_assert(0); Index: coregrind/m_syswrap/syswrap-darwin.c =================================================================== --- coregrind/m_syswrap/syswrap-darwin.c (revision 11689) +++ coregrind/m_syswrap/syswrap-darwin.c (revision 11690) @@ -33,6 +33,7 @@ #include "pub_core_basics.h" #include "pub_core_vki.h" #include "pub_core_vkiscnums.h" +#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy #include "pub_core_threadstate.h" #include "pub_core_aspacemgr.h" #include "pub_core_xarray.h" Index: coregrind/m_initimg/initimg-darwin.c =================================================================== --- coregrind/m_initimg/initimg-darwin.c (revision 11689) +++ coregrind/m_initimg/initimg-darwin.c (revision 11690) @@ -47,6 +47,7 @@ #include "pub_core_ume.h" #include "pub_core_options.h" #include "pub_core_tooliface.h" /* VG_TRACK */ +#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy #include "pub_core_threadstate.h" /* ThreadArchState */ #include "priv_initimg_pathscan.h" #include "pub_core_initimg.h" /* self */ Index: coregrind/m_coredump/coredump-macho.c =================================================================== --- coregrind/m_coredump/coredump-macho.c (revision 11689) +++ coregrind/m_coredump/coredump-macho.c (revision 11690) @@ -33,6 +33,7 @@ #include "pub_core_basics.h" #include "pub_core_vki.h" #include "pub_core_coredump.h" +#include "pub_core_libcsetjmp.h" // to keep _threadstate.h happy #include "pub_core_threadstate.h" void VG_(make_coredump)(ThreadId tid, const vki_siginfo_t *si, UInt max_size) ++++++ vg_bug267630_r2127.patch ++++++ ++++ 3096 lines (skipped) ++++++ vg_bug270794_r11697.patch ++++++ ++++ 7624 lines (skipped) ++++++ vg_bug270851_r2130.patch ++++++ Index: VEX/priv/ir_defs.c =================================================================== --- VEX/priv/ir_defs.c (revision 2129) +++ VEX/priv/ir_defs.c (revision 2130) @@ -2265,7 +2265,7 @@ case Iop_I32StoF64: UNARY(Ity_I32, Ity_F64); case Iop_I64StoF64: BINARY(ity_RMode,Ity_I64, Ity_F64); case Iop_I64UtoF64: BINARY(ity_RMode,Ity_I64, Ity_F64); - case Iop_I64UtoF32: BINARY(ity_RMode,Ity_I64, Ity_F64); + case Iop_I64UtoF32: BINARY(ity_RMode,Ity_I64, Ity_F32); case Iop_I32UtoF64: UNARY(Ity_I32, Ity_F64); Index: VEX/priv/guest_ppc_toIR.c =================================================================== --- VEX/priv/guest_ppc_toIR.c (revision 2129) +++ VEX/priv/guest_ppc_toIR.c (revision 2130) @@ -7256,7 +7256,7 @@ case 0x3Ce: // fcfidus (Float convert from unsigned DWord to single precision) DIP("fcfidus%s fr%u,fr%u\n", flag_rC ? ".":"", frD_addr, frB_addr); assign( r_tmp64, unop( Iop_ReinterpF64asI64, mkexpr(frB)) ); - assign( frD, binop( Iop_I64UtoF32, rm, mkexpr( r_tmp64 ) ) ); + assign( frD, unop( Iop_F32toF64, binop( Iop_I64UtoF32, rm, mkexpr( r_tmp64 ) ) ) ); goto putFR; } } Index: VEX/priv/host_ppc_isel.c =================================================================== --- VEX/priv/host_ppc_isel.c (revision 2129) +++ VEX/priv/host_ppc_isel.c (revision 2130) @@ -3190,8 +3190,7 @@ return r_dst; } - if (e->Iex.Binop.op == Iop_I64StoF64 || e->Iex.Binop.op == Iop_I64UtoF64 - || e->Iex.Binop.op == Iop_I64UtoF32) { + if (e->Iex.Binop.op == Iop_I64StoF64 || e->Iex.Binop.op == Iop_I64UtoF64) { if (mode64) { HReg fdst = newVRegF(env); HReg isrc = iselWordExpr_R(env, e->Iex.Binop.arg2); @@ -3206,8 +3205,8 @@ addInstr(env, PPCInstr_Store(8, zero_r1, isrc, True/*mode64*/)); addInstr(env, PPCInstr_FpLdSt(True/*load*/, 8, fdst, zero_r1)); addInstr(env, PPCInstr_FpCftI(True/*I->F*/, False/*int64*/, - e->Iex.Binop.op == Iop_I64StoF64 ? True : False, - e->Iex.Binop.op == Iop_I64UtoF32 ? False : True, + e->Iex.Binop.op == Iop_I64StoF64, + True/*fdst is 64 bit*/, fdst, fdst)); add_to_sp( env, 16 ); @@ -3234,8 +3233,8 @@ addInstr(env, PPCInstr_Store(4, four_r1, isrcLo, False/*mode32*/)); addInstr(env, PPCInstr_FpLdSt(True/*load*/, 8, fdst, zero_r1)); addInstr(env, PPCInstr_FpCftI(True/*I->F*/, False/*int64*/, - e->Iex.Binop.op == Iop_I64StoF64 ? True : False, - e->Iex.Binop.op == Iop_I64UtoF32 ? False : True, + e->Iex.Binop.op == Iop_I64StoF64, + True/*fdst is 64 bit*/, fdst, fdst)); add_to_sp( env, 16 ); ++++++ vg_bug270851_r2148.patch ++++++ Index: VEX/priv/host_ppc_defs.c =================================================================== --- VEX/priv/host_ppc_defs.c.orig +++ VEX/priv/host_ppc_defs.c @@ -962,17 +962,65 @@ PPCInstr* PPCInstr_FpRSP ( HReg dst, HRe i->Pin.FpRSP.src = src; return i; } + +/* +Valid combo | fromI | int32 | syned | flt64 | +-------------------------------------------- + | n n n n | +-------------------------------------------- + F64->I64U | n n n y | +-------------------------------------------- + | n n y n | +-------------------------------------------- + F64->I64S | n n y y | +-------------------------------------------- + | n y n n | +-------------------------------------------- + F64->I32U | n y n y | +-------------------------------------------- + | n y y n | +-------------------------------------------- + F64->I32S | n y y y | +-------------------------------------------- + I64U->F32 | y n n n | +-------------------------------------------- + I64U->F64 | y n n y | +-------------------------------------------- + | y n y n | +-------------------------------------------- + I64S->F64 | y n y y | +-------------------------------------------- + | y y n n | +-------------------------------------------- + | y y n y | +-------------------------------------------- + | y y y n | +-------------------------------------------- + | y y y y | +-------------------------------------------- +*/ PPCInstr* PPCInstr_FpCftI ( Bool fromI, Bool int32, Bool syned, - Bool dst64, HReg dst, HReg src ) { + Bool flt64, HReg dst, HReg src ) { + Bool tmp = fromI | int32 | syned | flt64; + vassert(tmp == True || tmp == False); // iow, no high bits set + UShort conversion = 0; + conversion = (fromI << 3) | (int32 << 2) | (syned << 1) | flt64; + switch (conversion) { + // Supported conversion operations + case 1: case 3: case 5: case 7: + case 8: case 9: case 11: + break; + default: + vpanic("PPCInstr_FpCftI(ppc_host)"); + } PPCInstr* i = LibVEX_Alloc(sizeof(PPCInstr)); i->tag = Pin_FpCftI; i->Pin.FpCftI.fromI = fromI; i->Pin.FpCftI.int32 = int32; i->Pin.FpCftI.syned = syned; - i->Pin.FpCftI.dst64 = dst64; + i->Pin.FpCftI.flt64 = flt64; i->Pin.FpCftI.dst = dst; i->Pin.FpCftI.src = src; - vassert(!(int32 && fromI)); /* no such insn ("fcfiw"). */ return i; } PPCInstr* PPCInstr_FpCMov ( PPCCondCode cond, HReg dst, HReg src ) { @@ -1445,7 +1493,7 @@ void ppPPCInstr ( PPCInstr* i, Bool mode if (i->Pin.FpCftI.fromI == True && i->Pin.FpCftI.int32 == False) { if (i->Pin.FpCftI.syned == True) str = "fcfid"; - else if (i->Pin.FpCftI.dst64 == True) + else if (i->Pin.FpCftI.flt64 == True) str = "fcfidu"; else str = "fcfidus"; @@ -3397,7 +3445,7 @@ Int emit_PPCInstr ( UChar* buf, Int nbuf // fcfid (conv i64 to f64), PPC64 p434 p = mkFormX(p, 63, fr_dst, 0, fr_src, 846, 0); goto done; - } else if (i->Pin.FpCftI.dst64 == True) { + } else if (i->Pin.FpCftI.flt64 == True) { // fcfidu (conv u64 to f64) p = mkFormX(p, 63, fr_dst, 0, fr_src, 974, 0); goto done; Index: VEX/priv/host_ppc_defs.h =================================================================== --- VEX/priv/host_ppc_defs.h.orig +++ VEX/priv/host_ppc_defs.h @@ -461,7 +461,7 @@ typedef Pin_FpLdSt, /* FP load/store */ Pin_FpSTFIW, /* stfiwx */ Pin_FpRSP, /* FP round IEEE754 double to IEEE754 single */ - Pin_FpCftI, /* fcfid/fctid/fctiw */ + Pin_FpCftI, /* fcfid[u,s,us]/fctid[u]/fctiw[u] */ Pin_FpCMov, /* FP floating point conditional move */ Pin_FpLdFPSCR, /* mtfsf */ Pin_FpCmp, /* FP compare, generating value into int reg */ @@ -662,13 +662,15 @@ typedef HReg src; HReg dst; } FpRSP; - /* fcfid/fctid/fctiw. Note there's no fcfiw so fromI==True - && int32==True is not allowed. */ + /* fcfid[u,s,us]/fctid[u]/fctiw[u]. Only some combinations + of the various fields are allowed. This is asserted for + and documented in the code for the constructor, + PPCInstr_FpCftI, in host_ppc_defs.c. */ struct { - Bool fromI; /* False==F->I, True==I->F */ - Bool int32; /* True== I is 32, False==I is 64 */ + Bool fromI; /* True== I->F, False== F->I */ + Bool int32; /* True== I is 32, False== I is 64 */ Bool syned; - Bool dst64; /* True==dest is 64bit; False==dest is 32bit */ + Bool flt64; /* True== F is 64, False== F is 32 */ HReg src; HReg dst; } FpCftI; Index: VEX/priv/host_ppc_isel.c =================================================================== --- VEX/priv/host_ppc_isel.c.orig +++ VEX/priv/host_ppc_isel.c @@ -1471,8 +1471,9 @@ static HReg iselWordExpr_R_wrk ( ISelEnv set_FPU_rounding_mode( env, e->Iex.Binop.arg1 ); sub_from_sp( env, 16 ); - addInstr(env, PPCInstr_FpCftI(False/*F->I*/, True/*int32*/, True, - False, ftmp, fsrc)); + addInstr(env, PPCInstr_FpCftI(False/*F->I*/, True/*int32*/, + True/*syned*/, True/*flt64*/, + ftmp, fsrc)); addInstr(env, PPCInstr_FpSTFIW(r1, ftmp)); addInstr(env, PPCInstr_Load(4, idst, zero_r1, mode64)); @@ -2959,6 +2960,8 @@ static HReg iselFltExpr ( ISelEnv* env, /* DO NOT CALL THIS DIRECTLY */ static HReg iselFltExpr_wrk ( ISelEnv* env, IRExpr* e ) { + Bool mode64 = env->mode64; + IRType ty = typeOfIRExpr(env->type_env,e); vassert(ty == Ity_F32); @@ -3027,6 +3030,60 @@ static HReg iselFltExpr_wrk ( ISelEnv* e return fdst; } + if (e->tag == Iex_Binop && e->Iex.Binop.op == Iop_I64UtoF32) { + if (mode64) { + HReg fdst = newVRegF(env); + HReg isrc = iselWordExpr_R(env, e->Iex.Binop.arg2); + HReg r1 = StackFramePtr(env->mode64); + PPCAMode* zero_r1 = PPCAMode_IR( 0, r1 ); + + /* Set host rounding mode */ + set_FPU_rounding_mode( env, e->Iex.Binop.arg1 ); + + sub_from_sp( env, 16 ); + + addInstr(env, PPCInstr_Store(8, zero_r1, isrc, True/*mode64*/)); + addInstr(env, PPCInstr_FpLdSt(True/*load*/, 8, fdst, zero_r1)); + addInstr(env, PPCInstr_FpCftI(True/*I->F*/, False/*int64*/, + False, False, + fdst, fdst)); + + add_to_sp( env, 16 ); + + ///* Restore default FPU rounding. */ + //set_FPU_rounding_default( env ); + return fdst; + } else { + /* 32-bit mode */ + HReg fdst = newVRegF(env); + HReg isrcHi, isrcLo; + HReg r1 = StackFramePtr(env->mode64); + PPCAMode* zero_r1 = PPCAMode_IR( 0, r1 ); + PPCAMode* four_r1 = PPCAMode_IR( 4, r1 ); + + iselInt64Expr(&isrcHi, &isrcLo, env, e->Iex.Binop.arg2); + + /* Set host rounding mode */ + set_FPU_rounding_mode( env, e->Iex.Binop.arg1 ); + + sub_from_sp( env, 16 ); + + addInstr(env, PPCInstr_Store(4, zero_r1, isrcHi, False/*mode32*/)); + addInstr(env, PPCInstr_Store(4, four_r1, isrcLo, False/*mode32*/)); + addInstr(env, PPCInstr_FpLdSt(True/*load*/, 8, fdst, zero_r1)); + addInstr(env, PPCInstr_FpCftI(True/*I->F*/, False/*int64*/, + False, False, + fdst, fdst)); + + add_to_sp( env, 16 ); + + ///* Restore default FPU rounding. */ + //set_FPU_rounding_default( env ); + return fdst; + } + + } + vex_printf("iselFltExpr(ppc): No such tag(%u)\n", e->tag); ppIRExpr(e); vpanic("iselFltExpr_wrk(ppc)"); ++++++ vg_bug270856_r2136.patch ++++++ Index: VEX/priv/host_ppc_isel.c =================================================================== --- VEX/priv/host_ppc_isel.c (revision 2135) +++ VEX/priv/host_ppc_isel.c (revision 2136) @@ -1615,6 +1615,7 @@ case Iop_Not16: case Iop_Not32: case Iop_Not64: { + if (op_unop == Iop_Not64) vassert(mode64); HReg r_dst = newVRegI(env); HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); addInstr(env, PPCInstr_Unary(Pun_NOT,r_dst,r_src)); @@ -2885,6 +2886,18 @@ return; } + case Iop_Not64: { + HReg xLo, xHi; + HReg tmpLo = newVRegI(env); + HReg tmpHi = newVRegI(env); + iselInt64Expr(&xHi, &xLo, env, e->Iex.Unop.arg); + addInstr(env, PPCInstr_Unary(Pun_NOT,tmpLo,xLo)); + addInstr(env, PPCInstr_Unary(Pun_NOT,tmpHi,xHi)); + *rHi = tmpHi; + *rLo = tmpLo; + return; + } + /* ReinterpF64asI64(e) */ /* Given an IEEE754 double, produce an I64 with the same bit pattern. */ ++++++ vg_bug271042_r11699.patch ++++++ Index: configure.in =================================================================== --- configure.in (revision 11698) +++ configure.in (revision 11699) @@ -986,7 +986,7 @@ #include <altivec.h> ], [ vector unsigned int v; - __asm__ __volatile__("xsmaddadp %vs32, %vs32, %vs33" ::: "memory","cc"); + __asm__ __volatile__("xsmaddadp 32, 32, 33" ::: "memory","cc"); ], [ ac_have_vsx=yes ++++++ vg_bug271043_r11700.patch ++++++ Index: coregrind/m_dispatch/dispatch-ppc64-linux.S =================================================================== --- coregrind/m_dispatch/dispatch-ppc64-linux.S (revision 11699) +++ coregrind/m_dispatch/dispatch-ppc64-linux.S (revision 11700) @@ -310,7 +310,7 @@ /* start over */ b .VG_(run_innerloop__dispatch_unprofiled) /*NOTREACHED*/ - .size VG_(run_innerloop), .-VG_(run_innerloop) + .size .VG_(run_innerloop), .-.VG_(run_innerloop) /*----------------------------------------------------*/ @@ -385,7 +385,7 @@ /* start over */ b .VG_(run_innerloop__dispatch_profiled) /*NOTREACHED*/ - .size VG_(run_a_noredir_translation), .-VG_(run_a_noredir_translation) + .size .VG_(run_a_noredir_translation), .-.VG_(run_a_noredir_translation) /*----------------------------------------------------*/ ++++++ vg_bug271043_r11765.patch ++++++ Index: coregrind/m_syswrap/syswrap-ppc64-linux.c =================================================================== --- coregrind/m_syswrap/syswrap-ppc64-linux.c (revision 11764) +++ coregrind/m_syswrap/syswrap-ppc64-linux.c (revision 11765) @@ -1380,7 +1380,7 @@ // _____(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178 GENXY(__NR_pread64, sys_pread64), // 179 -// _____(__NR_pwrite64, sys_pwrite64), // 180 + GENX_(__NR_pwrite64, sys_pwrite64), // 180 GENX_(__NR_chown, sys_chown), // 181 GENXY(__NR_getcwd, sys_getcwd), // 182 LINXY(__NR_capget, sys_capget), // 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
