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