Subversion Repositories tendra.SVN

Rev

Rev 7 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 7u83 1
/*
7 7u83 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
 */
31
/*
2 7u83 32
    		 Crown Copyright (c) 1997
33
 
34
    This TenDRA(r) Computer Program is subject to Copyright
35
    owned by the United Kingdom Secretary of State for Defence
36
    acting through the Defence Evaluation and Research Agency
37
    (DERA).  It is made available to Recipients with a
38
    royalty-free licence for its use, reproduction, transfer
39
    to other parties and amendment for any purpose not excluding
40
    product development provided that any such use et cetera
41
    shall be deemed to be acceptance of the following conditions:-
42
 
43
        (1) Its Recipients shall ensure that this Notice is
44
        reproduced upon any copies or amended versions of it;
45
 
46
        (2) Any amended version of it shall be clearly marked to
47
        show both the nature of and the organisation responsible
48
        for the relevant amendment or amendments;
49
 
50
        (3) Its onward transfer from a recipient to another
51
        party shall be deemed to be that party's acceptance of
52
        these conditions;
53
 
54
        (4) DERA gives no warranty or assurance as to its
55
        quality or suitability for any purpose and DERA accepts
56
        no liability whatsoever in relation to any use to which
57
        it may be put.
58
*/
59
 
60
 
61
/* sol86/diag_out.c */
62
 
63
/**********************************************************************
64
$Author: release $
65
$Date: 1998/03/27 09:47:52 $
66
$Revision: 1.4 $
67
$Log: diag_out.c,v $
68
 * Revision 1.4  1998/03/27  09:47:52  release
69
 * Changes for 4.1.2 release.
70
 *
71
 * Revision 1.3  1998/03/11  11:03:13  pwe
72
 * DWARF optimisation info
73
 *
74
 * Revision 1.2  1998/02/04  15:50:10  pwe
75
 * STABS for void*
76
 *
77
 * Revision 1.1.1.1  1998/01/17  15:55:52  release
78
 * First version to be checked into rolling release.
79
 *
80
 * Revision 1.16  1998/01/09  14:47:49  pwe
81
 * prep restructure
82
 *
83
 * Revision 1.15  1997/08/23  13:46:04  pwe
84
 * initial ANDF-DE
85
 *
86
 * Revision 1.14  1997/04/02  10:33:43  pwe
87
 * diagnose pl_tests
88
 *
89
 * Revision 1.13  1997/03/20  16:24:35  pwe
90
 * dwarf2
91
 *
92
 * Revision 1.12  1997/02/18  11:43:25  pwe
93
 * NEWDIAGS for debugging optimised code
94
 *
95
 * Revision 1.11  1996/12/10  15:12:06  pwe
96
 * prep NEWDIAGS
97
 *
98
 * Revision 1.10  1996/07/05  09:07:56  pwe
99
 * correct stabs enums
100
 *
101
 * Revision 1.9  1996/05/09  17:30:53  pwe
102
 * shift invalidate_dest, and stabs postlude
103
 *
104
 * Revision 1.8  1996/03/13  13:43:35  pwe
105
 * diags for long long
106
 *
107
 * Revision 1.7  1995/12/22  09:34:35  pwe
108
 * solaris diags for stack objects
109
 *
110
 * Revision 1.6  1995/12/20  11:14:02  pwe
111
 * stabs local variable scopes
112
 *
113
 * Revision 1.5  1995/11/30  10:20:02  pwe
114
 * diag struct struct
115
 *
116
 * Revision 1.4  1995/03/29  09:45:08  pwe
117
 * empty file requires arbitrary name
118
 *
119
 * Revision 1.3  1995/03/28  14:28:57  pwe
120
 * correct diagnose empty file
121
 *
122
 * Revision 1.2  1995/03/22  19:02:58  pwe
123
 * add .file at start
124
 *
125
 * Revision 1.1  1995/03/17  18:31:27  pwe
126
 * stabs diagnostics for solaris and linux
127
 *
128
**********************************************************************/
129
 
130
#include "config.h"
131
#include "common_types.h"
132
#include "basicread.h"
133
#include "out.h"
134
#include "machine.h"
135
#include "shapemacs.h"
136
#include "expmacs.h"
137
#include "tags.h"
138
#include "szs_als.h"
139
#include "xalloc.h"
140
#include "exp.h"
141
#include "externs.h"
142
 
143
#ifdef NEWDIAGS
144
 
145
#include "dg_types.h"
146
#include "dg_aux.h"
147
#include "dg_globs.h"
148
#include "codermacs.h"
149
#include "instr.h"
150
 
151
#else
152
 
153
#include "diagtypes.h"
154
#include "diag_fns.h"
155
#include "mark_scope.h"
156
#include "diagglob.h"
157
 
158
#endif
159
 
160
 
161
 
162
 
163
extern int locals_offset;	/* declared in cproc.c */
164
 
165
 
166
/*
167
    FORWARD DECLARATIONS
168
*/
169
 
170
#ifdef NEWDIAGS
7 7u83 171
static void stab_scope_open(dg_filename);
172
static void stab_scope_close(void);
173
static void stab_file(dg_filename);
174
static void stab_local(dg_name, int);
175
static void stab_types(void);
2 7u83 176
#else
7 7u83 177
static void stab_scope_open(long);
178
static void stab_scope_close(long);
179
static void stab_file(long, bool);
180
static void stab_local(diag_info *, int, exp);
181
static void stab_types(void);
2 7u83 182
#endif
183
 
184
 
7 7u83 185
/* label number sequence independent from text code */
2 7u83 186
static int diag_lab_no = 0;
187
 
7 7u83 188
static int
189
next_d_lab(void)
2 7u83 190
{
191
  return ++diag_lab_no;
192
}
193
 
194
 
195
 
196
/*
197
    DIAGNOSTICS FILE
198
*/
199
 
7 7u83 200
static FILE *dg_file;
2 7u83 201
 
202
#ifndef NEWDIAGS
7 7u83 203
static char *dg_file_name;
2 7u83 204
#endif
205
 
7 7u83 206
static void
207
d_outnl(void)
2 7u83 208
{
209
  /* avoids indicating completion of executable instruction */
7 7u83 210
  IGNORE fputs("\n", dg_file);
2 7u83 211
}
212
 
213
 
214
 
215
/*
216
    BASIC TYPE NUMBERS
217
*/
218
 
219
#define STAB_SCHAR	4
220
#define STAB_UCHAR	6
221
#define STAB_SSHRT	2
222
#define STAB_USHRT	3
223
#define STAB_SLONG	7
224
#define STAB_ULONG	9
225
#define STAB_SINT	1
226
#define STAB_UINT	8
227
#define STAB_FLOAT	10
228
#define STAB_DBL	11
229
#define STAB_LDBL	12
230
#define STAB_VOID	13
231
#define STAB_S64	14
232
#define STAB_U64	15
233
#define STAB_VS		16
234
#define NO_STABS	17
235
 
236
 
237
/*
238
    80x86 register numbers
239
*/
240
 
241
#ifdef NEWDIAGS
7 7u83 242
static long reg_stabno[8] = {0, 2, 1, 3, 7, 6, 5, 4};
2 7u83 243
#endif
244
 
245
/*
246
    BASIC POINTERS
247
*/
248
 
7 7u83 249
static long stab_ptrs[NO_STABS] = {
2 7u83 250
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
7 7u83 251
};
2 7u83 252
 
253
 
254
/*
255
    CURRENT TYPE NUMBER
256
*/
257
 
7 7u83 258
static long typeno;
2 7u83 259
 
260
 
261
/*
262
    SIZE OF LAST STAB TYPE OUTPUT
263
*/
264
 
7 7u83 265
static long last_type_sz = 0;
2 7u83 266
 
267
 
268
/*
269
    CURRENT LINE NUMBER AND FILE NUMBER
270
*/
271
 
7 7u83 272
long currentlno = -1;
2 7u83 273
 
274
#ifdef NEWDIAGS
275
 
276
dg_filename currentfile = (dg_filename)0;
277
dg_filename prim_file = (dg_filename)0;
278
 
279
#else
280
 
7 7u83 281
long currentfile = -1;
2 7u83 282
 
283
#endif
284
 
285
 
286
/*
287
    ARRAY OF TYPE SIZES
288
*/
289
 
7 7u83 290
static long *type_sizes;
291
static int total_type_sizes = 0;
2 7u83 292
 
293
 
294
/*
295
    SETTING AND GETTING TYPE SIZES
296
*/
297
 
7 7u83 298
#define set_stab_size(i)	type_sizes[(i)] = last_type_sz
299
#define get_stab_size(i)	(type_sizes[(i)])
300
#define shape_stab_size(i, s)	type_sizes[(i)] = shape_size(s)
2 7u83 301
 
302
 
303
/*
304
    GET THE NEXT TYPE NUMBER
305
*/
306
 
7 7u83 307
static long
308
next_typen(void)
2 7u83 309
{
7 7u83 310
    if (typeno >= total_type_sizes) {
311
	int i, n = total_type_sizes, m = n + 100;
312
	type_sizes = (long *)xrealloc((void *)(CH type_sizes),
313
				      (size_t)m * sizeof(long));
314
	for (i = n; i < m; i++) {
315
	    type_sizes[i] = 0;
316
	}
317
	total_type_sizes = m;
2 7u83 318
    }
7 7u83 319
    return(typeno++);
2 7u83 320
}
321
 
322
 
323
#ifndef NEWDIAGS
324
 
325
/*
326
    ARRAY OF FILE DESCRIPTORS
327
*/
328
 
7 7u83 329
static filename *fds = NULL;
330
static int szfds = 0;
331
static int nofds = 0;
2 7u83 332
 
333
 
334
/*
335
    ADD A NEW FILE TO THE ARRAY OF FILE DESCRIPTORS
336
*/
337
 
