|
|
1.1 root 1: /* Copyright (c) 1980 Regents of the University of California */
2:
3: static char sccsid[] = "@(#)stab.c 1.3 9/4/80";
4:
5: /*
6: * procedures to put out sdb symbol table information.
7: * and stabs for separate compilation type checking.
8: * these use the new .stabs, .stabn, and .stabd directives
9: */
10:
11: #include "whoami.h"
12: #ifdef PC
13: /* and the rest of the file */
14: # include "0.h"
15: # include <stab.h>
16:
17: /*
18: * additional symbol definition for <stab.h>
19: * that is used by the separate compilation facility --
20: * eventually, <stab.h> should be updated to include this
21: */
22:
23: # include "pstab.h"
24: # include "pc.h"
25:
26: /*
27: * absolute value: line numbers are negative if error recovery.
28: */
29: #define ABS( x ) ( x < 0 ? -x : x )
30:
31: /*
32: * variables
33: */
34: stabvar( name , type , level , offset , length , line )
35: char *name;
36: int type;
37: int level;
38: int offset;
39: int length;
40: int line;
41: {
42:
43: /*
44: * for separate compilation
45: */
46: if ( level == 1 ) {
47: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0
48: , name , N_PC , N_PGVAR , ABS( line ) );
49: }
50: /*
51: * for sdb
52: */
53: if ( ! opt('g') ) {
54: return;
55: }
56: putprintf( " .stabs \"" , 1 );
57: putprintf( NAMEFORMAT , 1 , name );
58: if ( level == 1 ) {
59: putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type );
60: } else {
61: putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , offset );
62: }
63: putprintf( " .stabs \"" , 1 );
64: putprintf( NAMEFORMAT , 1 , name );
65: putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
66:
67: }
68:
69:
70: /*
71: * parameters
72: */
73: stabparam( name , type , offset , length )
74: char *name;
75: int type;
76: int offset;
77: int length;
78: {
79:
80: if ( ! opt('g') ) {
81: return;
82: }
83: putprintf( " .stabs \"" , 1 );
84: putprintf( NAMEFORMAT , 1 , name );
85: putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset );
86: putprintf( " .stabs \"" , 1 );
87: putprintf( NAMEFORMAT , 1 , name );
88: putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
89: }
90:
91: /*
92: * fields
93: */
94: stabfield( name , type , offset , length )
95: char *name;
96: int type;
97: int offset;
98: int length;
99: {
100:
101: if ( ! opt('g') ) {
102: return;
103: }
104: putprintf( " .stabs \"" , 1 );
105: putprintf( NAMEFORMAT , 1 , name );
106: putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset );
107: putprintf( " .stabs \"" , 1 );
108: putprintf( NAMEFORMAT , 1 , name );
109: putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
110: }
111:
112: /*
113: * left brackets
114: */
115: stablbrac( level )
116: int level;
117: {
118:
119: if ( ! opt('g') ) {
120: return;
121: }
122: putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_LBRAC , level );
123: }
124:
125: /*
126: * right brackets
127: */
128: stabrbrac( level )
129: int level;
130: {
131:
132: if ( ! opt('g') ) {
133: return;
134: }
135: putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_RBRAC , level );
136: }
137:
138: /*
139: * functions
140: */
141: stabfunc( name , class , line , level )
142: char *name;
143: int class;
144: int line;
145: long level;
146: {
147: int type;
148: long i;
149:
150: /*
151: * for separate compilation
152: */
153: if ( level == 1 ) {
154: if ( class == FUNC ) {
155: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0
156: , name , N_PC , N_PGFUNC , ABS( line ) );
157: } else if ( class == PROC ) {
158: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0
159: , name , N_PC , N_PGPROC , ABS( line ) );
160: }
161: }
162: /*
163: * for sdb
164: */
165: if ( ! opt('g') ) {
166: return;
167: }
168: putprintf( " .stabs \"" , 1 );
169: putprintf( NAMEFORMAT , 1 , name );
170: putprintf( "\",0x%x,0,0x%x," , 1 , N_FUN , line );
171: for ( i = 1 ; i < level ; i++ ) {
172: putprintf( EXTFORMAT , 1 , enclosing[ i ] );
173: }
174: putprintf( EXTFORMAT , 0 , name );
175: }
176:
177: /*
178: * source line numbers
179: */
180: stabline( line )
181: int line;
182: {
183: if ( ! opt('g') ) {
184: return;
185: }
186: putprintf( " .stabd 0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) );
187: }
188:
189: /*
190: * source files
191: */
192: stabsource( filename )
193: char *filename;
194: {
195: int label;
196:
197: /*
198: * for separate compilation
199: */
200: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0
201: , filename , N_PC , N_PSO );
202: /*
203: * for sdb
204: */
205: if ( ! opt('g') ) {
206: return;
207: }
208: label = getlab();
209: putprintf( " .stabs \"" , 1 );
210: putprintf( NAMEFORMAT , 1 , filename );
211: putprintf( "\",0x%x,0,0," , 1 , N_SO );
212: putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
213: putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
214: putprintf( ":" , 0 );
215: }
216:
217: /*
218: * included files get one or more of these:
219: * one as they are entered by a #include,
220: * and one every time they are returned to by nested #includes
221: */
222: stabinclude( filename )
223: char *filename;
224: {
225: int label;
226:
227: /*
228: * for separate compilation
229: */
230: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0" , 0
231: , filename , N_PC , N_PSOL );
232: /*
233: * for sdb
234: */
235: if ( ! opt('g') ) {
236: return;
237: }
238: label = getlab();
239: putprintf( " .stabs \"" , 1 );
240: putprintf( NAMEFORMAT , 1 , filename );
241: putprintf( "\",0x%x,0,0," , 1 , N_SOL );
242: putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
243: putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
244: putprintf( ":" , 0 );
245: }
246:
247:
248: /*
249: * global Pascal symbols :
250: * labels, types, constants, and external procedure and function names:
251: * These are used by the separate compilation facility
252: * to be able to check for disjoint header files.
253: */
254:
255: /*
256: * global labels
257: */
258: stabglabel( label , line )
259: char *label;
260: int line;
261: {
262:
263: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0
264: , label , N_PC , N_PGLABEL , ABS( line ) );
265: }
266:
267: /*
268: * global constants
269: */
270: stabgconst( const , line )
271: char *const;
272: int line;
273: {
274:
275: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0
276: , const , N_PC , N_PGCONST , ABS( line ) );
277: }
278:
279: /*
280: * global types
281: */
282: stabgtype( type , line )
283: char *type;
284: int line;
285: {
286:
287: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0
288: , type , N_PC , N_PGTYPE , ABS( line ) );
289: }
290:
291:
292: /*
293: * external functions and procedures
294: */
295: stabefunc( name , class , line )
296: char *name;
297: int class;
298: int line;
299: {
300: int type;
301:
302: if ( class == FUNC ) {
303: type = N_PEFUNC;
304: } else if ( class == PROC ) {
305: type = N_PEPROC;
306: } else {
307: return;
308: }
309: putprintf( " .stabs \"%s\",0x%x,0,0x%x,0x%x" , 0
310: , name , N_PC , type , ABS( line ) );
311: }
312:
313: #endif PC
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.