Subversion Repositories tendra.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 7u83 1
/*
2
    		 Crown Copyright (c) 1997
3
 
4
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
6
    acting through the Defence Evaluation and Research Agency
7
    (DERA).  It is made available to Recipients with a
8
    royalty-free licence for its use, reproduction, transfer
9
    to other parties and amendment for any purpose not excluding
10
    product development provided that any such use et cetera
11
    shall be deemed to be acceptance of the following conditions:-
12
 
13
        (1) Its Recipients shall ensure that this Notice is
14
        reproduced upon any copies or amended versions of it;
15
 
16
        (2) Any amended version of it shall be clearly marked to
17
        show both the nature of and the organisation responsible
18
        for the relevant amendment or amendments;
19
 
20
        (3) Its onward transfer from a recipient to another
21
        party shall be deemed to be that party's acceptance of
22
        these conditions;
23
 
24
        (4) DERA gives no warranty or assurance as to its
25
        quality or suitability for any purpose and DERA accepts
26
        no liability whatsoever in relation to any use to which
27
        it may be put.
28
*/
29
 
30
 
31
 
32
 
33
/*
34
			    VERSION INFORMATION
35
			    ===================
36
 
37
--------------------------------------------------------------------------
38
$Header: /u/g/release/CVSROOT/Source/src/installers/sparc/sunos/sparcdiags.c,v 1.1.1.1 1998/01/17 15:55:56 release Exp $
39
--------------------------------------------------------------------------
40
$Log: sparcdiags.c,v $
41
 * Revision 1.1.1.1  1998/01/17  15:55:56  release
42
 * First version to be checked into rolling release.
43
 *
44
 * Revision 1.3  1997/04/04  15:23:59  pwe
45
 * tidy re old DWARF interface
46
 *
47
 * Revision 1.2  1997/04/01  17:18:04  pwe
48
 * diagnose pl_tests
49
 *
50
 * Revision 1.1  1997/03/24  17:10:19  pwe
51
 * reorganise solaris/sunos split
52
 *
53
 * Revision 1.11  1997/02/18  11:48:22  pwe
54
 * NEWDIAGS for debugging optimised code
55
 *
56
 * Revision 1.10  1996/09/10  14:36:55  pwe
57
 * fix diags - nested scope, param struct and leaf return
58
 *
59
 * Revision 1.9  1996/09/09  08:39:55  pwe
60
 * correct stabs enums
61
 *
62
 * Revision 1.8  1995/12/15  10:27:23  john
63
 * Fixed error in previous fix
64
 *
65
 * Revision 1.7  1995/11/23  15:21:31  john
66
 * Fix for diagnostics (nested structures)
67
 *
68
 * Revision 1.6  1995/07/03  09:30:13  john
69
 * Fixed error
70
 *
71
 * Revision 1.5  1995/06/29  08:20:22  john
72
 * Reformatting
73
 *
74
 * Revision 1.4  1995/06/27  08:47:38  john
75
 * Some reformatting
76
 *
77
 * Revision 1.3  1995/04/20  08:06:36  john
78
 * Minor change
79
 *
80
 * Revision 1.2  1995/03/27  12:50:40  john
81
 * Fix for c-style varargs handling
82
 *
83
 * Revision 1.1.1.1  1995/03/13  10:18:56  john
84
 * Entered into CVS
85
 *
86
 * Revision 1.7  1995/01/11  16:40:35  john
87
 * Fixed bug in diagnostics (for change request CR95_40)
88
 *
89
 * Revision 1.6  1995/01/11  09:59:32  john
90
 * Fixed bug in diagnostics (for change request CR94_224)
91
 *
92
 * Revision 1.5  1994/07/07  16:11:33  djch
93
 * Jul94 tape
94
 *
95
 * Revision 1.4  1994/07/04  08:29:06  djch
96
 * added extra parameter to stabd (section number). -ve values used to control
97
 * not putting out stabd (sometimes) in solaris; line #s go in the stabs.
98
 * added assert(0) to catch uninitialized items.
99
 *
100
 * Revision 1.3  1994/06/22  09:48:33  djch
101
 * Changes for solaris - line #s in functions are relative to start of fns,
102
 * global decls have line # in the stabs, and no stabn, and local labels are .LL,
103
 * not LL
104
 *
105
 * Revision 1.2  1994/05/13  13:08:39  djch
106
 * Incorporates improvements from expt version
107
 * changed format strings to remove longs..
108
 *
109
 * Revision 1.1  1994/05/03  14:49:53  djch
110
 * Initial revision
111
 *
112
 * Revision 1.6  93/09/27  14:55:15  14:55:15  ra (Robert Andrews)
113
 * Only whitespace.
114
 * 
115
 * Revision 1.5  93/08/27  11:37:55  11:37:55  ra (Robert Andrews)
116
 * A couple of lint-like changes.
117
 * 
118
 * Revision 1.4  93/08/13  14:45:51  14:45:51  ra (Robert Andrews)
119
 * Allow the stabs for long double to vary depending on DOUBLE_SZ.
120
 * 
121
 * Revision 1.3  93/07/05  18:26:29  18:26:29  ra (Robert Andrews)
122
 * A couple of minor corrections.  Introduced stab_ptrs to avoid duplication
123
 * of basic pointer types.
124
 * 
125
 * Revision 1.2  93/06/29  14:32:54  14:32:54  ra (Robert Andrews)
126
 * Fairly major rewrite and reformat.  There were a number of errors which
127
 * meant that the diagnostics were not previously working.
128
 * 
129
 * Revision 1.1  93/06/24  14:59:22  14:59:22  ra (Robert Andrews)
130
 * Initial revision
131
 * 
132
--------------------------------------------------------------------------
133
*/
134
 
