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