Subversion Repositories tendra.SVN

Rev

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

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