|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)functab.c 1.1 1/18/82"; ! 4: ! 5: /* ! 6: * This file contains the implementation of a table for going ! 7: * from object addresses to the functions in which they belong. ! 8: */ ! 9: ! 10: #include "defs.h" ! 11: #include "mappings.h" ! 12: #include "sym.h" ! 13: ! 14: #define MAXNFUNCS 1001 /* maximum number of functions allowed */ ! 15: ! 16: LOCAL SYM *functab[MAXNFUNCS]; ! 17: LOCAL int nfuncs; ! 18: ! 19: /* ! 20: * Insert a new function into the table. ! 21: * The table is ordered by object address. ! 22: */ ! 23: ! 24: newfunc(f) ! 25: SYM *f; ! 26: { ! 27: register int i, j; ! 28: ADDRESS a; ! 29: ! 30: if (nfuncs >= MAXNFUNCS) { ! 31: panic("too many procedures/functions"); ! 32: } ! 33: a = codeloc(f); ! 34: i = 0; ! 35: while (i < nfuncs && codeloc(functab[i]) < a) { ! 36: i++; ! 37: } ! 38: for (j = nfuncs; j > i; j--) { ! 39: functab[j] = functab[j - 1]; ! 40: } ! 41: functab[i] = f; ! 42: nfuncs++; ! 43: } ! 44: ! 45: /* ! 46: * Return the function that begins at the given address. ! 47: */ ! 48: ! 49: SYM *whatblock(addr) ! 50: ADDRESS addr; ! 51: { ! 52: register SYM *p; ! 53: register int i, j, k; ! 54: ADDRESS a; ! 55: ! 56: i = 0; ! 57: j = nfuncs - 1; ! 58: if (addr < codeloc(functab[i])) { ! 59: return program; ! 60: } else if (addr == codeloc(functab[i])) { ! 61: return functab[i]; ! 62: } else if (addr >= codeloc(functab[j])) { ! 63: return functab[j]; ! 64: } ! 65: while (i <= j) { ! 66: k = (i + j) / 2; ! 67: a = codeloc(functab[k]); ! 68: if (a == addr) { ! 69: return functab[k]; ! 70: } else if (addr > a) { ! 71: i = k+1; ! 72: } else { ! 73: j = k-1; ! 74: } ! 75: } ! 76: if (addr > codeloc(functab[i])) { ! 77: return functab[i]; ! 78: } else { ! 79: return functab[i-1]; ! 80: } ! 81: /* NOTREACHED */ ! 82: } ! 83: ! 84: /* ! 85: * Clear out the functab, used when re-reading the object information. ! 86: */ ! 87: ! 88: clrfunctab() ! 89: { ! 90: nfuncs = 0; ! 91: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.