|
|
1.1 root 1: # include "mfile1.h"
2: # include "debug.h"
3:
4: /* File where debugging information is collected and printed out */
5:
6: /* This file is for pi */
7:
8: int gdebug, slineno;
9:
10: #define SYMTAB struct symtab
11:
12: /* (year-80) month day(in dec), as 4 hexits */
13:
14: static vernum = 0x4501;
15:
16: static char verstr[] = "vaxpcc2";
17:
18: static char strvalfmt[] = " .stabs \"%s\",0x%x,0,%d,%d\n";
19:
20: static char strsymfmt[] = " .stabs \"%s\",0x%x,0,%d,%s\n";
21:
22: static char nulvalfmt[] = " .stabn 0x%x,0,%d,%d\n";
23:
24: static char nulsymfmt[] = " .stabn 0x%x,0,%d,%s\n";
25:
26: static char dotfmt[] = " .stabd 0x%x,0,%d\n";
27:
28: static char labstr[16];
29:
30: static char *
31: maklab(val)
32: {
33: sprintx(labstr, LABFMT, val);
34: return labstr;
35: }
36:
37: static
38: wasused( p )
39: register SYMTAB *p;
40: {
41: register i;
42:
43: switch( p->sclass ) {
44: case STNAME:
45: case UNAME:
46: case ENAME:
47: for (i = dimtab[p->sizoff+1]; i >= 0 && dimtab[i] >= 0; i++)
48: if (wasused( &stab[dimtab[i]] ))
49: return 1;
50: return 0;
51: default:
52: return p->suse < 0;
53: }
54: }
55:
56: dbnargs( n ) /* number of argument bytes in call to a function */
57: {
58: if (gdebug)
59: printx(dotfmt, N_NARGS, n/SZCHAR );
60: }
61:
62: dbfunbeg( p ) /* beginning of a function */
63: SYMTAB *p;
64: {
65: dbfile(exname(p->sname));
66: printx(strsymfmt, p->sname, N_BFUN, lineno, exname(p->sname));
67: ppstab(p);
68: }
69:
70: dbfunarg( p ) /* called for each argument of a function */
71: SYMTAB *p;
72: {
73: ppstab( p ); /* we can pick up the reg later */
74: }
75:
76: dbfunret() /* return from a function */
77: {
78: if (gdebug) {
79: dbfile(NULL);
80: printx(dotfmt, N_RFUN, slineno ? slineno : lineno );
81: slineno = 0;
82: }
83: }
84:
85: dbfunend( lab ) /* end of a function */
86: {
87: register SYMTAB *p = &stab[curftn];
88:
89: printx("%s:", maklab(lab));
90: dbfile(labstr);
91: printx(strsymfmt, p->sname, N_EFUN, lineno, labstr);
92: }
93:
94: dblbrac() /* block level when a { is seen */
95: {
96: if (gdebug)
97: printx(dotfmt, N_LBRAC, blevel);
98: }
99:
100: dbrbrac() /* block level when a } is seen */
101: {
102: if (gdebug)
103: printx(dotfmt, N_RBRAC, blevel);
104: }
105:
106: aobeg() /* called before printing out the autos */
107: {
108: }
109:
110: aocode(p)
111: register struct symtab *p;
112: {
113: /* called when automatic p removed from stab */
114:
115: switch( p->sclass ) {
116: case REGISTER:
117: case AUTO:
118: case STATIC:
119: case EXTDEF:
120: case STNAME:
121: case UNAME:
122: case ENAME:
123: if(!ISFTN(p->stype) && (gdebug || wasused(p)))
124: ppstab( p );
125: return;
126: case EXTERN:
127: /* for now, do not report externs */
128: return;
129: }
130: }
131:
132: aoend()
133: {
134: }
135:
136: # ifndef OUTREGNO
137: # define OUTREGNO(p) ((p)->offset)
138: # endif
139:
140: #define BYTOFF(p) (((off = (p)->offset) < 0 ? -off : off)/SZCHAR)
141:
142: ppstab( p )
143: register SYMTAB *p;
144: {
145: /* write out .stabs for the symbol p */
146: register TWORD t;
147: register off, i;
148:
149: if( p->stype == TNULL ) return;
150:
151: if( p->sclass & FIELD ) {
152: printx(strvalfmt, p->sname, N_SFLD,
153: ((p->sclass&FLDSIZ)<<BTSHIFT)|p->stype, p->offset);
154: return;
155: }
156:
157: switch( p->sclass )
158: {
159: case AUTO:
160: printx(strvalfmt, p->sname, N_LSYM, p->stype, BYTOFF(p));
161: break;
162: case REGISTER:
163: printx(strvalfmt, p->sname, N_RSYM, p->stype, OUTREGNO(p));
164: break;
165: case PARAM:
166: printx(strvalfmt, p->sname, N_PSYM, p->stype, BYTOFF(p));
167: break;
168: case EXTERN:
169: case EXTDEF:
170: printx(strvalfmt, p->sname, N_GSYM, p->stype, 0);
171: break;
172: /*
173: case EXTDEF:
174: printx(strsymfmt, p->sname, N_GSYM, p->stype,
175: exname(p->sname));
176: break;
177: */
178: case STATIC:
179: if (ISFTN(p->stype))
180: printx(strvalfmt, p->sname, N_STFUN, p->stype, 0);
181: else
182: printx(strsymfmt, p->sname,
183: (p->sflags&SBSS) ? N_LCSYM : N_STSYM, p->stype,
184: p->slevel ? maklab(p->offset) : exname(p->sname));
185: break;
186: case STNAME:
187: case UNAME:
188: case ENAME:
189: printx(strvalfmt, p->sname, N_BSTR, p->stype, 0);
190: for (i = dimtab[p->sizoff+1]; i >= 0 && dimtab[i] >= 0; i++)
191: ppstab( &stab[dimtab[i]] );
192: printx(strvalfmt, p->sname, N_ESTR, p->stype,
193: dimtab[p->sizoff]/SZCHAR);
194: return;
195: case MOS:
196: case MOU:
197: printx(strvalfmt, p->sname, N_SSYM, p->stype, BYTOFF(p));
198: break;
199: case MOE:
200: printx(strvalfmt, p->sname, N_SSYM, p->stype, p->offset);
201: return;
202: case TYPEDEF: /* !? */
203: return;
204: default:
205: fprintf(stderr,"unexpected stab class %d: %s, type = 0x%04x\n",
206: p->sclass, p->sname, p->stype);
207: fflush(stderr);
208: return;
209: }
210: /* make another entry to describe structs, unions, enums */
211: switch( BTYPE(p->stype) ) {
212: case STRTY:
213: case UNIONTY:
214: case ENUMTY:
215: printx(strvalfmt, stab[dimtab[p->sizoff+3]].sname,
216: N_TYID, 0, 0);
217: }
218:
219: /* make other entries with the dimensions */
220: for( t=p->stype, i=p->dimoff; t&TMASK; t = DECREF(t) )
221: {
222: if( ISARY(t) ) printx(nulvalfmt, N_DIM, 0, dimtab[i++]);
223: }
224: }
225:
226: static char orgfile[100], curfile[100], prtfile[100];
227:
228: static int srcfilop = N_SO;
229:
230: static char *
231: makstr(ip)
232: register char *ip;
233: {
234: register c; register char *jp = prtfile;
235: do {
236: if ((c = *ip++) != '"')
237: *jp++ = c;
238: } while (c);
239: return prtfile;
240: }
241:
242: dbfile(pname)
243: char *pname;
244: {
245: int seg;
246: if (strcmp(curfile, ftitle) == 0)
247: return 0;
248: strcpy(curfile, ftitle);
249: seg = locctr(PROG);
250: if (pname == NULL)
251: printx("%s:", pname = maklab(getlab()));
252: printx(strsymfmt, makstr(curfile), srcfilop,
253: slineno ? slineno : lineno, pname);
254: slineno = 0;
255: if (srcfilop == N_SO) { /* first file */
256: printx(strvalfmt, verstr, N_VER, vernum, time(0));
257: strcpy(orgfile, ftitle);
258: srcfilop = N_SOL;
259: }
260: if (seg >= 0)
261: locctr(seg);
262: return 1;
263: }
264:
265: dbline()
266: {
267: int seg;
268: if (blevel && !dbfile(NULL) && gdebug) {
269: seg = locctr(PROG);
270: printx(dotfmt, N_SLINE, slineno ? slineno : lineno);
271: slineno = 0;
272: if (seg >= 0)
273: locctr(seg);
274: }
275: }
276:
277: ejsdb()
278: {
279: /* called at the end of the entire file */
280: register struct symtab *p;
281: extern Pflag, bbcnt;
282: int i;
283: if(Pflag) {
284: printx("\t.data\nlocprof:\t.long %d\n", bbcnt+4);
285: printx("\t.long 0\n\t.long L%db\n", bbcnt);
286: printx("\t.space %d\n", 4*bbcnt+4);
287: printx("L%db:\t.byte ", bbcnt);
288: for(i = 0; curfile[i]; i++)
289: printx("0x%x,", curfile[i]);
290: printx("0\n");
291: }
292: for( p = &stab[SYMTSZ]; --p>=stab; )
293: {
294: if( p->stype != TNULL && !ISFTN(p->stype) )
295: {
296: switch( p->sclass )
297: {
298: case EXTERN:
299: if( p->suse > 0 ) continue; /* unused */
300: case EXTDEF:
301: case STATIC:
302: case STNAME:
303: case UNAME:
304: case ENAME:
305: if (gdebug || wasused(p))
306: ppstab(p);
307: break;
308: }
309: }
310: }
311: printx(" .text\n");
312: printx("%s:", maklab(getlab()));
313: printx(strsymfmt, makstr(orgfile), N_ESO, lineno, labstr);
314: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.