1 /* Copyright (c) 1982 Regents of the University of California */ 2 3 static char sccsid[] = "@(#)entry.c 1.1 01/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 } 98