Subversion Repositories tendra.SVN

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 7
Line -... Line 1...
-
 
1
/*
-
 
2
 * Copyright (c) 2002-2005 The TenDRA Project <http://www.tendra.org/>.
-
 
3
 * All rights reserved.
-
 
4
 *
-
 
5
 * Redistribution and use in source and binary forms, with or without
-
 
6
 * modification, are permitted provided that the following conditions are met:
-
 
7
 *
-
 
8
 * 1. Redistributions of source code must retain the above copyright notice,
-
 
9
 *    this list of conditions and the following disclaimer.
-
 
10
 * 2. Redistributions in binary form must reproduce the above copyright notice,
-
 
11
 *    this list of conditions and the following disclaimer in the documentation
-
 
12
 *    and/or other materials provided with the distribution.
-
 
13
 * 3. Neither the name of The TenDRA Project nor the names of its contributors
-
 
14
 *    may be used to endorse or promote products derived from this software
-
 
15
 *    without specific, prior written permission.
-
 
16
 *
-
 
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
-
 
18
 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-
 
19
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-
 
20
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
-
 
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-
 
22
 * EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-
 
23
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-
 
24
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-
 
25
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-
 
26
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-
 
27
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 
28
 *
-
 
29
 * $Id$
-
 
30
 */
1
/*
31
/*
2
    		 Crown Copyright (c) 1997
32
    		 Crown Copyright (c) 1997
3
 
33
 
4
    This TenDRA(r) Computer Program is subject to Copyright
34
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
35
    owned by the United Kingdom Secretary of State for Defence
Line 53... Line 83...
53
 
83
 
54
/*
84
/*
55
    FORWARD DECLARATIONS
85
    FORWARD DECLARATIONS
56
*/
86
*/
57
 
87
 
58
static void stab_scope_open PROTO_S ( ( long ) ) ;
88
static void stab_scope_open(long);
59
static void stab_scope_close PROTO_S ( ( long ) ) ;
89
static void stab_scope_close(long);
60
static void stab_file PROTO_S ( ( long, bool ) ) ;
90
static void stab_file(long, bool);
61
static void stab_local PROTO_S ( ( diag_info *, int, exp ) ) ;
91
static void stab_local(diag_info *, int, exp);
62
static void stab_types PROTO_S ( ( void ) ) ;
92
static void stab_types(void);
63
 
93
 
64
 
94
 
65
 
95
 
66
 
96
 
67
/*
97
/*
68
    DIAGNOSTICS FILE
98
    DIAGNOSTICS FILE
69
*/
99
*/
70
 
100
 
71
static FILE *dg_file ;
101
static FILE *dg_file;
72
static char *dg_file_name ;
102
static char *dg_file_name;
73
 
103
 
74
 
104
 
75
/*
105
/*
76
    BASIC TYPE NUMBERS
106
    BASIC TYPE NUMBERS
77
*/
107
*/
Line 94... Line 124...
94
/*
124
/*
95
    80x86 register numbers
125
    80x86 register numbers
96
*/
126
*/
97
 
127
 
98
#ifdef NEWDIAGS
128
#ifdef NEWDIAGS
99
static long reg_stabno [8] = {0, 2, 1, 3, 7, 6, 5, 4};
129
static long reg_stabno[8] = {0, 2, 1, 3, 7, 6, 5, 4};
100
#endif
130
#endif
101
 
131
 
102
/*
132
/*
103
    BASIC POINTERS
133
    BASIC POINTERS
104
*/
134
*/
105
 
135
 
106
static long stab_ptrs [ NO_STABS ] = {
136
static long stab_ptrs[NO_STABS] = {
107
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
137
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
108
} ;
138
};
109
 
139
 
110
 
140
 
111
/*
141
/*
112
    CURRENT TYPE NUMBER
142
    CURRENT TYPE NUMBER
113
*/
143
*/
114
 
144
 
115
static long typeno ;
145
static long typeno;
116
 
146
 
117
 
147
 
118
/*
148
/*
119
    SIZE OF LAST STAB TYPE OUTPUT
149
    SIZE OF LAST STAB TYPE OUTPUT
120
*/
150
*/
121
 
151
 
122
static long last_type_sz = 0 ;
152
static long last_type_sz = 0;
123
 
153
 
124
 
154
 
125
/*
155
/*
126
    CURRENT LINE NUMBER AND FILE NUMBER
156
    CURRENT LINE NUMBER AND FILE NUMBER
127
*/
157
*/
128
 
158
 
129
long currentlno = -1 ;
159
long currentlno = -1;
130
long currentfile = -1 ;
160
long currentfile = -1;
131
 
161
 
132
 
162
 
133
/*
163
/*
134
    ARRAY OF TYPE SIZES
164
    ARRAY OF TYPE SIZES
135
*/
165
*/
136
 
166
 
137
static long *type_sizes ;
167
static long *type_sizes;
138
static int total_type_sizes = 0 ;
168
static int total_type_sizes = 0;
139
 
169
 
140
 
170
 
141
/*
171
/*
142
    SETTING AND GETTING TYPE SIZES
172
    SETTING AND GETTING TYPE SIZES
143
*/
173
*/
144
 
174
 
145
#define set_stab_size( i )	type_sizes [ ( i ) ] = last_type_sz
175
#define set_stab_size(i)	type_sizes[(i)] = last_type_sz
146
#define get_stab_size( i )	( type_sizes [ ( i ) ] )
176
#define get_stab_size(i)	(type_sizes[(i)])
147
 
177
 
148
 
178
 
149
/*
179
/*
150
    GET THE NEXT TYPE NUMBER
180
    GET THE NEXT TYPE NUMBER
151
*/
181
*/
152
 
182
 
153
static long next_typen
183
static long next_typen
154
    PROTO_Z ()
184
(void)
155
{
185
{
156
    if ( typeno >= total_type_sizes ) {
186
    if (typeno >= total_type_sizes) {
157
	int i, n = total_type_sizes, m = n + 100 ;
187
	int i, n = total_type_sizes, m = n + 100;
158
	type_sizes = ( long * ) xrealloc ( (void*)(CH type_sizes),
188
	type_sizes = (long *)xrealloc((void*)(CH type_sizes),
159
					m * sizeof ( long ) ) ;
189
					m * sizeof(long));
160
	for ( i = n ; i < m ; i++ ) type_sizes [i] = 0 ;
190
	for (i = n; i < m; i++)type_sizes[i] = 0;
161
	total_type_sizes = m ;
191
	total_type_sizes = m;
162
    }
192
    }
163
    return ( typeno++ ) ;
193
    return(typeno++);
164
}
194
}
165
 
195
 
166
 
196
 
167
/*
197
/*
168
    ARRAY OF FILE DESCRIPTORS
198
    ARRAY OF FILE DESCRIPTORS
169
*/
199
*/
170
 
200
 
171
static filename *fds = NULL ;
201
static filename *fds = NULL;
172
static int szfds = 0 ;
202
static int szfds = 0;
173
static int nofds = 0 ;
203
static int nofds = 0;
174
 
204
 
175
 
205
 
176
/*
206
/*
177
    ADD A NEW FILE TO THE ARRAY OF FILE DESCRIPTORS
207
    ADD A NEW FILE TO THE ARRAY OF FILE DESCRIPTORS
178
*/
208
*/
179
 
209
 
180
void stab_collect_files
210
void stab_collect_files
181
    PROTO_N ( (f) )
-
 
182
    PROTO_T ( filename f )
211
(filename f)
183
{
212
{
184
    if ( fds == NULL ) {
213
    if (fds == NULL) {
185
	szfds += 10 ;
214
	szfds += 10;
186
	fds = ( filename * ) xmalloc ( szfds * sizeof ( filename ) ) ;
215
	fds = (filename *)xmalloc(szfds * sizeof(filename));
187
    } else if ( nofds >= szfds ) {
216
    } else if (nofds >= szfds) {
188
	szfds += 10 ;
217
	szfds += 10;
189
	fds = ( filename * ) xrealloc ( (void*)(CH fds),
218
	fds = (filename *)xrealloc((void*)(CH fds),
190
				szfds * sizeof ( filename ) ) ;
219
				szfds * sizeof(filename));
191
    }
220
    }
192
    fds [ nofds++ ] = f ;
221
    fds[nofds++] = f;
193
    return ;
222
    return;
194
}
223
}
195
 
224
 
196
 
225
 
197
/*
226
/*
198
    FIND THE FILE DESCRIPTOR CORRESPONDING TO A FILE NAME
227
    FIND THE FILE DESCRIPTOR CORRESPONDING TO A FILE NAME
199
*/
228
*/
200
 
229
 
