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