|
|
1.1 root 1: /*
2: * Symbolic debugging info interface.
3: *
4: * Here we generate pseudo-ops that cause the assembler to put
5: * symbolic debugging information into the object file.
6: */
7: #include "cpass1.h"
8: #include <sys/types.h>
9: #include <a.out.h>
10: #include "stab.h"
11:
12: static int inastruct;
13: static int inafunc;
14: static int inbegfunc;
15: static int inaparam;
16: static char strvalfmt[] = " .stabs \"%s\",0x%x,0,%d,%d\n";
17: static char strsymfmt[] = " .stabs \"%s\",0x%x,0,%d,%s\n";
18: static char nulvalfmt[] = " .stabn 0x%x,0,%d,%d\n";
19: static char nulsymfmt[] = " .stabn 0x%x,0,%d,%s\n";
20: static char dotfmt[] = " .stabd 0x%x,0,%d\n";
21:
22: extern int gdebug;
23: extern char *strcpy();
24: int stabLCSYM;
25:
26: /*
27: * Old flag, not used anymore.
28: */
29: int oldway = 0;
30:
31: /*
32: * Generate information for a newly-defined structure.
33: */
34: outstruct(szindex, paramindex)
35: int szindex, paramindex;
36: {
37: register struct symtab *p;
38: register int i;
39:
40: if (!gdebug)
41: return;
42: inastruct = 1;
43: p = STP(dimtab[szindex + 3]);
44: printf(strvalfmt, p->sname, N_BSTR, p->stype, 0);
45: outstab(STP(dimtab[szindex + 3]));
46: for( i = dimtab[szindex + 1]; dimtab[i] > 0; i++)
47: outstab(STP(dimtab[i]));
48: printf(strvalfmt, p->sname, N_ESTR, p->stype, dimtab[p->sizoff]/SZCHAR);
49: inastruct = 0;
50: }
51:
52: psline(lineno)
53: int lineno;
54: {
55: if (gdebug && !dbfile(NULL))
56: printf(dotfmt, N_SLINE, lineno);
57: }
58:
59: plcstab(level)
60: int level;
61: {
62: if (gdebug)
63: printf(dotfmt, N_LBRAC, level);
64: }
65:
66: prcstab(level)
67: int level;
68: {
69: if (gdebug)
70: printf(dotfmt, N_RBRAC, level);
71: }
72:
73: pfstab(sname)
74: char *sname;
75: {
76: register struct symtab *p;
77:
78: p = STP(lookup(sname, 0));
79: inafunc = 1;
80: inbegfunc = 1;
81: /* dbfile(exname(p->sname));*/
82: locctr(PROG);
83: printf(strsymfmt, p->sname, N_BFUN, lineno, exname(p->sname));
84: outstab(p);
85: inbegfunc = 0;
86: }
87:
88: #define BYTOFF(p) (((off = (p)->offset) < 0 ? -off : off)/SZCHAR)
89:
90: /*
91: * Generate debugging info for a parameter.
92: * The offset isn't known when it is first entered into the symbol table
93: * since the types are read later.
94: */
95: fixarg(p)
96: struct symtab *p;
97: {
98: inaparam = 1;
99: outstab(p);
100: inaparam = 0;
101: }
102:
103: static char labstr[16];
104:
105: static char *
106: maklab(val)
107: {
108: sprintf(labstr, "L%d", val);
109: return labstr;
110: }
111:
112: # ifndef OUTREGNO
113: # define OUTREGNO(p) ((p)->offset)
114: # endif
115:
116: /*
117: * Generate debugging info for a given symbol.
118: */
119: outstab(p)
120: register struct symtab *p; {
121:
122: register TWORD t;
123: register off, i;
124:
125: if (ISFTN(p->stype) && !inbegfunc)
126: return;
127: if( p->sclass > FIELD ) {
128: if (!inastruct)
129: return;
130: printf(strvalfmt, p->sname, N_SFLD,
131: ((p->sclass - FIELD)<<BTSHIFT)|p->stype, p->offset);
132: return;
133: }
134:
135: switch( p->sclass )
136: {
137: case AUTO:
138: printf(strvalfmt, p->sname, N_LSYM, p->stype, BYTOFF(p));
139: break;
140: case REGISTER:
141: if (!inafunc)
142: return;
143: if (inaparam) {
144: p->sclass = PARAM;
145: outstab(p);
146: p->sclass = REGISTER;
147: }
148: printf(strvalfmt, p->sname, N_RSYM, p->stype, OUTREGNO(p));
149: break;
150: case PARAM:
151: if (!inaparam)
152: return;
153: printf(strvalfmt, p->sname, N_PSYM, p->stype, argoff/SZCHAR);
154: break;
155: case EXTERN:
156: case EXTDEF:
157: printf(strvalfmt, p->sname, N_GSYM, p->stype, 0);
158: break;
159: case STATIC:
160: if (ISFTN(p->stype))
161: printf(strvalfmt, p->sname, N_STFUN, p->stype, 0);
162: else
163: printf(strsymfmt, p->sname,
164: stabLCSYM ? N_LCSYM : N_STSYM, p->stype,
165: p->slevel ? maklab(p->offset) : exname(p->sname));
166: break;
167: case MOS:
168: case MOU:
169: if (!inastruct)
170: return;
171: printf(strvalfmt, p->sname, N_SSYM, p->stype, BYTOFF(p));
172: break;
173: case MOE:
174: if (!inastruct)
175: return;
176: printf(strvalfmt, p->sname, N_SSYM, p->stype, p->offset);
177: return;
178: default:
179: return;
180: }
181: /* make another entry to describe structs, unions, enums */
182: switch( BTYPE(p->stype) ) {
183: case STRTY:
184: case UNIONTY:
185: case ENUMTY:
186: printf(strvalfmt, STP(dimtab[p->sizoff+3])->sname,
187: N_TYID, 0, 0);
188: }
189:
190: /* make other entries with the dimensions */
191: for( t=p->stype, i=p->dimoff; t&TMASK; t = DECREF(t) )
192: {
193: if( ISARY(t) ) printf(nulvalfmt, N_DIM, 0, dimtab[i++]);
194: }
195:
196: }
197:
198: dbfunend( lab ) /* end of a function */
199: {
200: inafunc = 0;
201: printf(dotfmt, N_EFUN, lineno);
202: }
203:
204: beg_file() /* only used in cgram.y */
205: {
206: dbfile(NULL);
207: }
208:
209: static char orgfile[100], currfile[100], prtfile[100];
210:
211: static int srcfilop = N_SO;
212:
213: static char *
214: makstr(ip)
215: register char *ip;
216: {
217: register c; register char *jp = prtfile;
218: do {
219: if ((c = *ip++) != '"')
220: *jp++ = c;
221: } while (c);
222: return prtfile;
223: }
224:
225: dbfile(pname)
226: char *pname;
227: {
228: int seg;
229: if (!strcmp(currfile, ftitle))
230: return 0;
231: strcpy(currfile, ftitle);
232: seg = locctr(PROG);
233: if (pname == NULL)
234: printf("%s:", pname = maklab(getlab()));
235: printf(strsymfmt, makstr(currfile), srcfilop, lineno, pname);
236: if (srcfilop == N_SO) { /* first file */
237: strcpy(orgfile, ftitle);
238: srcfilop = N_SOL;
239: }
240: if (seg >= 0)
241: locctr(seg);
242: return 1;
243: }
244:
245: ejsdb()
246: {
247: /* called at the end of the entire file */
248: printf("\t.text\n");
249: printf("%s:", maklab(getlab()));
250: printf(strsymfmt, makstr(orgfile), N_ESO, lineno, labstr);
251: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.