201
static long find_file
230
static long find_file
202
    PROTO_N ( (f) )
-
 
203
    PROTO_T ( char * f )
231
(char * f)
204
{
232
{
205
    long i ;
233
    long i;
206
    for ( i = 0 ; i < nofds ; i++ ) {
234
    for (i = 0; i < nofds; i++) {
207
	if ( strcmp ( f, fds [i]->file.ints.chars ) == 0 ) return ( i ) ;
235
	if (strcmp(f, fds[i] ->file.ints.chars) == 0) return(i);
208
    }
236
    }
209
    return ( 0 ) ;
237
    return(0);
210
}
238
}
211
 
239
 
212
 
240
 
213
static int last_proc_cname;
241
static int last_proc_cname;
214
static char * last_proc_pname;
242
static char * last_proc_pname;
215
static int in_proc = 0;
243
static int in_proc = 0;
216
 
244
 
217
static void out_procname
245
static void out_procname
218
    PROTO_Z ()
246
(void)
219
{
247
{
220
  if (last_proc_cname == -1) {
248
  if (last_proc_cname == -1) {
221
    outs (last_proc_pname);
249
    outs(last_proc_pname);
222
  }
250
  }
223
  else {
251
  else {
224
    outs(local_prefix);
252
    outs(local_prefix);
225
    outn ((long)last_proc_cname);
253
    outn((long)last_proc_cname);
226
  };
254
  };
227
}
255
}
228
 
256
 
229
 
257
 
230
/*
258
/*
231
    OUTPUT A FILE POSITION CONSTRUCT
259
    OUTPUT A FILE POSITION CONSTRUCT
232
*/
260
*/
233
 
261
 
234
#define N_SLINE 0x44
262
#define N_SLINE 0x44
Line 236... Line 264...
236
#define N_BSLINE 0x48
264
#define N_BSLINE 0x48
237
#define N_LBRAC  0xc0
265
#define N_LBRAC  0xc0
238
#define N_RBRAC  0xe0
266
#define N_RBRAC  0xe0
239
 
267
 
240
static void stabd
268
static void stabd
241
    PROTO_N ( (findex, lno, seg) )
-
 
242
    PROTO_T ( long findex X long lno X int seg )
269
(long findex, long lno, int seg)
243
{
270
{
244
    long i ;
271
    long i;
245
 
272
 
246
    if ( findex == currentfile && lno == currentlno ) return ;
273
    if (findex == currentfile && lno == currentlno) return;
247
    stab_file ( findex, 1 ) ;
274
    stab_file(findex, 1);
248
 
275
 
249
    if (seg != 0)		/* 0 suppresses always */
276
    if (seg != 0)		/* 0 suppresses always */
250
    {
277
    {
251
      if (seg < 0)
278
      if (seg < 0 && !freebsd_elf)
252
	seg = - seg;
279
	seg = - seg;
253
      if (seg > 0)		/* -ve line nos are put out in the stabs */
280
      if (seg > 0)		/* -ve line nos are put out in the stabs */
254
      {
281
      {
255
	i = next_lab () ;
282
	i = next_lab();
256
	fprintf ( dg_file, "%sL.%ld:\n", local_prefix, i ) ;
283
	fprintf(dg_file, "%sL.%ld:\n", local_prefix, i);
257
	fprintf ( dg_file, "\t.stabn\t0x%x,0,%ld,%sL.%ld",seg, lno, local_prefix, i ) ;
284
	fprintf(dg_file, "\t.stabn\t0x%x,0,%ld,%sL.%ld",seg, lno, local_prefix, i);
-
 
285
	if (freebsd_elf && in_proc) {
-
 
286
	  outs("-");
-
 
287
	  out_procname();
-
 
288
	}
258
	outnl ();
289
	outnl();
259
      }
290
      }
260
    }
291
    }
261
    currentlno = lno ;
292
    currentlno = lno;
262
    return ;
293
    return;
263
}
294
}
264
 
295
 
265
 
296
 
266
#ifdef NEWDIAGS
297
#ifdef NEWDIAGS
267
/*
298
/*
268
    OUTPUT DIAGNOSTICS SURROUNDING CODE
299
    OUTPUT DIAGNOSTICS SURROUNDING CODE
269
*/
300
*/
270
 
301
 
271
void code_diag_info
302
void code_diag_info
272
    PROTO_N ( (d, proc_no, mcode, args) )
-
 
273
    PROTO_T ( diag_info * d X int proc_no X void (*mcode) PROTO_S ((void *)) X void * args )
303
(diag_info * d, int proc_no, void(*mcode)(void *), void * args)
274
{
304
{
275
  if (d == nildiag) {
305
  if (d == nildiag) {
276
    (*mcode)(args);
306
   (*mcode)(args);
277
    return;
307
    return;
278
  }
308
  }
279
  switch (d->key) {
309
  switch (d->key) {
280
    case DIAG_INFO_SCOPE: {
310
    case DIAG_INFO_SCOPE: {
281
	stab_scope_open ( currentfile ) ;
311
	stab_scope_open(currentfile);
282
	stabd ( currentfile, ( long ) ( currentlno + 1 ), N_SLINE ) ;
312
	stabd(currentfile,(long)(currentlno + 1), N_SLINE);
283
	code_diag_info (d->more, proc_no, mcode, args);
313
	code_diag_info(d->more, proc_no, mcode, args);
284
	stab_scope_close ( currentfile ) ;
314
	stab_scope_close(currentfile);
285
	return;
315
	return;
286
    }
316
    }
287
    case DIAG_INFO_SOURCE: {
317
    case DIAG_INFO_SOURCE: {
288
	sourcemark *s = &d->data.source.beg ;
318
	sourcemark *s = &d->data.source.beg;
289
	long f = find_file ( s->file->file.ints.chars ) ;
319
	long f = find_file(s->file->file.ints.chars);
290
	stabd ( f, ( long ) s->line_no.nat_val.small_nat ,N_SLINE) ;
320
	stabd(f,(long)s->line_no.nat_val.small_nat ,N_SLINE);
291
	code_diag_info (d->more, proc_no, mcode, args);
321
	code_diag_info(d->more, proc_no, mcode, args);
292
	s = &d->data.source.end ;
322
	s = &d->data.source.end;
293
	f = find_file ( s->file->file.ints.chars ) ;
323
	f = find_file(s->file->file.ints.chars);
294
	stabd ( f, ( long ) s->line_no.nat_val.small_nat ,N_SLINE) ;
324
	stabd(f,(long)s->line_no.nat_val.small_nat ,N_SLINE);
295
	return;
325
	return;
296
    }
326
    }
297
    case DIAG_INFO_ID: {
327
    case DIAG_INFO_ID: {
298
	exp acc = d -> data.id_scope.access;
328
	exp acc = d -> data.id_scope.access;
299
	if (name(acc) != hold_tag)
329
	if (name(acc)!= hold_tag)
300
	  failer("not hold_tag");
330
	  failer("not hold_tag");
301
	acc = son(acc);
331
	acc = son(acc);
302
	if (name(acc) == cont_tag && name(son(acc)) == name_tag && isvar(son(son(acc))))
332
	if (name(acc) == cont_tag && name(son(acc)) == name_tag && isvar(son(son(acc))))
303
	  acc = son(acc);
333
	  acc = son(acc);
304
	if ( ( name(acc) == name_tag && !isdiscarded(acc) && !isglob(son(acc)) ) ||
334
	if ((name(acc) == name_tag && !isdiscarded(acc) && !isglob(son(acc))) ||
305
		name(acc) == val_tag )
335
		name(acc) == val_tag)
306
	  stab_local ( d, proc_no, acc );
336
	  stab_local(d, proc_no, acc);
307
	code_diag_info (d->more, proc_no, mcode, args);
337
	code_diag_info(d->more, proc_no, mcode, args);
308
    }
338
    }
309
  };
339
  };
310
  return;
340
  return;
311
}
341
}
312
 
342
 
313
 
343
 
314
#else
344
#else
315
 
345
 
316
/*
346
/*
317
    OUTPUT INITIAL DIAGNOSTICS FOR A DIAGNOSE_TAG
347
    OUTPUT INITIAL DIAGNOSTICS FOR A DIAGNOSE_TAG
318
*/
348
*/
319
 
349
 
320
void output_diag
350
void output_diag
321
    PROTO_N ( (d, proc_no, e) )
-
 
322
    PROTO_T ( diag_info * d X int proc_no X exp e )
