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