|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)entry.c 1.1 1/18/82"; ! 4: ! 5: /* ! 6: * routines to deal with the entry addresses of blocks ! 7: */ ! 8: ! 9: #include "defs.h" ! 10: #include "runtime.h" ! 11: #include "frame.rep" ! 12: #include "machine.h" ! 13: #include "process.h" ! 14: #include "sym.h" ! 15: #include "source.h" ! 16: #include "object.h" ! 17: #include "process/pxinfo.h" ! 18: #include "process/process.rep" ! 19: ! 20: /* ! 21: * Return the address of the beginning of the procedure/function ! 22: * associated with the given frame. ! 23: */ ! 24: ! 25: ADDRESS entry(frp) ! 26: register FRAME *frp; ! 27: { ! 28: return(frp->blockp - 2 - ENDOFF); ! 29: } ! 30: ! 31: /* ! 32: * Find the entry address of the caller of the current block. ! 33: * This is only called in connection with breakpoints. ! 34: * ! 35: * This routine assumes it is at the very beginning of the block. ! 36: */ ! 37: ! 38: ADDRESS caller_addr() ! 39: { ! 40: FRAME *frp; ! 41: ! 42: if ((frp = curframe()) == NIL) { ! 43: panic("caller_addr(main program)"); ! 44: } ! 45: frp = nextframe(frp); ! 46: if (frp == NIL) { ! 47: return(codeloc(program)); ! 48: } else { ! 49: return(entry(frp)); ! 50: } ! 51: } ! 52: ! 53: /* ! 54: * Find the return address of the current procedure/function. ! 55: * ! 56: * There are two special cases: ! 57: * ! 58: * we're right at the beginning of the main program ! 59: * we're right at the beginning of some procedure or function ! 60: * ! 61: * The first one is handled by returning the last instruction in ! 62: * the object code. In the second case, we get the return address ! 63: * directly from the process' stack. ! 64: */ ! 65: ! 66: ADDRESS return_addr() ! 67: { ! 68: ADDRESS addr; ! 69: FRAME *frp, frame; ! 70: ! 71: if (pc == codeloc(program)) { ! 72: addr = lastaddr(); ! 73: } else { ! 74: frp = curframe(); ! 75: if (frp == NIL) { ! 76: dread(&frame, (ADDRESS) process->sp, sizeof(FRAME)); ! 77: addr = frame.save_pc - ENDOFF; ! 78: } else { ! 79: addr = frp->save_pc; ! 80: } ! 81: } ! 82: return addr; ! 83: } ! 84: ! 85: /* ! 86: * Calculate the entry address for a procedure or function parameter, ! 87: * given the address of the descriptor. ! 88: */ ! 89: ! 90: ADDRESS fparamaddr(a) ! 91: ADDRESS a; ! 92: { ! 93: ADDRESS r; ! 94: ! 95: dread(&r, a, sizeof(r)); ! 96: return (r - ENDOFF); ! 97: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.