135
 
136
#define SPARCTRANS_CODE
137
#include "config.h"
138
#include "addrtypes.h"
139
#include "exptypes.h"
140
#include "shapemacs.h"
141
#include "expmacs.h"
142
#include "codetypes.h"
143
#include "installtypes.h"
144
#include "toktypes.h"
145
#include "exp.h"
146
#include "exptypes.h"
147
#include "proctypes.h"
148
#include "procrec.h"
149
#include "tags.h"
150
#include "bitsmacs.h"
151
#include "diagtypes.h"
152
#include "xalloc.h"
153
#include "diag_fns.h"
154
#include "locate.h"
155
#include "diagglob.h"
156
#include "mark_scope.h"
157
#include "xalloc.h"
158
#include "comment.h"
159
#include "myassert.h"
160
#include "translat.h"
161
#include "machine.h"
162
#include "szs_als.h"
163
#include "install_fns.h"
164
#include "installglob.h"
165
#include "externs.h"
166
#include "out.h"
167
#include "sparcdiags.h"
168
extern bool last_param PROTO_S ( ( exp ) ) ;
169
 
170
 
171
/*
172
  FORWARD DECLARATIONS
173
*/
174
 
175
static long stab_scope_open PROTO_S ( ( long ) ) ;
176
static void stab_scope_close PROTO_S ( ( long ) ) ;
177
static void ready_scope PROTO_S ( ( void ) );
178
 
179
 
180
	/* label number sequence independent from text code */
181
static int diag_lab_no = 0;
182
 
183
static int next_d_lab
184
    PROTO_Z ()
185
{
186
  return ++diag_lab_no;
187
}
188
 
189
 
190
/*
191
  DIAGNOSTICS FILE
192
*/
193
 
194
static FILE *dg_file ;
195
static char *dg_file_name ;
196
 
197
 
198
/*
199
  BASIC TYPE NUMBERS
200
*/
201
 
202
#define STAB_SCHAR	4
203
#define STAB_UCHAR	6
204
#define STAB_SSHRT	2
205
#define STAB_USHRT	3
206
#define STAB_SLONG	1
207
#define STAB_ULONG	8
208
#define STAB_FLOAT	10
209
#define STAB_DBL	11
210
#define STAB_LDBL	12
211
#define STAB_VOID	13
212
#define NO_STABS	14
213
 
214
 
215
/*
216
  BASIC POINTERS
217
*/
218
 
219
static long stab_ptrs [ NO_STABS ] = {
220
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
221
} ;
222
 
223
 
224
/*
225
  CURRENT TYPE NUMBER
226
*/
227
 
228
static long typeno ;
229
 
230
 
231
/*
232
  SIZE OF LAST STAB TYPE OUTPUT
233
*/
234
 
235
static long last_type_sz = 0 ;
236
 
237
 
238
/*
239
  CURRENT LINE NUMBER AND FILE NUMBER
240
*/
241
 
242
long currentlno = -1 ;
243
long currentfile = -1 ;
244
 
245
 
246
/*
247
  ARRAY OF TYPE SIZES
248
*/
249
 
250
static long *type_sizes ;
251
static int total_type_sizes = 0 ;
252
 
253
 
254
/*
255
  SETTING AND GETTING TYPE SIZES
256
*/
257
 
258
#define set_stab_size( i )	type_sizes [ ( i ) ] = last_type_sz
259
#define get_stab_size( i )	( type_sizes [ ( i ) ] )
260
 
261
 
262
/*
263
  GET THE NEXT TYPE NUMBER
264
*/
265
 
266
static long next_typen 
267
    PROTO_Z ()
268
{
269
  if ( typeno >= total_type_sizes ) {
270
    int i, n = total_type_sizes, m = n + 100 ;
271
    type_sizes = ( long * ) xrealloc ( type_sizes, m * sizeof ( long ) ) ;
272
    for ( i = n ; i < m ; i++ ) type_sizes [i] = 0 ;
273
    total_type_sizes = m ;
274
  }
275
  return ( typeno++ ) ;
276
}
277
 
278
 
279
/*
280
    ARRAY OF FILE DESCRIPTORS
281
*/
282
 
283
static filename *fds = null ;
284
static int szfds = 0 ;
285
static int nofds = 0 ;
286
 
287
 
288
/*
289
  ADD A NEW FILE TO THE ARRAY OF FILE DESCRIPTORS
290
*/
291
 
292
void stab_collect_files 
293
    PROTO_N ( ( f ) )
294
    PROTO_T ( filename f )
