rendered paste bodygaim_network_set_upnp_port_mapping_cb(gboolean success, gpointer data)
// Crazy gcc optimization here to branch based on success, methinks
0x639ccf8 <+8>: mflr r0
0x639ccfc <+12>: bcl- 20,4*cr7+so,0x639cd00 <+16>
0x639cd00 <+16>: stw r0,8(r1)
0x639cd04 <+20>: mr r30,r4 // $r30 = data = listen_data
0x639cd08 <+24>: stwu r1,-80(r1)
0x639cd0c <+28>: mflr r31
0x639cd10 <+32>: bne+ 0x639cd84 <+148>
// Not successful... print debug info
0x639cd14 <+36>: addis r3,r31,20
0x639cd18 <+40>: addis r4,r31,20
0x639cd1c <+44>: addi r3,r3,-18832
0x639cd20 <+48>: addi r4,r4,-18824
0x639cd24 <+52>: bl 0x63a4ef0 <gaim_debug_info>
// if(listen_data->retry) {
0x639cd28 <+56>: lwz r0,8(r30) // listen_data->retry
0x639cd2c <+60>: cmpwi cr7,r0,0
0x639cd30 <+64>: beq+ cr7,0x639cde0 <+240>
// true... gaim_network_get_port_from_fd()
0x639cd34 <+68>: stw r29,12(r30)
0x639cd38 <+72>: stw r29,8(r30)
0x639cd3c <+76>: lwz r3,0(r30)
0x639cd40 <+80>: bl 0x639d1b4 <gaim_network_get_port_from_fd>
// Which socket type?
0x639cd44 <+84>: lwz r0,4(r30) // listen_data->socket_type
0x639cd48 <+88>: cmpwi cr7,r0,1
0x639cd4c <+92>: bne+ cr7,0x639cd5c <+108>
// TCP
0x639cd50 <+96>: addis r4,r31,20
0x639cd54 <+100>: addi r4,r4,-18792
0x639cd58 <+104>: b 0x639cd64 <+116>
// UDP
0x639cd5c <+108>: addis r4,r31,20
0x639cd60 <+112>: addi r4,r4,-18788
// Call gaim_upnp_remorve_port_mapping with stuff from above
0x639cd64 <+116>: lwz r0,88(r1)
0x639cd68 <+120>: addis r5,r31,38
0x639cd6c <+124>: addi r1,r1,80
0x639cd70 <+128>: lwz r5,9724(r5)
0x639cd74 <+132>: mr r6,r30
0x639cd78 <+136>: lmw r28,-16(r1)
0x639cd7c <+140>: mtlr r0
0x639cd80 <+144>: b 0x6383318 <gaim_upnp_remove_port_mapping>
// since the following statement is 'return', gcc optimizes with a non-linking branch
// } else if... {
0x639cd84 <+148>: lwz r0,12(r4)
0x639cd88 <+152>: cmpwi cr7,r0,0
0x639cd8c <+156>: bne+ cr7,0x639cde0 <+240>
0x639cd90 <+160>: li r0,1
0x639cd94 <+164>: lwz r3,0(r4)
0x639cd98 <+168>: stw r0,12(r4)
0x639cd9c <+172>: bl 0x639d1b4 <gaim_network_get_port_from_fd>
0x639cda0 <+176>: lwz r0,4(r30)
0x639cda4 <+180>: cmpwi cr7,r0,1
0x639cda8 <+184>: bne+ cr7,0x639cdb8 <+200>
0x639cdac <+188>: addis r4,r31,20
0x639cdb0 <+192>: addi r4,r4,-18792
0x639cdb4 <+196>: b 0x639cdc0 <+208>
0x639cdb8 <+200>: addis r4,r31,20
0x639cdbc <+204>: addi r4,r4,-18788
0x639cdc0 <+208>: lwz r0,88(r1)
0x639cdc4 <+212>: addis r5,r31,38
0x639cdc8 <+216>: addi r1,r1,80
0x639cdcc <+220>: lwz r5,9724(r5)
0x639cdd0 <+224>: mr r6,r30
0x639cdd4 <+228>: lmw r28,-16(r1)
0x639cdd8 <+232>: mtlr r0
0x639cddc <+236>: b 0x63831bc <gaim_upnp_set_port_mapping>
// Function is done
0x639cde0 <+240>: lwz r12,16(r30) // listen_data->cb
0x639cde4 <+244>: cmpwi cr7,r12,0 // if it's null,
0x639cde8 <+248>: beq+ cr7,0x639cdfc <+268>
/* Crash in this block...
cb is invalid, so it tries to branch and fails */
0x639cdec <+252>: lwz r3,0(r30)
0x639cdf0 <+256>: mtctr r12
0x639cdf4 <+260>: lwz r4,20(r30)
0x639cdf8 <+264>: bctrl
// function is done!
0x639cdfc <+268>: lwz r0,88(r1)
0x639ce00 <+272>: addi r1,r1,80
0x639ce04 <+276>: mr r3,r30
0x639ce08 <+280>: lmw r28,-16(r1)
0x639ce0c <+284>: mtlr r0
0x639ce10 <+288>: b 0x639d1b0 <gaim_network_listen_cancel>