351
(diag_info * d, int proc_no, exp e)
323
{
352
{
324
  if ( d->key == DIAG_INFO_SOURCE ) {
353
  if (d->key == DIAG_INFO_SOURCE) {
325
    sourcemark *s = &d->data.source.beg ;
354
    sourcemark *s = &d->data.source.beg;
326
    long f = find_file ( s->file->file.ints.chars ) ;
355
    long f = find_file(s->file->file.ints.chars);
327
    stabd ( f, ( long ) s->line_no.nat_val.small_nat ,N_SLINE) ;
356
    stabd(f,(long)s->line_no.nat_val.small_nat ,N_SLINE);
328
    return ;
357
    return;
329
  }
358
  }
330
 
359
 
331
  if (d -> key == DIAG_INFO_ID) {
360
  if (d -> key == DIAG_INFO_ID) {
332
    exp acc = d -> data.id_scope.access;
361
    exp acc = d -> data.id_scope.access;
333
 
362
 
334
    if ( isglob ( son ( acc ) ) || no ( son ( acc ) ) == 1 ) return;
363
    if (isglob(son(acc)) || no(son(acc)) == 1) return;
335
    mark_scope(e);
364
    mark_scope(e);
336
 
365
 
337
    if ( props ( e ) & 0x80 ) {
366
    if (props(e) & 0x80) {
338
      stab_scope_open ( currentfile ) ;
367
      stab_scope_open(currentfile);
339
      stabd ( currentfile, ( long ) ( currentlno + 1 ), N_SLINE ) ;
368
      stabd(currentfile,(long)(currentlno + 1), N_SLINE);
340
    }
369
    }
341
 
370
 
342
    stab_local ( d, proc_no, acc );
371
    stab_local(d, proc_no, acc);
343
    return ;
372
    return;
344
  }
373
  }
345
}
374
}
346
 
375
 
347
 
376
 
348
/*
377
/*
349
    OUTPUT FINAL DIAGNOSTICS FOR A DIAGNOSE_TAG
378
    OUTPUT FINAL DIAGNOSTICS FOR A DIAGNOSE_TAG
350
*/
379
*/
351
 
380
 
352
void output_end_scope
381
void output_end_scope
353
    PROTO_N ( (d, e) )
-
 
354
    PROTO_T ( diag_info * d X exp e )
382
(diag_info * d, exp e)
355
{
383
{
356
    if ( d->key == DIAG_INFO_SOURCE ) {
384
    if (d->key == DIAG_INFO_SOURCE) {
357
	sourcemark *s = &d->data.source.end ;
385
	sourcemark *s = &d->data.source.end;
358
	long f = find_file ( s->file->file.ints.chars ) ;
386
	long f = find_file(s->file->file.ints.chars);
359
	long lno = s->line_no.nat_val.small_nat ;
387
	long lno = s->line_no.nat_val.small_nat;
360
	stabd ( f, lno, N_SLINE) ;
388
	stabd(f, lno, N_SLINE);
361
	return ;
-
 
362
    }
-
 
363
    if ( d->key == DIAG_INFO_ID && props ( e ) & 0x80 ) {
-
 
364
	stab_scope_close ( currentfile ) ;
-
 
365
	return ;
389
	return;
366
    }
390
    }
-
 
391
    if (d->key == DIAG_INFO_ID && props(e) & 0x80) {
-
 
392
	stab_scope_close(currentfile);
-
 
393
	return;
-
 
394
    }
367
    return ;
395
    return;
368
}
396
}
369
 
397
 
370
 
398
 
371
#endif
399
#endif
372
/*
400
/*
373
    INITIALISE DIAGNOSTICS
401
    INITIALISE DIAGNOSTICS
374
*/
402
*/
375
 
403
 
376
void out_diagnose_prelude
404
void out_diagnose_prelude
377
    PROTO_Z ()
405
(void)
378
{
406
{
379
    dg_file_name = tmpnam ( NULL ) ;
407
    dg_file_name = tmpnam(NULL);
380
    dg_file = fopen ( dg_file_name, "w" ) ;
408
    dg_file = fopen(dg_file_name, "w");
381
    if ( dg_file == NULL ) {
409
    if (dg_file == NULL) {
382
	failer ( "Can't open temporary diagnostics file" ) ;
410
	failer("Can't open temporary diagnostics file");
383
	exit (EXIT_FAILURE) ;
411
	exit(EXIT_FAILURE);
384
    }
412
    }
385
    stab_types () ;
413
    stab_types();
386
    return ;
414
    return;
387
}
415
}
388
 
416
 
389
 
417
 
390
/*
418
/*
391
    INITIALIZE DIAGNOSTICS
419
    INITIALIZE DIAGNOSTICS
392
*/
420
*/
393
 
421
 
394
void init_stab_aux
422
void init_stab_aux
395
    PROTO_Z ()
423
(void)
396
{
424
{
397
    int c ;
425
    int c;
398
    FILE *f ;
426
    FILE *f;
399
    int i, j = -1 ;
427
    int i, j = -1;
400
    for ( i = 0 ; i < nofds ; i++ ) {
428
    for (i = 0; i < nofds; i++) {
401
	char *s = fds [i]->file.ints.chars ;
429
	char *s = fds[i] ->file.ints.chars;
402
	int n = ( int ) strlen ( s ) ;
430
	int n = (int)strlen(s);
403
	if ( n && s [ n - 1 ] != 'h' ) j = i ;
431
	if (n && s[n - 1]!= 'h')j = i;
404
    }
432
    }
405
    fclose ( dg_file ) ;
433
    fclose(dg_file);
406
    dg_file = fpout ;
434
    dg_file = fpout;
407
    if (j >= 0)
435
    if (j >= 0)
408
	fprintf (dg_file, "\t.file\t\"%s\"\n", fds[j]->file.ints.chars) ;
436
	fprintf(dg_file, "\t.file\t\"%s\"\n", fds[j] ->file.ints.chars);
409
    else
437
    else
410
	fprintf (dg_file, "\t.file\t\"no_source_file\"\n") ;
438
	fprintf(dg_file, "\t.file\t\"no_source_file\"\n");
411
    stab_file ( ( long ) j, 0 ) ;
439
    stab_file((long)j, 0);
412
    f = fopen ( dg_file_name, "r" ) ;
440
    f = fopen(dg_file_name, "r");
413
    if ( f == NULL ) {
441
    if (f == NULL) {
414
	failer ( "Can't open temporary diagnostics file" ) ;
442
	failer("Can't open temporary diagnostics file");
415
	exit (EXIT_FAILURE) ;
443
	exit(EXIT_FAILURE);
416
    }
444
    }
417
    while ( c = fgetc ( f ), c != EOF ) outc ( c ) ;
445
    while (c = fgetc(f), c != EOF)outc(c);
418
    fclose ( f ) ;
446
    fclose(f);
419
    remove ( dg_file_name ) ;
447
    remove(dg_file_name);
420
    return ;
448
    return;
421
}
449
}
422
 
450
 
423
void out_diagnose_postlude
451
void out_diagnose_postlude
424
    PROTO_Z ()
452
(void)
425
{
453
{
426
    long i = next_lab () ;
454
    long i = next_lab();
427
    fprintf ( dg_file, ".text\n" ) ;
455
    fprintf(dg_file, ".text\n");
428
    fprintf ( dg_file, "%sL.%ld:\n", local_prefix, i ) ;
456
    fprintf(dg_file, "%sL.%ld:\n", local_prefix, i);
429
    fprintf ( dg_file, "\t.stabs\t\"\",0x64,0,0,%sL.%ld\n", local_prefix, i ) ;
457
    fprintf(dg_file, "\t.stabs\t\"\",0x64,0,0,%sL.%ld\n", local_prefix, i);
430
    return ;
458
    return;
431
}
459
}
432
 
460
 
433
 
461
 
434
/*
462
/*
435
    FIND THE STAB OF A SIMPLE SHAPE
463
    FIND THE STAB OF A SIMPLE SHAPE
436
*/
464
*/
437
 
465
 
438
static long out_sh_type
466
static long out_sh_type
439
    PROTO_N ( (s) )
-
 
440
    PROTO_T ( shape s )
