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