7 7u83 338
void
339
stab_collect_files(filename f)
2 7u83 340
{
7 7u83 341
    if (fds == NULL) {
342
	szfds += 10;
343
	fds = (filename *)xmalloc(szfds * sizeof(filename));
344
    } else if (nofds >= szfds) {
345
	szfds += 10;
346
	fds = (filename *)xrealloc((void *)(CH fds), szfds * sizeof(filename));
2 7u83 347
    }
7 7u83 348
    fds[nofds++] = f;
349
    return;
2 7u83 350
}
351
 
352
 
353
/*
354
    FIND THE FILE DESCRIPTOR CORRESPONDING TO A FILE NAME
355
*/
356
 
7 7u83 357
static long
358
find_file(char *f)
2 7u83 359
{
7 7u83 360
    long i;
361
    for (i = 0; i < nofds; i++) {
362
	if (strcmp(f, fds[i]->file.ints.chars) == 0) {
363
	    return(i);
364
	}
2 7u83 365
    }
7 7u83 366
    return(0);
2 7u83 367
}
368
 
369
#endif
370
 
371
 
372
static int last_proc_cname;
7 7u83 373
static char *last_proc_pname = "<<No Proc>>";
2 7u83 374
 
7 7u83 375
static void
376
out_procname(void)
2 7u83 377
{
378
  if (last_proc_cname == -1) {
7 7u83 379
    outs(last_proc_pname);
380
  } else {
381
    outs(local_prefix);
382
    outn((long)last_proc_cname);
2 7u83 383
  }
384
}
385
 
386
 
387
/*
388
    OUTPUT A FILE POSITION CONSTRUCT
389
*/
390
 
391
#define N_SLINE 0x44
392
#define N_DSLINE 0x46
393
#define N_BSLINE 0x48
394
#define N_LBRAC  0xc0
395
#define N_RBRAC  0xe0
396
 
397
#ifdef NEWDIAGS
398
 
7 7u83 399
void
400
stabd(dg_filename f, long lno, int seg)
2 7u83 401
{
7 7u83 402
    long i;
403
    if (f == currentfile && lno == currentlno) {
404
	return;
405
    }
406
    stab_file(f);
2 7u83 407
 
7 7u83 408
    if (seg != 0) {		/* 0 suppresses always */
409
      if (seg > 0) {		/* -ve line nos are put out in the stabs */
410
	i = next_d_lab();
411
	IGNORE fprintf(dg_file, ".LL.%ld:\n", i);
412
	IGNORE fprintf(dg_file, "\t.stabn\t0x%x,0,%ld,.LL.%ld-", seg, lno, i);
413
	out_procname();
414
	d_outnl();
2 7u83 415
      }
416
    }
7 7u83 417
    currentlno = lno;
418
    return;
2 7u83 419
}
420
 
421
#else
422
 
7 7u83 423
static void
424
stabd(long findex, long lno, int seg)
2 7u83 425
{
7 7u83 426
    long i;
2 7u83 427
 
7 7u83 428
    if (findex == currentfile && lno == currentlno) {
429
	return;
430
    }
431
    stab_file(findex, 1);
2 7u83 432
 
7 7u83 433
    if (seg != 0) {		/* 0 suppresses always */
434
      if (seg > 0) {		/* -ve line nos are put out in the stabs */
435
	i = next_d_lab();
436
	IGNORE fprintf(dg_file, ".LL.%ld:\n", i);
437
	IGNORE fprintf(dg_file, "\t.stabn\t0x%x,0,%ld,.LL.%ld-", seg, lno, i);
438
	out_procname();
439
	d_outnl();
2 7u83 440
      }
441
    }
7 7u83 442
    currentlno = lno;
443
    return;
2 7u83 444
}
445
 
446
#endif
447
 
448
 
449
 
450
#ifdef NEWDIAGS
451
/*
452
    OUTPUT DIAGNOSTICS SURROUNDING CODE
453
*/
454
 
7 7u83 455
void
456
code_diag_info(dg_info d, void(*mcode)(void *), void *args)
2 7u83 457
{
458
  if (d == nildiag) {
7 7u83 459
   (*mcode)(args);
2 7u83 460
    return;
461
  }
462
  switch (d->key) {
463
    case DGA_PARAMS: {
464
      dg_name arg = d->data.i_param.args;
465
      while (arg) {
7 7u83 466
	stab_local(arg, 1);
2 7u83 467
	arg = arg->next;
468
      }
7 7u83 469
      code_diag_info(d->more, mcode, args);
2 7u83 470
      break;
471
    }
472
    case DGA_SRC: {
473
      if (d->data.i_src.startpos.line) {
7 7u83 474
	stabd(d->data.i_src.startpos.file, d->data.i_src.startpos.line,
475
	      N_SLINE);
2 7u83 476
      }
7 7u83 477
      code_diag_info(d->more, mcode, args);
2 7u83 478
      if (d->data.i_src.endpos.line)
7 7u83 479
	stabd(d->data.i_src.endpos.file, d->data.i_src.endpos.line, N_SLINE);
2 7u83 480
      break;
481
    }
482
    case DGA_SCOPE:
483
    case DGA_EXTRA: {
484
      dg_filename f = currentfile;
485
      long l = currentlno + 1;
486
      if (d->data.i_scope.lexpos.line) {
487
	f = d->data.i_scope.lexpos.file;
488
	l = d->data.i_scope.lexpos.line;
489
      }
7 7u83 490
      stab_scope_open(f);
491
      stabd(f, l, N_SLINE);
492
      code_diag_info(d->more, mcode, args);
493
      stab_scope_close();
494
      if (d->data.i_scope.endpos.line) {
495
	stabd(d->data.i_scope.endpos.file, d->data.i_scope.endpos.line,
496
	      N_SLINE);
497
      }
2 7u83 498
      break;
499
    }
500
    case DGA_NAME: {
7 7u83 501
      stab_local(d->data.i_nam.dnam, 0);
502
      code_diag_info(d->more, mcode, args);
2 7u83 503
      break;
504
    }
505
    default: {
7 7u83 506
      code_diag_info(d->more, mcode, args);
2 7u83 507
      break;
508
    }
7 7u83 509
  }
2 7u83 510
  return;
511
}
512
 
513
 
514
#else
515
 
516
/*
517
    OUTPUT INITIAL DIAGNOSTICS FOR A DIAGNOSE_TAG
518
*/
519
 
7 7u83 520
void
521
output_diag(diag_info *d, int proc_no, exp e)
2 7u83 522
{
7 7u83 523
  if (d->key == DIAG_INFO_SOURCE) {
524
    sourcemark *s = &d->data.source.beg;
525
    long f = find_file(s->file->file.ints.chars);
526
    stabd(f, (long)s->line_no.nat_val.small_nat, N_SLINE);
527
    return;
2 7u83 528
  }
529
 
7 7u83 530
  if (d->key == DIAG_INFO_ID) {
531
    exp acc = d->data.id_scope.access;
2 7u83 532
 
7 7u83 533
    if (isglob(son(acc)) || no(son(acc)) == 1) {
534
	return;
535
    }
2 7u83 536
    mark_scope(e);
537
 
7 7u83 538
    if (props(e) & 0x80) {
539
      stab_scope_open(currentfile);
540
      stabd(currentfile, (long)(currentlno + 1), N_SLINE);
2 7u83 541
    }
542
 
7 7u83 543
    stab_local(d, proc_no, acc);
2 7u83 544
 
7 7u83 545
    return;
2 7u83 546
  }
547
}
548
 
549
 
550
/*
551
    OUTPUT FINAL DIAGNOSTICS FOR A DIAGNOSE_TAG
552
*/
553
 
7 7u83 554
void
555
output_end_scope(diag_info *d, exp e)
2 7u83 556
{
7 7u83 557
    if (d->key == DIAG_INFO_SOURCE) {
558
	sourcemark *s = &d->data.source.end;
559
	long f = find_file(s->file->file.ints.chars);
560
	long lno = s->line_no.nat_val.small_nat;
561
	stabd(f, lno, N_SLINE);
562
	return;
2 7u83 563
    }
7 7u83 564
    if (d->key == DIAG_INFO_ID && props(e) & 0x80) {
565
	stab_scope_close(currentfile);
566
	return;
2 7u83 567
    }
7 7u83 568
    return;
2 7u83 569
}
570
#endif
571
 
572
 
573
 
574
 
575
/*
576
    FIND THE STAB OF A SIMPLE SHAPE
577
*/
578
 
579
#ifdef NEWDIAGS
580
 
7 7u83 581
static long
582
out_sh_type(shape s, char *nm)
2 7u83 583
{
7 7u83 584
  last_type_sz = shape_size(s);
585
  switch (name(s)) {
586
    case scharhd: return(STAB_SCHAR);
587
    case ucharhd: return(STAB_UCHAR);
588
    case swordhd: return(STAB_SSHRT);
589
    case uwordhd: return(STAB_USHRT);
590
    case slonghd: return(strstr(nm, "long")? STAB_SLONG : STAB_SINT);
591
    case ulonghd: return(strstr(nm, "long")? STAB_ULONG : STAB_UINT);
592
    case s64hd: return(STAB_S64);
593
    case u64hd: return(STAB_U64);
594
    case shrealhd: return(STAB_FLOAT);
595
    case realhd: return(STAB_DBL);
596
    case doublehd: return(STAB_LDBL);
2 7u83 597
  }
7 7u83 598
  return(STAB_VOID);
2 7u83 599
}
600
 
7 7u83 601
static long
602
find_basic_type(char *s)
2 7u83 603
{
7 7u83 604
  char *x;
605
  if (strstr(s, "char")) {
606
    return(strstr(s, "unsigned") ? STAB_UCHAR : STAB_SCHAR);
2 7u83 607
  }
7 7u83 608
  if (strstr(s, "double")) {
609
    return(strstr(s, "long") ? STAB_LDBL : STAB_DBL);
610
  }
611
  if (strstr(s, "float")) {
612
    return(STAB_FLOAT);
613
  }
614
  if (strstr(s, "short")) {
615
    return(strstr(s, "unsigned") ? STAB_USHRT : STAB_SSHRT);
616
  }
617
  if ((x = strstr(s, "long"))) {
618
    if (strstr(x+1, "long")) {
619
      return(strstr(s, "unsigned") ? STAB_U64 : STAB_S64);
620
    }
621
    return(strstr(s, "unsigned") ? STAB_ULONG : STAB_SLONG);
622
  }
623
  if (strstr(s, "int")) {
624
    return(strstr(s, "unsigned") ? STAB_UINT : STAB_SINT);
625
  }
626
  if (strstr(s, "void_star")) {
627
    return(STAB_VS);
628
  }
629
  return(STAB_VOID);
2 7u83 630
}
631
 