467
(shape s)
441
{
468
{
442
    last_type_sz = shape_size ( s ) ;
469
    last_type_sz = shape_size(s);
443
    switch ( name ( s ) ) {
470
    switch (name(s)) {
444
	case scharhd : return ( STAB_SCHAR ) ;
471
	case scharhd: return(STAB_SCHAR);
445
	case ucharhd : return ( STAB_UCHAR ) ;
472
	case ucharhd: return(STAB_UCHAR);
446
	case swordhd : return ( STAB_SSHRT ) ;
473
	case swordhd: return(STAB_SSHRT);
447
	case uwordhd : return ( STAB_USHRT ) ;
474
	case uwordhd: return(STAB_USHRT);
448
	case slonghd : return ( STAB_SLONG ) ;
475
	case slonghd: return(STAB_SLONG);
449
	case ulonghd : return ( STAB_ULONG ) ;
476
	case ulonghd: return(STAB_ULONG);
450
	case s64hd : return ( STAB_S64 ) ;
477
	case s64hd: return(STAB_S64);
451
	case u64hd : return ( STAB_U64 ) ;
478
	case u64hd: return(STAB_U64);
452
	case shrealhd : return ( STAB_FLOAT ) ;
479
	case shrealhd: return(STAB_FLOAT);
453
	case realhd : return ( STAB_DBL ) ;
480
	case realhd: return(STAB_DBL);
454
	case doublehd : return ( STAB_LDBL ) ;
481
	case doublehd: return(STAB_LDBL);
455
    }
482
    }
456
    return ( STAB_VOID ) ;
483
    return(STAB_VOID);
457
}
484
}
458
 
485
 
459
 
486
 
460
/*
487
/*
461
    OUTPUT DIAGNOSTICS DIRECTIVE FOR A FILE
488
    OUTPUT DIAGNOSTICS DIRECTIVE FOR A FILE
462
*/
489
*/
463
 
490
 
464
static void stab_file
491
static void stab_file
465
    PROTO_N ( (findex, internal) )
-
 
466
    PROTO_T ( long findex X bool internal )
492
(long findex, bool internal)
467
{
493
{
468
    static long i = 0 ;
494
    static long i = 0;
469
 
495
 
470
    if ( findex == currentfile || findex < 0 || findex >= szfds ) {
496
    if (findex == currentfile || findex < 0 || findex >= szfds) {
471
	return ;
497
	return;
472
    }
498
    }
473
 
499
 
474
    if ( !internal ) {
500
    if (!internal) {
475
	/* source file */
501
	/* source file */
476
	i = next_lab () ;
502
	i = next_lab();
477
	fprintf ( dg_file, "%sL.%ld:\n", local_prefix, i ) ;
503
	fprintf(dg_file, "%sL.%ld:\n", local_prefix, i);
478
	fprintf ( dg_file, "\t.stabs\t\"%s\",0x64,0,0,%sL.%ld\n",
504
	fprintf(dg_file, "\t.stabs\t\"%s\",0x64,0,0,%sL.%ld\n",
479
		  fds [ findex ]->file.ints.chars, local_prefix, i ) ;
505
		  fds[findex] ->file.ints.chars, local_prefix, i);
480
    } else {
506
    } else {
481
	/* included file */
507
	/* included file */
482
	fprintf ( dg_file, "\t.stabs\t\"%s\",0x84,0,0,%sL.%ld\n",
508
	fprintf(dg_file, "\t.stabs\t\"%s\",0x84,0,0,%sL.%ld\n",
483
		  fds [ findex ]->file.ints.chars, local_prefix, i ) ;
509
		  fds[findex] ->file.ints.chars, local_prefix, i);
484
    }
510
    }
485
    currentfile = findex ;
511
    currentfile = findex;
486
    return ;
512
    return;
487
}
513
}
488
 
514
 
489
 
515
 
490
/*
516
/*
491
    ARRAY OF DIAGNOSTIC SCOPES
517
    ARRAY OF DIAGNOSTIC SCOPES
492
*/
518
*/
493
 
519
 
494
static long open_label = 0 ;
520
static long open_label = 0;
495
static long bracket_level = 0 ;
521
static long bracket_level = 0;
496
 
522
 
497
 
523
 
498
/*
524
/*
499
    START OF A DIAGNOSTICS SCOPE
525
    START OF A DIAGNOSTICS SCOPE
500
*/
526
*/
501
 
527
 
502
static void stab_scope_open
528
static void stab_scope_open
503
    PROTO_N ( (findex) )
-
 
504
    PROTO_T ( long findex )
529
(long findex)
505
{
530
{
506
    long i ;
531
    long i;
507
    stab_file ( findex, 1 ) ;
532
    stab_file(findex, 1);
508
    if ( open_label != 0 )
533
    if (open_label != 0)
509
    {
534
    {
510
	fprintf ( dg_file, "\t.stabn\t0x%x,0,%ld,%sL.%ld\n", N_LBRAC,
535
	fprintf(dg_file, "\t.stabn\t0x%x,0,%ld,%sL.%ld\n", N_LBRAC,
511
		  bracket_level, local_prefix, open_label ) ;
536
		  bracket_level, local_prefix, open_label);
512
    }
537
    }
513
    i = next_lab () ;
538
    i = next_lab();
514
    fprintf ( dg_file, "%sL.%ld:\n", local_prefix, i ) ;
539
    fprintf(dg_file, "%sL.%ld:\n", local_prefix, i);
515
    bracket_level++ ;
540
    bracket_level++;
516
    open_label = i ;
541
    open_label = i;
517
    return ;
542
    return;
518
}
543
}
519
 
544
 
520
 
545
 
521
/*
546
/*
522
    END OF A DIAGNOSTICS SCOPE
547
    END OF A DIAGNOSTICS SCOPE
523
*/
548
*/
524
 
549
 
525
static void stab_scope_close
550
static void stab_scope_close
526
    PROTO_N ( (findex) )
-
 
527
    PROTO_T ( long findex )
551
(long findex)
528
{
552
{
529
    long i ;
553
    long i;
530
    if ( open_label != 0 )
554
    if (open_label != 0)
531
    {
555
    {
532
	fprintf ( dg_file, "\t.stabn\t0x%x,0,%ld,%sL.%ld\n", N_LBRAC,
556
	fprintf(dg_file, "\t.stabn\t0x%x,0,%ld,%sL.%ld\n", N_LBRAC,
533
		  bracket_level, local_prefix, open_label ) ;
557
		  bracket_level, local_prefix, open_label);
534
	open_label = 0 ;
558
	open_label = 0;
535
    }
559
    }
536
    i = next_lab () ;
560
    i = next_lab();
537
    fprintf ( dg_file, "%sL.%ld:\n", local_prefix, i ) ;
561
    fprintf(dg_file, "%sL.%ld:\n", local_prefix, i);
538
    fprintf ( dg_file, "\t.stabn\t0x%x,0,%ld,%sL.%ld\n", N_RBRAC,
562
    fprintf(dg_file, "\t.stabn\t0x%x,0,%ld,%sL.%ld\n", N_RBRAC,
539
		  bracket_level, local_prefix, i ) ;
563
		  bracket_level, local_prefix, i);
540
    bracket_level-- ;
564
    bracket_level--;
541
    return ;
565
    return;
542
}
566
}
543
 
567
 
544
 
568
 
545
/*
569
/*
546
    DEPTH COUNT FOR STAB TYPES
570
    DEPTH COUNT FOR STAB TYPES
547
*/
571
*/
548
 
572
 
549
static int max_depth = 64 ;
573
static int max_depth = 64;
550
static int depth_now = 0 ;
574
static int depth_now = 0;
551
 
575
 
552
 
576
 
553
/*
577
/*
554
    OUTPUT A DIAGNOSTICS TYPE
578
    OUTPUT A DIAGNOSTICS TYPE
555
*/
579
*/
556
 
580
 
557
#define OUT_DT_SHAPE( dt )	out_dt_shape ( ( depth_now = 0, dt ) )
581
#define OUT_DT_SHAPE(dt)	out_dt_shape((depth_now = 0, dt))
558
 
582
 
559
static void out_dt_shape
583
static void out_dt_shape
560
    PROTO_N ( (dt) )
-
 
561
    PROTO_T ( diag_type dt )
