Subversion Repositories tendra.SVN

Rev

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

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