295
{
296
  if ( fds == null ) {
297
    szfds += 10 ;
298
    fds = ( filename * ) xmalloc ( szfds * sizeof ( filename ) ) ;
299
  } 
300
  else if ( nofds >= szfds ) {
301
    szfds += 10 ;
302
    fds = ( filename * ) xrealloc ( fds, szfds * sizeof ( filename ) ) ;
303
  }
304
  fds [ nofds++ ] = f ;
305
  return ;
306
}
307
 
308
 
309
/*
310
  FIND THE FILE DESCRIPTOR CORRESPONDING TO A FILE NAME
311
*/
312
 
313
static long find_file 
314
    PROTO_N ( ( f ) )
315
    PROTO_T ( char * f )
316
{
317
  long i ;
318
  for ( i = 0 ; i < nofds ; i++ ) {
319
    if ( strcmp ( f, fds [i]->file.ints.chars ) == 0 ) return ( i ) ;
320
  }
321
  return ( 0 ) ;
322
}
323
 
324
 
325
 
326
/*
327
  OUTPUT A FILE POSITION CONSTRUCT
328
*/
329
 
330
#define N_SLINE 0x44
331
#define N_DSLINE 0x46
332
#define N_BSLINE 0x48
333
 
334
void stabd 
335
    PROTO_N ( ( findex, lno, seg ) )
336
    PROTO_T ( long findex X long lno X int seg )
337
{
338
  long i ;
339
  if ( findex == currentfile && lno == currentlno ) return ;
340
  stab_file ( findex, 1 ) ;
341
 
342
  if (seg != 0){		/* 0 suppresses always */
343
 
344
    if (seg > 0)	/* -ve line nos are put out in the stabs */
345
      {
346
	i = next_d_lab () ;
347
	fprintf ( dg_file, "\t.stabn\t0x%x,0,%ld,LL.%ld\n",seg, lno, i ) ;
348
	fprintf ( dg_file, "LL.%ld:\n", i ) ;
349
      }
350
  }
351
  currentlno = lno ;
352
  return ;
353
}
354
 
355
 
356
#ifdef NEWDIAGS
357
/*
358
    OUTPUT DIAGNOSTICS SURROUNDING CODE
359
*/
360
 
361
void code_diag_info (d, proc_no, mcode, args)
362
diag_info * d;
363
int proc_no;
364
void (*mcode)();
365
void * args;
366
{
367
  if (d == nildiag) {
368
    (*mcode)(args);
369
    return;
370
  }
371
  switch (d->key) {
372
    case DIAG_INFO_SCOPE: {
373
	stab_scope_open ( currentfile ) ;
374
	stabd ( currentfile, ( long ) ( currentlno + 1 ), N_SLINE ) ;
375
	code_diag_info (d->more, proc_no, mcode, args);
376
	stab_scope_close ( currentfile ) ;
377
	return;
378
    }
379
    case DIAG_INFO_SOURCE: {
380
	sourcemark *s = &d->data.source.beg ;
381
	long f = find_file ( s->file->file.ints.chars ) ;
382
	ready_scope () ;
383
	stabd ( f, ( long ) s->line_no.nat_val.small_nat ,N_SLINE) ;
384
	code_diag_info (d->more, proc_no, mcode, args);
385
	s = &d->data.source.end ;
386
	f = find_file ( s->file->file.ints.chars ) ;
387
	stabd ( f, ( long ) s->line_no.nat_val.small_nat ,N_SLINE) ;
388
	return;
389
    }
390
    case DIAG_INFO_ID: {
391
	exp acc = d -> data.id_scope.access;
392
	if (name(acc) != hold_tag)
393
	  fail("not hold_tag");
394
	acc = son(acc);
395
	if (name(acc) == cont_tag && name(son(acc)) == name_tag && isvar(son(son(acc))))
396
	  acc = son(acc);
397
	if ( name(acc) == name_tag && !isdiscarded(acc) && !isglob(son(acc)) ) {
398
	  stab_local ( d->data.id_scope.nme.ints.chars, d->data.id_scope.typ,
399
	       acc, 0, currentfile ) ;
400
 
401
	  if ( last_param ( son ( acc ) ) ) {
402
	    stabd ( currentfile, ( long ) ( currentlno + 1 ),N_SLINE) ;
403
	  }
404
	}
405
	else if ( name(acc) == val_tag ) {
406
	  ; /* should be able to do something with val_tag */
407
	}
408
	code_diag_info (d->more, proc_no, mcode, args);
409
    }
410
  };
411
  return;
412
}
413
 
414
 
415
#else
416
 
417
/*
418
  OUTPUT INITIAL DIAGNOSTICS FOR A DIAGNOSE_TAG
419
*/
420
 
421
void stab_begin 
422
    PROTO_N ( ( d, proc_no, e ) )
423
    PROTO_T ( diag_info * d X int proc_no X exp e )