584
(diag_type dt)
562
{
585
{
563
    if ( dt->been_outed ) {
586
    if (dt->been_outed) {
564
	fprintf ( dg_file, "%d",(int) dt->been_outed ) ;
587
	fprintf(dg_file, "%d",(int)dt->been_outed);
565
	last_type_sz = get_stab_size ( dt->been_outed ) ;
588
	last_type_sz = get_stab_size(dt->been_outed);
566
	return ;
589
	return;
567
    }
590
    }
568
 
591
 
569
    /* SunOS as(1) rejects stab lines >2k so reduce size arbitrarily */
592
    /* SunOS as(1) rejects stab lines >2k so reduce size arbitrarily */
570
    if ( depth_now >= max_depth ) {
593
    if (depth_now >= max_depth) {
571
	fprintf ( dg_file, "%d", STAB_SLONG ) ;
594
	fprintf(dg_file, "%d", STAB_SLONG);
572
	return ;
595
	return;
573
    }
596
    }
574
    depth_now++ ;
597
    depth_now++;
575
 
598
 
576
    switch ( dt->key ) {
599
    switch (dt->key) {
577
 
600
 
578
	case DIAG_TYPE_PTR : {
601
	case DIAG_TYPE_PTR: {
579
	    long non ;
602
	    long non;
580
	    diag_type pdt = dt->data.ptr.object ;
603
	    diag_type pdt = dt->data.ptr.object;
581
	    if ( pdt->key == DIAG_TYPE_VARIETY ) {
604
	    if (pdt->key == DIAG_TYPE_VARIETY) {
582
		long pn = out_sh_type ( f_integer ( pdt->data.var ) ) ;
605
		long pn = out_sh_type(f_integer(pdt->data.var));
583
		non = stab_ptrs [ pn ] ;
606
		non = stab_ptrs[pn];
584
		if ( non == 0 ) {
607
		if (non == 0) {
585
		    non = next_typen () ;
608
		    non = next_typen();
586
		    stab_ptrs [ pn ] = non ;
609
		    stab_ptrs[pn] = non;
587
		    fprintf ( dg_file, "%ld=*%ld", non, pn ) ;
610
		    fprintf(dg_file, "%ld=*%ld", non, pn);
588
		} else {
611
		} else {
589
		    fprintf ( dg_file, "%ld", non ) ;
612
		    fprintf(dg_file, "%ld", non);
590
		}
613
		}
591
	    } else {
614
	    } else {
592
		non = next_typen () ;
615
		non = next_typen();
593
		fprintf ( dg_file, "%ld=*", non ) ;
616
		fprintf(dg_file, "%ld=*", non);
594
		out_dt_shape ( dt->data.ptr.object ) ;
617
		out_dt_shape(dt->data.ptr.object);
595
	    }
618
	    }
596
	    dt->been_outed = non ;
619
	    dt->been_outed = non;
597
	    last_type_sz = 32 ;
620
	    last_type_sz = 32;
598
	    set_stab_size ( non ) ;
621
	    set_stab_size(non);
599
	    break ;
622
	    break;
600
	}
623
	}
601
 
624
 
602
	case DIAG_TYPE_ARRAY : {
625
	case DIAG_TYPE_ARRAY: {
603
#if 0
626
#if 0
604
	    long str = no ( dt->data.array.stride ) ;
627
	    long str = no(dt->data.array.stride);
605
#endif
628
#endif
606
	    long lwb = no ( dt->data.array.lower_b ) ;
629
	    long lwb = no(dt->data.array.lower_b);
607
	    long upb = no ( dt->data.array.upper_b ) ;
630
	    long upb = no(dt->data.array.upper_b);
608
	    diag_type index_type = dt->data.array.index_type ;
631
	    diag_type index_type = dt->data.array.index_type;
609
	    diag_type element_type = dt->data.array.element_type ;
632
	    diag_type element_type = dt->data.array.element_type;
610
	    long non = next_typen () ;
633
	    long non = next_typen();
611
	    dt->been_outed = non ;
634
	    dt->been_outed = non;
612
	    fprintf ( dg_file, "%ld=ar", non ) ;
635
	    fprintf(dg_file, "%ld=ar", non);
613
	    out_dt_shape ( index_type ) ;
636
	    out_dt_shape(index_type);
614
	    fprintf ( dg_file, ";%ld;%ld;", lwb, upb ) ;
637
	    fprintf(dg_file, ";%ld;%ld;", lwb, upb);
615
	    out_dt_shape ( element_type ) ;
638
	    out_dt_shape(element_type);
616
	    last_type_sz *= ( upb - lwb + 1 ) ;
639
	    last_type_sz *= (upb - lwb + 1);
617
	    set_stab_size ( non ) ;
640
	    set_stab_size(non);
618
	    break ;
641
	    break;
619
	}
642
	}
620
 
643
 
621
	case DIAG_TYPE_STRUCT :
644
	case DIAG_TYPE_STRUCT:
622
	case DIAG_TYPE_UNION : {
645
	case DIAG_TYPE_UNION: {
623
	    int i ;
646
	    int i;
624
	    char su ;
647
	    char su;
625
	    shape s ;
648
	    shape s;
626
	    diag_field_list fields ;
649
	    diag_field_list fields;
627
	    long non = next_typen () ;
650
	    long non = next_typen();
628
	    dt->been_outed = non ;
651
	    dt->been_outed = non;
629
 
652
 
630
	    if ( dt->key == DIAG_TYPE_STRUCT ) {
653
	    if (dt->key == DIAG_TYPE_STRUCT) {
631
		fields = dt->data.t_struct.fields ;
654
		fields = dt->data.t_struct.fields;
632
		s = dt->data.t_struct.tdf_shape ;
655
		s = dt->data.t_struct.tdf_shape;
633
		su = 's';
656
		su = 's';
634
	    } else {
657
	    } else {
635
		fields = dt->data.t_union.fields ;
658
		fields = dt->data.t_union.fields;
636
		s = dt->data.t_union.tdf_shape;
659
		s = dt->data.t_union.tdf_shape;
637
		su = 'u' ;
660
		su = 'u';
638
	    }
-
 
639
	    fprintf ( dg_file, "%ld=%c%d", non, su, shape_size ( s ) / 8 ) ;
-
 
640
 
-
 
641
	    for ( i = fields->lastused - 1 ; i >= 0 ; i-- ) {
-
 
642
		diag_field sf =  ( fields->array ) [i] ;
-
 
643
		long offset = no ( sf->where );
-
 
644
 
-
 
645
		if ( depth_now >= max_depth ) return ;
-
 
646
		depth_now++ ;
-
 
647
		fprintf ( dg_file, "%s:", sf->field_name.ints.chars ) ;
-
 
648
		out_dt_shape ( sf->field_type ) ;
-
 
649
		fprintf ( dg_file, ",%ld,%ld;", offset, last_type_sz ) ;
-
 
650
	    }
661
	    }
-
 
662
	    fprintf(dg_file, "%ld=%c%d", non, su, shape_size(s) / 8);
-
 
663
 
-
 
664
	    for (i = fields->lastused - 1; i >= 0; i--) {
-
 
665
		diag_field sf = (fields->array)[i];
-
 
666
		long offset = no(sf->where);
-
 
667
 
-
 
668
		if (depth_now >= max_depth) return;
-
 
669
		depth_now++;
-
 
670
		fprintf(dg_file, "%s:", sf->field_name.ints.chars);
-
 
671
		out_dt_shape(sf->field_type);
-
 
672
		fprintf(dg_file, ",%ld,%ld;", offset, last_type_sz);
-
 
673
	    }
651
	    fprintf ( dg_file, ";" ) ;
674
	    fprintf(dg_file, ";");
652
	    last_type_sz = shape_size ( s ) ;
675
	    last_type_sz = shape_size(s);
653
	    set_stab_size ( non ) ;
676
	    set_stab_size(non);
654
	    break ;
677
	    break;
655
	}
678
	}
656
 
679
 
657
	case DIAG_TYPE_VARIETY : {
680
	case DIAG_TYPE_VARIETY: {
658
	    dt->been_outed = out_sh_type ( f_integer ( dt->data.var ) ) ;
681
	    dt->been_outed = out_sh_type(f_integer(dt->data.var));
659
	    fprintf ( dg_file, "%ld", dt->been_outed ) ;
682
	    fprintf(dg_file, "%ld", dt->been_outed);
660
	    break ;
683
	    break;
661
	}
684
	}
662
 
685
 
663
	case DIAG_TYPE_PROC: {
686
	case DIAG_TYPE_PROC: {
664
	    diag_type result_type = dt->data.proc.result_type ;
687
	    diag_type result_type = dt->data.proc.result_type;
665
	    long non1 = next_typen () ;
688
	    long non1 = next_typen();
666
	    long non2 = next_typen () ;
689
	    long non2 = next_typen();
667
	    dt->been_outed = non1 ;
690
	    dt->been_outed = non1;
668
	    fprintf ( dg_file, "%ld=*%ld=f", non1, non2 ) ;
691
	    fprintf(dg_file, "%ld=*%ld=f", non1, non2);
669
	    out_dt_shape ( result_type ) ;
692
	    out_dt_shape(result_type);
670
	    last_type_sz = 32 ;
693
	    last_type_sz = 32;
671
	    set_stab_size ( non1 ) ;
694
	    set_stab_size(non1);
672
	    set_stab_size ( non2 ) ;
695
	    set_stab_size(non2);
673
	    break ;
696
	    break;
674
	}
697
	}
675
 
698
 
676
	case DIAG_TYPE_LOC: {
699
	case DIAG_TYPE_LOC: {
677
	    /* +++ use qualifier which gives "const"/"volatile" */
700
	    /* +++ use qualifier which gives "const"/"volatile" */
678
	    out_dt_shape ( dt->data.loc.object ) ;
701
	    out_dt_shape(dt->data.loc.object);
679
	    break ;
702
	    break;
-
 
703
	}
-
 
704
 
-
 
705
	case DIAG_TYPE_FLOAT: {
-
 
706
	    dt->been_outed = out_sh_type(f_floating(dt->data.f_var));
-
 
707
	    fprintf(dg_file, "%ld", dt->been_outed);
-
 
708
	    break;
680
	}
709
	}
681
 
710
 
682
	case DIAG_TYPE_FLOAT : {
711
	case DIAG_TYPE_NULL: {
683
	    dt->been_outed = out_sh_type ( f_floating ( dt->data.f_var ) ) ;
712
	    fprintf(dg_file, "%d", STAB_VOID);
684
	    fprintf ( dg_file, "%ld", dt->been_outed ) ;
713
	    last_type_sz = 0;
685
	    break ;
714
	    break;
686
	}
715
	}
687
 
716
 
688
	case DIAG_TYPE_NULL : {
717
	case DIAG_TYPE_BITFIELD: {
-
 
718
	    long sz = dt->data.bitfield.no_of_bits.nat_val.small_nat;
689
	    fprintf ( dg_file, "%d", STAB_VOID ) ;
719
	    fprintf(dg_file, "%d", STAB_SLONG);
690
	    last_type_sz = 0 ;
720
	    last_type_sz = sz;
691
	    break ;
721
	    break;
692
	}
722
	}
693
 
723
 
694
	case DIAG_TYPE_BITFIELD : {
-
 
695
	    long sz = dt->data.bitfield.no_of_bits.nat_val.small_nat ;
-
 
696
	    fprintf ( dg_file, "%d", STAB_SLONG ) ;
-
 
697
	    last_type_sz = sz ;
-
 
698
	    break ;
-
 
699
	}
-
 
700
 
-
 
701
	case DIAG_TYPE_ENUM : {
724
	case DIAG_TYPE_ENUM: {
702
	    int i ;
725
	    int i;
703
	    enum_values_list enumvals = dt->data.t_enum.values;
726
	    enum_values_list enumvals = dt->data.t_enum.values;
704
	    long non = next_typen () ;
727
	    long non = next_typen();
705
	    dt->been_outed = non ;
728
	    dt->been_outed = non;
706
	    fprintf ( dg_file, "%ld=e", non ) ;
729
	    fprintf(dg_file, "%ld=e", non);
707
	    for ( i = enumvals->lastused - 1 ; i >= 0 ; i-- ) {
730
	    for (i = enumvals->lastused - 1; i >= 0; i--) {
708
		enum_values ef =  ( enumvals->array ) [i] ;
731
		enum_values ef = (enumvals->array)[i];
709
		fprintf ( dg_file, "%s:%d,", ef->nme.ints.chars, no ( ef->val ) );
732
		fprintf(dg_file, "%s:%d,", ef->nme.ints.chars, no(ef->val));
710
	    }
733
	    }
711
	    fprintf ( dg_file, ";" ) ;
734
	    fprintf(dg_file, ";");
712
	    last_type_sz = 32 ;
735
	    last_type_sz = 32;
713
	    set_stab_size ( non ) ;
736
	    set_stab_size(non);
714
	    break ;
737
	    break;
715
	}
738
	}
716
 
739
 
717
	default : {
740
	default : {
718
	    fprintf ( dg_file, "%d", STAB_VOID ) ;
741
	    fprintf(dg_file, "%d", STAB_VOID);
719
	    last_type_sz = 0 ;
742
	    last_type_sz = 0;
720
	    break ;
743
	    break;
721
	}
744
	}
722
    }
745
    }
723
    return ;
746
    return;
724
}
747
}
725
 