632
#else
633
 
7 7u83 634
static long
635
out_sh_type(shape s)
2 7u83 636
{
7 7u83 637
    last_type_sz = shape_size(s);
638
    switch (name(s)) {
639
	case scharhd:
640
		return(STAB_SCHAR);
641
	case ucharhd:
642
		return(STAB_UCHAR);
643
	case swordhd:
644
		return(STAB_SSHRT);
645
	case uwordhd:
646
		return(STAB_USHRT);
647
	case slonghd:
648
		return(STAB_SINT);
649
	case ulonghd:
650
		return(STAB_UINT);
651
	case s64hd:
652
		return(STAB_S64);
653
	case u64hd:
654
		return(STAB_U64);
655
	case shrealhd:
656
		return(STAB_FLOAT);
657
	case realhd:
658
		return(STAB_DBL);
659
	case doublehd:
660
		return(STAB_LDBL);
2 7u83 661
    }
7 7u83 662
    return(STAB_VOID);
2 7u83 663
}
664
 
665
#endif
666
 
667
 
668
/*
669
    OUTPUT DIAGNOSTICS DIRECTIVE FOR A FILE
670
*/
671
 
672
#ifdef NEWDIAGS
673
 
7 7u83 674
static void
675
stab_file(dg_filename f)
2 7u83 676
{
7 7u83 677
    long i = next_d_lab();
2 7u83 678
    int stb;
679
 
7 7u83 680
    if (f == currentfile || !f) {
681
	return;
2 7u83 682
    }
683
 
684
    stb = (f == prim_file ? 0x64 : 0x84);
7 7u83 685
    IGNORE fprintf(dg_file, ".LL.%ld:\n", i);
2 7u83 686
 
7 7u83 687
    if (f->file_name[0]!= '/' && f->file_path[0]) {
688
      IGNORE fprintf(dg_file, "\t.stabs\t\"%s/\",0x%x,0,0,.LL.%ld\n",
689
		     f->file_path, stb, i);
690
    }
2 7u83 691
 
7 7u83 692
    IGNORE fprintf(dg_file, "\t.stabs\t\"%s\",0x%x,0,0,.LL.%ld\n",
693
		   f->file_name, stb, i);
2 7u83 694
 
7 7u83 695
    currentfile = f;
696
    return;
2 7u83 697
}
698
 
699
#else
700
 
7 7u83 701
static void
702
stab_file(long findex, bool internal)
2 7u83 703
{
7 7u83 704
    static long i = 0;
2 7u83 705
 
7 7u83 706
    if (findex == currentfile || findex < 0 || findex >= szfds) {
707
	return;
2 7u83 708
    }
709
 
7 7u83 710
    if (!internal) {
2 7u83 711
	/* source file */
7 7u83 712
	i = next_d_lab();
713
	IGNORE fprintf(dg_file, ".LL.%ld:\n", i);
714
	IGNORE fprintf(dg_file, "\t.stabs\t\"%s\",0x64,0,0,.LL.%ld\n",
715
		       fds[findex]->file.ints.chars, i);
2 7u83 716
    } else {
717
	/* included file */
7 7u83 718
	IGNORE fprintf(dg_file, "\t.stabs\t\"%s\",0x84,0,0,.LL.%ld\n",
719
		       fds[findex]->file.ints.chars, i);
2 7u83 720
    }
7 7u83 721
    currentfile = findex;
722
    return;
2 7u83 723
}
724
 
725
#endif
726
 
727
 
728
/*
729
    LIST OF DIAGNOSTIC SCOPES AND LOCAL VARIABLES
730
*/
731
 
732
#define DEL_SIZE 50
733
 
734
struct delay_stab {
735
    int del_t;
736
    union {
737
	struct {
7 7u83 738
	    char *nm;
2 7u83 739
#ifdef NEWDIAGS
740
	    dg_type dt;
741
#else
742
	    diag_type dt;
743
#endif
744
	    int offset;
745
	} l;
746
	struct {
747
	    int br;
748
	    int lev;
749
	    int lab;
750
	} b;
751
    } u;
752
};
753
 
754
enum del_types {D_PARAM, D_LOCAL, D_BRACKET, D_REG};
755
 
756
struct del_stab_array {
757
    struct del_stab_array *more;
7 7u83 758
    struct delay_stab a[DEL_SIZE];
2 7u83 759
};
760
 
761
static struct del_stab_array *del_stab_start = NULL;
762
static struct del_stab_array *last_del_array = NULL;
763
static struct del_stab_array *c_del_array = NULL;
764
static int c_del_index = DEL_SIZE;
765
 
7 7u83 766
static struct delay_stab *
767
next_del_stab(void)
2 7u83 768
{
769
    if (c_del_index == DEL_SIZE) {
7 7u83 770
	if (c_del_array != last_del_array) {
771
	    c_del_array = c_del_array->more;
772
	} else {
773
	    struct del_stab_array *s = (struct del_stab_array *)
774
		(xmalloc(sizeof(struct del_stab_array)));
775
	    s->more = NULL;
776
	    if (del_stab_start == NULL) {
2 7u83 777
		del_stab_start = s;
7 7u83 778
	    } else {
2 7u83 779
		last_del_array -> more = s;
7 7u83 780
	    }
2 7u83 781
	    c_del_array = last_del_array = s;
782
	}
783
	c_del_index = 0;
784
    }
7 7u83 785
    return((c_del_array -> a) + (c_del_index ++));
2 7u83 786
}
787
 
7 7u83 788
static long open_label = 0;
789
static long bracket_level = 0;
2 7u83 790
 
791
 
792
/*
793
    START OF A DIAGNOSTICS SCOPE
794
*/
795
 
796
#ifdef NEWDIAGS
797
 
7 7u83 798
static void
799
stab_scope_open(dg_filename f)
2 7u83 800
{
7 7u83 801
    long i;
802
    stab_file(f);
803
    if (open_label != 0) {
804
	struct delay_stab *t = next_del_stab();
2 7u83 805
	t->del_t = D_BRACKET;
806
	t->u.b.br = N_LBRAC;
807
	t->u.b.lev = bracket_level;
808
	t->u.b.lab = open_label;
809
    }
7 7u83 810
    i = next_d_lab();
811
    IGNORE fprintf(dg_file, ".LL.%ld:\n", i);
812
    bracket_level++;
813
    open_label = i;
814
    return;
2 7u83 815
}
816
 
817
#else
818
 
7 7u83 819
static void
820
stab_scope_open(long findex)
2 7u83 821
{
7 7u83 822
    long i;
823
    stab_file(findex, 1);
824
    if (open_label != 0) {
825
	struct delay_stab *t = next_del_stab();
2 7u83 826
	t->del_t = D_BRACKET;
827
	t->u.b.br = N_LBRAC;
828
	t->u.b.lev = bracket_level;
829
	t->u.b.lab = open_label;
830
    }
7 7u83 831
    i = next_d_lab();
832
    IGNORE fprintf(dg_file, ".LL.%ld:\n", i);
833
    bracket_level++;
834
    open_label = i;
835
    return;
2 7u83 836
}
837
 
838
#endif
839
 
840
 
841
/*
842
    END OF A DIAGNOSTICS SCOPE
843
*/
844
 
845
#ifdef NEWDIAGS
846
 
7 7u83 847
static void
848
stab_scope_close(void)
2 7u83 849
{
7 7u83 850
    long i;
851
    struct delay_stab *x;
852
    if (open_label != 0) {
853
	struct delay_stab *t = next_del_stab();
2 7u83 854
	t->del_t = D_BRACKET;
855
	t->u.b.br = N_LBRAC;
856
	t->u.b.lev = bracket_level;
857
	t->u.b.lab = open_label;
7 7u83 858
	open_label = 0;
2 7u83 859
    }
7 7u83 860
    i = next_d_lab();
2 7u83 861
    x = next_del_stab();
862
    x->del_t = D_BRACKET;
863
    x->u.b.br = N_RBRAC;
864
    x->u.b.lev = bracket_level;
865
    x->u.b.lab = i;
7 7u83 866
    IGNORE fprintf(dg_file, ".LL.%ld:\n", i);
867
    bracket_level--;
868
    return;
2 7u83 869
}
870
 
871
#else
872
 
7 7u83 873
static void
874
stab_scope_close(long findex)
2 7u83 875
{
7 7u83 876
    long i;
877
    struct delay_stab *x;
878
    if (open_label != 0) {
879
	struct delay_stab *t = next_del_stab();
2 7u83 880
	t->del_t = D_BRACKET;
881
	t->u.b.br = N_LBRAC;
882
	t->u.b.lev = bracket_level;
883
	t->u.b.lab = open_label;
7 7u83 884
	open_label = 0;
2 7u83 885
    }
7 7u83 886
    i = next_d_lab();
2 7u83 887
    x = next_del_stab();
888
    x->del_t = D_BRACKET;
889
    x->u.b.br = N_RBRAC;
890
    x->u.b.lev = bracket_level;
891
    x->u.b.lab = i;
7 7u83 892
    IGNORE fprintf(dg_file, ".LL.%ld:\n", i);
893
    bracket_level--;
894
    return;
2 7u83 895
}
896
 
897
#endif
898
 
899
 
900
/*
901
    DEPTH COUNT FOR STAB TYPES
902
*/
903
 
7 7u83 904
static int max_depth = 64;
905
static int depth_now = 0;
2 7u83 906
 
