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) 6/6/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: }

Defined functions

caller_addr defined in line 43; never used
fparamaddr defined in line 95; never used
return_addr defined in line 71; never used

Defined variables

sccsid defined in line 8; never used
Last modified: 1985-06-06
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 918
Valid CSS Valid XHTML 1.0 Strict