748
 
726
 
749
 
727
/*
750
/*
728
    OUTPUT DIAGNOSTICS FOR A GLOBAL VARIABLE
751
    OUTPUT DIAGNOSTICS FOR A GLOBAL VARIABLE
729
*/
752
*/
730
 
753
 
731
void diag_val_begin
754
void diag_val_begin
732
    PROTO_N ( (d, global, cname, pname) )
-
 
733
    PROTO_T ( diag_global * d X int global X int cname X char * pname )
755
(diag_global * d, int global, int cname, char * pname)
734
{
756
{
735
  stabd ( find_file ( d->data.id.whence.file->file.ints.chars ),
757
  stabd(find_file(d->data.id.whence.file->file.ints.chars),
736
	 ( long ) d->data.id.whence.line_no.nat_val.small_nat
758
	(long)d->data.id.whence.line_no.nat_val.small_nat
737
	 , -N_DSLINE ) ;
759
	 , -N_DSLINE);
738
 
760
 
739
  fprintf ( dg_file, "\t.stabs\t\"%s:%c",
761
  fprintf(dg_file, "\t.stabs\t\"%s:%c",
740
	d->data.id.nme.ints.chars, (global ? 'G' : 'S'));
762
	d->data.id.nme.ints.chars,(global ? 'G' : 'S'));
741
  OUT_DT_SHAPE ( d->data.id.new_type ) ;
763
  OUT_DT_SHAPE(d->data.id.new_type);
742
  if (global)
764
  if (global)
743
    fprintf ( dg_file, "\",0x20,0,%d,0\n",
765
    fprintf(dg_file, "\",0x20,0,%d,0\n",
744
	d->data.id.whence.line_no.nat_val.small_nat);
766
	d->data.id.whence.line_no.nat_val.small_nat);
745
  else {
767
  else {
746
    fprintf ( dg_file, "\",0x28,0,%d,",
768
    fprintf(dg_file, "\",0x28,0,%d,",
747
	d->data.id.whence.line_no.nat_val.small_nat);
769
	d->data.id.whence.line_no.nat_val.small_nat);
748
    if (cname == -1) {
770
    if (cname == -1) {
749
      outs (pname);
771
      outs(pname);
750
    }
772
    }
751
    else {
773
    else {
752
      outs(local_prefix);
774
      outs(local_prefix);
753
      outn ((long)cname);
775
      outn((long)cname);
754
    };
776
    };
755
    outnl ();
777
    outnl();
756
  };
778
  };
757
  return ;
779
  return;
758
}
780
}
759
 
781
 
760
void diag_val_end
782
void diag_val_end
761
    PROTO_N ( (d) )
-
 
762
    PROTO_T ( diag_global * d )
783
(diag_global * d)
763
{
784
{
764
  UNUSED(d);
785
  UNUSED(d);
765
  return;
786
  return;
766
}
787
}
767
 
788
 
768
 
789
 
769
/*
790
/*
770
    OUTPUT DIAGNOSTICS FOR A PROCEDURE
791
    OUTPUT DIAGNOSTICS FOR A PROCEDURE
771
*/
792
*/
772
 
793
 
773
void diag_proc_begin
794
void diag_proc_begin
774
    PROTO_N ( (d, global, cname, pname) )
-
 
775
    PROTO_T ( diag_global * d X int global X int cname X char * pname )
795
(diag_global * d, int global, int cname, char * pname)
776
{
796
{
777
  last_proc_pname = pname;
797
  last_proc_pname = pname;
778
  last_proc_cname = cname;
798
  last_proc_cname = cname;
779
  in_proc = 1;
799
  in_proc = 1;
780
  if (!d)
800
  if (!d)
781
    return;
801
    return;
782
 
802
 
783
  stabd ( find_file ( d->data.id.whence.file->file.ints.chars ),
803
  stabd(find_file(d->data.id.whence.file->file.ints.chars),
784
	 ( long ) d->data.id.whence.line_no.nat_val.small_nat
804
	(long)d->data.id.whence.line_no.nat_val.small_nat
785
	 ,0) ;
805
	 ,0);
786
 
806
 
787
  outs ("\t.stabs\t\"");
807
  outs("\t.stabs\t\"");
788
  outs (d->data.id.nme.ints.chars);
808
  outs(d->data.id.nme.ints.chars);
789
  if (global)
809
  if (global)
790
    outs (":F");
810
    outs(":F");
791
  else
811
  else
792
    outs (":f");
812
    outs(":f");
793
  OUT_DT_SHAPE ( d->data.id.new_type->data.proc.result_type ) ;
813
  OUT_DT_SHAPE(d->data.id.new_type->data.proc.result_type);
794
  outs ("\",0x24,0,0,");
814
  outs("\",0x24,0,0,");
795
  out_procname ();
815
  out_procname();
796
  outnl ();
816
  outnl();
797
  return ;
817
  return;
798
}
818
}
799
 
819
 