424
{
425
  exp x ;
426
 
427
  if ( d->key == DIAG_INFO_SOURCE ) {
428
    sourcemark *s = &d->data.source.beg ;
429
    long f = find_file ( s->file->file.ints.chars ) ;
430
    ready_scope () ;
431
    stabd ( f, ( long ) s->line_no.nat_val.small_nat ,N_SLINE) ;
432
    return ;
433
  }
434
 
435
  if ( d->key != DIAG_INFO_ID ) {
436
    /* not implemented */
437
    return ;
438
  }
439
 
440
  x = d->data.id_scope.access ;
441
  /* MIPS */
442
  if ( isglob ( son ( x ) ) || no ( son ( x ) ) == 1 ) return;
443
 
444
  mark_scope ( e ) ;
445
  if ( props ( e ) & 0x80 ) {
446
    ( void ) stab_scope_open ( currentfile ) ;
447
    stabd ( currentfile, ( long ) ( currentlno + 1 ), N_SLINE ) ;
448
  }
449
 
450
  stab_local ( d->data.id_scope.nme.ints.chars, d->data.id_scope.typ,
451
	       x, 0, currentfile ) ;
452
 
453
  if ( last_param ( son ( x ) ) ) {
454
    stabd ( currentfile, ( long ) ( currentlno + 1 ),N_SLINE) ;
455
  }
456
  return ;
457
}
458
 
459
 
460
/*
461
  OUTPUT FINAL DIAGNOSTICS FOR A DIAGNOSE_TAG
462
*/
463
 
464
void stab_end 
465
    PROTO_N ( ( d, e ) )
466
    PROTO_T ( diag_info * d X exp e )
467
{
468
  if ( d->key == DIAG_INFO_SOURCE ) {
469
    sourcemark *s = &d->data.source.end ;
470
    long f = find_file ( s->file->file.ints.chars ) ;
471
    long lno = s->line_no.nat_val.small_nat ;
472
    stabd (f,(long)lno,N_SLINE);
473
    return ;
474
  }
475
  if ( d->key == DIAG_INFO_ID && props ( e ) & 0x80 ) {
476
    stab_scope_close ( currentfile ) ;
477
    return ;
478
  }
479
  return ;
480
}
481
#endif
482
 
483
 
484
/*
485
  INITIALISE DIAGNOSTICS
486
*/
487
 
488
void init_stab 
489
    PROTO_Z ()
490
{
491
  dg_file_name = tmpnam ( NULL ) ;
492
  dg_file = fopen ( dg_file_name, "w" ) ;
493
  if ( dg_file == NULL ) {
494
    fail ( "Can't open temporary diagnostics file" ) ;
495
    exit ( EXIT_FAILURE ) ;
496
  }
497
  stab_types () ;
498
  return ;
499
}
500
 
501
 
502
/*
503
  INITIALIZE DIAGNOSTICS
504
*/
505
 
506
void init_stab_aux 
507
    PROTO_Z ()
508
{
509
  int c ;
510
  FILE *f ;
511
  int i, j = 0 ;
512
  for ( i = 0 ; i < nofds ; i++ ) {
513
    char *s = fds [i]->file.ints.chars ;
514
    int n = ( int ) strlen ( s ) ;
515
    if ( n && s [ n - 1 ] != 'h' ) j = i ;
516
  }
517
  fclose ( dg_file ) ;
518
  dg_file = as_file ;
519
  stab_file ( ( long ) j, 0 ) ;
520
  f = fopen ( dg_file_name, "r" ) ;
521
  if ( f == NULL ) {
522
    fail ( "Can't open temporary diagnostics file" ) ;
523
    exit ( EXIT_FAILURE ) ;
524
  }
525
  while ( c = fgetc ( f ), c != EOF ) outc ( c ) ;
526
  fclose ( f ) ;
527
  remove ( dg_file_name ) ;
528
  return ;
529
}
530
 
531
 
532
/*
533
  FIND THE STAB OF A SIMPLE SHAPE
534
*/
535
 
536
static long out_sh_type 
537
    PROTO_N ( ( s ) )
538
    PROTO_T ( shape s )
539
{
540
  last_type_sz = shape_size ( s ) ;
541
  switch ( name ( s ) ) {
542
    case scharhd : return ( STAB_SCHAR ) ;
543
    case ucharhd : return ( STAB_UCHAR ) ;
544
    case swordhd : return ( STAB_SSHRT ) ;
545
    case uwordhd : return ( STAB_USHRT ) ;
546
    case slonghd : return ( STAB_SLONG ) ;
547
    case ulonghd : return ( STAB_ULONG ) ;
548
    case shrealhd : return ( STAB_FLOAT ) ;
549
    case realhd : return ( STAB_DBL ) ;
550
    case doublehd : return ( STAB_LDBL ) ;
551
  }
552
  return ( STAB_VOID ) ;
553
}
554
 
555
 
556
/*
557
  OUTPUT DIAGNOSTICS DIRECTIVE FOR A FILE
558
*/
559
 
560
void stab_file 
561
    PROTO_N ( ( findex, internal ) )
562
    PROTO_T ( long findex X bool internal )
563
{
564
  static long i = 0 ;
565
 
566
  if ( findex == currentfile || findex < 0 || findex >= szfds ) {
567
    return ;
568
  }
569
 
570
  if ( !internal ) {
571
    /* source file */
572
    i = next_d_lab () ;
573
    fprintf ( dg_file, "\t.stabs\t\"%s\",0x64,0,0,LL.%ld\n",
574
	      fds [ findex ]->file.ints.chars, i ) ;
575
    fprintf ( dg_file, "LL.%ld:\n", i ) ;
576
  } 
577
  else {
578
    /* included file */
579
    fprintf ( dg_file, "\t.stabs\t\"%s\",0x84,0,0,LL.%ld\n",
580
	      fds [ findex ]->file.ints.chars, i ) ;
581
    }
582
    currentfile = findex ;
583
    return ;
584
}
585
 
