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