|
|
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.