800
void diag_proc_end
820
void diag_proc_end
801
    PROTO_N ( (d) )
-
 
802
    PROTO_T ( diag_global * d )
821
(diag_global * d)
803
{
822
{
804
  UNUSED(d);
823
  UNUSED(d);
805
  in_proc = 0;
824
  in_proc = 0;
806
  return;
825
  return;
807
}
826
}
Line 811... Line 830...
811
/*
830
/*
812
    OUTPUT DIAGNOSTICS FOR A LOCAL VARIABLE
831
    OUTPUT DIAGNOSTICS FOR A LOCAL VARIABLE
813
*/
832
*/
814
 
833
 
815
static void stab_local
834
static void stab_local
816
    PROTO_N ( (d, proc_no, acc) )
-
 
817
    PROTO_T ( diag_info * d X int proc_no X exp acc )
835
(diag_info * d, int proc_no, exp acc)
818
{
836
{
819
  int p, param_dec;
837
  int p, param_dec;
820
#ifdef NEWDIAGS
838
#ifdef NEWDIAGS
821
  long acc_type;
839
  long acc_type;
822
  if (name(acc) == name_tag) {
840
  if (name(acc) == name_tag) {
823
    acc_type = ptno(son(acc));
841
    acc_type = ptno(son(acc));
824
    if (no_frame && acc_type != reg_pl)
842
    if (no_frame && acc_type != reg_pl)
825
      return;
843
      return;
826
  }
844
  }
827
  if (name(acc) != name_tag) {
845
  if (name(acc)!= name_tag) {
828
    fprintf ( dg_file, "\t.stabs\t\"%s=i\",0x80,0,0,%d\n",
846
    fprintf(dg_file, "\t.stabs\t\"%s=i\",0x80,0,0,%d\n",
829
	d -> data.id_scope.nme.ints.chars, no(acc) );
847
	d -> data.id_scope.nme.ints.chars, no(acc));
830
  }
848
  }
831
  else
849
  else
832
  if (acc_type == reg_pl) {
850
  if (acc_type == reg_pl) {
833
    fprintf ( dg_file, "\t.stabs\t\"%s:r",
851
    fprintf(dg_file, "\t.stabs\t\"%s:r",
834
	d -> data.id_scope.nme.ints.chars );
852
	d -> data.id_scope.nme.ints.chars);
835
    OUT_DT_SHAPE ( d -> data.id_scope.typ ) ;
853
    OUT_DT_SHAPE(d -> data.id_scope.typ);
836
    fprintf ( dg_file, "\",0x40,0,0,%d\n",
854
    fprintf(dg_file, "\",0x40,0,0,%d\n",
837
		reg_stabno [get_reg_no (no(son(acc)))]);
855
		reg_stabno[get_reg_no(no(son(acc)))]);
838
  }
856
  }
839
  else
857
  else
840
#endif
858
#endif
841
  {
859
  {
842
    p = (no(acc) + no(son(acc))) / 8;
860
    p = (no(acc) + no(son(acc))) / 8;
843
    param_dec = isparam(son(acc));
861
    param_dec = isparam(son(acc));
844
 
862
 
845
    fprintf ( dg_file, "\t.stabs\t\"%s:",
863
    fprintf(dg_file, "\t.stabs\t\"%s:",
846
	d -> data.id_scope.nme.ints.chars );
864
	d -> data.id_scope.nme.ints.chars);
847
    OUT_DT_SHAPE ( d -> data.id_scope.typ ) ;
865
    OUT_DT_SHAPE(d -> data.id_scope.typ);
848
    fprintf ( dg_file, "\",0x80,0,%d,",
866
    fprintf(dg_file, "\",0x80,0,%d,",
849
	0 /* or line number? */ );
867
	0 /* or line number? */ );
850
    if (param_dec)
868
    if (param_dec)
851
      fprintf ( dg_file, "%d\n", p+8);
869
      fprintf(dg_file, "%d\n", p+8);
852
    else
870
    else
853
      fprintf ( dg_file, "%d-%sdisp%d\n", p, local_prefix, proc_no);
871
      fprintf(dg_file, "%d-%sdisp%d\n", p, local_prefix, proc_no);
854
  }
872
  }
855
  return ;
873
  return;
856
}
874
}
857
 
875
 
858
 
876
 
859
 
877
 
860
/*
878
/*
861
    DEAL WITH BASIC TYPES
879
    DEAL WITH BASIC TYPES
862
*/
880
*/
863
 
881
 
864
static void stab_types
882
static void stab_types
865
    PROTO_Z ()
883
(void)
866
{
884
{
867
    total_type_sizes = NO_STABS ;
885
    total_type_sizes = NO_STABS;
868
    typeno = NO_STABS ;
886
    typeno = NO_STABS;
869
    type_sizes = ( long * ) xmalloc ( NO_STABS * sizeof ( long ) ) ;
887
    type_sizes = (long *)xmalloc(NO_STABS * sizeof(long));
870
    fputs ( "\t.stabs\t\"int:t1=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
888
    fputs("\t.stabs\t\"int:t1=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
871
	    dg_file ) ;
889
	    dg_file);
872
    fputs ( "\t.stabs\t\"short int:t2=r1;-32768;32767;\",0x80,0,0,0\n",
890
    fputs("\t.stabs\t\"short int:t2=r1;-32768;32767;\",0x80,0,0,0\n",
873
	    dg_file ) ;
891
	    dg_file);
874
    fputs ( "\t.stabs\t\"short unsigned int:t3=r1;0;65535;\",0x80,0,0,0\n",
892
    fputs("\t.stabs\t\"short unsigned int:t3=r1;0;65535;\",0x80,0,0,0\n",
875
	    dg_file ) ;
893
	    dg_file);
876
    fputs ( "\t.stabs\t\"char:t4=r4;0;127;\",0x80,0,0,0\n",
894
    fputs("\t.stabs\t\"char:t4=r4;0;127;\",0x80,0,0,0\n",
877
	    dg_file ) ;
895
	    dg_file);
878
    fputs ( "\t.stabs\t\"signed char:t5=r1;-128;127;\",0x80,0,0,0\n",
896
    fputs("\t.stabs\t\"signed char:t5=r1;-128;127;\",0x80,0,0,0\n",
879
	    dg_file ) ;
897
	    dg_file);
880
    fputs ( "\t.stabs\t\"unsigned char:t6=r1;0;255;\",0x80,0,0,0\n",
898
    fputs("\t.stabs\t\"unsigned char:t6=r1;0;255;\",0x80,0,0,0\n",
881
	    dg_file ) ;
899
	    dg_file);
882
    fputs ( "\t.stabs\t\"long int:t7=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
900
    fputs("\t.stabs\t\"long int:t7=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
883
	    dg_file ) ;
901
	    dg_file);
884
    fputs ( "\t.stabs\t\"unsigned int:t8=r1;0;-1;\",0x80,0,0,0\n",
902
    fputs("\t.stabs\t\"unsigned int:t8=r1;0;-1;\",0x80,0,0,0\n",
885
	    dg_file ) ;
903
	    dg_file);
886
    fputs ( "\t.stabs\t\"long unsigned int:t9=r1;0;-1;\",0x80,0,0,0\n",
904
    fputs("\t.stabs\t\"long unsigned int:t9=r1;0;-1;\",0x80,0,0,0\n",
887
	    dg_file ) ;
905
	    dg_file);
888
    fputs ( "\t.stabs\t\"float:t10=r1;4;0;\",0x80,0,0,0\n",
906
    fputs("\t.stabs\t\"float:t10=r1;4;0;\",0x80,0,0,0\n",
889
	    dg_file ) ;
907
	    dg_file);
890
    fputs ( "\t.stabs\t\"double:t11=r1;8;0;\",0x80,0,0,0\n",
908
    fputs("\t.stabs\t\"double:t11=r1;8;0;\",0x80,0,0,0\n",
891
	    dg_file ) ;
909
	    dg_file);
892
    fprintf ( dg_file, "\t.stabs\t\"long double:t12=r1;%d;0;\",0x80,0,0,0\n",
910
    fprintf(dg_file, "\t.stabs\t\"long double:t12=r1;%d;0;\",0x80,0,0,0\n",
893
	      DOUBLE_SZ / 8 ) ;
911
	      DOUBLE_SZ / 8);
894
    fputs ( "\t.stabs\t\"void:t13=13\",0x80,0,0,0\n",
912
    fputs("\t.stabs\t\"void:t13=13\",0x80,0,0,0\n",
895
	    dg_file ) ;
913
	    dg_file);
896
    fputs ( "\t.stabs\t\"long long int:t14=r1;", dg_file ) ;
914
    fputs("\t.stabs\t\"long long int:t14=r1;", dg_file);
897
    fputs ( "01000000000000000000000;0777777777777777777777;\",0x80,0,0,0\n",
915
    fputs("01000000000000000000000;0777777777777777777777;\",0x80,0,0,0\n",
898
	    dg_file ) ;
916
	    dg_file);
899
    fputs ( "\t.stabs\t\"unsigned long long int:t15=r1;", dg_file ) ;
917
    fputs("\t.stabs\t\"unsigned long long int:t15=r1;", dg_file);
900
    fputs ( "0000000000000;01777777777777777777777;\",0x80,0,0,0\n",
918
    fputs("0000000000000;01777777777777777777777;\",0x80,0,0,0\n",
901
	    dg_file ) ;
919
	    dg_file);
902
    type_sizes [0] = 0 ;
920
    type_sizes[0] = 0;
903
    type_sizes [1] = 32 ;
921
    type_sizes[1] = 32;
904
    type_sizes [2] = 16 ;
922
    type_sizes[2] = 16;
905
    type_sizes [3] = 16 ;
923
    type_sizes[3] = 16;
906
    type_sizes [4] = 8 ;
924
    type_sizes[4] = 8;
907
    type_sizes [5] = 8 ;
925
    type_sizes[5] = 8;
908
    type_sizes [6] = 8 ;
926
    type_sizes[6] = 8;
909
    type_sizes [7] = 32 ;
927
    type_sizes[7] = 32;
910
    type_sizes [8] = 32 ;
928
    type_sizes[8] = 32;
911
    type_sizes [9] = 32 ;
929
    type_sizes[9] = 32;
912
    type_sizes [10] = 32 ;
930
    type_sizes[10] = 32;
913
    type_sizes [11] = 64 ;
931
    type_sizes[11] = 64;
914
    type_sizes [12] = DOUBLE_SZ ;
932
    type_sizes[12] = DOUBLE_SZ;
915
    type_sizes [13] = 0 ;
933
    type_sizes[13] = 0;
916
    type_sizes [14] = 64 ;
934
    type_sizes[14] = 64;
917
    type_sizes [15] = 64 ;
935
    type_sizes[15] = 64;
918
    return ;
936
    return;
919
}
937
}
920
 
