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[] = "@(#)address.c	5.1 (Berkeley) 6/6/85";
   9: #endif not lint
  10: 
  11: /*
  12:  * Some machine and runtime dependent manipulation of a symbol.
  13:  */
  14: 
  15: #include "defs.h"
  16: #include "runtime.h"
  17: #include "sym.h"
  18: #include "machine.h"
  19: #include "process.h"
  20: #include "object.h"
  21: #include "mappings.h"
  22: #include "sym/classes.h"
  23: #include "frame.rep"
  24: #include "sym/sym.rep"
  25: 
  26: /*
  27:  * Calculate the address of a symbol.
  28:  * If frame is not NIL, then it is the frame associated with the
  29:  * activation in which the symbol we're interested in is defined.
  30:  */
  31: 
  32: ADDRESS address(s, frame)
  33: register SYM *s;
  34: FRAME *frame;
  35: {
  36:     SYM *f;
  37:     FRAME *frp;
  38:     ADDRESS r, *dp, *disp;
  39:     short offs;
  40: 
  41:     f = s->func;
  42:     if (s->class == FVAR) {
  43:     offs = f->symvalue.offset;
  44:     } else {
  45:     offs = s->symvalue.offset;
  46:     }
  47:     if (f == program) {
  48:     r = (ADDRESS) dispval(MAINBLK) + offs;
  49:     } else if (f == curfunc && frame == NIL) {
  50:     dp = curdp();
  51:     disp = contents(dp);
  52:     r = (ADDRESS) disp + offs;
  53:     } else {
  54:     if (frame == NIL) {
  55:         frp = findframe(s->func);
  56:         if (frp == NIL) {
  57:         panic("address: findframe returned NIL");
  58:         }
  59:     } else {
  60:         frp = frame;
  61:     }
  62:     r = stkaddr(frp, s->blkno) + offs;
  63:     }
  64:     return r;
  65: }
  66: 
  67: /*
  68:  * The next three routines assume the procedure entry code is
  69:  *
  70:  *      f:  tra4    A
  71:  *          ...
  72:  *      A:  beg
  73:  *      B:  <code for first line>
  74:  *
  75:  * Pi gives f, we compute and store A with "findbeginning(f)",
  76:  * (retrieved by "codeloc(f)"), B is computed by "firstline(f)".
  77:  *
  78:  * The procedure "runtofirst" assumes you're at A and want to step to B.
  79:  * It should be changed to a nop if A is equal to B.
  80:  */
  81: 
  82: /*
  83:  * Find the beginning of a procedure or function.  This is a destructive
  84:  * routine, it changes the value associated with the procedure symbol.
  85:  * Should only be called once per symbol.
  86:  */
  87: 
  88: findbeginning(f)
  89: SYM *f;
  90: {
  91:     f->symvalue.funcv.codeloc = nextaddr(f->symvalue.funcv.codeloc, FALSE);
  92: }
  93: 
  94: /*
  95:  * Find the object code associated with the first line of a block.
  96:  */
  97: 
  98: ADDRESS firstline(f)
  99: SYM *f;
 100: {
 101:     ADDRESS addr;
 102: 
 103:     addr = codeloc(f);
 104:     while (linelookup(addr) == 0) {
 105:     if (isendofproc(addr)) {
 106:         return -1;
 107:     }
 108:     addr = nextaddr(addr, FALSE);
 109:     }
 110:     return addr;
 111: }
 112: 
 113: /*
 114:  * Catcher drops strike three ...
 115:  */
 116: 
 117: runtofirst()
 118: {
 119:     stepto(firstline(curfunc));
 120: }
 121: 
 122: /*
 123:  * Calculate the address of the last line in the program.
 124:  * This is assumed to be at the physical end.
 125:  */
 126: 
 127: ADDRESS lastaddr()
 128: {
 129:     if (objsize == 0) {
 130:     panic("lastaddr: objsize = 0!");
 131:     }
 132:     return(objsize - sizeof(short));
 133: }

Defined functions

address defined in line 32; never used
findbeginning defined in line 88; never used
firstline defined in line 98; used 2 times
lastaddr defined in line 127; used 1 times
runtofirst defined in line 117; 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: 973
Valid CSS Valid XHTML 1.0 Strict