586
 
587
/*
588
  DIAGNOSTIC SCOPES
589
*/
590
 
591
static long open_label = 0 ;
592
static long bracket_level = 1 ;
593
 
594
static void ready_scope 
595
    PROTO_Z ()
596
{
597
  if ( open_label != 0 ) {
598
    fprintf ( dg_file, "\t.stabn\t0xc0,0,%ld,LL.%ld\n",
599
	      bracket_level, open_label ) ;
600
    open_label = 0 ;
601
  }
602
}
603
 
604
 
605
/*
606
  START OF A DIAGNOSTICS SCOPE
607
*/
608
 
609
static long stab_scope_open 
610
    PROTO_N ( ( findex ) )
611
    PROTO_T ( long findex )
612
{
613
  long i ;
614
  stab_file ( findex, 1 ) ;
615
  i = next_d_lab () ;
616
  ready_scope ();
617
  fprintf ( dg_file, "LL.%ld:\n", i ) ;
618
  open_label = i ;
619
  bracket_level++ ;
620
  return ( i ) ;
621
}
622
 
623
 
624
/*
625
  END OF A DIAGNOSTICS SCOPE
626
*/
627
 
628
static void stab_scope_close 
629
    PROTO_N ( ( findex ) )
630
    PROTO_T ( long findex )
631
{
632
  long i ;
633
  bracket_level-- ;
634
  if ( open_label != 0 ) {
635
    ready_scope ();
636
    open_label = 0 ;
637
  }
638
  i = next_d_lab () ;
639
  fprintf ( dg_file, "\t.stabn\t0xe0,0,%ld,LL.%ld\n",
640
	      bracket_level, i ) ;
641
  fprintf ( dg_file, "LL.%ld:\n", i ) ;
642
  return ;
643
}
644
 
645
 
646
/*
647
  DEPTH COUNT FOR STAB TYPES
648
*/
649
 
650
static int max_depth = 64 ;
651
static int depth_now = 0 ;
652
 
653
 
654
/*
655
  OUTPUT A DIAGNOSTICS TYPE
656
*/
657
 
658
#define OUT_DT_SHAPE( dt )	out_dt_shape ( ( depth_now = 0, dt ) )
659
 
660
static void out_dt_shape 
661
    PROTO_N ( ( dt ) )
662
    PROTO_T ( diag_type dt )
