/* Sun-$Revision: 23.8 $ */ /* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ # pragma interface // power pc frame layout: /* prev frame ---------------------------------------------- fp save area gpr save area cr save area locals dyn alloc ... arg area saved PC saved RTOC? saved SP ------------------------------------------------ next frame */ class frame; class Conversion; class Recompilation; class ppc_sp { friend class ::frame; protected: // coercions frame* as_frame() { return (frame*)this; } oop* as_oops() { return (oop*) this; } // link ppc_sp* link() { return *link_addr(); } void set_link(ppc_sp* x) { *link_addr() = x; } ppc_sp** link_addr() { return &((ppc_sp**) this)[saved_sp_offset]; } void adjust_link(int32 delta) { *(char**)link_addr() += delta; } // return addr char** return_addr_addr() { return &((char**) this)[saved_pc_offset]; } char* return_addr() { return *return_addr_addr(); } // the return PC of the code that was using THIS frame (SP was eq to this) void set_return_addr(char* x) { *return_addr_addr() = x; } oop* locals(); public: ppc_sp* push_new_sp( char* pc, fint size_in_oops, bool zapAlways = false); };