Subversion Repositories tendra.SVN

Rev

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

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