|
|
1.1 ! root 1: /* Copyright (c) 1982 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)readsym.c 1.3 5/19/82"; ! 4: ! 5: /* ! 6: * SYM representation dependent routines for reading in the ! 7: * symbol information from the object file. ! 8: */ ! 9: ! 10: #include "defs.h" ! 11: #include "sym.h" ! 12: #include "symtab.h" ! 13: #include "object.h" ! 14: #include "objfmt.h" ! 15: #include "process.h" ! 16: #include "sym/classes.h" ! 17: #include "objsym.rep" ! 18: #include "sym/sym.rep" ! 19: ! 20: LOCAL SYM *findblock(); ! 21: LOCAL SYM *enterblock(); ! 22: LOCAL SYM *findfunc(); ! 23: ! 24: /* ! 25: * Read the information on a symbol from the object file, return a ! 26: * SYM with the info. ! 27: */ ! 28: ! 29: SYM *readsym(fp) ! 30: FILE *fp; ! 31: { ! 32: register SYM *s, *t; ! 33: SYM cursym; ! 34: static SYM *func; ! 35: ! 36: t = &cursym; ! 37: getsym(fp, t); ! 38: if (isblock(t)) { ! 39: # if (isvaxpx) ! 40: if (t->class == PROG) { ! 41: t->symvalue.funcv.codeloc = HEADER_BYTES; ! 42: } ! 43: # endif ! 44: s = findblock(t); ! 45: if (s->class == PROG) { ! 46: program = s; ! 47: s->func = NIL; ! 48: } else { ! 49: s->func = func; ! 50: } ! 51: } else if (t->class == BADUSE) { ! 52: func = enterblock(t); ! 53: return(func); ! 54: } else { ! 55: s = st_insert(symtab, t->symbol); ! 56: t->next_sym = s->next_sym; ! 57: *s = *t; ! 58: if (s->class == FVAR) { ! 59: s->func = findfunc(s); ! 60: } else { ! 61: s->func = func; ! 62: } ! 63: } ! 64: ! 65: /* ! 66: * This glitch is pi's fault. It gives string constants ! 67: * a type whose symbol number is -1. For what reason, I know not. ! 68: */ ! 69: if (s->type == (SYM *) -1) { ! 70: s->type = NIL; ! 71: } else { ! 72: chkpatch(&s->type); ! 73: } ! 74: chkpatch(&s->chain); ! 75: if (s->class == RECORD || s->class == VARNT) { ! 76: chkpatch(&s->symvalue.varnt.vtorec); ! 77: chkpatch(&s->symvalue.varnt.vtag); ! 78: } ! 79: if (isblock(s)) { ! 80: fixparams(s); ! 81: } ! 82: return(s); ! 83: } ! 84: ! 85: /* ! 86: * Read the SYM information in the object file. ! 87: */ ! 88: ! 89: LOCAL getsym(fp, t) ! 90: FILE *fp; ! 91: SYM *t; ! 92: { ! 93: OBJSYM osym; ! 94: register OBJSYM *o; ! 95: ! 96: get(fp, osym); ! 97: o = &osym; ! 98: if (o->strindex == 0) { ! 99: t->symbol = NIL; ! 100: } else { ! 101: t->symbol = &stringtab[o->strindex]; ! 102: } ! 103: t->class = o->oclass; ! 104: t->blkno = o->oblkno; ! 105: t->type = (SYM *) o->typno; ! 106: t->chain = (SYM *) o->chno; ! 107: t->symvalue.rangev.lower = o->osymvalue.orangev.lower; ! 108: t->symvalue.rangev.upper = o->osymvalue.orangev.upper; ! 109: if (t->class == RECORD || t->class == VARNT) { ! 110: t->symvalue.varnt.vtorec = (SYM *) o->osymvalue.ovarnt.vtorecno; ! 111: t->symvalue.varnt.vtag = (SYM *) o->osymvalue.ovarnt.vtagno; ! 112: } ! 113: } ! 114: ! 115: /* ! 116: * The symbol read in is a real block so we find it's entry, ! 117: * copy the information, and return a pointer to it. ! 118: */ ! 119: ! 120: LOCAL SYM *findblock(t) ! 121: SYM *t; ! 122: { ! 123: SYM *s; ! 124: ! 125: s = st_lookup(symtab, t->symbol); ! 126: while (s != NIL && ! 127: (s->class != FUNC || s->type != NIL || ! 128: strcmp(s->symbol, t->symbol) != 0)) { ! 129: s = s->next_sym; ! 130: } ! 131: if (s == NIL) { ! 132: panic("can't find %s", t->symbol); ! 133: } ! 134: t->next_sym = s->next_sym; ! 135: *s = *t; ! 136: s->symvalue.funcv.codeloc -= HEADER_BYTES; ! 137: findbeginning(s); ! 138: newfunc(s); ! 139: return(s); ! 140: } ! 141: ! 142: /* ! 143: * Found a "fake" block symbol, enter it. ! 144: */ ! 145: ! 146: LOCAL SYM *enterblock(t) ! 147: SYM *t; ! 148: { ! 149: SYM *s; ! 150: ! 151: s = st_insert(symtab, t->symbol); ! 152: t->next_sym = s->next_sym; ! 153: *s = *t; ! 154: backpatch(); ! 155: s->class = FUNC; ! 156: s->type = NIL; ! 157: return(s); ! 158: } ! 159: ! 160: /* ! 161: * This kludge is brought to you by the pi symbol table. ! 162: * Parameters appear with the function in which they reside, ! 163: * messing up the way the "func" field is calculated. ! 164: * ! 165: * The assumption here is that parameters appear before the function. ! 166: */ ! 167: ! 168: LOCAL fixparams(f) ! 169: SYM *f; ! 170: { ! 171: register SYM *s; ! 172: ! 173: for (s = f->chain; s != NIL; s = s->chain) { ! 174: s->func = f; ! 175: } ! 176: } ! 177: ! 178: /* ! 179: * Find the function entry associated with a function variable. ! 180: * Function variables come out a bit strangely in the symbol table; ! 181: * if we didn't do this here, a function variable would have a func ! 182: * field that referred to the outer block. ! 183: */ ! 184: ! 185: #define notfunc(f, fv) (\ ! 186: f->class != FUNC || f->type != NIL || \ ! 187: strcmp(f->symbol, fv->symbol) != 0 \ ! 188: ) ! 189: ! 190: LOCAL SYM *findfunc(fv) ! 191: SYM *fv; ! 192: { ! 193: register SYM *t; ! 194: ! 195: t = st_lookup(symtab, fv->symbol); ! 196: while (t != NIL && notfunc(t, fv)) { ! 197: t = t->next_sym; ! 198: } ! 199: if (t == NIL) { ! 200: panic("no func for funcvar %s", fv->symbol); ! 201: } ! 202: return(t); ! 203: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.