907
 
908
/*
909
    OUTPUT A DIAGNOSTICS TYPE
910
*/
911
 
7 7u83 912
#define OUT_DT_SHAPE(dt)	out_dt_shape((depth_now = 0, dt))
2 7u83 913
 
914
#ifdef NEWDIAGS
915
 
7 7u83 916
static long
917
type_size(dg_type dt)
2 7u83 918
{
7 7u83 919
  if (!dt) {
2 7u83 920
    return 0;
7 7u83 921
  }
922
  if (dt->outref.k == LAB_D || dt->outref.k < 0) {
923
    return get_stab_size(dt->outref.u.l);
924
  }
925
  switch (dt->key) {
2 7u83 926
    case DGT_TAGGED: {
927
      dg_tag tg = dt->data.t_tag;
928
      if (tg->key == DGK_NONE) {
929
	return 0;
930
      }
931
      if (tg->key == DGK_TYPE) {
932
	dg_type ref_t = tg->p.typ;
7 7u83 933
	if (ref_t == dt) {
934
	  return type_sizes[find_basic_type(ref_t->outref.u.s)];
935
	}
936
	return type_size(ref_t);
2 7u83 937
      }
938
      if (tg->key == DGK_NAME) {
939
	dg_name ref_n = tg->p.nam;
940
	if (ref_n->key == DGN_TYPE /* && ref_n->idnam.id_key == DG_ID_NONE */) {
941
	  dg_type ref_t = tg->p.nam->data.n_typ.raw;
7 7u83 942
	  return type_size(ref_t);
2 7u83 943
	}
944
      }
945
      return 0;
946
    }
947
    case DGT_BASIC: {
7 7u83 948
      return shape_size(dt->data.t_bas.b_sh);
2 7u83 949
    }
950
    case DGT_QUAL: {
7 7u83 951
      if (dt->data.t_qual.q_key == DG_PTR_T) {
2 7u83 952
        return 32;
7 7u83 953
      }
2 7u83 954
      {
7 7u83 955
	dg_type pdt = dt->data.t_qual.typ;
956
	return type_size(pdt);
2 7u83 957
      }
958
    }
959
    case DGT_ARRAY: {
960
      if (dt->data.t_arr.dims.len == 1) {
961
	dg_dim x;
962
	x = dt->data.t_arr.dims.array[0];
963
	if (x.d_key == DG_DIM_BOUNDS && !x.low_ref && !x.hi_ref && !x.hi_cnt) {
7 7u83 964
	  long lwb = no(son(x.lower.x));
965
	  long upb = no(son(x.upper.x));
966
	  long stride = no(son(dt->data.t_arr.stride));
967
	  return(stride *(upb - lwb + 1));
2 7u83 968
 
969
	}
970
      }
971
      return 0;
972
    }
973
    case DGT_ENUM: {
7 7u83 974
      return shape_size(dt->data.t_enum.sha);
2 7u83 975
    }
976
    case DGT_STRUCT: {
7 7u83 977
      return shape_size(dt->data.t_struct.sha);
2 7u83 978
    }
7 7u83 979
    case DGT_BITF: {
2 7u83 980
      return dt->data.t_bitf.bv.bits;
981
    }
982
    case DGT_PROC: {
983
      return 32;
984
    }
985
    default :
986
      return 0;
987
  }
988
}
989
 
7 7u83 990
static void
991
out_dt_shape(dg_type dt)
2 7u83 992
{
993
  if (!dt) {
7 7u83 994
    IGNORE fprintf(dg_file, "%d", STAB_VOID);
995
    last_type_sz = 0;
996
    return;
2 7u83 997
  }
998
 
7 7u83 999
  if (dt->outref.k == LAB_D || (dt->outref.k < 0 && depth_now != 0)) {
1000
    IGNORE fprintf(dg_file, "%ld", dt->outref.u.l);
1001
    last_type_sz = get_stab_size(dt->outref.u.l);
1002
    return;
2 7u83 1003
  }
1004
 
1005
#if 0
1006
  /* SunOS as(1) rejects stab lines >2k so reduce size arbitrarily */
7 7u83 1007
  if (depth_now >= max_depth) {
1008
    IGNORE fprintf(dg_file, "%d", STAB_SLONG);
1009
    return;
2 7u83 1010
  }
1011
#endif
7 7u83 1012
  depth_now++;
2 7u83 1013
 
7 7u83 1014
  switch (dt->key) {
2 7u83 1015
 
1016
    case DGT_TAGGED: {
1017
      dg_tag tg = dt->data.t_tag;
1018
      if (tg->done) {
1019
	dt->outref = tg->outref;
7 7u83 1020
	out_dt_shape(dt);
2 7u83 1021
	break;
1022
      }
1023
      if (tg->key == DGK_NONE) {
7 7u83 1024
	failer("external type");
2 7u83 1025
	tg->done = 1;
1026
	tg->outref.k = LAB_D;
1027
	tg->outref.u.l = 0;
7 7u83 1028
	out_dt_shape(dt);
2 7u83 1029
	break;
1030
      }
1031
      if (tg->key == DGK_TYPE) {
1032
	dg_type ref_t = tg->p.typ;
1033
	if (ref_t == dt) {
1034
	  if (ref_t->outref.k != LAB_STR)
7 7u83 1035
	    failer("uninitialised?");
2 7u83 1036
	  ref_t->outref.k = LAB_D;
7 7u83 1037
	  ref_t->outref.u.l = find_basic_type(ref_t->outref.u.s);
2 7u83 1038
	}
7 7u83 1039
	out_dt_shape(ref_t);
2 7u83 1040
	dt->outref = tg->outref = ref_t->outref;
1041
	tg->done = 1;
1042
	break;
1043
      }
1044
      if (tg->key == DGK_NAME) {
1045
	dg_name ref_n = tg->p.nam;
1046
	if (ref_n->key == DGN_TYPE /* && ref_n->idnam.id_key == DG_ID_NONE */) {
1047
	  dg_type ref_t = tg->p.nam->data.n_typ.raw;
7 7u83 1048
	  out_dt_shape(ref_t);
2 7u83 1049
	  dt->outref = tg->outref = ref_t->outref;
1050
	  tg->done = 1;
1051
	  break;
1052
	}
1053
      }
7 7u83 1054
      failer("unfinished convolution");
2 7u83 1055
      tg->done = 1;
1056
      tg->outref.k = LAB_D;
1057
      tg->outref.u.l = 0;
7 7u83 1058
      out_dt_shape(dt);
2 7u83 1059
      break;
1060
    }
1061
 
1062
    case DGT_BASIC: {
7 7u83 1063
      dt->outref.u.l = out_sh_type(dt->data.t_bas.b_sh, dt->data.t_bas.tnam);
2 7u83 1064
      dt->outref.k = LAB_D;
7 7u83 1065
      out_dt_shape(dt);
2 7u83 1066
      break;
1067
    }
1068
 
1069
    case DGT_QUAL: {
1070
      if (dt->data.t_qual.q_key == DG_PTR_T) {
7 7u83 1071
	long non;
1072
	dg_type pdt = dt->data.t_qual.typ;
1073
	if (pdt->key == DGT_BASIC) {
1074
	  long pn = out_sh_type(pdt->data.t_bas.b_sh, pdt->data.t_bas.tnam);
1075
	  non = stab_ptrs[pn];
1076
	  if (non == 0) {
1077
	    non = (dt->outref.k < 0 ? dt->outref.u.l : next_typen());
1078
	    stab_ptrs[pn] = non;
1079
	    IGNORE fprintf(dg_file, "%ld=*%ld", non, pn);
1080
	  } else {
1081
	    IGNORE fprintf(dg_file, "%ld", non);
2 7u83 1082
	  }
7 7u83 1083
        } else {
1084
	  non = (dt->outref.k < 0 ? dt->outref.u.l : next_typen());
1085
	  IGNORE fprintf(dg_file, "%ld=*", non);
1086
	  out_dt_shape(pdt);
2 7u83 1087
	}
7 7u83 1088
	dt->outref.u.l = non;
2 7u83 1089
	dt->outref.k = LAB_D;
7 7u83 1090
	last_type_sz = 32;
1091
	set_stab_size(non);
1092
      } else {
1093
	dg_type pdt = dt->data.t_qual.typ;
1094
	out_dt_shape(pdt);
2 7u83 1095
	dt->outref = pdt->outref;
1096
      }
1097
      break;
1098
    }
1099
 
1100
    case DGT_ARRAY: {
1101
      long non;
7 7u83 1102
      if (dt->outref.k >= 0) {
1103
	dt->outref.u.l = next_typen();
1104
      }
2 7u83 1105
      dt->outref.k = LAB_D;
1106
      non = dt->outref.u.l;
1107
      if (dt->data.t_arr.dims.len == 1) {
1108
	dg_dim x;
1109
	x = dt->data.t_arr.dims.array[0];
1110
	if (x.d_key == DG_DIM_BOUNDS && !x.low_ref && !x.hi_ref && !x.hi_cnt) {
7 7u83 1111
	  long lwb = no(son(x.lower.x));
1112
	  long upb = no(son(x.upper.x));
1113
	  long stride = no(son(dt->data.t_arr.stride));
2 7u83 1114
	  dg_type index_type = x.d_typ;
1115
	  dg_type element_type = dt->data.t_arr.elem_type;
7 7u83 1116
	  IGNORE fprintf(dg_file, "%ld=", non);
1117
	  IGNORE fprintf(dg_file, "ar");
1118
	  out_dt_shape(index_type);
1119
	  IGNORE fprintf(dg_file, ";%ld;%ld;", lwb, upb);
1120
	  out_dt_shape(element_type);
1121
	  last_type_sz = stride *(upb - lwb + 2);
1122
	  set_stab_size(non);
1123
	  break;
2 7u83 1124
	}
1125
	if (x.d_key == DG_DIM_NONE) {
1126
	  dg_type index_type = x.d_typ;
1127
	  dg_type element_type = dt->data.t_arr.elem_type;
7 7u83 1128
	  IGNORE fprintf(dg_file, "%ld=", non);
1129
	  IGNORE fprintf(dg_file, "ar");
1130
	  out_dt_shape(index_type);
1131
	  IGNORE fprintf(dg_file, ";0;0;");
1132
	  out_dt_shape(element_type);
1133
	  last_type_sz = 0;
1134
	  set_stab_size(non);
1135
	  break;
2 7u83 1136
	}
1137
      }
7 7u83 1138
      failer("complex array");
2 7u83 1139
      break;
1140
    }
1141
 
1142
    case DGT_ENUM: {
7 7u83 1143
      int i;
1144
      dg_enum *el = dt->data.t_enum.values.array;
1145
      if (dt->outref.k >= 0) {
1146
	dt->outref.u.l = next_typen();
1147
      }
2 7u83 1148
      dt->outref.k = LAB_D;
7 7u83 1149
      IGNORE fprintf(dg_file, "%ld=e", dt->outref.u.l);
2 7u83 1150
      for (i = 0; i < dt->data.t_enum.values.len; i++) {
7 7u83 1151
	  IGNORE fprintf(dg_file, "%s:%d,", el[i].enam, no(son(el[i].value)));
2 7u83 1152
      }
7 7u83 1153
      IGNORE fprintf(dg_file, ";");
1154
      last_type_sz = shape_size(dt->data.t_enum.sha);
1155
      set_stab_size(dt->outref.u.l);
1156
      break;
2 7u83 1157
    }
1158
 
1159
    case DGT_STRUCT: {
7 7u83 1160
      int i;
2 7u83 1161
      char su = (dt->data.t_struct.is_union ? 'u' : 's');
1162
      shape s = dt->data.t_struct.sha;
1163
      dg_classmem * el = dt->data.t_struct.u.fields.array;
7 7u83 1164
      if (dt->outref.k >= 0) {
1165
	dt->outref.u.l = next_typen();
1166
      }
2 7u83 1167
      dt->outref.k = LAB_D;
7 7u83 1168
      IGNORE fprintf(dg_file, "%ld=%c%d", dt->outref.u.l, su,
1169
		     shape_size(s) / 8);
2 7u83 1170
      for (i = 0; i < dt->data.t_struct.u.fields.len; i++) {
7 7u83 1171
	long offset = no(son(el[i].d.cm_f.f_offset));
1172
	if (depth_now >= max_depth) {
2 7u83 1173
	  depth_now = 0;
7 7u83 1174
	  IGNORE fprintf(dg_file, "\\\\\",0x80,0,%d,%d\n", 0, 0);
1175
	  IGNORE fprintf(dg_file, "\t.stabs\t\"");
2 7u83 1176
	}
7 7u83 1177
	depth_now++;
1178
	IGNORE fprintf(dg_file, "%s:", el[i].d.cm_f.fnam);
1179
	out_dt_shape(el[i].d.cm_f.f_typ);
1180
	IGNORE fprintf(dg_file, ",%ld,%ld;", offset,
1181
		       type_size(el[i].d.cm_f.f_typ));
2 7u83 1182
      }
7 7u83 1183
      IGNORE fprintf(dg_file, ";");
1184
      last_type_sz = shape_size(s);
1185
      set_stab_size(dt->outref.u.l);
1186
      break;
2 7u83 1187
    }
1188
 
7 7u83 1189
    case DGT_BITF: {
2 7u83 1190
      bitfield_variety bv;
1191
      bv = dt->data.t_bitf.bv;
7 7u83 1192
      IGNORE fprintf(dg_file, "%d",(bv.has_sign ? STAB_SINT : STAB_UINT));
1193
      last_type_sz = bv.bits;
1194
      break;
2 7u83 1195
    }
1196
 
1197
    case DGT_PROC: {
7 7u83 1198
      dg_type result_type = dt->data.t_proc.res_type;
1199
      long non1 = next_typen();
1200
      long non2 = next_typen();
2 7u83 1201
      dt->outref.u.l = non1;
1202
      dt->outref.k = LAB_D;
7 7u83 1203
      IGNORE fprintf(dg_file, "%ld=*%ld=f", non1, non2);
1204
      out_dt_shape(result_type);
1205
      last_type_sz = 32;
1206
      set_stab_size(non1);
1207
      set_stab_size(non2);
1208
      break;
2 7u83 1209
    }
1210
 
1211
    default : {
7 7u83 1212
      IGNORE fprintf(dg_file, "%d", STAB_VOID);
2 7u83 1213
      dt->outref.u.l = STAB_VOID;
1214
      dt->outref.k = LAB_D;
7 7u83 1215
      last_type_sz = 0;
1216
      break;
2 7u83 1217
    }
1218
  }
1219
#if 0
7 7u83 1220
  if (dt->mor && dt->mor->this_tag) {
2 7u83 1221
    dt->mor->this_tag->outref = dt->outref;
7 7u83 1222
  }
2 7u83 1223
#endif
7 7u83 1224
  return;
2 7u83 1225
}
1226
 
