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