I have a newer version of GDB installed in my account on the gcc110 that has hw watchpoint working.
We can continue to add debugging capabilities to the PPC64 backend, but it is fairly clear how the ops correspond to assembler instructions. The overwriting occurs in the first call to setinteriorfield: ; function descriptor data 0xfffb74e0d18: fnmadd. f31,f31,f31,f31 0xfffb74e0d1c: .long 0xfff 0xfffb74e0d20: sthu r26,7712(r14) 0xfffb74e0d24: .long 0x0 0xfffb74e0d28: .long 0x0 0xfffb74e0d2c: .long 0x0 0xfffb74e0d30: .long 0x0 ; p13 = getfield_gc(ConstPtr(ptr12), descr=<FieldP pypy.jit.backend.ppc.test.test_zrpy_gc.Glob.inst_a 8>) 0xfffb74e0d34: lis r30,4131 0xfffb74e0d38: ori r30,r30,11712 0xfffb74e0d3c: ld r30,8(r30) ; guard_nonnull(p13, descr=<Guard3>) [i0, p13, p11, p10, p9, p8, p7, p6, p5, p4, p3, p2, p1] 0xfffb74e0d40: cmpdi r30,0 0xfffb74e0d44: beq 0xfffb74e1f60 ; i15 = int_add(i0, 0) 0xfffb74e0d48: addi r29,r3,0 ; i17 = int_add(i15, 1) 0xfffb74e0d4c: addi r29,r29,1 ; p18 = new(, descr=<SizeDescr 16>) ; malloc_cond (save r3, r4) 0xfffb74e0d50: std r3,-8(r31) 0xfffb74e0d54: std r4,-16(r31) ; load nursery_free_adr 0xfffb74e0d58: lis r3,4131 0xfffb74e0d5c: ori r3,r3,2864 0xfffb74e0d60: ld r3,0(r3) ; add size 0xfffb74e0d64: addi r4,r3,584 ; load nursery_top_adr 0xfffb74e0d68: lis r0,4131 0xfffb74e0d6c: ori r0,r0,2888 0xfffb74e0d70: ldx r0,0,r0 ; compare 0xfffb74e0d74: cmpld r4,r0 0xfffb74e0d78: ble 0xfffb74e0da0 ; _write_fail_index 0xfffb74e0d7c: li r0,2 0xfffb74e0d80: std r0,464(r31) ; malloc_slowpath 0xfffb74e0d84: lis r0,0 0xfffb74e0d88: ori r0,r0,4095 0xfffb74e0d8c: rldicr r0,r0,32,31 0xfffb74e0d90: oris r0,r0,46926 0xfffb74e0d94: ori r0,r0,1504 0xfffb74e0d98: mtctr r0 0xfffb74e0d9c: bctrl ; write to nursery_free_adr 0xfffb74e0da0: lis r0,4131 0xfffb74e0da4: ori r0,r0,2864 0xfffb74e0da8: stdx r4,0,r0 ; store typeid 0xfffb74e0dac: li r4,760 0xfffb74e0db0: std r4,0(r3) ; setfield_gc(p18, i17, descr=<FieldS S.i 8>) 0xfffb74e0db4: std r29,8(r3) ; cond_call_gc_wb 0xfffb74e0db8: lbz r0,3(r30) 0xfffb74e0dbc: andi. r0,r0,1 0xfffb74e0dc0: beq 0xfffb74e0de4 0xfffb74e0dc4: mr r3,r30 0xfffb74e0dc8: lis r0,0 0xfffb74e0dcc: ori r0,r0,4095 0xfffb74e0dd0: rldicr r0,r0,32,31 0xfffb74e0dd4: oris r0,r0,46926 0xfffb74e0dd8: nop 0xfffb74e0ddc: mtctr r0 0xfffb74e0de0: bctrl ; setinteriorfield_gc(p13, 0, p18, descr=<InteriorFieldDescr <FieldP entry.x 0>>) 0xfffb74e0de4: li r29,0 0xfffb74e0de8: mulli r0,r29,24 0xfffb74e0dec: addic r0,r0,16 0xfffb74e0df0: stdx r3,r30,r0 ; reload i0 0xfffb74e0df4: ld r29,-8(r31) ; i21 = int_add(i0, 0) 0xfffb74e0df8: addi r4,r29,0 ; i23 = int_add(i21, 2) 0xfffb74e0dfc: addi r4,r4,2 ; p24 = new(, descr=<SizeDescr 16>) 0xfffb74e0e00: addi r3,r3,16 ; store typeid 0xfffb74e0e04: li r28,760 0xfffb74e0e08: std r28,0(r3) ; XXX writes typeid @ offset 0 ; setfield_gc(p24, i23, descr=<FieldS S.i 8>) => 0xfffb74e0e0c: std r4,8(r3) ; write field @ offset 8 ; cond_call_gc_wb 0xfffb74e0e10: lbz r0,3(r30) 0xfffb74e0e14: andi. r0,r0,1 0xfffb74e0e18: beq 0xfffb74e0e3c 0xfffb74e0e1c: mr r3,r30 0xfffb74e0e20: lis r0,0 0xfffb74e0e24: ori r0,r0,4095 0xfffb74e0e28: rldicr r0,r0,32,31 0xfffb74e0e2c: oris r0,r0,46926 0xfffb74e0e30: nop 0xfffb74e0e34: mtctr r0 0xfffb74e0e38: bctrl ; setinteriorfield_gc(p13, 0, p24, descr=<InteriorFieldDescr <FieldP entry.y 8>>) 0xfffb74e0e3c: li r4,0 0xfffb74e0e40: mulli r0,r4,24 0xfffb74e0e44: addic r0,r0,24 0xfffb74e0e48: stdx r3,r30,r0 ; store pointer to object into interior field ... ; setinteriorfield_gc(p13, 9, p173, descr=<InteriorFieldDescr <FieldP entry.z 16>>) 0xfffb74e176c: li r4,9 0xfffb74e1770: mulli r0,r4,24 0xfffb74e1774: addic r0,r0,32 0xfffb74e1778: stdx r3,r30,r0 ; p175 = getinteriorfield_gc(p13, 0, descr=<InteriorFieldDescr <FieldP entry.x 0>>) 0xfffb74e177c: li r4,0 0xfffb74e1780: mulli r0,r4,24 0xfffb74e1784: addic r0,r0,16 0xfffb74e1788: ldx r4,r30,r0 ; i176 = getfield_gc(p175, descr=<FieldS S.i 8>) => 0xfffb74e178c: ld r4,8(r4) ; XXX uses typeid as address ; i178 = int_add(i0, 0) 0xfffb74e1790: addi r28,r29,0 ; i180 = int_add(i178, 1) 0xfffb74e1794: addi r28,r28,1 ; i181 = int_eq(i176, i180) 0xfffb74e1798: cmpd r4,r28 0xfffb74e179c: crmove lt,eq 0xfffb74e17a0: mfcr r28 0xfffb74e17a4: rlwinm r28,r28,1,31,31 ; guard_true(i181, descr=<Guard4>) [i0, p13, p11, p10, p9, p8, p7, p6, p5, p4, p3, p2, p1] 0xfffb74e17a8: cmpdi r28,0 0xfffb74e17ac: beq 0xfffb74e1f94 ; p182 = getinteriorfield_gc(p13, 0, descr=<InteriorFieldDescr <FieldP entry.y 8>>) 0xfffb74e17b0: li r28,0 0xfffb74e17b4: mulli r0,r28,24 0xfffb74e17b8: addic r0,r0,24 0xfffb74e17bc: ldx r28,r30,r0 ; i183 = getfield_gc(p182, descr=<FieldS S.i 8>) 0xfffb74e17c0: ld r28,8(r28) It looks ilke something is conflicting with object allocation because the typeid of the second object created later is being loaded as the field from the first object. - David _______________________________________________ pypy-dev mailing list pypy-dev@python.org http://mail.python.org/mailman/listinfo/pypy-dev