1227
#else
1228
 
7 7u83 1229
static void
1230
out_dt_shape(diag_type dt)
2 7u83 1231
{
7 7u83 1232
    if (dt->been_outed) {
1233
	IGNORE fprintf(dg_file, "%d",(int)dt->been_outed);
1234
	last_type_sz = get_stab_size(dt->been_outed);
1235
	return;
2 7u83 1236
    }
1237
 
1238
    /* SunOS as(1) rejects stab lines >2k so reduce size arbitrarily */
7 7u83 1239
    if (depth_now >= max_depth) {
1240
	IGNORE fprintf(dg_file, "%d", STAB_SLONG);
1241
	return;
2 7u83 1242
    }
7 7u83 1243
    depth_now++;
2 7u83 1244
 
7 7u83 1245
    switch (dt->key) {
1246
	case DIAG_TYPE_PTR: {
1247
	    long non;
1248
	    diag_type pdt = dt->data.ptr.object;
1249
	    if (pdt->key == DIAG_TYPE_VARIETY) {
1250
		long pn = out_sh_type(f_integer(pdt->data.var));
1251
		non = stab_ptrs[pn];
1252
		if (non == 0) {
1253
		    non = next_typen();
1254
		    stab_ptrs[pn] = non;
1255
		    IGNORE fprintf(dg_file, "%ld=*%ld", non, pn);
2 7u83 1256
		} else {
7 7u83 1257
		    IGNORE fprintf(dg_file, "%ld", non);
2 7u83 1258
		}
1259
	    } else {
7 7u83 1260
		non = next_typen();
1261
		IGNORE fprintf(dg_file, "%ld=*", non);
1262
		out_dt_shape(dt->data.ptr.object);
2 7u83 1263
	    }
7 7u83 1264
	    dt->been_outed = non;
1265
	    last_type_sz = 32;
1266
	    set_stab_size(non);
1267
	    break;
2 7u83 1268
	}
1269
 
7 7u83 1270
	case DIAG_TYPE_ARRAY: {
2 7u83 1271
#if 0
7 7u83 1272
	    long str = no(dt->data.array.stride);
2 7u83 1273
#endif
7 7u83 1274
	    long lwb = no(dt->data.array.lower_b);
1275
	    long upb = no(dt->data.array.upper_b);
1276
	    diag_type index_type = dt->data.array.index_type;
1277
	    diag_type element_type = dt->data.array.element_type;
1278
	    long non = next_typen();
1279
	    dt->been_outed = non;
1280
	    IGNORE fprintf(dg_file, "%ld=ar", non);
1281
	    out_dt_shape(index_type);
1282
	    IGNORE fprintf(dg_file, ";%ld;%ld;", lwb, upb);
1283
	    out_dt_shape(element_type);
1284
	    last_type_sz *= (upb - lwb + 1);
1285
	    set_stab_size(non);
1286
	    break;
2 7u83 1287
	}
1288
 
7 7u83 1289
	case DIAG_TYPE_STRUCT:
1290
	case DIAG_TYPE_UNION: {
1291
	    int i;
1292
	    char su;
1293
	    shape s;
1294
	    diag_field_list fields;
1295
	    long non = next_typen();
1296
	    dt->been_outed = non;
2 7u83 1297
 
7 7u83 1298
	    if (dt->key == DIAG_TYPE_STRUCT) {
1299
		fields = dt->data.t_struct.fields;
1300
		s = dt->data.t_struct.tdf_shape;
2 7u83 1301
		su = 's';
1302
	    } else {
7 7u83 1303
		fields = dt->data.t_union.fields;
2 7u83 1304
		s = dt->data.t_union.tdf_shape;
7 7u83 1305
		su = 'u';
2 7u83 1306
	    }
7 7u83 1307
	    IGNORE fprintf(dg_file, "%ld=%c%d", non, su, shape_size(s) / 8);
2 7u83 1308
 
7 7u83 1309
	    for (i = fields->lastused - 1; i >= 0; i--) {
1310
		diag_field sf = (fields->array)[i];
1311
		long offset = no(sf->where);
2 7u83 1312
 
7 7u83 1313
		if (depth_now >= max_depth) {
1314
		    return;
1315
		}
1316
		depth_now++;
1317
		IGNORE fprintf(dg_file, "%s:", sf->field_name.ints.chars);
1318
		out_dt_shape(sf->field_type);
1319
		IGNORE fprintf(dg_file, ",%ld,%ld;", offset, last_type_sz);
2 7u83 1320
	    }
7 7u83 1321
	    IGNORE fprintf(dg_file, ";");
1322
	    last_type_sz = shape_size(s);
1323
	    set_stab_size(non);
1324
	    break;
2 7u83 1325
	}
1326
 
7 7u83 1327
	case DIAG_TYPE_VARIETY: {
1328
	    dt->been_outed = out_sh_type(f_integer(dt->data.var));
1329
	    IGNORE fprintf(dg_file, "%ld", dt->been_outed);
1330
	    break;
2 7u83 1331
	}
1332
 
1333
	case DIAG_TYPE_PROC: {
7 7u83 1334
	    diag_type result_type = dt->data.proc.result_type;
1335
	    long non1 = next_typen();
1336
	    long non2 = next_typen();
1337
	    dt->been_outed = non1;
1338
	    IGNORE fprintf(dg_file, "%ld=*%ld=f", non1, non2);
1339
	    out_dt_shape(result_type);
1340
	    last_type_sz = 32;
1341
	    set_stab_size(non1);
1342
	    set_stab_size(non2);
1343
	    break;
2 7u83 1344
	}
1345
 
1346
	case DIAG_TYPE_LOC: {
1347
	    /* +++ use qualifier which gives "const"/"volatile" */
7 7u83 1348
	    out_dt_shape(dt->data.loc.object);
1349
	    break;
2 7u83 1350
	}
1351
 
7 7u83 1352
	case DIAG_TYPE_FLOAT: {
1353
	    dt->been_outed = out_sh_type(f_floating(dt->data.f_var));
1354
	    IGNORE fprintf(dg_file, "%ld", dt->been_outed);
1355
	    break;
2 7u83 1356
	}
1357
 
7 7u83 1358
	case DIAG_TYPE_NULL: {
1359
	    IGNORE fprintf(dg_file, "%d", STAB_VOID);
1360
	    last_type_sz = 0;
1361
	    break;
2 7u83 1362
	}
1363
 
7 7u83 1364
	case DIAG_TYPE_BITFIELD: {
1365
	    long sz = dt->data.bitfield.no_of_bits.nat_val.small_nat;
1366
	    IGNORE fprintf(dg_file, "%d", STAB_SINT);
1367
	    last_type_sz = sz;
1368
	    break;
2 7u83 1369
	}
1370
 
7 7u83 1371
	case DIAG_TYPE_ENUM: {
1372
	    int i;
2 7u83 1373
	    enum_values_list enumvals = dt->data.t_enum.values;
7 7u83 1374
	    long non = next_typen();
1375
	    dt->been_outed = non;
1376
	    IGNORE fprintf(dg_file, "%ld=e", non);
1377
	    for (i = enumvals->lastused - 1; i >= 0; i--) {
1378
		enum_values ef = (enumvals->array)[i];
1379
		IGNORE fprintf(dg_file, "%s:%d,", ef->nme.ints.chars,
1380
			       no(ef->val));
2 7u83 1381
	    }
7 7u83 1382
	    IGNORE fprintf(dg_file, ";");
1383
	    last_type_sz = 32;
1384
	    set_stab_size(non);
1385
	    break;
2 7u83 1386
	}
1387
 
1388
	default : {
7 7u83 1389
	    IGNORE fprintf(dg_file, "%d", STAB_VOID);
1390
	    last_type_sz = 0;
1391
	    break;
2 7u83 1392
	}
1393
    }
7 7u83 1394
    return;
2 7u83 1395
}
1396
 
