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

Reply via email to