|
From: <sv...@va...> - 2008-07-30 10:00:18
|
Author: sewardj
Date: 2008-07-30 11:00:25 +0100 (Wed, 30 Jul 2008)
New Revision: 8483
Log:
Make exp-ptrcheck work on ppc{32,64}-linux. Also, fix nasty kludges
to do with GetI and PutI in pc_instrument; these should now be handled
correctly.
Modified:
branches/PTRCHECK/coregrind/m_debuginfo/d3basics.c
branches/PTRCHECK/coregrind/m_machine.c
branches/PTRCHECK/exp-ptrcheck/pc_list.c
branches/PTRCHECK/exp-ptrcheck/pc_main.c
branches/PTRCHECK/none/tests/ppc32/Makefile.am
branches/PTRCHECK/none/tests/ppc64/Makefile.am
Modified: branches/PTRCHECK/coregrind/m_debuginfo/d3basics.c
===================================================================
--- branches/PTRCHECK/coregrind/m_debuginfo/d3basics.c 2008-07-30 09:19:21 UTC (rev 8482)
+++ branches/PTRCHECK/coregrind/m_debuginfo/d3basics.c 2008-07-30 10:00:25 UTC (rev 8483)
@@ -461,7 +461,6 @@
&& expr[0] == DW_OP_regx) {
/* JRS: 2008Feb20: I believe the following is correct, but would
like to see a test case show up before enabling it. */
- vg_assert(0);
expr++;
res.kind = GXR_RegNo;
res.word = (UWord)read_leb128U( &expr );
@@ -472,7 +471,7 @@
/*NOTREACHED*/
}
- /* Evidently this expresion denotes a value, not a register name.
+ /* Evidently this expression denotes a value, not a register name.
So evaluate it accordingly. */
if (push_initial_zero)
Modified: branches/PTRCHECK/coregrind/m_machine.c
===================================================================
--- branches/PTRCHECK/coregrind/m_machine.c 2008-07-30 09:19:21 UTC (rev 8482)
+++ branches/PTRCHECK/coregrind/m_machine.c 2008-07-30 10:00:25 UTC (rev 8483)
@@ -86,6 +86,9 @@
# elif defined(VGP_amd64_linux)
VG_(threads)[tid].arch.vex_shadow1.guest_RAX = s1;
VG_(threads)[tid].arch.vex_shadow2.guest_RAX = s2;
+# elif defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux)
+ VG_(threads)[tid].arch.vex_shadow1.guest_GPR3 = s1;
+ VG_(threads)[tid].arch.vex_shadow2.guest_GPR3 = s2;
# else
# error "Unknown plat"
# endif
Modified: branches/PTRCHECK/exp-ptrcheck/pc_list.c
===================================================================
--- branches/PTRCHECK/exp-ptrcheck/pc_list.c 2008-07-30 09:19:21 UTC (rev 8482)
+++ branches/PTRCHECK/exp-ptrcheck/pc_list.c 2008-07-30 10:00:25 UTC (rev 8483)
@@ -142,9 +142,9 @@
Interval* Interval__construct(Addr left, Addr right, Bool is_zero,
ExeContext* where, SegStatus status)
{
+ Interval* o = my_malloc( sizeof(Interval) );
if (0) VG_(printf)("Interval__construct(%p,%p,%d)\n",
left, right, (Int)is_zero);
- Interval* o = my_malloc( sizeof(Interval) );
o->left = left;
o->right = right;
o->is_zero = is_zero;
@@ -154,6 +154,7 @@
return o;
}
+__attribute__((unused))
static
void Interval__destruct(Interval* o)
{
Modified: branches/PTRCHECK/exp-ptrcheck/pc_main.c
===================================================================
--- branches/PTRCHECK/exp-ptrcheck/pc_main.c 2008-07-30 09:19:21 UTC (rev 8482)
+++ branches/PTRCHECK/exp-ptrcheck/pc_main.c 2008-07-30 10:00:25 UTC (rev 8483)
@@ -31,7 +31,11 @@
// FIXME: 64-bit cleanness, check the following
// struct _ISNode.ownerCount is 32-bit
// struct _ISNode.topLevel is 32-bit
+// or is that not really right now? add assertion checks about
+// the max size of a node
+// FIXME: should we shadow %RIP? Maybe not.
+
// FIXME: result of add_new_segment is always ignored
// FIXME: the mechanism involving last_seg_added is really ugly.
@@ -46,12 +50,6 @@
// the default 'NONPTR' behaviour of post_syscall. post_reg_write_demux
// is called first, then post_syscall.
-// FIXME: deal with Ist_PutI, Iex_GetI kludges
-// PutI kludge: it is assumed that PutIs are to unshadowed areas, so
-// no instrumentation is generated -- can silently generate wrong
-// instrumentation
-// GetI kludge: is at least safe; will abort in unhandled cases
-
// FIXME: check nothing is mapped in the lowest 1M of memory at
// startup, or quit (to do with nonptr_or_unknown, also sync 1M
// magic value with PIE default load address in m_ume.c.
@@ -1390,6 +1388,17 @@
# define PC_SZB_FS_ZERO sizeof( ((VexGuestAMD64State*)0)->guest_FS_ZERO)
#endif
+#if defined(VGA_ppc32)
+# include "libvex_guest_ppc32.h"
+# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestPPC32State)
+#endif
+
+#if defined(VGA_ppc64)
+# include "libvex_guest_ppc64.h"
+# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestPPC64State)
+#endif
+
+
/* See description on definition of type IntRegInfo. */
static void get_IntRegInfo ( /*OUT*/IntRegInfo* iii, Int offset, Int szB )
{
@@ -1576,7 +1585,328 @@
tl_assert(0);
# undef GOF
+ /* -------------------- ppc32 -------------------- */
+# elif defined(VGA_ppc32)
+
+# define GOF(_fieldname) \
+ (offsetof(VexGuestPPC32State,guest_##_fieldname))
+
+ Int o = offset;
+ Int sz = szB;
+ Bool is4 = sz == 4;
+ Bool is8 = sz == 8;
+
+ tl_assert(sz > 0);
+ tl_assert(host_is_big_endian());
+
+ /* Set default state to "does not intersect any int register". */
+ VG_(memset)( iii, 0, sizeof(*iii) );
+
+ /* Exact accesses to integer registers */
+ if (o == GOF(GPR0) && is4) goto exactly1;
+ if (o == GOF(GPR1) && is4) goto exactly1;
+ if (o == GOF(GPR2) && is4) goto exactly1;
+ if (o == GOF(GPR3) && is4) goto exactly1;
+ if (o == GOF(GPR4) && is4) goto exactly1;
+ if (o == GOF(GPR5) && is4) goto exactly1;
+ if (o == GOF(GPR6) && is4) goto exactly1;
+ if (o == GOF(GPR7) && is4) goto exactly1;
+ if (o == GOF(GPR8) && is4) goto exactly1;
+ if (o == GOF(GPR9) && is4) goto exactly1;
+ if (o == GOF(GPR10) && is4) goto exactly1;
+ if (o == GOF(GPR11) && is4) goto exactly1;
+ if (o == GOF(GPR12) && is4) goto exactly1;
+ if (o == GOF(GPR13) && is4) goto exactly1;
+ if (o == GOF(GPR14) && is4) goto exactly1;
+ if (o == GOF(GPR15) && is4) goto exactly1;
+ if (o == GOF(GPR16) && is4) goto exactly1;
+ if (o == GOF(GPR17) && is4) goto exactly1;
+ if (o == GOF(GPR18) && is4) goto exactly1;
+ if (o == GOF(GPR19) && is4) goto exactly1;
+ if (o == GOF(GPR20) && is4) goto exactly1;
+ if (o == GOF(GPR21) && is4) goto exactly1;
+ if (o == GOF(GPR22) && is4) goto exactly1;
+ if (o == GOF(GPR23) && is4) goto exactly1;
+ if (o == GOF(GPR24) && is4) goto exactly1;
+ if (o == GOF(GPR25) && is4) goto exactly1;
+ if (o == GOF(GPR26) && is4) goto exactly1;
+ if (o == GOF(GPR27) && is4) goto exactly1;
+ if (o == GOF(GPR28) && is4) goto exactly1;
+ if (o == GOF(GPR29) && is4) goto exactly1;
+ if (o == GOF(GPR30) && is4) goto exactly1;
+ if (o == GOF(GPR31) && is4) goto exactly1;
+
+ /* Misc integer reg and condition code accesses */
+ if (o == GOF(LR) && is4) goto exactly1;
+ if (o == GOF(CTR) && is4) goto exactly1;
+ if (o == GOF(CIA) && is4) goto none;
+ if (o == GOF(CIA_AT_SC) && is4) goto none;
+ if (o == GOF(RESVN) && is4) goto none;
+ if (o == GOF(TISTART) && is4) goto none;
+ if (o == GOF(TILEN) && is4) goto none;
+
+ if (sz == 1) {
+ if (o == GOF(XER_SO)) goto none;
+ if (o == GOF(XER_OV)) goto none;
+ if (o == GOF(XER_CA)) goto none;
+ if (o == GOF(XER_BC)) goto none;
+ if (o == GOF(CR0_321)) goto none;
+ if (o == GOF(CR0_0)) goto none;
+ if (o == GOF(CR1_321)) goto none;
+ if (o == GOF(CR1_0)) goto none;
+ if (o == GOF(CR2_321)) goto none;
+ if (o == GOF(CR2_0)) goto none;
+ if (o == GOF(CR3_321)) goto none;
+ if (o == GOF(CR3_0)) goto none;
+ if (o == GOF(CR4_321)) goto none;
+ if (o == GOF(CR4_0)) goto none;
+ if (o == GOF(CR5_321)) goto none;
+ if (o == GOF(CR5_0)) goto none;
+ if (o == GOF(CR6_321)) goto none;
+ if (o == GOF(CR6_0)) goto none;
+ if (o == GOF(CR7_321)) goto none;
+ if (o == GOF(CR7_0)) goto none;
+ }
+
+ /* Exact accesses to FP registers */
+ if (o == GOF(FPR0) && is8) goto none;
+ if (o == GOF(FPR1) && is8) goto none;
+ if (o == GOF(FPR2) && is8) goto none;
+ if (o == GOF(FPR3) && is8) goto none;
+ if (o == GOF(FPR4) && is8) goto none;
+ if (o == GOF(FPR5) && is8) goto none;
+ if (o == GOF(FPR6) && is8) goto none;
+ if (o == GOF(FPR7) && is8) goto none;
+ if (o == GOF(FPR8) && is8) goto none;
+ if (o == GOF(FPR9) && is8) goto none;
+ if (o == GOF(FPR10) && is8) goto none;
+ if (o == GOF(FPR11) && is8) goto none;
+ if (o == GOF(FPR12) && is8) goto none;
+ if (o == GOF(FPR13) && is8) goto none;
+ if (o == GOF(FPR14) && is8) goto none;
+ if (o == GOF(FPR15) && is8) goto none;
+ if (o == GOF(FPR16) && is8) goto none;
+ if (o == GOF(FPR17) && is8) goto none;
+ if (o == GOF(FPR18) && is8) goto none;
+ if (o == GOF(FPR19) && is8) goto none;
+ if (o == GOF(FPR20) && is8) goto none;
+ if (o == GOF(FPR21) && is8) goto none;
+ if (o == GOF(FPR22) && is8) goto none;
+ if (o == GOF(FPR23) && is8) goto none;
+ if (o == GOF(FPR24) && is8) goto none;
+ if (o == GOF(FPR25) && is8) goto none;
+ if (o == GOF(FPR26) && is8) goto none;
+ if (o == GOF(FPR27) && is8) goto none;
+ if (o == GOF(FPR28) && is8) goto none;
+ if (o == GOF(FPR29) && is8) goto none;
+ if (o == GOF(FPR30) && is8) goto none;
+ if (o == GOF(FPR31) && is8) goto none;
+
+ /* FP admin related */
+ if (o == GOF(FPROUND) && is4) goto none;
+ if (o == GOF(EMWARN) && is4) goto none;
+
+ /* Altivec registers */
+ if (o == GOF(VR0) && sz == 16) goto none;
+ if (o == GOF(VR1) && sz == 16) goto none;
+ if (o == GOF(VR2) && sz == 16) goto none;
+ if (o == GOF(VR3) && sz == 16) goto none;
+ if (o == GOF(VR4) && sz == 16) goto none;
+ if (o == GOF(VR5) && sz == 16) goto none;
+ if (o == GOF(VR6) && sz == 16) goto none;
+ if (o == GOF(VR7) && sz == 16) goto none;
+ if (o == GOF(VR8) && sz == 16) goto none;
+ if (o == GOF(VR9) && sz == 16) goto none;
+ if (o == GOF(VR10) && sz == 16) goto none;
+ if (o == GOF(VR11) && sz == 16) goto none;
+ if (o == GOF(VR12) && sz == 16) goto none;
+ if (o == GOF(VR13) && sz == 16) goto none;
+ if (o == GOF(VR14) && sz == 16) goto none;
+ if (o == GOF(VR15) && sz == 16) goto none;
+ if (o == GOF(VR16) && sz == 16) goto none;
+ if (o == GOF(VR17) && sz == 16) goto none;
+ if (o == GOF(VR18) && sz == 16) goto none;
+ if (o == GOF(VR19) && sz == 16) goto none;
+ if (o == GOF(VR20) && sz == 16) goto none;
+ if (o == GOF(VR21) && sz == 16) goto none;
+ if (o == GOF(VR22) && sz == 16) goto none;
+ if (o == GOF(VR23) && sz == 16) goto none;
+ if (o == GOF(VR24) && sz == 16) goto none;
+ if (o == GOF(VR25) && sz == 16) goto none;
+ if (o == GOF(VR26) && sz == 16) goto none;
+ if (o == GOF(VR27) && sz == 16) goto none;
+ if (o == GOF(VR28) && sz == 16) goto none;
+ if (o == GOF(VR29) && sz == 16) goto none;
+ if (o == GOF(VR30) && sz == 16) goto none;
+ if (o == GOF(VR31) && sz == 16) goto none;
+
+ VG_(printf)("get_IntRegInfo(ppc32):failing on (%d,%d)\n", o, sz);
+ tl_assert(0);
+# undef GOF
+
+ /* -------------------- ppc64 -------------------- */
+
+# elif defined(VGA_ppc64)
+
+# define GOF(_fieldname) \
+ (offsetof(VexGuestPPC64State,guest_##_fieldname))
+
+ Int o = offset;
+ Int sz = szB;
+ Bool is4 = sz == 4;
+ Bool is8 = sz == 8;
+
+ tl_assert(sz > 0);
+ tl_assert(host_is_big_endian());
+
+ /* Set default state to "does not intersect any int register". */
+ VG_(memset)( iii, 0, sizeof(*iii) );
+
+ /* Exact accesses to integer registers */
+ if (o == GOF(GPR0) && is8) goto exactly1;
+ if (o == GOF(GPR1) && is8) goto exactly1;
+ if (o == GOF(GPR2) && is8) goto exactly1;
+ if (o == GOF(GPR3) && is8) goto exactly1;
+ if (o == GOF(GPR4) && is8) goto exactly1;
+ if (o == GOF(GPR5) && is8) goto exactly1;
+ if (o == GOF(GPR6) && is8) goto exactly1;
+ if (o == GOF(GPR7) && is8) goto exactly1;
+ if (o == GOF(GPR8) && is8) goto exactly1;
+ if (o == GOF(GPR9) && is8) goto exactly1;
+ if (o == GOF(GPR10) && is8) goto exactly1;
+ if (o == GOF(GPR11) && is8) goto exactly1;
+ if (o == GOF(GPR12) && is8) goto exactly1;
+ if (o == GOF(GPR13) && is8) goto exactly1;
+ if (o == GOF(GPR14) && is8) goto exactly1;
+ if (o == GOF(GPR15) && is8) goto exactly1;
+ if (o == GOF(GPR16) && is8) goto exactly1;
+ if (o == GOF(GPR17) && is8) goto exactly1;
+ if (o == GOF(GPR18) && is8) goto exactly1;
+ if (o == GOF(GPR19) && is8) goto exactly1;
+ if (o == GOF(GPR20) && is8) goto exactly1;
+ if (o == GOF(GPR21) && is8) goto exactly1;
+ if (o == GOF(GPR22) && is8) goto exactly1;
+ if (o == GOF(GPR23) && is8) goto exactly1;
+ if (o == GOF(GPR24) && is8) goto exactly1;
+ if (o == GOF(GPR25) && is8) goto exactly1;
+ if (o == GOF(GPR26) && is8) goto exactly1;
+ if (o == GOF(GPR27) && is8) goto exactly1;
+ if (o == GOF(GPR28) && is8) goto exactly1;
+ if (o == GOF(GPR29) && is8) goto exactly1;
+ if (o == GOF(GPR30) && is8) goto exactly1;
+ if (o == GOF(GPR31) && is8) goto exactly1;
+
+ /* Misc integer reg and condition code accesses */
+ if (o == GOF(LR) && is8) goto exactly1;
+ if (o == GOF(CTR) && is8) goto exactly1;
+ if (o == GOF(CIA) && is8) goto none;
+ if (o == GOF(CIA_AT_SC) && is8) goto none;
+ if (o == GOF(RESVN) && is8) goto none;
+ if (o == GOF(TISTART) && is8) goto none;
+ if (o == GOF(TILEN) && is8) goto none;
+ if (o == GOF(REDIR_SP) && is8) goto none;
+
+ if (sz == 1) {
+ if (o == GOF(XER_SO)) goto none;
+ if (o == GOF(XER_OV)) goto none;
+ if (o == GOF(XER_CA)) goto none;
+ if (o == GOF(XER_BC)) goto none;
+ if (o == GOF(CR0_321)) goto none;
+ if (o == GOF(CR0_0)) goto none;
+ if (o == GOF(CR1_321)) goto none;
+ if (o == GOF(CR1_0)) goto none;
+ if (o == GOF(CR2_321)) goto none;
+ if (o == GOF(CR2_0)) goto none;
+ if (o == GOF(CR3_321)) goto none;
+ if (o == GOF(CR3_0)) goto none;
+ if (o == GOF(CR4_321)) goto none;
+ if (o == GOF(CR4_0)) goto none;
+ if (o == GOF(CR5_321)) goto none;
+ if (o == GOF(CR5_0)) goto none;
+ if (o == GOF(CR6_321)) goto none;
+ if (o == GOF(CR6_0)) goto none;
+ if (o == GOF(CR7_321)) goto none;
+ if (o == GOF(CR7_0)) goto none;
+ }
+
+ /* Exact accesses to FP registers */
+ if (o == GOF(FPR0) && is8) goto none;
+ if (o == GOF(FPR1) && is8) goto none;
+ if (o == GOF(FPR2) && is8) goto none;
+ if (o == GOF(FPR3) && is8) goto none;
+ if (o == GOF(FPR4) && is8) goto none;
+ if (o == GOF(FPR5) && is8) goto none;
+ if (o == GOF(FPR6) && is8) goto none;
+ if (o == GOF(FPR7) && is8) goto none;
+ if (o == GOF(FPR8) && is8) goto none;
+ if (o == GOF(FPR9) && is8) goto none;
+ if (o == GOF(FPR10) && is8) goto none;
+ if (o == GOF(FPR11) && is8) goto none;
+ if (o == GOF(FPR12) && is8) goto none;
+ if (o == GOF(FPR13) && is8) goto none;
+ if (o == GOF(FPR14) && is8) goto none;
+ if (o == GOF(FPR15) && is8) goto none;
+ if (o == GOF(FPR16) && is8) goto none;
+ if (o == GOF(FPR17) && is8) goto none;
+ if (o == GOF(FPR18) && is8) goto none;
+ if (o == GOF(FPR19) && is8) goto none;
+ if (o == GOF(FPR20) && is8) goto none;
+ if (o == GOF(FPR21) && is8) goto none;
+ if (o == GOF(FPR22) && is8) goto none;
+ if (o == GOF(FPR23) && is8) goto none;
+ if (o == GOF(FPR24) && is8) goto none;
+ if (o == GOF(FPR25) && is8) goto none;
+ if (o == GOF(FPR26) && is8) goto none;
+ if (o == GOF(FPR27) && is8) goto none;
+ if (o == GOF(FPR28) && is8) goto none;
+ if (o == GOF(FPR29) && is8) goto none;
+ if (o == GOF(FPR30) && is8) goto none;
+ if (o == GOF(FPR31) && is8) goto none;
+
+ /* FP admin related */
+ if (o == GOF(FPROUND) && is4) goto none;
+ if (o == GOF(EMWARN) && is4) goto none;
+
+ /* Altivec registers */
+ if (o == GOF(VR0) && sz == 16) goto none;
+ if (o == GOF(VR1) && sz == 16) goto none;
+ if (o == GOF(VR2) && sz == 16) goto none;
+ if (o == GOF(VR3) && sz == 16) goto none;
+ if (o == GOF(VR4) && sz == 16) goto none;
+ if (o == GOF(VR5) && sz == 16) goto none;
+ if (o == GOF(VR6) && sz == 16) goto none;
+ if (o == GOF(VR7) && sz == 16) goto none;
+ if (o == GOF(VR8) && sz == 16) goto none;
+ if (o == GOF(VR9) && sz == 16) goto none;
+ if (o == GOF(VR10) && sz == 16) goto none;
+ if (o == GOF(VR11) && sz == 16) goto none;
+ if (o == GOF(VR12) && sz == 16) goto none;
+ if (o == GOF(VR13) && sz == 16) goto none;
+ if (o == GOF(VR14) && sz == 16) goto none;
+ if (o == GOF(VR15) && sz == 16) goto none;
+ if (o == GOF(VR16) && sz == 16) goto none;
+ if (o == GOF(VR17) && sz == 16) goto none;
+ if (o == GOF(VR18) && sz == 16) goto none;
+ if (o == GOF(VR19) && sz == 16) goto none;
+ if (o == GOF(VR20) && sz == 16) goto none;
+ if (o == GOF(VR21) && sz == 16) goto none;
+ if (o == GOF(VR22) && sz == 16) goto none;
+ if (o == GOF(VR23) && sz == 16) goto none;
+ if (o == GOF(VR24) && sz == 16) goto none;
+ if (o == GOF(VR25) && sz == 16) goto none;
+ if (o == GOF(VR26) && sz == 16) goto none;
+ if (o == GOF(VR27) && sz == 16) goto none;
+ if (o == GOF(VR28) && sz == 16) goto none;
+ if (o == GOF(VR29) && sz == 16) goto none;
+ if (o == GOF(VR30) && sz == 16) goto none;
+ if (o == GOF(VR31) && sz == 16) goto none;
+
+ VG_(printf)("get_IntRegInfo(ppc64):failing on (%d,%d)\n", o, sz);
+ tl_assert(0);
+# undef GOF
+
+
# else
# error "FIXME: not implemented for this architecture"
# endif
@@ -1594,6 +1924,44 @@
return;
}
+
+/* Does 'arr' describe an indexed guest state section containing host
+ words, that we want to shadow? */
+
+static Bool is_integer_guest_reg_array ( IRRegArray* arr )
+{
+ /* -------------------- ppc32 -------------------- */
+# if defined(VGA_ppc32)
+ /* The redir stack. */
+ //if (arr->base == offsetof(VexGuestPPC64State,guest_REDIR_STACK[0])
+ // && arr->elemTy == Ity_I64
+ // && arr->nElems == VEX_GUEST_PPC64_REDIR_STACK_SIZE)
+ // return True;
+
+ VG_(printf)("is_integer_guest_reg_array(ppc32): unhandled: ");
+ ppIRRegArray(arr);
+ VG_(printf)("\n");
+ tl_assert(0);
+
+ /* -------------------- ppc64 -------------------- */
+# elif defined(VGA_ppc64)
+ /* The redir stack. */
+ if (arr->base == offsetof(VexGuestPPC64State,guest_REDIR_STACK[0])
+ && arr->elemTy == Ity_I64
+ && arr->nElems == VEX_GUEST_PPC64_REDIR_STACK_SIZE)
+ return True;
+
+ VG_(printf)("is_integer_guest_reg_array(ppc64): unhandled: ");
+ ppIRRegArray(arr);
+ VG_(printf)("\n");
+ tl_assert(0);
+
+# else
+# error "FIXME: not implemented for this architecture"
+# endif
+}
+
+
// END move this uglyness to pc_machine.c
/* returns True iff given slice exactly matches an int reg. Merely
@@ -1874,7 +2242,9 @@
case __NR_open:
case __NR_read:
case __NR_set_robust_list:
+# if defined(__NR_set_thread_area)
case __NR_set_thread_area:
+# endif
case __NR_set_tid_address:
# if defined(__NR_socket)
case __NR_socket:
@@ -1928,11 +2298,13 @@
# endif
case __NR_fdatasync:
case __NR_fstatfs:
+ case __NR_statfs64:
case __NR_fsync:
case __NR_ftruncate:
# if defined(__NR_ftruncate64)
case __NR_ftruncate64:
# endif
+ case __NR_getdents:
case __NR_getegid:
# if defined(__NR_getegid32)
case __NR_getegid32:
@@ -2005,6 +2377,7 @@
# if defined(__NR_shutdown)
case __NR_shutdown:
# endif
+ case __NR_sigreturn: /* not sure if we should see this or not */
case __NR_statfs:
case __NR_symlink:
case __NR_sysinfo:
@@ -2017,6 +2390,7 @@
case __NR_umask:
case __NR_unlink:
case __NR_utime:
+ case __NR_waitpid:
case __NR_wait4:
case __NR_writev:
VG_(set_syscall_return_shadows)( tid, (UWord)NONPTR, 0 );
@@ -2433,7 +2807,8 @@
*(ULong*)(m + 0) = ls8B;
*(ULong*)(m + 8) = ms8B;
} else {
- tl_assert(0);
+ *(ULong*)(m + 0) = ms8B;
+ *(ULong*)(m + 8) = ls8B;
}
nonptr_or_unknown_range(m, 16);
}
@@ -2456,7 +2831,10 @@
*(UInt*)(m + 8) = w2;
*(UInt*)(m + 12) = ms4B;
} else {
- tl_assert(0);
+ *(UInt*)(m + 0) = ms4B;
+ *(UInt*)(m + 4) = w2;
+ *(UInt*)(m + 8) = w1;
+ *(UInt*)(m + 12) = ls4B;
}
nonptr_or_unknown_range(m, 16);
}
@@ -2476,7 +2854,8 @@
*(UInt*)(m + 0) = ls4B;
*(UInt*)(m + 4) = ms4B;
} else {
- tl_assert(0);
+ *(UInt*)(m + 0) = ms4B;
+ *(UInt*)(m + 4) = ls4B;
}
nonptr_or_unknown_range(m, 8);
}
@@ -3505,15 +3884,21 @@
case Iop_MullS16: goto n32;
case Iop_MullU16: goto n32;
case Iop_PRemC3210F64: goto n32;
+ case Iop_DivU32: goto n32;
+ case Iop_DivS32: goto n32;
+ case Iop_V128to32: goto n32;
/* cases where result range is very limited and clearly cannot
be a pointer */
case Iop_1Uto32: goto n32;
+ case Iop_1Sto32: goto n32;
case Iop_8Uto32: goto n32;
case Iop_8Sto32: goto n32;
case Iop_Clz32: goto n32;
case Iop_Ctz32: goto n32;
case Iop_CmpF64: goto n32;
+ case Iop_CmpORD32S: goto n32;
+ case Iop_CmpORD32U: goto n32;
n32:
assign( 'I', pce, dstv, mkU32( (UInt)NONPTR ));
break;
@@ -3579,8 +3964,6 @@
case Iop_128to64: goto n_or_u_64;
case Iop_V128HIto64: goto n_or_u_64;
case Iop_V128to64: goto n_or_u_64;
- case Iop_MullS32: goto n_or_u_64;
- case Iop_MullU32: goto n_or_u_64;
n_or_u_64:
assign( 'I', pce, dstv,
mkexpr(
@@ -3607,6 +3990,11 @@
case Iop_DivModU64to32: goto n64;
case Iop_DivModS64to32: goto n64;
case Iop_F64toI64: goto n64;
+ case Iop_MullS32: goto n64;
+ case Iop_MullU32: goto n64;
+ case Iop_DivU64: goto n64;
+ case Iop_DivS64: goto n64;
+ case Iop_ReinterpF64asI64: goto n64;
/* cases where result range is very limited and clearly cannot
be a pointer */
@@ -3615,6 +4003,8 @@
case Iop_8Sto64: goto n64;
case Iop_Ctz64: goto n64;
case Iop_Clz64: goto n64;
+ case Iop_CmpORD64S: goto n64;
+ case Iop_CmpORD64U: goto n64;
/* 64-bit simd */
case Iop_Avg8Ux8: case Iop_Avg16Ux4:
case Iop_Max16Sx4: case Iop_Max8Ux8: case Iop_Min16Sx4:
@@ -3764,13 +4154,29 @@
stmt( 'C', pce, st );
break;
- case Ist_PutI:
+ case Ist_PutI: {
+ IRRegArray* descr = st->Ist.PutI.descr;
+pce->trace=True;
stmt( 'C', pce, st );
- if (st->Ist.PutI.descr->elemTy == pce->gWordTy)
- goto unhandled;
- /* If the element type isn't pointer-capable, we assume
- there's nothing to be done. */
+ tl_assert(descr && descr->elemTy);
+ if (is_integer_guest_reg_array(descr)) {
+ /* if this fails, is_integer_guest_reg_array is returning
+ bogus results */
+ tl_assert(descr->elemTy == pce->gWordTy);
+ stmt(
+ 'I', pce,
+ IRStmt_PutI(
+ mkIRRegArray(descr->base + pce->guest_state_sizeB,
+ descr->elemTy, descr->nElems),
+ st->Ist.PutI.ix,
+ st->Ist.PutI.bias,
+ schemeEw_Atom( pce, st->Ist.PutI.data)
+ )
+ );
+ }
+tl_assert(0);
break;
+ }
case Ist_Put: {
/* PUT(offset) = atom */
@@ -4112,9 +4518,23 @@
}
case Iex_GetI: {
+ IRRegArray* descr = e->Iex.GetI.descr;
stmt( 'C', pce, st );
- tl_assert(e_ty == e->Iex.GetI.descr->elemTy);
- if (isWord) goto unhandled;
+ tl_assert(descr && descr->elemTy);
+ if (is_integer_guest_reg_array(descr)) {
+ /* if this fails, is_integer_guest_reg_array is
+ returning bogus results */
+ tl_assert(isWord);
+ assign(
+ 'I', pce, dstv,
+ IRExpr_GetI(
+ mkIRRegArray(descr->base + pce->guest_state_sizeB,
+ descr->elemTy, descr->nElems),
+ e->Iex.GetI.ix,
+ e->Iex.GetI.bias
+ )
+ );
+ }
break;
}
@@ -4177,6 +4597,19 @@
break;
}
+ case Iex_Qop: {
+ stmt( 'C', pce, st );
+ tl_assert(isIRAtom(e->Iex.Qop.arg1));
+ tl_assert(isIRAtom(e->Iex.Qop.arg2));
+ tl_assert(isIRAtom(e->Iex.Qop.arg3));
+ tl_assert(isIRAtom(e->Iex.Qop.arg4));
+ if (isWord)
+ instrument_arithop( pce, dst, dstv, e->Iex.Qop.op,
+ e->Iex.Qop.arg1, e->Iex.Qop.arg2,
+ e->Iex.Qop.arg3, e->Iex.Qop.arg4 );
+ break;
+ }
+
default:
goto unhandled;
} /* switch (e->tag) */
Modified: branches/PTRCHECK/none/tests/ppc32/Makefile.am
===================================================================
--- branches/PTRCHECK/none/tests/ppc32/Makefile.am 2008-07-30 09:19:21 UTC (rev 8482)
+++ branches/PTRCHECK/none/tests/ppc32/Makefile.am 2008-07-30 10:00:25 UTC (rev 8483)
@@ -31,6 +31,6 @@
@FLAG_M32@
AM_CXXFLAGS = $(AM_CFLAGS) @FLAG_M32@
-jm_insns_CFLAGS = -Winline -Wall -O -mregnames -maltivec @FLAG_M32@
+jm_insns_CFLAGS = -Winline -Wall -O -g -mregnames -maltivec @FLAG_M32@
testVMX_CFLAGS = -O -g -Wall -maltivec -mabi=altivec -DALTIVEC \
-DGCC_COMPILER @FLAG_M32@
Modified: branches/PTRCHECK/none/tests/ppc64/Makefile.am
===================================================================
--- branches/PTRCHECK/none/tests/ppc64/Makefile.am 2008-07-30 09:19:21 UTC (rev 8482)
+++ branches/PTRCHECK/none/tests/ppc64/Makefile.am 2008-07-30 10:00:25 UTC (rev 8483)
@@ -18,4 +18,4 @@
@FLAG_M64@
AM_CXXFLAGS = $(AM_CFLAGS) @FLAG_M64@
-jm_insns_CFLAGS = -Winline -Wall -O -mregnames -maltivec @FLAG_M64@
+jm_insns_CFLAGS = -Winline -Wall -O -g -mregnames -maltivec @FLAG_M64@
|