1397
#endif
1398
 
1399
 
1400
/*
1401
    OUTPUT DIAGNOSTICS FOR A GLOBAL VARIABLE
1402
*/
1403
 
1404
#ifdef NEWDIAGS
1405
 
7 7u83 1406
void
1407
out_diag_global(dg_name di, int global, int cname, char * pname)
2 7u83 1408
{
1409
  char* nm;
1410
  dg_type dt;
7 7u83 1411
  if (!di || di->key != DGN_OBJECT) {
2 7u83 1412
    return;
7 7u83 1413
  }
1414
  nm = idname_chars(di->idnam);
2 7u83 1415
  dt = di->data.n_obj.typ;
1416
 
7 7u83 1417
  if (di->whence.line) {
1418
    stabd(di->whence.file, di->whence.line, -N_DSLINE);
1419
  }
1420
  IGNORE fprintf(dg_file, "\t.stabs\t\"%s:%c", nm, (global ? 'G' : 'S'));
1421
  OUT_DT_SHAPE(dt);
1422
  if (global) {
1423
    IGNORE fprintf(dg_file, "\",0x20,0,%ld,0\n", di->whence.line);
1424
  } else {
1425
    IGNORE fprintf(dg_file, "\",0x28,0,%ld,", di->whence.line);
2 7u83 1426
    if (cname == -1) {
7 7u83 1427
      outs(pname);
1428
    } else {
1429
      outs(local_prefix);
1430
      outn((long)cname);
2 7u83 1431
    }
7 7u83 1432
    d_outnl();
1433
  }
1434
  return;
2 7u83 1435
}
1436
 
1437
#else
1438
 
7 7u83 1439
void
1440
diag_val_begin(diag_global *d, int global, int cname, char *pname)
2 7u83 1441
{
7 7u83 1442
  stabd(find_file(d->data.id.whence.file->file.ints.chars),
1443
	(long)d->data.id.whence.line_no.nat_val.small_nat, -N_DSLINE);
2 7u83 1444
 
7 7u83 1445
  IGNORE fprintf(dg_file, "\t.stabs\t\"%s:%c", d->data.id.nme.ints.chars,
1446
		 (global ? 'G' : 'S'));
1447
  OUT_DT_SHAPE(d->data.id.new_type);
1448
  if (global) {
1449
    IGNORE fprintf(dg_file, "\",0x20,0,%d,0\n",
1450
		   d->data.id.whence.line_no.nat_val.small_nat);
1451
  } else {
1452
    IGNORE fprintf(dg_file, "\",0x28,0,%d,",
1453
		   d->data.id.whence.line_no.nat_val.small_nat);
2 7u83 1454
    if (cname == -1) {
7 7u83 1455
      outs(pname);
1456
    } else {
1457
      outs(local_prefix);
1458
      outn((long)cname);
2 7u83 1459
    }
7 7u83 1460
    d_outnl();
1461
  }
1462
  return;
2 7u83 1463
}
1464
 
7 7u83 1465
void
1466
diag_val_end(diag_global *d)
2 7u83 1467
{
1468
  UNUSED(d);
1469
  return;
1470
}
1471
 
1472
#endif
1473
 
1474
 
1475
/*
1476
    OUTPUT DIAGNOSTICS FOR A PROCEDURE
1477
*/
1478
 
1479
#ifdef NEWDIAGS
1480
 
7 7u83 1481
void
1482
diag_proc_begin(dg_name di, int global, int cname, char *pname)
2 7u83 1483
{
7 7u83 1484
  char *nm;
2 7u83 1485
  dg_type dt;
1486
  last_proc_pname = pname;
1487
  last_proc_cname = cname;
7 7u83 1488
  if (!di || di->key != DGN_PROC) {
2 7u83 1489
    return;
7 7u83 1490
  }
1491
  nm = idname_chars(di->idnam);
2 7u83 1492
  dt = di->data.n_proc.typ;
7 7u83 1493
  if (dt->key == DGT_PROC) {	/* it should be */
2 7u83 1494
    dt = dt->data.t_proc.res_type;
7 7u83 1495
  }
2 7u83 1496
 
7 7u83 1497
  if (di->whence.line) {
1498
    stabd(di->whence.file, di->whence.line, 0);
1499
  }
1500
  outs("\t.stabs\t\"");
1501
  outs(nm);
1502
  if (global) {
1503
    outs(":F");
1504
  } else {
1505
    outs(":f");
1506
  }
1507
  OUT_DT_SHAPE(dt);
1508
  outs("\",0x24,0,0,");
1509
  out_procname();
1510
  d_outnl();
1511
  return;
2 7u83 1512
}
1513
 
1514
#else
1515
 
7 7u83 1516
void
1517
diag_proc_begin(diag_global *d, int global, int cname, char *pname)
2 7u83 1518
{
1519
  last_proc_pname = pname;
1520
  last_proc_cname = cname;
7 7u83 1521
  if (!d) {
2 7u83 1522
    return;
7 7u83 1523
  }
2 7u83 1524
 
7 7u83 1525
  stabd(find_file(d->data.id.whence.file->file.ints.chars),
1526
	(long)d->data.id.whence.line_no.nat_val.small_nat, 0);
2 7u83 1527
 
7 7u83 1528
  outs("\t.stabs\t\"");
1529
  outs(d->data.id.nme.ints.chars);
1530
  if (global) {
1531
    outs(":F");
1532
  } else {
1533
    outs(":f");
1534
  }
1535
  OUT_DT_SHAPE(d->data.id.new_type->data.proc.result_type);
1536
  outs("\",0x24,0,0,");
1537
  out_procname();
1538
  d_outnl();
1539
  return;
2 7u83 1540
}
1541
 
1542
#endif
1543
 
7 7u83 1544
void
1545
diag_proc_end(void)
2 7u83 1546
{
1547
  if (del_stab_start != NULL) {
1548
    struct del_stab_array *this_a = del_stab_start;
1549
    int this_i = 0;
1550
    while (this_a != c_del_array || this_i != c_del_index) {
7 7u83 1551
	struct delay_stab *t;
2 7u83 1552
	if (this_i == DEL_SIZE) {
1553
	    this_a = this_a -> more;
1554
	    this_i = 0;
1555
	}
7 7u83 1556
	t = (this_a->a) + (this_i ++);
1557
	switch (t->del_t) {
2 7u83 1558
	    case D_PARAM:
7 7u83 1559
		IGNORE fprintf(dg_file, "\t.stabs\t\"%s:p", t->u.l.nm);
1560
		OUT_DT_SHAPE(t->u.l.dt);
1561
		IGNORE fprintf(dg_file, "\",0xa0,0,0,%d\n", t->u.l.offset + 8);
2 7u83 1562
		break;
1563
	    case D_LOCAL:
7 7u83 1564
		IGNORE fprintf(dg_file, "\t.stabs\t\"%s:", t->u.l.nm);
1565
		OUT_DT_SHAPE(t->u.l.dt);
1566
		IGNORE fprintf(dg_file, "\",0x80,0,0,%d\n", t->u.l.offset -
1567
			       locals_offset);
2 7u83 1568
		break;
1569
	    case D_REG:
7 7u83 1570
		IGNORE fprintf(dg_file, "\t.stabs\t\"%s:r", t->u.l.nm);
1571
		OUT_DT_SHAPE(t->u.l.dt);
1572
		IGNORE fprintf(dg_file, "\",0x40,0,0,%d\n", t->u.l.offset);
2 7u83 1573
		break;
1574
	    default:
7 7u83 1575
		IGNORE fprintf(dg_file, "\t.stabn\t0x%x,0,%d,.LL.%d-",
1576
			       t->u.b.br, t->u.b.lev, t->u.b.lab);
1577
		out_procname();
1578
		d_outnl();
2 7u83 1579
	}
1580
    }
1581
    c_del_array = del_stab_start;
1582
    c_del_index = 0;
1583
  }
1584
  return;
1585
}
1586
 