663
{
664
  if ( dt->been_outed ) {
665
    fprintf ( dg_file, "%d",(int) dt->been_outed ) ;
666
    last_type_sz = get_stab_size ( dt->been_outed ) ;
667
    return ;
668
  }
669
 
670
  depth_now++ ;
671
 
672
  switch ( dt->key ) {
673
 
674
    case DIAG_TYPE_PTR : {
675
      long non ;
676
      diag_type pdt = dt->data.ptr.object ;
677
      if ( pdt->key == DIAG_TYPE_VARIETY ) {
678
	long pn = out_sh_type ( f_integer ( pdt->data.var ) ) ;
679
	non = stab_ptrs [ pn ] ;
680
	if ( non == 0 ) {
681
	  non = next_typen () ;
682
	  stab_ptrs [ pn ] = non ;
683
	  fprintf ( dg_file, "%ld=*%ld", non, pn ) ;
684
	} 
685
	else {
686
	  fprintf ( dg_file, "%ld", non ) ;
687
	}
688
      } 
689
      else {
690
	non = next_typen () ;
691
	fprintf ( dg_file, "%ld=*", non ) ;
692
	out_dt_shape ( dt->data.ptr.object ) ;
693
      }
694
      dt->been_outed = non ;
695
      last_type_sz = 32 ;
696
      set_stab_size ( non ) ;
697
      break ;
698
    }
699
    case DIAG_TYPE_ARRAY : {
700
      long lwb = no ( dt->data.array.lower_b ) ;
701
      long upb = no ( dt->data.array.upper_b ) ;
702
      diag_type index_type = dt->data.array.index_type ;
703
      diag_type element_type = dt->data.array.element_type ;
704
      long non = next_typen () ;
705
      dt->been_outed = non ;
706
      fprintf ( dg_file, "%ld=", non ) ;
707
      fprintf ( dg_file, "ar" ) ;
708
      out_dt_shape ( index_type ) ;
709
      fprintf ( dg_file, ";%ld;%ld;", lwb, upb ) ;
710
      out_dt_shape ( element_type ) ;
711
      last_type_sz *= ( upb - lwb + 1 ) ;
712
      set_stab_size ( non ) ;
713
      break ;
714
    }
715
 
716
    case DIAG_TYPE_STRUCT :
717
    case DIAG_TYPE_UNION : {
718
      int i ;
719
      char su ;
720
      shape s ;
721
      diag_field_list fields ;
722
      long non = next_typen () ;
723
      dt->been_outed = non ;
724
 
725
      if ( dt->key == DIAG_TYPE_STRUCT ) {
726
	fields = dt->data.t_struct.fields ;
727
	s = dt->data.t_struct.tdf_shape ;
728
	su = 's';
729
      } 
730
      else {
731
	fields = dt->data.t_union.fields ;
732
	s = dt->data.t_union.tdf_shape;
733
	su = 'u' ;
734
      }
735
      fprintf ( dg_file, "%ld=%c%d", non, su, shape_size ( s ) / 8 ) ;
736
 
737
      for ( i = fields->lastused - 1 ; i >= 0 ; i-- ) {
738
	diag_field sf =  ( fields->array ) [i] ;
739
	long offset = no ( sf->where );
740
 
741
/*	if ( depth_now >= max_depth ) return ;*/
742
	if(depth_now >= max_depth){
743
	  depth_now = 0;
744
	  fprintf (dg_file, "\\\\\",0x80,0,%d,%d\n",0,0 ) ;
745
	  fprintf(dg_file,"\t.stabs\t\"");
746
	}
747
	depth_now++ ;
748
	fprintf ( dg_file, "%s:", sf->field_name.ints.chars ) ;
749
	out_dt_shape ( sf->field_type ) ;
750
	fprintf ( dg_file, ",%ld,%ld;", offset, last_type_sz ) ;
751
      }
752
      fprintf ( dg_file, ";" ) ;
753
      last_type_sz = shape_size ( s ) ;
754
      set_stab_size ( non ) ;
755
      break ;
756
    }
757
 
758
    case DIAG_TYPE_VARIETY : {
759
      dt->been_outed = out_sh_type ( f_integer ( dt->data.var ) ) ;
760
      fprintf ( dg_file, "%ld", dt->been_outed ) ;
761
      break ;
762
    }
763
 
764
    case DIAG_TYPE_PROC : {
765
      diag_type result_type = dt->data.proc.result_type ;
766
      long non1 = next_typen () ;
767
      long non2 = next_typen () ;
768
      dt->been_outed = non1 ;
769
      fprintf ( dg_file, "%ld=*%ld=f", non1, non2 ) ;
770
      out_dt_shape ( result_type ) ;
771
      last_type_sz = 32 ;
772
      set_stab_size ( non1 ) ;
773
      set_stab_size ( non2 ) ;
774
      break ;
775
    }
776
 
777
    case DIAG_TYPE_LOC : {
778
      /* +++ use qualifier which gives "const"/"volatile" */
779
      out_dt_shape ( dt->data.loc.object ) ;
780
      break ;
781
    }
782
 
783
    case DIAG_TYPE_FLOAT : {
784
      dt->been_outed = out_sh_type ( f_floating ( dt->data.f_var ) ) ;
785
      fprintf ( dg_file, "%ld", dt->been_outed ) ;
786
      break ;
787
    }
788
 
789
    case DIAG_TYPE_NULL : {
790
      fprintf ( dg_file, "%d", STAB_VOID ) ;
791
      last_type_sz = 0 ;
792
      break ;
793
    }
794
 
795
    case DIAG_TYPE_BITFIELD : {
796
      long sz = dt->data.bitfield.no_of_bits.nat_val.small_nat ;
797
      fprintf ( dg_file, "%d", STAB_SLONG ) ;
798
      last_type_sz = sz ;
799
      break ;
800
    }
801
 
802
    case DIAG_TYPE_ENUM : {
803
      int i ;
804
      enum_values_list enumvals = dt->data.t_enum.values;
805
      long non = next_typen () ;
806
      dt->been_outed = non ;
807
      fprintf ( dg_file, "%ld=e", non ) ;
808
      for ( i = enumvals->lastused - 1 ; i >= 0 ; i-- ) {
809
	  enum_values ef =  ( enumvals->array ) [i] ;
810
	  fprintf ( dg_file, "%s:%d,", ef->nme.ints.chars, no ( ef->val ) );
811
      }
812
      fprintf ( dg_file, ";" ) ;
813
      last_type_sz = 32 ;
814
      set_stab_size ( non ) ;
815
      break ;
816
    }
817
 
818
    default : {
819
      fprintf ( dg_file, "%d", STAB_VOID ) ;
820
      last_type_sz = 0 ;
821
      break ;
822
    }
823
  }
824
    return ;
825
}
826
 
827
 
828
/*
829
  OUTPUT DIAGNOSTICS FOR A GLOBAL VARIABLE
830
*/
831
 
832
void stab_global 
833
    PROTO_N ( ( dd, global, id, ext ) )
834
    PROTO_T ( diag_descriptor * dd X exp global X char * id X bool ext )
835
{
836
  if ( dd == NULL ) return ;
837
 
838
  stabd ( find_file ( dd->data.id.whence.file->file.ints.chars ),
839
	 ( long ) dd->data.id.whence.line_no.nat_val.small_nat
840
	 , -N_DSLINE ) ;
841
 
842
  fprintf ( dg_file, "\t.stabs\t\"%s:%c", dd->data.id.nme.ints.chars,
843
	   ( ext ? 'G' : 'S' ) ) ;
844
  OUT_DT_SHAPE ( dd->data.id.new_type ) ;
845
  fprintf ( dg_file, "\",%#x,0,%d,%s\n", ( ext ? 0x24 : ((no(global)!=0)?0x26:0x28) ),
846
	   dd->data.id.whence.line_no.nat_val.small_nat /*0*/,
847
	   id
848
	   ) ;
849
  return ;
850
}
851
 
