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