1587
 
1588
 
1589
/*
1590
    OUTPUT DIAGNOSTICS FOR A LOCAL VARIABLE
1591
*/
1592
 
1593
#ifdef NEWDIAGS
1594
 
7 7u83 1595
static void
1596
stab_local(dg_name di, int param)
2 7u83 1597
{
1598
    exp id = di->data.n_obj.obtain_val;
7 7u83 1599
    struct delay_stab *t;
1600
    char *nm;
2 7u83 1601
    dg_type dt;
1602
    long disp;
7 7u83 1603
    if (di->key != DGN_OBJECT || !id) {
2 7u83 1604
      return;
7 7u83 1605
    }
2 7u83 1606
    id = son(id);
7 7u83 1607
    if (name(id) == cont_tag && name(son(id)) == name_tag &&
1608
	isvar(son(son(id)))) {
2 7u83 1609
	  id = son(id);
7 7u83 1610
    }
1611
    if (name(id)!= name_tag || isdiscarded(id) || (isglob(son(id)) &&
1612
	no(son(id)) == 0 && !(brog(son(id))->dec_u.dec_val.extnamed))) {
2 7u83 1613
      return;
7 7u83 1614
    }
2 7u83 1615
    disp = no(id);
1616
    id = son(id);
7 7u83 1617
    nm = idname_chars(di->idnam);
2 7u83 1618
    dt = di->data.n_obj.typ;
1619
    t = next_del_stab();
7 7u83 1620
    t->u.l.nm = nm;
1621
    t->u.l.dt = dt;
2 7u83 1622
    if (ptno(id) == reg_pl) {
1623
      t->del_t = D_REG;
7 7u83 1624
      t->u.l.offset = reg_stabno[get_reg_no(no(id))];
1625
    } else {
2 7u83 1626
      t->del_t = (param ? D_PARAM : D_LOCAL);
1627
      t->u.l.offset = (disp + no(id)) / 8;
7 7u83 1628
    }
1629
    return;
2 7u83 1630
}
1631
 
1632
 
1633
#else
1634
 
7 7u83 1635
static void
1636
stab_local(diag_info *d, int proc_no, exp acc)
2 7u83 1637
{
7 7u83 1638
    struct delay_stab *t = next_del_stab();
2 7u83 1639
    t->del_t = (isparam(son(acc)) ? D_PARAM : D_LOCAL);
7 7u83 1640
    t->u.l.nm = d->data.id_scope.nme.ints.chars;
1641
    t->u.l.dt = d->data.id_scope.typ;
2 7u83 1642
    t->u.l.offset = (no(acc) + no(son(acc))) / 8;
7 7u83 1643
    return;
2 7u83 1644
}
1645
 
1646
#endif
1647
 
1648
 
1649
 
1650
/*
1651
    DEAL WITH BASIC TYPES
1652
*/
1653
 
7 7u83 1654
static void
1655
stab_types(void)
2 7u83 1656
{
7 7u83 1657
    total_type_sizes = NO_STABS;
1658
    typeno = NO_STABS;
1659
    type_sizes = (long *)xmalloc(NO_STABS * sizeof(long));
1660
    IGNORE fputs("\t.stabs\t\"int:t1=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
1661
		 dg_file);
1662
    IGNORE fputs("\t.stabs\t\"short int:t2=r1;-32768;32767;\",0x80,0,0,0\n",
1663
		 dg_file);
1664
    IGNORE fputs("\t.stabs\t\"short unsigned int:t3=r1;0;65535;\",0x80,0,0,0\n",
1665
		 dg_file);
1666
    IGNORE fputs("\t.stabs\t\"char:t4=r4;0;127;\",0x80,0,0,0\n", dg_file);
1667
    IGNORE fputs("\t.stabs\t\"signed char:t5=r1;-128;127;\",0x80,0,0,0\n",
1668
		 dg_file);
1669
    IGNORE fputs("\t.stabs\t\"unsigned char:t6=r1;0;255;\",0x80,0,0,0\n",
1670
		 dg_file);
1671
    IGNORE fputs("\t.stabs\t\"long int:t7=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
1672
		 dg_file);
1673
    IGNORE fputs("\t.stabs\t\"unsigned int:t8=r1;0;-1;\",0x80,0,0,0\n",
1674
		 dg_file);
1675
    IGNORE fputs("\t.stabs\t\"long unsigned int:t9=r1;0;-1;\",0x80,0,0,0\n",
1676
		 dg_file);
1677
    IGNORE fputs("\t.stabs\t\"float:t10=r1;4;0;\",0x80,0,0,0\n", dg_file);
1678
    IGNORE fputs("\t.stabs\t\"double:t11=r1;8;0;\",0x80,0,0,0\n", dg_file);
1679
    IGNORE fprintf(dg_file, "\t.stabs\t\"long double:t12=r1;%d;0;\",0x80,0,0,0\n",
1680
		   DOUBLE_SZ / 8);
1681
    IGNORE fputs("\t.stabs\t\"void:t13=13\",0x80,0,0,0\n", dg_file);
1682
    IGNORE fputs("\t.stabs\t\"long long int:t14=r1;", dg_file);
1683
    IGNORE fputs("01000000000000000000000;0777777777777777777777;\",0x80,0,0,0\n",
1684
		 dg_file);
1685
    IGNORE fputs("\t.stabs\t\"unsigned long long int:t15=r1;", dg_file);
1686
    IGNORE fputs("0000000000000;01777777777777777777777;\",0x80,0,0,0\n",
1687
		 dg_file);
1688
    IGNORE fputs("\t.stabs\t\"__void_star:t16=*13\",0x80,0,0,0\n", dg_file);
1689
    type_sizes[0] = 0;
1690
    type_sizes[1] = 32;
1691
    type_sizes[2] = 16;
1692
    type_sizes[3] = 16;
1693
    type_sizes[4] = 8;
1694
    type_sizes[5] = 8;
1695
    type_sizes[6] = 8;
1696
    type_sizes[7] = 32;
1697
    type_sizes[8] = 32;
1698
    type_sizes[9] = 32;
1699
    type_sizes[10] = 32;
1700
    type_sizes[11] = 64;
1701
    type_sizes[12] = DOUBLE_SZ;
1702
    type_sizes[13] = 0;
1703
    type_sizes[14] = 64;
1704
    type_sizes[15] = 64;
1705
    type_sizes[16] = 32;
1706
    return;
2 7u83 1707
}
1708
 
1709
 
1710
#ifndef NEWDIAGS
1711
 
1712
/*
1713
    DEAL WITH STRUCTURE, UNION AND ENUM TAGS
1714
*/
1715
 
7 7u83 1716
void
1717
stab_tagdefs(void)
2 7u83 1718
{
7 7u83 1719
    diag_tagdef **di = unit_ind_diagtags;
1720
    int i, n = unit_no_of_diagtags, istag;
2 7u83 1721
 
7 7u83 1722
    for (i = 0; i < n; i++) {
1723
	diag_type d = di[i]->d_type;
2 7u83 1724
	istag = 1;
1725
 
7 7u83 1726
	switch (d->key) {
1727
	    case DIAG_TYPE_STRUCT: {
1728
		char *nme = d->data.t_struct.nme.ints.chars;
1729
		if (nme && *nme) {
1730
		    IGNORE fprintf(dg_file, "\t.stabs\t\"%s:", nme);
2 7u83 1731
		} else {
7 7u83 1732
		    static int s_count = 0;
1733
		    IGNORE fprintf(dg_file, "\t.stabs\t\"_struct%d:",
1734
				   s_count++);
2 7u83 1735
		}
7 7u83 1736
		break;
2 7u83 1737
	    }
7 7u83 1738
	    case DIAG_TYPE_UNION: {
1739
		char *nme = d->data.t_union.nme.ints.chars;
1740
		if (nme && *nme) {
1741
		    IGNORE fprintf(dg_file, "\t.stabs\t\"%s:", nme);
2 7u83 1742
		} else {
7 7u83 1743
		    static int u_count = 0;
1744
		    IGNORE fprintf(dg_file, "\t.stabs\t\"_union%d:", u_count++);
2 7u83 1745
		}
7 7u83 1746
		break;
2 7u83 1747
	    }
7 7u83 1748
	    case DIAG_TYPE_ENUM: {
1749
		char *nme = d->data.t_enum.nme.ints.chars;
1750
		if (nme && *nme) {
1751
		    IGNORE fprintf(dg_file, "\t.stabs\t\"%s:", nme);
2 7u83 1752
		} else {
7 7u83 1753
		    static int e_count = 0;
1754
		    IGNORE fprintf(dg_file, "\t.stabs\t\"_enum%d:", e_count++);
2 7u83 1755
		}
7 7u83 1756
		break;
2 7u83 1757
	    }
1758
	    default: {
7 7u83 1759
		istag = 0;
1760
		break;
2 7u83 1761
	    }
1762
	}
1763
	if (istag) {
7 7u83 1764
	    if (d->been_outed && 0) {
1765
		IGNORE fprintf(dg_file, "%d", (int)d->been_outed);
2 7u83 1766
	    } else {
7 7u83 1767
		IGNORE fprintf(dg_file, "T");
1768
		OUT_DT_SHAPE(d);
2 7u83 1769
	    }
7 7u83 1770
	    IGNORE fprintf(dg_file, "\",0x80,0,0,0\n");
2 7u83 1771
	}
1772
    }
7 7u83 1773
    return;
2 7u83 1774
}
1775
 