852
 
853
/*
854
  OUTPUT DIAGNOSTICS FOR A PROCEDURE
855
*/
856
 
857
void stab_proc 
858
    PROTO_N ( ( dd, proc, id, ext ) )
859
    PROTO_T ( diag_descriptor * dd X exp proc X char * id X bool ext )
860
{
861
  if ( dd == NULL ) return ;
862
 
863
  stabd ( find_file ( dd->data.id.whence.file->file.ints.chars ),
864
	 ( long ) dd->data.id.whence.line_no.nat_val.small_nat 
865
	 ,0) ;
866
 
867
  fprintf ( dg_file, "\t.stabs\t\"%s:%c",
868
	   dd->data.id.nme.ints.chars, ( ext ? 'F' : 'f' ) ) ;
869
  OUT_DT_SHAPE ( dd->data.id.new_type->data.proc.result_type ) ;
870
  fprintf ( dg_file, "\",0x24,0,%d,%s\n", 0, id ) ;
871
  return ;
872
}
873
 
874
 
875
/*
876
  OUTPUT DIAGNOSTICS FOR A LOCAL VARIABLE
877
*/
878
 
879
void stab_local
880
    PROTO_N ( ( nm, dt, ldid, disp, findex ) )
881
    PROTO_T ( char *nm X diag_type dt X exp ldid X long disp X long findex )
882
{
883
  exp id = son ( ldid ) ;
884
 
885
  if (name (id) == ident_tag && ((props (id) & defer_bit) == 0))
886
    disp += boff ( id ).offset ;	/* is this condition right ? */
887
  again :
888
    if ( name ( id ) == ident_tag ) {
889
      if ( ( props ( id ) & defer_bit ) == 0 ) {
890
	/* +++ add assembler comment to say which reg is being used */
891
	if ( isparam ( id ) ) {
892
	  fprintf ( dg_file, "\t.stabs\t\"%s:p", nm ) ;
893
	  OUT_DT_SHAPE ( dt ) ;
894
	  fprintf ( dg_file, "\",0xa0,0,%d,%ld\n",
895
		    0,
896
		    disp ) ;
897
	  if(disp <= 88) { /* register useage comment */
898
	    fprintf(dg_file, "\t.stabs\t\"%s:r",nm);
899
	    OUT_DT_SHAPE(dt);
900
	    fprintf(dg_file,"\",0x40,0,%d,%ld\n",0,24+ ((disp-68)/4));
901
	  }
902
	  return ;
903
	} 
904
	else {
905
	  fprintf ( dg_file, "\t.stabs\t\"%s:", nm ) ;
906
	  OUT_DT_SHAPE ( dt ) ;
907
	  fprintf ( dg_file, "\",0x80,0,%d,%ld\n",
908
		    0,
909
		    disp ) ;
910
	  return ;
911
	}
912
      } 
913
      else {
914
	exp sn = son ( id ) ;
915
	long d = disp ;
916
 
917
	while ( sn != nilexp ) {
918
	  switch ( name ( sn ) ) {
919
	    case name_tag : {
920
	      disp = d + no ( sn ) ;
921
	      id = son ( sn ) ;
922
	      if ( isvar ( id ) ) dt = dt->data.ptr.object ;
923
	      goto again ;
924
	    }
925
	    case reff_tag : {
926
	      d += no ( sn ) ;
927
	      sn = son ( sn ) ;
928
	      break ;
929
	    }
930
	    case cont_tag : {
931
	      sn = son ( sn ) ;
932
	      break ;
933
	    }
934
	    default : {
935
	      return ;
936
	    }
937
	  }
938
	}
939
      }
940
    }
941
  return ;
942
}
943
 
944
 
945
/*
946
  DEAL WITH BASIC TYPES
947
*/
948
 
949
void stab_types 
950
    PROTO_Z ()