938
 
921
 
939
 
922
/*
940
/*
923
    DEAL WITH STRUCTURE, UNION AND ENUM TAGS
941
    DEAL WITH STRUCTURE, UNION AND ENUM TAGS
924
*/
942
*/
925
 
943
 
926
void stab_tagdefs
944
void stab_tagdefs
927
    PROTO_Z ()
945
(void)
928
{
946
{
929
    diag_tagdef **di = unit_ind_diagtags ;
947
    diag_tagdef **di = unit_ind_diagtags;
930
    int i, n = unit_no_of_diagtags, istag ;
948
    int i, n = unit_no_of_diagtags, istag;
931
 
949
 
932
    for ( i = 0 ; i < n ; i++ ) {
950
    for (i = 0; i < n; i++) {
933
	diag_type d = di [i]->d_type ;
951
	diag_type d = di[i] ->d_type;
934
	istag = 1;
952
	istag = 1;
935
 
953
 
936
	switch ( d->key ) {
954
	switch (d->key) {
937
 
955
 
938
	    case DIAG_TYPE_STRUCT : {
956
	    case DIAG_TYPE_STRUCT: {
939
		char *nme = d->data.t_struct.nme.ints.chars ;
957
		char *nme = d->data.t_struct.nme.ints.chars;
940
		if ( nme && *nme ) {
958
		if (nme && *nme) {
941
		    fprintf ( dg_file, "\t.stabs\t\"%s:", nme ) ;
959
		    fprintf(dg_file, "\t.stabs\t\"%s:", nme);
942
		} else {
960
		} else {
943
		    static int s_count = 0 ;
961
		    static int s_count = 0;
944
		    fprintf ( dg_file, "\t.stabs\t\"_struct%d:", s_count++ ) ;
962
		    fprintf(dg_file, "\t.stabs\t\"_struct%d:", s_count++);
945
		}
963
		}
946
		break ;
964
		break;
947
	    }
965
	    }
948
	    case DIAG_TYPE_UNION : {
966
	    case DIAG_TYPE_UNION: {
949
		char *nme = d->data.t_union.nme.ints.chars ;
967
		char *nme = d->data.t_union.nme.ints.chars;
950
		if ( nme && *nme ) {
968
		if (nme && *nme) {
951
		    fprintf ( dg_file, "\t.stabs\t\"%s:", nme ) ;
969
		    fprintf(dg_file, "\t.stabs\t\"%s:", nme);
952
		} else {
970
		} else {
953
		    static int u_count = 0 ;
971
		    static int u_count = 0;
954
		    fprintf ( dg_file, "\t.stabs\t\"_union%d:", u_count++ ) ;
972
		    fprintf(dg_file, "\t.stabs\t\"_union%d:", u_count++);
955
		}
973
		}
956
		break ;
974
		break;
957
	    }
975
	    }
958
	    case DIAG_TYPE_ENUM : {
976
	    case DIAG_TYPE_ENUM: {
959
		char *nme = d->data.t_enum.nme.ints.chars ;
977
		char *nme = d->data.t_enum.nme.ints.chars;
960
		if ( nme && *nme ) {
978
		if (nme && *nme) {
961
		    fprintf ( dg_file, "\t.stabs\t\"%s:", nme ) ;
979
		    fprintf(dg_file, "\t.stabs\t\"%s:", nme);
962
		} else {
980
		} else {
963
		    static int e_count = 0 ;
981
		    static int e_count = 0;
964
		    fprintf ( dg_file, "\t.stabs\t\"_enum%d:", e_count++ ) ;
982
		    fprintf(dg_file, "\t.stabs\t\"_enum%d:", e_count++);
965
		}
983
		}
966
		break ;
984
		break;
967
	    }
985
	    }
968
	    default: {
986
	    default: {
969
		istag = 0 ;
987
		istag = 0;
970
		break ;
988
		break;
971
	    }
989
	    }
972
	}
990
	}
973
	if (istag) {
991
	if (istag) {
974
	    if ( d->been_outed && 0) {
992
	    if (d->been_outed && 0) {
975
		fprintf ( dg_file, "%d", (int)d->been_outed ) ;
993
		fprintf(dg_file, "%d",(int)d->been_outed);
976
	    } else {
994
	    } else {
977
		fprintf ( dg_file, "T" ) ;
995
		fprintf(dg_file, "T");
978
		OUT_DT_SHAPE ( d ) ;
996
		OUT_DT_SHAPE(d);
979
	    }
997
	    }
980
	    fprintf ( dg_file, "\",0x80,0,0,0\n" ) ;
998
	    fprintf(dg_file, "\",0x80,0,0,0\n");
981
	}
999
	}
982
    }
1000
    }
983
    return ;
1001
    return;
984
}
1002
}
985
 
1003
 
986
 
1004
 
987
/*
1005
/*
988
    DEAL WITH TYPEDEFS
1006
    DEAL WITH TYPEDEFS
989
*/
1007
*/
990
 
1008
 
991
void stab_typedefs
1009
void stab_typedefs
992
    PROTO_Z ()
1010
(void)
993
{
1011
{
994
    diag_descriptor *di = unit_diagvar_tab.array ;
1012
    diag_descriptor *di = unit_diagvar_tab.array;
995
    int i, n = unit_diagvar_tab.lastused ;
1013
    int i, n = unit_diagvar_tab.lastused;
996
    for ( i = 0 ; i < n ; i++ ) {
1014
    for (i = 0; i < n; i++) {
997
	if ( di [i].key == DIAG_TYPEDEF_KEY ) {
1015
	if (di[i].key == DIAG_TYPEDEF_KEY) {
998
	    long non = next_typen () ;
1016
	    long non = next_typen();
999
	    fprintf ( dg_file, "\t.stabs\t\"%s:t%ld=",
1017
	    fprintf(dg_file, "\t.stabs\t\"%s:t%ld=",
1000
		      di [i].data.typ.nme.ints.chars, non ) ;
1018
		      di[i].data.typ.nme.ints.chars, non);
1001
	    OUT_DT_SHAPE ( di [i].data.typ.new_type ) ;
1019
	    OUT_DT_SHAPE(di[i].data.typ.new_type);
1002
	    fprintf ( dg_file, "\",0x80,0,0,0\n" ) ;
1020
	    fprintf(dg_file, "\",0x80,0,0,0\n");
1003
	}
1021
	}
1004
    }
1022
    }
1005
    return ;
1023
    return;
1006
}
1024
}