Changeset 12638


Ignore:
Timestamp:
Aug 21, 2009, 6:45:21 PM (10 years ago)
Author:
gb
Message:

ppc-constants.s: define lisp_globals for ObjC 2 exception stuff.
ppc-spentry.s: first draft of ObjC 2.0 exception code for PPC64 Darwin.
(Need to repeat all of this for the variant of ffcall that returns multiple
registers, and hook up the DWARF exception stuff.)

Location:
trunk/source/lisp-kernel
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/lisp-kernel/ppc-constants.s

    r12128 r12638  
    190190         _node(image_name)              /* --image-name argument */
    191191         _node(BADfpscr_save_high)              /* high word of FP reg used to save FPSCR */
    192          _node(BADfpscr_save)              /* saved FPSCR */
     192         _node(unwind_resume)           /* _Unwind_Resume */
    193193         _node(batch_flag)              /* -b */
    194194         _node(host_platform)           /* for runtime platform-specific stuff */
     
    201201         _node(double_float_one)        /* high half of 1.0d0 */
    202202         _node(short_float_zero)        /* low half of 1.0d0 */
    203          _node(doh_head)                /* creole objects header */
     203         _node(objc2_end_catch)         /* objc_end_catch() */
    204204         _node(metering_info)           /* address of lisp_metering global */
    205205         _node(in_gc)                   /* non-zero when GC active */
     
    209209         _node(BAD_cs_overflow_limit)   /* limit for control-stack overflow check */
    210210         _node(kernel_name)             /* real executable name */
    211          _node(BAD_current_vs)          /* current value-stack area */
     211         _node(objc2_begin_catch)       /* objc_begin_catch */
    212212         _node(statically_linked)       /* non-zero if -static */
    213213         _node(heap_end)                /* end of lisp heap */
  • trunk/source/lisp-kernel/ppc-spentry.s

    r12294 r12638  
    15771577        __(mtxer rzero)
    15781578        __(mtctr rzero)
    1579         __(blr)
    1580 
     1579        __ifdef([PPC64])
     1580         __ifdef([DARWIN])
     1581          __(li imm3,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
     1582          __(ld imm4,tcr.flags(rcontext))
     1583          __(and. imm3,imm3,imm4)
     1584          __(bne cr0,0f)
     1585         __endif
     1586        __endif
     1587        __(blr)
     1588        __ifdef([PPC64])
     1589         __ifdef([DARWIN])
     15900:        /* Got here because TCR_FLAG_BIT_FOREIGN_EXCEPTION */
     1591          /* was set in tcr.flags.  Clear that bit. */
     1592          __(andc imm4,imm4,imm3)
     1593          __(std imm4,tcr.flags(rcontext))
     1594          /* Unboxed foreign exception (likely an NSException) in %imm0. */
     1595          /* Box it, then signal a lisp error. */
     1596          __(Misc_Alloc_Fixed(arg_z,imm1,macptr.size))
     1597          __(std imm0,macptr.address(arg_z))
     1598          __(li arg_y,XFOREIGNEXCEPTION)
     1599          __(set_nargs(2))
     1600          __(b _SPksignalerr)
     1601        /* Handle exceptions, for ObjC 2.0 */
     1602LocalLabelPrefix[]ffcallLandingPad:     
     1603          __(mr save1,r3)
     1604          __(cmpdi r4,1)
     1605          __(beq 1f)
     1606LocalLabelPrefix[]ffcallUnwindResume:
     1607          __(ref_global(r12,unwind_resume))
     1608          __(mtctr r12)
     1609          __(bctrl)
     1610LocalLabelPrefix[]ffcallUnwindResume_end:         
     16111:        __(mr r3,save1)
     1612LocalLabelPrefix[]ffcallBeginCatch:
     1613          __(ref_global(r12,objc2_begin_catch))
     1614          __(mtctr r12)
     1615          __(bctrl)
     1616LocalLabelPrefix[]ffcallBeginCatch_end:         
     1617          __(ld save1,0(r3)) /* indirection is necessary because we don't provide type info in lsda */
     1618LocalLabelPrefix[]ffcallEndCatch: 
     1619          __(ref_global(r12,objc2_end_catch))
     1620          __(mtctr r12)
     1621          __(bctrl)             
     1622LocalLabelPrefix[]ffcallEndCatch_end:     
     1623          __(ref_global(r12,get_tcr))
     1624          __(mtctr r12)
     1625          __(li imm0,1)       
     1626          __(bctrl)
     1627          __(ld imm2,tcr.flags(imm0))
     1628          __(ori imm2,imm2,1<<TCR_FLAG_BIT_FOREIGN_EXCEPTION)
     1629          __(std imm2,tcr.flags(imm0))
     1630          __(mr imm0,save1)
     1631          __(b LocalLabelPrefix[]ffcall_call_end)
     1632LocalLabelPrefix[]ffcall_end:   
     1633         __endif
     1634        __endif
    15811635
    15821636/* Just like poweropen_ffcall, only we save all argument(result)
Note: See TracChangeset for help on using the changeset viewer.