951
{
952
  total_type_sizes = NO_STABS ;
953
  typeno = NO_STABS ;
954
  type_sizes = ( long * ) xmalloc ( NO_STABS * sizeof ( long ) ) ;
955
  fputs ( "\t.stabs\t\"int:t1=r1;-2147483648;2147483647;\",0x80,0,0,0\n", dg_file ) ;
956
  fputs ( "\t.stabs\t\"short int:t2=r1;-32768;32767;\",0x80,0,0,0\n",
957
	    dg_file ) ;
958
  fputs ( "\t.stabs\t\"short unsigned int:t3=r1;0;65535;\",0x80,0,0,0\n", dg_file ) ;
959
  fputs ( "\t.stabs\t\"char:t4=r4;0;127;\",0x80,0,0,0\n", dg_file ) ;
960
  fputs ( "\t.stabs\t\"signed char:t5=r1;-128;127;\",0x80,0,0,0\n",
961
	  dg_file ) ;
962
  fputs ( "\t.stabs\t\"unsigned char:t6=r1;0;255;\",0x80,0,0,0\n",
963
	  dg_file ) ;
964
  fputs ( "\t.stabs\t\"long int:t7=r1;-2147483648;2147483647;\",0x80,0,0,0\n", dg_file ) ;
965
    fputs ( "\t.stabs\t\"unsigned int:t8=r1;0;-1;\",0x80,0,0,0\n",
966
	    dg_file ) ;
967
    fputs ( "\t.stabs\t\"long unsigned int:t9=r1;0;-1;\",0x80,0,0,0\n",
968
	    dg_file ) ;
969
    fputs ( "\t.stabs\t\"float:t10=r1;4;0;\",0x80,0,0,0\n", dg_file ) ;
970
    fputs ( "\t.stabs\t\"double:t11=r1;8;0;\",0x80,0,0,0\n", dg_file ) ;
971
    fprintf ( dg_file, "\t.stabs\t\"long double:t12=r1;%ld;0;\",0x80,0,0,0\n",
972
	      DOUBLE_SZ / 8 ) ;
973
    fputs ( "\t.stabs\t\"void:t13=13\",0x80,0,0,0\n", dg_file ) ;
974
    type_sizes [0] = 0 ;
975
    type_sizes [1] = 32 ;
976
    type_sizes [2] = 16 ;
977
    type_sizes [3] = 16 ;
978
    type_sizes [4] = 8 ;
979
    type_sizes [5] = 8 ;
980
    type_sizes [6] = 8 ;
981
    type_sizes [7] = 32 ;
982
    type_sizes [8] = 32 ;
983
    type_sizes [9] = 32 ;
984
    type_sizes [10] = 32 ;
985
    type_sizes [11] = 64 ;
986
    type_sizes [12] = DOUBLE_SZ ;
987
    type_sizes [13] = 0 ;
988
    return ;
989
}
990
 
991
 
992
/*
993
    DEAL WITH STRUCTURE, UNION AND ENUM TAGS
994
*/
995
 
996
void stab_tagdefs
997
    PROTO_Z ()
998
{
999
    diag_tagdef **di = unit_ind_diagtags ;
1000
    int i, n = unit_no_of_diagtags, istag ;
1001
 
1002
    for ( i = 0 ; i < n ; i++ ) {
1003
	diag_type d = di [i]->d_type ;
1004
	istag = 1;
1005
 
1006
	switch ( d->key ) {
1007
 
1008
	    case DIAG_TYPE_STRUCT : {
1009
		char *nme = d->data.t_struct.nme.ints.chars ;
1010
		if ( nme && *nme ) {
1011
		    fprintf ( dg_file, "\t.stabs\t\"%s:", nme ) ;
1012
		} else {
1013
		    static int s_count = 0 ;
1014
		    fprintf ( dg_file, "\t.stabs\t\"_struct%d:", s_count++ ) ;
1015
		}
1016
		break ;
1017
	    }
1018
	    case DIAG_TYPE_UNION : {
1019
		char *nme = d->data.t_union.nme.ints.chars ;
1020
		if ( nme && *nme ) {
1021
		    fprintf ( dg_file, "\t.stabs\t\"%s:", nme ) ;
1022
		} else {
1023
		    static int u_count = 0 ;
1024
		    fprintf ( dg_file, "\t.stabs\t\"_union%d:", u_count++ ) ;
1025
		}
1026
		break ;
1027
	    }
1028
	    case DIAG_TYPE_ENUM : {
1029
		char *nme = d->data.t_enum.nme.ints.chars ;
1030
		if ( nme && *nme ) {
1031
		    fprintf ( dg_file, "\t.stabs\t\"%s:", nme ) ;
1032
		} else {
1033
		    static int e_count = 0 ;
1034
		    fprintf ( dg_file, "\t.stabs\t\"_enum%d:", e_count++ ) ;
1035
		}
1036
		break ;
1037
	    }
1038
	    default: {
1039
		istag = 0 ;
1040
		break ;
1041
	    }
1042
	}
1043
	if (istag) {
1044
	    if ( d->been_outed && 0) {
1045
		fprintf ( dg_file, "%d", (int)d->been_outed ) ;
1046
	    } else {
1047
		fprintf ( dg_file, "T" ) ;
1048
		OUT_DT_SHAPE ( d ) ;
1049
	    }
1050
	    fprintf ( dg_file, "\",0x80,0,0,0\n" ) ;
1051
	}
1052
    }
1053
    return ;
1054
}
1055
 
1056
 
1057
/*
1058
  DEAL WITH TYPEDEFS
1059
*/
1060
 
1061
void stab_typedefs 
1062
    PROTO_Z ()
1063
{
1064
  diag_descriptor *di = unit_diagvar_tab.array ;
1065
  int i, n = unit_diagvar_tab.lastused ;
1066
  for ( i = 0 ; i < n ; i++ ) {
1067
    if ( di [i].key == DIAG_TYPEDEF_KEY ) {
1068
      long non = next_typen () ;
1069
      fprintf ( dg_file, "\t.stabs\t\"%s:t%ld=",
1070
		di [i].data.typ.nme.ints.chars, non ) ;
1071
      OUT_DT_SHAPE ( di [i].data.typ.new_type ) ;
1072
      fprintf ( dg_file, "\",0x80,0,0,0\n" ) ;
1073
    }
1074
  }
1075
  return ;
1076
}