1776
#endif
1777
 
1778
 
1779
/*
1780
    DEAL WITH TYPEDEFS
1781
*/
1782
 
1783
#ifndef NEWDIAGS
1784
 
7 7u83 1785
void
1786
stab_typedefs(void)
2 7u83 1787
{
7 7u83 1788
    diag_descriptor *di = unit_diagvar_tab.array;
1789
    int i, n = unit_diagvar_tab.lastused;
1790
    for (i = 0; i < n; i++) {
1791
	if (di[i].key == DIAG_TYPEDEF_KEY) {
1792
	    long non = next_typen();
1793
	    IGNORE fprintf(dg_file, "\t.stabs\t\"%s:t%ld=",
1794
			   di[i].data.typ.nme.ints.chars, non);
1795
	    OUT_DT_SHAPE(di[i].data.typ.new_type);
1796
	    IGNORE fprintf(dg_file, "\",0x80,0,0,0\n");
2 7u83 1797
	}
1798
    }
7 7u83 1799
    return;
2 7u83 1800
}
1801
 
1802
#endif
1803
 
1804
 
1805
 
1806
/*
1807
  INITIALISE DIAGNOSTICS
1808
*/
1809
 
1810
#ifdef NEWDIAGS
1811
 
7 7u83 1812
void
1813
out_diagnose_prelude(void)
2 7u83 1814
{
1815
  return;
1816
}
1817
 
1818
#if 0
7 7u83 1819
static void
1820
prep_type(dg_type dt)
2 7u83 1821
{
1822
  if (dt->key == DGT_BASIC) {
7 7u83 1823
    dt->outref.u.l = out_sh_type(dt->data.t_bas.b_sh, dt->data.t_bas.tnam);
2 7u83 1824
    dt->outref.k = LAB_D;
7 7u83 1825
  } else {
1826
    last_type_sz = type_size(dt);
2 7u83 1827
    dt->outref.k = -1;
7 7u83 1828
    dt->outref.u.l = next_typen();
1829
    set_stab_size(dt->outref.u.l);
2 7u83 1830
  }
1831
#if 0
7 7u83 1832
  if (dt->mor && dt->mor->this_tag) {
2 7u83 1833
    dt->mor->this_tag->outref = dt->outref;
7 7u83 1834
  }
2 7u83 1835
#endif
1836
}
1837
#endif
1838
 
7 7u83 1839
void
1840
init_stab_aux(void)
2 7u83 1841
{
1842
  dg_compilation this_comp;
7 7u83 1843
  dg_file = fpout;
2 7u83 1844
  this_comp = all_comp_units;
1845
  while (this_comp) {
1846
    dg_name item = this_comp->dn_list;
1847
    while (item) {
7 7u83 1848
      if (item->key == DGN_PROC && item->data.n_proc.obtain_val) {
2 7u83 1849
	prim_file = this_comp->prim_file;
7 7u83 1850
      }
2 7u83 1851
      item = item -> next;
1852
    }
1853
    this_comp = this_comp->another;
1854
  }
1855
  if (prim_file) {
7 7u83 1856
    IGNORE fprintf(dg_file, "\t.file\t\"");
1857
    if (prim_file->file_name[0]!= '/' && prim_file->file_path[0]) {
1858
      IGNORE fprintf(dg_file, "%s/", prim_file->file_path);
1859
    }
1860
    IGNORE fprintf(dg_file, "%s\"\n",prim_file ->file_name);
1861
    stab_file(prim_file);
1862
  } else {
1863
    IGNORE fprintf(dg_file, "\t.file\t\"no_source_file\"\n");
2 7u83 1864
  }
7 7u83 1865
  stab_types();
2 7u83 1866
#if 0
1867
  this_comp = all_comp_units;
1868
  while (this_comp) {
1869
    dg_name item = this_comp->dn_list;
1870
    while (item) {
1871
      if (item->key == DGN_TYPE) {
1872
	dg_type dt = item->data.n_typ.raw;
7 7u83 1873
	char *s = idname_chars(item->idnam);
2 7u83 1874
	if (s[0]) {
7 7u83 1875
	  if (!dt->outref.k) {
1876
	    prep_type(dt);
1877
	  }
1878
	} else if ((dt->key == DGT_STRUCT &&
1879
		    dt->data.t_struct.idnam.id_key == DG_ID_SRC &&
1880
		    (s = dt->data.t_struct.idnam.idd.nam, s[0])) ||
1881
		   (dt->key == DGT_ENUM && (s = dt->data.t_enum.tnam, s[0]))) {
1882
	  if (!dt->outref.k) {
1883
	    prep_type(dt);
1884
	  }
2 7u83 1885
	}
1886
      }
7 7u83 1887
      item = item->next;
2 7u83 1888
    }
1889
    this_comp = this_comp->another;
1890
  }
1891
#endif
1892
  this_comp = all_comp_units;
1893
  while (this_comp) {
1894
    dg_name item = this_comp->dn_list;
1895
    while (item) {
1896
      if (item->key == DGN_TYPE && item->data.n_typ.raw->key != DGT_UNKNOWN) {
1897
	dg_type dt = item->data.n_typ.raw;
7 7u83 1898
	char *s = idname_chars(item->idnam);
2 7u83 1899
	if (s[0]) {
7 7u83 1900
	  IGNORE fprintf(dg_file, "\t.stabs\t\"%s:", s);
2 7u83 1901
	  if (dt->outref.k == LAB_STR) {
1902
	    dt->outref.k = LAB_D;
7 7u83 1903
	    dt->outref.u.l = find_basic_type(dt->outref.u.s);
2 7u83 1904
	  }
7 7u83 1905
	  if (dt->outref.k == LAB_D) {
1906
		IGNORE fprintf(dg_file, "%d", (int)dt->outref.u.l);
1907
	  } else {
1908
		IGNORE fprintf(dg_file, "t");
1909
		OUT_DT_SHAPE(dt);
2 7u83 1910
	  }
7 7u83 1911
	  IGNORE fprintf(dg_file, "\",0x80,0,0,0\n");
1912
	} else if ((dt->key == DGT_STRUCT &&
1913
		    (dt->data.t_struct.idnam.id_key == DG_ID_SRC ||
1914
		     dt->data.t_struct.idnam.id_key == DG_ID_EXT) &&
1915
		    (s = dt->data.t_struct.idnam.idd.nam, s[0])) ||
1916
		   (dt->key == DGT_ENUM && (s = dt->data.t_enum.tnam, s[0]))) {
1917
	  IGNORE fprintf(dg_file, "\t.stabs\t\"%s:", s);
1918
	  if (dt->outref.k == LAB_D) {
1919
	    IGNORE fprintf(dg_file, "%d",(int)dt->outref.u.l);
1920
	  } else {
1921
	    IGNORE fprintf(dg_file, "T");
1922
	    OUT_DT_SHAPE(dt);
2 7u83 1923
	  }
7 7u83 1924
	  IGNORE fprintf(dg_file, "\",0x80,0,0,0\n");
2 7u83 1925
	}
1926
#if 0
7 7u83 1927
	if (item->mor && item->mor->this_tag) {
2 7u83 1928
	  item->mor->this_tag->outref = item->data.n_typ.raw->outref;
7 7u83 1929
	}
2 7u83 1930
#endif
1931
      }
7 7u83 1932
      item = item->next;
2 7u83 1933
    }
1934
    this_comp = this_comp->another;
1935
  }
1936
  return;
1937
}
1938
 
1939
#else
1940
 
7 7u83 1941
void
1942
out_diagnose_prelude(void)
2 7u83 1943
{
7 7u83 1944
    dg_file_name = tmpnam(NULL);
1945
    dg_file = fopen(dg_file_name, "w");
1946
    if (dg_file == NULL) {
1947
	failer("Can't open temporary diagnostics file");
1948
	exit(EXIT_FAILURE);
2 7u83 1949
    }
7 7u83 1950
    stab_types();
1951
    return;
2 7u83 1952
}
1953
 
7 7u83 1954
void
1955
init_stab_aux(void)
2 7u83 1956
{
7 7u83 1957
    int c;
1958
    FILE *f;
1959
    int i, j = -1;
1960
    for (i = 0; i < nofds; i++) {
1961
	char *s = fds[i]->file.ints.chars;
1962
	int n = (int)strlen(s);
1963
	if (n && s[n - 1]!= 'h') {
1964
	    j = i;
1965
	}
2 7u83 1966
    }
7 7u83 1967
    IGNORE fclose(dg_file);
1968
    dg_file = fpout;
1969
    if (j >= 0) {
1970
	IGNORE fprintf(dg_file, "\t.file\t\"%s\"\n", fds[j] ->file.ints.chars);
1971
    } else {
1972
	IGNORE fprintf(dg_file, "\t.file\t\"no_source_file\"\n");
2 7u83 1973
    }
7 7u83 1974
    stab_file((long)j, 0);
1975
    f = fopen(dg_file_name, "r");
1976
    if (f == NULL) {
1977
	failer("Can't open temporary diagnostics file");
1978
	exit(EXIT_FAILURE);
1979
    }
1980
    while (c = fgetc(f), c != EOF) {
1981
	outc(c);
1982
    }
1983
    IGNORE fclose(f);
1984
    remove(dg_file_name);
1985
    return;
2 7u83 1986
}
1987
 
1988
#endif
1989
 
1990
 
7 7u83 1991
void
1992
out_diagnose_postlude(void)
2 7u83 1993
{
7 7u83 1994
    long i = next_d_lab();
1995
    IGNORE fprintf(dg_file, ".LL.%ld:\n", i);
1996
    IGNORE fprintf(dg_file, "\t.stabs\t\"\",0x64,0,0,.LL.%ld\n", i);
1997
    return;
2 7u83 1998
}