Subversion Repositories tendra.SVN

Rev

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

Rev 2 Rev 7
Line -... Line 1...
-
 
1
/*
-
 
2
 * Copyright (c) 2002-2005 The TenDRA Project <http://www.tendra.org/>.
-
 
3
 * All rights reserved.
-
 
4
 *
-
 
5
 * Redistribution and use in source and binary forms, with or without
-
 
6
 * modification, are permitted provided that the following conditions are met:
-
 
7
 *
-
 
8
 * 1. Redistributions of source code must retain the above copyright notice,
-
 
9
 *    this list of conditions and the following disclaimer.
-
 
10
 * 2. Redistributions in binary form must reproduce the above copyright notice,
-
 
11
 *    this list of conditions and the following disclaimer in the documentation
-
 
12
 *    and/or other materials provided with the distribution.
-
 
13
 * 3. Neither the name of The TenDRA Project nor the names of its contributors
-
 
14
 *    may be used to endorse or promote products derived from this software
-
 
15
 *    without specific, prior written permission.
-
 
16
 *
-
 
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
-
 
18
 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-
 
19
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-
 
20
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
-
 
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-
 
22
 * EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-
 
23
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-
 
24
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-
 
25
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-
 
26
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-
 
27
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 
28
 *
-
 
29
 * $Id$
-
 
30
 */
1
/*
31
/*
2
    		 Crown Copyright (c) 1997
32
    		 Crown Copyright (c) 1997
3
    
33
 
4
    This TenDRA(r) Computer Program is subject to Copyright
34
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
35
    owned by the United Kingdom Secretary of State for Defence
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 32... Line 62...
32
			    VERSION INFORMATION
62
			    VERSION INFORMATION
33
			    ===================
63
			    ===================
34
 
64
 
35
--------------------------------------------------------------------------
65
--------------------------------------------------------------------------
36
$Header: /u/g/release/CVSROOT/Source/src/installers/hppa/common/hppadiags.c,v 1.1.1.1 1998/01/17 15:56:02 release Exp $
66
$Header: /u/g/release/CVSROOT/Source/src/installers/hppa/common/hppadiags.c,v 1.1.1.1 1998/01/17 15:56:02 release Exp $
37
--------------------------------------------------------------------------
67
--------------------------------------------------------------------------
38
$Log: hppadiags.c,v $
68
$Log: hppadiags.c,v $
39
 * Revision 1.1.1.1  1998/01/17  15:56:02  release
69
 * Revision 1.1.1.1  1998/01/17  15:56:02  release
40
 * First version to be checked into rolling release.
70
 * First version to be checked into rolling release.
41
 *
71
 *
42
 * Revision 1.4  1996/08/06  10:50:06  wfs
72
 * Revision 1.4  1996/08/06  10:50:06  wfs
Line 103... Line 133...
103
 * Revision 3.4  1995/08/25  09:32:55  wfs
133
 * Revision 3.4  1995/08/25  09:32:55  wfs
104
 * A major revision. XDB stuff added.
134
 * A major revision. XDB stuff added.
105
 *
135
 *
106
 * Revision 3.1  95/04/10  16:26:44  16:26:44  wfs (William Simmonds)
136
 * Revision 3.1  95/04/10  16:26:44  16:26:44  wfs (William Simmonds)
107
 * Apr95 tape version.
137
 * Apr95 tape version.
108
 * 
138
 *
109
 * Revision 3.0  95/03/30  11:17:22  11:17:22  wfs (William Simmonds)
139
 * Revision 3.0  95/03/30  11:17:22  11:17:22  wfs (William Simmonds)
110
 * Mar95 tape version with CRCR95_178 bug fix.
140
 * Mar95 tape version with CRCR95_178 bug fix.
111
 * 
141
 *
112
 * Revision 2.0  95/03/15  15:27:08  15:27:08  wfs (William Simmonds)
142
 * Revision 2.0  95/03/15  15:27:08  15:27:08  wfs (William Simmonds)
113
 * spec 3.1 changes implemented, tests outstanding.
143
 * spec 3.1 changes implemented, tests outstanding.
114
 * 
144
 *
115
 * Revision 1.7  1995/01/11  16:40:35  john
145
 * Revision 1.7  1995/01/11  16:40:35  john
116
 * Fixed bug in diagnostics (for change request CR95_40)
146
 * Fixed bug in diagnostics (for change request CR95_40)
117
 *
147
 *
118
 * Revision 1.6  1995/01/11  09:59:32  john
148
 * Revision 1.6  1995/01/11  09:59:32  john
119
 * Fixed bug in diagnostics (for change request CR94_224)
149
 * Fixed bug in diagnostics (for change request CR94_224)
Line 140... Line 170...
140
 * Revision 1.1  1994/05/03  14:49:53  djch
170
 * Revision 1.1  1994/05/03  14:49:53  djch
141
 * Initial revision
171
 * Initial revision
142
 *
172
 *
143
 * Revision 1.6  93/09/27  14:55:15  14:55:15  ra (Robert Andrews)
173
 * Revision 1.6  93/09/27  14:55:15  14:55:15  ra (Robert Andrews)
144
 * Only whitespace.
174
 * Only whitespace.
145
 * 
175
 *
146
 * Revision 1.5  93/08/27  11:37:55  11:37:55  ra (Robert Andrews)
176
 * Revision 1.5  93/08/27  11:37:55  11:37:55  ra (Robert Andrews)
147
 * A couple of lint-like changes.
177
 * A couple of lint-like changes.
148
 * 
178
 *
149
 * Revision 1.4  93/08/13  14:45:51  14:45:51  ra (Robert Andrews)
179
 * Revision 1.4  93/08/13  14:45:51  14:45:51  ra (Robert Andrews)
150
 * Allow the stabs for long double to vary depending on DOUBLE_SZ.
180
 * Allow the stabs for long double to vary depending on DOUBLE_SZ.
151
 * 
181
 *
152
 * Revision 1.3  93/07/05  18:26:29  18:26:29  ra (Robert Andrews)
182
 * Revision 1.3  93/07/05  18:26:29  18:26:29  ra (Robert Andrews)
153
 * A couple of minor corrections.  Introduced stab_ptrs to avoid duplication
183
 * A couple of minor corrections.  Introduced stab_ptrs to avoid duplication
154
 * of basic pointer types.
184
 * of basic pointer types.
155
 * 
185
 *
156
 * Revision 1.2  93/06/29  14:32:54  14:32:54  ra (Robert Andrews)
186
 * Revision 1.2  93/06/29  14:32:54  14:32:54  ra (Robert Andrews)
157
 * Fairly major rewrite and reformat.  There were a number of errors which
187
 * Fairly major rewrite and reformat.  There were a number of errors which
158
 * meant that the diagnostics were not previously working.
188
 * meant that the diagnostics were not previously working.
159
 * 
189
 *
160
 * Revision 1.1  93/06/24  14:59:22  14:59:22  ra (Robert Andrews)
190
 * Revision 1.1  93/06/24  14:59:22  14:59:22  ra (Robert Andrews)
161
 * Initial revision
191
 * Initial revision
162
 * 
192
 *
163
--------------------------------------------------------------------------
193
--------------------------------------------------------------------------
164
*/
194
*/
165
 
195
 
166
 
196
 
167
#define HPPATRANS_CODE
197
#define HPPATRANS_CODE
Line 208... Line 238...
208
#include "hpux-symtab.h"
238
#include "hpux-symtab.h"
209
#endif
239
#endif
210
 
240
 
211
 
241
 
212
 
242
 
213
extern bool last_param PROTO_S ( ( exp ) ) ;
243
extern bool last_param(exp);
214
 
244
 
215
 
245
 
216
/*
246
/*
217
    FORWARD DECLARATIONS
247
    FORWARD DECLARATIONS
218
*/
248
*/
219
 
249
 
220
static void stab_scope_open PROTO_S ( ( long ) ) ;
250
static void stab_scope_open(long);
221
static void stab_scope_close PROTO_S ( ( long ) ) ;
251
static void stab_scope_close(long);
222
 
252
 
223
#ifdef _SYMTAB_INCLUDED
253
#ifdef _SYMTAB_INCLUDED
224
static int last_lno = 0;
254
static int last_lno = 0;
225
#endif
255
#endif
226
 
256
 
227
/*
257
/*
228
    ARRAY OF DIAGNOSTIC SCOPES
258
    ARRAY OF DIAGNOSTIC SCOPES
229
*/
259
*/
230
 
260
 
231
#define MAX_LEX_LEVEL 256
261
#define MAX_LEX_LEVEL 256
232
static long bracket_level = 1 ;
262
static long bracket_level = 1;
233
static long BB_id = 0;
263
static long BB_id = 0;
234
static long BE_id = 0;
264
static long BE_id = 0;
235
static int last_LBRAC_stab = 0;
265
static int last_LBRAC_stab = 0;
236
 
266
 
237
/*
267
/*
Line 255... Line 285...
255
#define STAB_FLOAT	10
285
#define STAB_FLOAT	10
256
#define STAB_DBL	11
286
#define STAB_DBL	11
257
#define STAB_LDBL	12
287
#define STAB_LDBL	12
258
#define STAB_VOID	13
288
#define STAB_VOID	13
259
#define NO_STABS	14
289
#define NO_STABS	14
260
 
290
 
261
 
291
 
262
/*
292
/*
263
    BASIC POINTERS
293
    BASIC POINTERS
264
*/
294
*/
265
 
295
 
266
static long stab_ptrs [ NO_STABS ] = {
296
static long stab_ptrs[NO_STABS] = {
267
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
297
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
268
} ;
298
};
269
 
299
 
270
 
300
 
271
/*
301
/*
272
    CURRENT TYPE NUMBER
302
    CURRENT TYPE NUMBER
273
*/
303
*/
274
 
304
 
275
static long typeno = NO_STABS ;
305
static long typeno = NO_STABS;
276
 
306
 
277
 
307
 
278
/*
308
/*
279
    SIZE OF LAST STAB TYPE OUTPUT
309
    SIZE OF LAST STAB TYPE OUTPUT
280
*/
310
*/
281
 
311
 
282
static long last_type_sz = 0 ;
312
static long last_type_sz = 0;
283
 
313
 
284
 
314
 
285
/*
315
/*
286
    CURRENT LINE NUMBER AND FILE NUMBER
316
    CURRENT LINE NUMBER AND FILE NUMBER
287
*/
317
*/
288
 
318
 
289
long currentlno = -1 ;
319
long currentlno = -1;
290
long currentfile = -1 ;
320
long currentfile = -1;
291
 
321
 
292
#ifndef _SYMTAB_INCLUDED
322
#ifndef _SYMTAB_INCLUDED
293
 
323
 
294
typedef int DNTTPOINTER;
324
typedef int DNTTPOINTER;
295
 
325
 
296
#endif
326
#endif
297
 
327
 
298
static DNTTPOINTER NIL;
328
static DNTTPOINTER NIL;
299
 
329
 
300
/*
330
/*
301
    ARRAY OF TYPE SIZES
331
    ARRAY OF TYPE SIZES
302
*/
332
*/
303
 
-
 
304
 
-
 
305
/* Information about previously defined types. */
-
 
306
 
333
 
307
typedef struct { int sz; DNTTPOINTER p; } type_info_t; 
-
 
308
 
334
 
-
 
335
/* Information about previously defined types. */
-
 
336
 
-
 
337
typedef struct { int sz; DNTTPOINTER p; } type_info_t;
-
 
338
 
309
static type_info_t *type_info ;
339
static type_info_t *type_info;
310
static int no_type_info = 0 ;
340
static int no_type_info = 0;
311
 
341
 
312
 
342
 
313
/*
343
/*
314
    SETTING AND GETTING TYPE SIZES
344
    SETTING AND GETTING TYPE SIZES
315
*/
345
*/
316
 
346
 
317
#define set_stab_size( i )	type_info [ ( i ) ].sz = last_type_sz
347
#define set_stab_size(i)	type_info[(i)].sz = last_type_sz
318
#define get_stab_size( i )	( type_info [ ( i ) ].sz )
348
#define get_stab_size(i)	(type_info[(i)].sz)
319
 
349
 
320
 
350
 
321
/*
351
/*
322
    GET THE NEXT TYPE NUMBER
352
    GET THE NEXT TYPE NUMBER
323
*/
353
*/
324
 
354
 
325
static long next_typen 
355
static long next_typen
326
    PROTO_Z ()
356
(void)
327
{
357
{
328
    if ( typeno >= no_type_info ) {
358
    if (typeno >= no_type_info) {
329
	int i, n = no_type_info, m = n + 100 ;
359
	int i, n = no_type_info, m = n + 100;
330
	type_info = ( type_info_t* ) xrealloc ( type_info, m * sizeof ( type_info_t ) ) ;
360
	type_info = (type_info_t*)xrealloc(type_info, m * sizeof(type_info_t));
331
	for ( i = n ; i < m ; i++ ) type_info [i].sz = 0 ;
361
	for (i = n; i < m; i++)type_info[i].sz = 0;
332
	no_type_info = m ;
362
	no_type_info = m;
333
    }
363
    }
334
    return ( typeno++ ) ;
364
    return(typeno++);
335
}
365
}
336
 
366
 
337
 
367
 
338
/*
368
/*
339
    ARRAY OF FILE DESCRIPTORS
369
    ARRAY OF FILE DESCRIPTORS
340
*/
370
*/
341
 
371
 
342
static filename *fds = null ;
372
static filename *fds = null;
343
static int szfds = 0 ;
373
static int szfds = 0;
344
static int nofds = 0 ;
374
static int nofds = 0;
345
 
375
 
346
 
376
 
347
/* tdfstring -> nul terminated C string (char *) */
377
/* tdfstring -> nul terminated C string (char *) */
348
#define CSTRING(tdfstring)	((tdfstring).ints.chars)
378
#define CSTRING(tdfstring)	((tdfstring).ints.chars)
349
 
379
 
350
/* tdf exp -> C int */
380
/* tdf exp -> C int */
351
#define EXPINT(exp)		(assert(name(exp) == val_tag) , no(exp))
381
#define EXPINT(exp)		(assert(name(exp) == val_tag), no(exp))
352
 
382
 
353
/* tdf nat -> C int */
383
/* tdf nat -> C int */
354
#define NATINT(n)		((n).nat_val.small_nat)
384
#define NATINT(n)		((n).nat_val.small_nat)
355
 
385
 
356
 
386
 
357
 
387
 
358
#ifdef _SYMTAB_INCLUDED
388
#ifdef _SYMTAB_INCLUDED
359
/******************************   XDB stuff  *********************************/
389
/******************************   XDB stuff  *********************************/
360
 
390
 
361
static FILE *VT_,*SLT_,*LNTT_,*GNTT_ ;
391
static FILE *VT_,*SLT_,*LNTT_,*GNTT_;
362
 
392
 
363
static char   VT_name[L_tmpnam],  SLT_name[L_tmpnam],
393
static char   VT_name[L_tmpnam],  SLT_name[L_tmpnam],
364
	      LNTT_name[L_tmpnam], GNTT_name[L_tmpnam] ;
394
	      LNTT_name[L_tmpnam], GNTT_name[L_tmpnam];
365
 
395
 
366
static DNTTPOINTER DNTT_BEGIN_entry[1024];
396
static DNTTPOINTER DNTT_BEGIN_entry[1024];
367
 
397
 
368
static int level_of_DNTT_BEGINs = -1;
398
static int level_of_DNTT_BEGINs = -1;
369
 
399
 
370
#define last_DNTT_BEGIN_entry()  DNTT_BEGIN_entry[level_of_DNTT_BEGINs]
400
#define last_DNTT_BEGIN_entry() DNTT_BEGIN_entry[level_of_DNTT_BEGINs]
371
#define LNTT 1
401
#define LNTT 1
372
#define GNTT 0
402
#define GNTT 0
373
 
403
 
374
static DNTTPOINTER lntt_next;
404
static DNTTPOINTER lntt_next;
375
static DNTTPOINTER gntt_next;
405
static DNTTPOINTER gntt_next;
376
static SLTPOINTER  slt_next = 0;
406
static SLTPOINTER  slt_next = 0;
377
static VTPOINTER   vt_next = VTNIL;
407
static VTPOINTER   vt_next = VTNIL;
378
 
408
 
379
struct vt_entry_t { long findex;
409
struct vt_entry_t { long findex;
380
		    VTPOINTER vtp;
410
		    VTPOINTER vtp;
381
		    struct vt_entry_t *prev; }; 
411
		    struct vt_entry_t *prev; };
382
 
412
 
383
typedef struct vt_entry_t *vt_entry;
413
typedef struct vt_entry_t *vt_entry;
384
 
414
 
385
vt_entry last_vt_entry = (vt_entry)0;
415
vt_entry last_vt_entry = (vt_entry)0;
386
 
416
 
387
VTPOINTER is_vt_entry
417
VTPOINTER is_vt_entry
388
    PROTO_N ( ( findex ) )
-
 
389
    PROTO_T ( long findex )
418
(long findex)
390
{
419
{
391
   vt_entry current = last_vt_entry;
420
   vt_entry current = last_vt_entry;
392
   while ( current != (vt_entry)0 )
421
   while (current != (vt_entry)0)
393
   {
422
   {
394
      if ( current->findex == findex )
423
      if (current->findex == findex)
395
	 return current->vtp;
424
	 return current->vtp;
396
      else
425
      else
397
	 current = current->prev;
426
	 current = current->prev;
398
   }   
427
   }
399
   return VTNIL;
428
   return VTNIL;
400
}    
429
}
401
 
430
 
402
#define EXTENSION_BIT( p ) ( (p)&(1<<31) )
431
#define EXTENSION_BIT(p)((p) & (1<<31))
403
 
432
 
404
void output_LNTT
433
void output_LNTT
405
    PROTO_N ( ( e ) )
-
 
406
    PROTO_T ( union dnttentry e )
434
(union dnttentry e)
407
{
435
{
408
   KINDTYPE kind = e.dfunc.kind;
436
   KINDTYPE kind = e.dfunc.kind;
409
   if (kind==K_SVAR)
437
   if (kind==K_SVAR)
410
   {
438
   {
411
      fprintf(LNTT_,"\t.WORD\t%lu,%lu,%s",e.dgeneric.word[0], e.dgeneric.word[1], (char*)e.dgeneric.word[2]);
439
      fprintf(LNTT_,"\t.WORD\t%lu,%lu,%s",e.dgeneric.word[0], e.dgeneric.word[1],(char*)e.dgeneric.word[2]);
412
   }
440
   }
413
   else
441
   else
414
   {
442
   {
415
      fprintf(LNTT_,"\t.WORD\t%lu,%lu,%lu",e.dgeneric.word[0], e.dgeneric.word[1], e.dgeneric.word[2]);
443
      fprintf(LNTT_,"\t.WORD\t%lu,%lu,%lu",e.dgeneric.word[0], e.dgeneric.word[1], e.dgeneric.word[2]);
416
   }
444
   }
417
 
445
 
418
   switch ( kind )
446
   switch (kind)
419
   {
447
   {
420
      case K_MODULE:
448
      case K_MODULE:
421
      case K_WITH: 
449
      case K_WITH:
422
      case K_FPARAM:
450
      case K_FPARAM:
423
      case K_SVAR:
451
      case K_SVAR:
424
      case K_DVAR:
452
      case K_DVAR:
425
      case K_CONST:
453
      case K_CONST:
426
      case K_MEMENUM:
454
      case K_MEMENUM:
Line 430... Line 458...
430
      case K_FIELD:
458
      case K_FIELD:
431
      case K_VARIANT:
459
      case K_VARIANT:
432
      case K_FILE:
460
      case K_FILE:
433
      case K_FUNCTYPE:
461
      case K_FUNCTYPE:
434
      {
462
      {
435
	 if ( EXTENSION_BIT(e.dgeneric.word[3])==0 )
463
	 if (EXTENSION_BIT(e.dgeneric.word[3]) ==0)
436
	 {
464
	 {
437
	    fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables (extension bit not set)\n");
465
	    fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables (extension bit not set)\n");
438
	 }
466
	 }
439
	 else
467
	 else
440
	 {
468
	 {
Line 445... Line 473...
445
      case K_FUNCTION:
473
      case K_FUNCTION:
446
      case K_ENTRY:
474
      case K_ENTRY:
447
      case K_BLOCKDATA:
475
      case K_BLOCKDATA:
448
      case K_COBSTRUCT:
476
      case K_COBSTRUCT:
449
      {
477
      {
450
	 if ( EXTENSION_BIT(e.dgeneric.word[3])==0 )
478
	 if (EXTENSION_BIT(e.dgeneric.word[3]) ==0)
451
	 {
479
	 {
452
	    fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables (extension bit not set)\n");
480
	    fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables (extension bit not set)\n");
453
	    break;
481
	    break;
454
	 }
482
	 }
455
	 else
483
	 else
456
	 {
484
	 {
457
	    fprintf(LNTT_,",%lu,%lu,%s",e.dgeneric.word[3],e.dgeneric.word[4], (char*)e.dgeneric.word[5]);
485
	    fprintf(LNTT_,",%lu,%lu,%s",e.dgeneric.word[3],e.dgeneric.word[4],(char*)e.dgeneric.word[5]);
458
	 }
486
	 }
459
	 if ( EXTENSION_BIT(e.dgeneric.word[6])==0 )
487
	 if (EXTENSION_BIT(e.dgeneric.word[6]) ==0)
460
	 {
488
	 {
461
	    fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables (extension bit not set)\n");
489
	    fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables (extension bit not set)\n");
462
	 }
490
	 }
463
	 else
491
	 else
464
	 {
492
	 {
465
	    fprintf(LNTT_,",%lu,%s,%s",e.dgeneric.word[6], (char*)e.dgeneric.word[7],(char*)e.dgeneric.word[8]);         
493
	    fprintf(LNTT_,",%lu,%s,%s",e.dgeneric.word[6],(char*)e.dgeneric.word[7],(char*)e.dgeneric.word[8]);
466
	 }
494
	 }
467
      }
495
      }
468
      default:
496
      default:
469
      break;
497
      break;
470
   }
498
   }
471
   fprintf(LNTT_,"\n");
499
   fprintf(LNTT_,"\n");
472
}
500
}
473
 
501
 
474
 
502
 
475
void output_GNTT
503
void output_GNTT
476
    PROTO_N ( ( e ) )
-
 
477
    PROTO_T ( union dnttentry e )
504
(union dnttentry e)
478
{
505
{
479
   KINDTYPE kind = e.dfunc.kind;
506
   KINDTYPE kind = e.dfunc.kind;
480
   if (kind==K_SVAR)
507
   if (kind==K_SVAR)
481
   {
508
   {
482
      fprintf(GNTT_,"\t.WORD\t%lu,%lu,%s",e.dgeneric.word[0], e.dgeneric.word[1], (char*)e.dgeneric.word[2]);
509
      fprintf(GNTT_,"\t.WORD\t%lu,%lu,%s",e.dgeneric.word[0], e.dgeneric.word[1],(char*)e.dgeneric.word[2]);
483
      if ( EXTENSION_BIT(e.dgeneric.word[3])==0 )
510
      if (EXTENSION_BIT(e.dgeneric.word[3]) ==0)
484
      {
511
      {
485
	 fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables (extension bit not set)\n");
512
	 fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables (extension bit not set)\n");
486
      }
513
      }
487
      else
514
      else
488
      {
515
      {
489
	 fprintf(GNTT_,",%lu,%lu,%lu",e.dgeneric.word[3],e.dgeneric.word[4], e.dgeneric.word[5]);
516
	 fprintf(GNTT_,",%lu,%lu,%lu",e.dgeneric.word[3],e.dgeneric.word[4], e.dgeneric.word[5]);
490
      }
517
      }
491
   }
518
   }
492
   else
519
   else
493
   {
520
   {
494
      fprintf(GNTT_,"\t.WORD\t%lu,%lu,%lu",e.dgeneric.word[0], e.dgeneric.word[1], e.dgeneric.word[2]);
521
      fprintf(GNTT_,"\t.WORD\t%lu,%lu,%lu",e.dgeneric.word[0], e.dgeneric.word[1], e.dgeneric.word[2]);
495
   }
522
   }
496
   if (e.dgeneric.word[6]&(1<<31))
523
   if (e.dgeneric.word[6] & (1<<31))
497
   {
524
   {
498
      fprintf(GNTT_,",%lu,%lu,%lu",e.dgeneric.word[6],e.dgeneric.word[7], e.dgeneric.word[8]);
525
      fprintf(GNTT_,",%lu,%lu,%lu",e.dgeneric.word[6],e.dgeneric.word[7], e.dgeneric.word[8]);
499
   }
526
   }
500
   fprintf(GNTT_,"\n");
527
   fprintf(GNTT_,"\n");
501
}
528
}
502
 
529
 
503
 
530
 
504
DNTTPOINTER make_DNTTP_IMMEDIATE
531
DNTTPOINTER make_DNTTP_IMMEDIATE
505
    PROTO_V ( ( BASETYPE type, ... ) )
532
(BASETYPE type, ...)
506
{
533
{
507
   DNTTPOINTER p;
534
   DNTTPOINTER p;
508
   va_list ap;
535
   va_list ap;
509
#if FS_STDARG
536
#if FS_STDARG
510
   va_start(ap,type);
537
   va_start(ap,type);
Line 515... Line 542...
515
#endif
542
#endif
516
   p.dntti.extension = 1;
543
   p.dntti.extension = 1;
517
   p.dntti.immediate = 1;
544
   p.dntti.immediate = 1;
518
   p.dntti.global = 0;
545
   p.dntti.global = 0;
519
   p.dntti.type = type;
546
   p.dntti.type = type;
520
   switch( type )
547
   switch (type)
521
     {
548
     {
522
     case T_UNDEFINED:
549
     case T_UNDEFINED:
523
       {
550
       {
524
	  p.dntti.bitlength = 32;
551
	  p.dntti.bitlength = 32;
525
	  break;
552
	  break;
526
       } 
553
       }
527
     case T_BOOLEAN:
554
     case T_BOOLEAN:
528
       {
555
       {
529
	  p.dntti.bitlength = 1;
556
	  p.dntti.bitlength = 1;
530
	  break;
557
	  break;
531
       } 
558
       }
532
     case T_CHAR:
559
     case T_CHAR:
533
     case T_INT:
560
     case T_INT:
534
     case T_UNS_INT:
561
     case T_UNS_INT:
535
     case T_LONG:
562
     case T_LONG:
536
     case T_UNS_LONG:
563
     case T_UNS_LONG:
537
     case T_REAL:
564
     case T_REAL:
538
     case T_COMPLEX:
565
     case T_COMPLEX:
539
       {
566
       {
540
	  p.dntti.bitlength = va_arg(ap,BITS);
567
	  p.dntti.bitlength = va_arg(ap,BITS);
541
	  break;
568
	  break;
542
       } 
569
       }
543
     }
570
     }
544
   return p;
571
   return p;
545
}
572
}
546
 
573
 
547
 
574
 
548
void make_vtentry
575
void make_vtentry
549
    PROTO_T ( ( e X record X findex ) )
576
((e, record, findex))
550
    PROTO_T ( char *e X int record X long findex )
577
(char *e, int record, long findex)
551
{
578
{
552
   int len = 0;
579
   int len = 0;
553
   fprintf(VT_,"\t.STRINGZ\t\"");
-
 
554
   while (e[len++])
580
   fprintf(VT_,   while (e[len++])
555
   {
581
   {
556
      fprintf(VT_,"%c",e[len-1]);
582
      fprintf(VT_,"%c",e[len-1]);
557
   }
583
   }
558
   if ( record )
584
   if (record)
559
   {
585
   {
560
      vt_entry next = (vt_entry) malloc(sizeof(struct vt_entry_t));
586
      vt_entry next = (vt_entry)malloc(sizeof(struct vt_entry_t));
561
      if ( last_vt_entry == (vt_entry)0 )
587
      if (last_vt_entry == (vt_entry)0)
562
      {
588
      {
563
	 last_vt_entry = next;
589
	 last_vt_entry = next;
564
	 last_vt_entry->prev = (vt_entry)0;
590
	 last_vt_entry->prev = (vt_entry)0;
565
      }
591
      }
566
      else
592
      else
567
      {
593
      {
568
	 next->prev = last_vt_entry;
594
	 next->prev = last_vt_entry;
569
	 last_vt_entry = next;
595
	 last_vt_entry = next;
570
      }
596
      }
571
      next->findex = findex;
597
      next->findex = findex;
Line 575... Line 601...
575
   fprintf(VT_,"\"\n");
601
   fprintf(VT_,"\"\n");
576
}
602
}
577
 
603
 
578
 
604
 
579
void make_sltentry
605
void make_sltentry
580
    PROTO_V ( ( SLTTYPE sltdesc, ... ) )
606
(SLTTYPE sltdesc, ...)
581
{
607
{
582
   va_list ap;
608
   va_list ap;
583
   union sltentry e;
609
   union sltentry e;
584
#if FS_STDARG
610
#if FS_STDARG
585
   va_start(ap,sltdesc);
611
   va_start(ap,sltdesc);
Line 588... Line 614...
588
   va_start(ap);
614
   va_start(ap);
589
   sltdesc = va_arg(ap, SLTTYPE);
615
   sltdesc = va_arg(ap, SLTTYPE);
590
#endif
616
#endif
591
   e.sgeneric.word[0] = 0;
617
   e.sgeneric.word[0] = 0;
592
   e.sgeneric.word[1] = 0;
618
   e.sgeneric.word[1] = 0;
593
   switch(sltdesc)
619
   switch (sltdesc)
594
   {
620
   {
595
   case SLT_SRCFILE:
621
   case SLT_SRCFILE:
596
   case SLT_MODULE:
622
   case SLT_MODULE:
597
   case SLT_FUNCTION:
623
   case SLT_FUNCTION:
598
   case SLT_ENTRY:
624
   case SLT_ENTRY:
Line 613... Line 639...
613
     {
639
     {
614
	/*  A "normal" entry  */
640
	/*  A "normal" entry  */
615
	e.snorm.sltdesc = SLT_NORMAL;
641
	e.snorm.sltdesc = SLT_NORMAL;
616
	e.snorm.line = va_arg(ap,BITS);
642
	e.snorm.line = va_arg(ap,BITS);
617
	e.snorm.address = va_arg(ap,ADDRESS);
643
	e.snorm.address = va_arg(ap,ADDRESS);
618
	fprintf(SLT_,"\t.WORD\t%lu,%s\n",e.sgeneric.word[0], (char*)e.sgeneric.word[1]);
644
	fprintf(SLT_,"\t.WORD\t%lu,%s\n",e.sgeneric.word[0],(char*)e.sgeneric.word[1]);
619
	break;
645
	break;
620
     }
646
     }
621
   case SLT_ASSIST:
647
   case SLT_ASSIST:
622
     {
648
     {
623
	/*  An "assist" entry  */
649
	/*  An "assist" entry  */
Line 626... Line 652...
626
	e.sasst.address = va_arg(ap,ADDRESS);
652
	e.sasst.address = va_arg(ap,ADDRESS);
627
	fprintf(SLT_,"\t.WORD\t%lu,%lu\n",e.sgeneric.word[0], e.sgeneric.word[1]);
653
	fprintf(SLT_,"\t.WORD\t%lu,%lu\n",e.sgeneric.word[0], e.sgeneric.word[1]);
628
	break;
654
	break;
629
     }
655
     }
630
   }
656
   }
631
   slt_next++; 
657
   slt_next++;
632
}
658
}
633
 
659
 
634
 
660
 
635
DNTTPOINTER make_dnttentry
661
DNTTPOINTER make_dnttentry
636
    PROTO_V ( ( KINDTYPE kind, ... ) )
662
(KINDTYPE kind, ...)
637
{
663
{
638
   va_list ap;
664
   va_list ap;
639
   union dnttentry e;
665
   union dnttentry e;
640
   DNTTPOINTER dnttpointer;
666
   DNTTPOINTER dnttpointer;
641
#if FS_STDARG
667
#if FS_STDARG
Line 647... Line 673...
647
#endif
673
#endif
648
   e.dsfile.extension = 0;
674
   e.dsfile.extension = 0;
649
   e.dsfile.kind = K_SRCFILE;
675
   e.dsfile.kind = K_SRCFILE;
650
   e.dsfile.language = 0;
676
   e.dsfile.language = 0;
651
   dnttpointer = lntt_next;
677
   dnttpointer = lntt_next;
652
   switch(kind)
678
   switch (kind)
653
   {
679
   {
654
   case K_SRCFILE:
680
   case K_SRCFILE:
655
     {
681
     {
656
	e.dsfile.extension = 0;
682
	e.dsfile.extension = 0;
657
	e.dsfile.kind = K_SRCFILE;
683
	e.dsfile.kind = K_SRCFILE;
Line 899... Line 925...
899
	break;
925
	break;
900
     }
926
     }
901
   case K_MEMENUM:
927
   case K_MEMENUM:
902
     {
928
     {
903
	e.dmember.extension = 0;
929
	e.dmember.extension = 0;
904
	e.dmember.kind = K_MEMENUM;  
930
	e.dmember.kind = K_MEMENUM;
905
	e.dmember.unused = 0;
931
	e.dmember.unused = 0;
906
	e.dmember.name = va_arg(ap,VTPOINTER);
932
	e.dmember.name = va_arg(ap,VTPOINTER);
907
	e.dmember.value = va_arg(ap,unsigned long);
933
	e.dmember.value = va_arg(ap,unsigned long);
908
	e.dmember.nextmem = va_arg(ap,DNTTPOINTER);
934
	e.dmember.nextmem = va_arg(ap,DNTTPOINTER);
909
	e.dgeneric.word[4] = 0;
935
	e.dgeneric.word[4] = 0;
Line 913... Line 939...
913
	break;
939
	break;
914
     }
940
     }
915
   case K_SET:
941
   case K_SET:
916
     {
942
     {
917
	e.dset.extension = 0;
943
	e.dset.extension = 0;
918
	e.dset.kind = K_SET;  
944
	e.dset.kind = K_SET;
919
	e.dset.declaration = va_arg(ap,BITS);
945
	e.dset.declaration = va_arg(ap,BITS);
920
	e.dset.unused = 0;
946
	e.dset.unused = 0;
921
	e.dset.subtype = va_arg(ap,DNTTPOINTER);
947
	e.dset.subtype = va_arg(ap,DNTTPOINTER);
922
	e.dset.bitlength = va_arg(ap,unsigned long);
948
	e.dset.bitlength = va_arg(ap,unsigned long);
923
	output_LNTT(e);
949
	output_LNTT(e);
Line 925... Line 951...
925
	break;
951
	break;
926
     }
952
     }
927
   case K_SUBRANGE:
953
   case K_SUBRANGE:
928
     {
954
     {
929
	e.dsubr.extension = 0;
955
	e.dsubr.extension = 0;
930
	e.dsubr.kind = K_SUBRANGE;  
956
	e.dsubr.kind = K_SUBRANGE;
931
	e.dsubr.dyn_low = va_arg(ap,BITS);
957
	e.dsubr.dyn_low = va_arg(ap,BITS);
932
	e.dsubr.dyn_high = va_arg(ap,BITS);
958
	e.dsubr.dyn_high = va_arg(ap,BITS);
933
	e.dsubr.unused = 0;
959
	e.dsubr.unused = 0;
934
	e.dsubr.lowbound = va_arg(ap,long);
960
	e.dsubr.lowbound = va_arg(ap,long);
935
	e.dsubr.highbound = va_arg(ap,long);
961
	e.dsubr.highbound = va_arg(ap,long);
Line 941... Line 967...
941
	break;
967
	break;
942
     }
968
     }
943
   case K_ARRAY:
969
   case K_ARRAY:
944
     {
970
     {
945
	e.darray.extension = 0;
971
	e.darray.extension = 0;
946
	e.darray.kind = K_ARRAY;  
972
	e.darray.kind = K_ARRAY;
947
	e.darray.declaration = va_arg(ap,BITS);
973
	e.darray.declaration = va_arg(ap,BITS);
948
	e.darray.dyn_low = va_arg(ap,BITS);
974
	e.darray.dyn_low = va_arg(ap,BITS);
949
	e.darray.dyn_high = va_arg(ap,BITS);
975
	e.darray.dyn_high = va_arg(ap,BITS);
950
	e.darray.arrayisbytes = va_arg(ap,BITS);
976
	e.darray.arrayisbytes = va_arg(ap,BITS);
951
	e.darray.elemisbytes = va_arg(ap,BITS);
977
	e.darray.elemisbytes = va_arg(ap,BITS);
Line 962... Line 988...
962
	break;
988
	break;
963
     }
989
     }
964
   case K_STRUCT:
990
   case K_STRUCT:
965
     {
991
     {
966
	e.dstruct.extension = 0;
992
	e.dstruct.extension = 0;
967
	e.dstruct.kind = K_STRUCT;  
993
	e.dstruct.kind = K_STRUCT;
968
	e.dstruct.declaration = va_arg(ap,BITS);
994
	e.dstruct.declaration = va_arg(ap,BITS);
969
	e.dstruct.unused = 0;
995
	e.dstruct.unused = 0;
970
	e.dstruct.firstfield = va_arg(ap,DNTTPOINTER);
996
	e.dstruct.firstfield = va_arg(ap,DNTTPOINTER);
971
	e.dstruct.vartagfield = va_arg(ap,DNTTPOINTER);
997
	e.dstruct.vartagfield = va_arg(ap,DNTTPOINTER);
972
	e.dstruct.varlist = va_arg(ap,DNTTPOINTER);
998
	e.dstruct.varlist = va_arg(ap,DNTTPOINTER);
Line 977... Line 1003...
977
	break;
1003
	break;
978
     }
1004
     }
979
   case K_UNION:
1005
   case K_UNION:
980
     {
1006
     {
981
	e.dunion.extension = 0;
1007
	e.dunion.extension = 0;
982
	e.dunion.kind = K_UNION;  
1008
	e.dunion.kind = K_UNION;
983
	e.dunion.unused = 0;
1009
	e.dunion.unused = 0;
984
	e.dunion.firstfield = va_arg(ap,DNTTPOINTER);
1010
	e.dunion.firstfield = va_arg(ap,DNTTPOINTER);
985
	e.dunion.bitlength = va_arg(ap,unsigned long);
1011
	e.dunion.bitlength = va_arg(ap,unsigned long);
986
	output_LNTT(e);
1012
	output_LNTT(e);
987
	lntt_next.word++;
1013
	lntt_next.word++;
988
	break;
1014
	break;
989
     }
1015
     }
990
   case K_FIELD:
1016
   case K_FIELD:
991
     {
1017
     {
992
	e.dfield.extension = 0;
1018
	e.dfield.extension = 0;
993
	e.dfield.kind = K_FIELD;  
1019
	e.dfield.kind = K_FIELD;
994
	e.dfield.unused = 0;
1020
	e.dfield.unused = 0;
995
	e.dfield.name = va_arg(ap,VTPOINTER);
1021
	e.dfield.name = va_arg(ap,VTPOINTER);
996
	e.dfield.bitoffset = va_arg(ap,unsigned long);
1022
	e.dfield.bitoffset = va_arg(ap,unsigned long);
997
	e.dfield.type = va_arg(ap,DNTTPOINTER);
1023
	e.dfield.type = va_arg(ap,DNTTPOINTER);
998
	e.dfield.bitlength = va_arg(ap,unsigned long);
1024
	e.dfield.bitlength = va_arg(ap,unsigned long);
Line 1002... Line 1028...
1002
	break;
1028
	break;
1003
     }
1029
     }
1004
   case K_VARIANT:
1030
   case K_VARIANT:
1005
     {
1031
     {
1006
	e.dvariant.extension = 0;
1032
	e.dvariant.extension = 0;
1007
	e.dvariant.kind = K_VARIANT;  
1033
	e.dvariant.kind = K_VARIANT;
1008
	e.dvariant.unused = 0;
1034
	e.dvariant.unused = 0;
1009
	e.dvariant.lowvarvalue = va_arg(ap,long);
1035
	e.dvariant.lowvarvalue = va_arg(ap,long);
1010
	e.dvariant.hivarvalue = va_arg(ap,long);
1036
	e.dvariant.hivarvalue = va_arg(ap,long);
1011
	e.dvariant.varstruct = va_arg(ap,DNTTPOINTER);
1037
	e.dvariant.varstruct = va_arg(ap,DNTTPOINTER);
1012
	e.dvariant.bitoffset = va_arg(ap,unsigned long);
1038
	e.dvariant.bitoffset = va_arg(ap,unsigned long);
Line 1016... Line 1042...
1016
	break;
1042
	break;
1017
     }
1043
     }
1018
   case K_FILE:
1044
   case K_FILE:
1019
     {
1045
     {
1020
	e.dfile.extension = 0;
1046
	e.dfile.extension = 0;
1021
	e.dfile.kind = K_FILE;  
1047
	e.dfile.kind = K_FILE;
1022
	e.dfile.ispacked = va_arg(ap,BITS);
1048
	e.dfile.ispacked = va_arg(ap,BITS);
1023
	e.dfile.unused = 0;
1049
	e.dfile.unused = 0;
1024
	e.dfile.bitlength = va_arg(ap,unsigned long);
1050
	e.dfile.bitlength = va_arg(ap,unsigned long);
1025
	e.dfile.bitoffset = va_arg(ap,unsigned long);
1051
	e.dfile.bitoffset = va_arg(ap,unsigned long);
1026
	e.dfile.elemtype = va_arg(ap,DNTTPOINTER);
1052
	e.dfile.elemtype = va_arg(ap,DNTTPOINTER);
Line 1031... Line 1057...
1031
	break;
1057
	break;
1032
     }
1058
     }
1033
   case K_FUNCTYPE:
1059
   case K_FUNCTYPE:
1034
     {
1060
     {
1035
	e.dfunctype.extension = 0;
1061
	e.dfunctype.extension = 0;
1036
	e.dfunctype.kind = K_FUNCTYPE;  
1062
	e.dfunctype.kind = K_FUNCTYPE;
1037
	e.dfunctype.varargs = va_arg(ap,BITS);
1063
	e.dfunctype.varargs = va_arg(ap,BITS);
1038
	e.dfunctype.info = va_arg(ap,BITS);
1064
	e.dfunctype.info = va_arg(ap,BITS);
1039
	e.dfunctype.unused = 0;
1065
	e.dfunctype.unused = 0;
1040
	e.dfunctype.bitlength = va_arg(ap,unsigned long);
1066
	e.dfunctype.bitlength = va_arg(ap,unsigned long);
1041
	e.dfunctype.firstparam = va_arg(ap,DNTTPOINTER);
1067
	e.dfunctype.firstparam = va_arg(ap,DNTTPOINTER);
Line 1047... Line 1073...
1047
	break;
1073
	break;
1048
     }
1074
     }
1049
   case K_COBSTRUCT:
1075
   case K_COBSTRUCT:
1050
     {
1076
     {
1051
	e.dcobstruct.extension = 0;
1077
	e.dcobstruct.extension = 0;
1052
	e.dcobstruct.kind = K_COBSTRUCT;  
1078
	e.dcobstruct.kind = K_COBSTRUCT;
1053
	e.dcobstruct.hasoccurs = va_arg(ap,BITS);
1079
	e.dcobstruct.hasoccurs = va_arg(ap,BITS);
1054
	e.dcobstruct.istable = va_arg(ap,BITS);
1080
	e.dcobstruct.istable = va_arg(ap,BITS);
1055
	e.dcobstruct.unused = 0;
1081
	e.dcobstruct.unused = 0;
1056
	e.dcobstruct.parent = va_arg(ap,DNTTPOINTER);
1082
	e.dcobstruct.parent = va_arg(ap,DNTTPOINTER);
1057
	e.dcobstruct.child = va_arg(ap,DNTTPOINTER);
1083
	e.dcobstruct.child = va_arg(ap,DNTTPOINTER);
Line 1062... Line 1088...
1062
	e.dcobstruct.table = va_arg(ap,DNTTPOINTER);
1088
	e.dcobstruct.table = va_arg(ap,DNTTPOINTER);
1063
	e.dcobstruct.editpgm = va_arg(ap,VTPOINTER);
1089
	e.dcobstruct.editpgm = va_arg(ap,VTPOINTER);
1064
	e.dcobstruct.bitlength = va_arg(ap,unsigned long);
1090
	e.dcobstruct.bitlength = va_arg(ap,unsigned long);
1065
	output_LNTT(e);
1091
	output_LNTT(e);
1066
	lntt_next.word+=3;
1092
	lntt_next.word+=3;
1067
	break;
1093
	break;
1068
     }
1094
     }
1069
   case K_SA:
1095
   case K_SA:
1070
     {
1096
     {
1071
	e.dsa.extension = 0;
1097
	e.dsa.extension = 0;
1072
	e.dsa.kind = K_SA;
1098
	e.dsa.kind = K_SA;
1073
	e.dsa.base_kind = va_arg(ap,KINDTYPE);
1099
	e.dsa.base_kind = va_arg(ap,KINDTYPE);
1074
	e.dsa.unused = 0;
1100
	e.dsa.unused = 0;
1075
	e.dsa.name = va_arg(ap,VTPOINTER);
1101
	e.dsa.name = va_arg(ap,VTPOINTER);
1076
	e.dsa.extra = 0;
1102
	e.dsa.extra = 0;
1077
	output_LNTT(e);
1103
	output_LNTT(e);
1078
	lntt_next.word++;
1104
	lntt_next.word++;
1079
	break;
1105
	break;
1080
     }
1106
     }
1081
   case K_XREF:
1107
   case K_XREF:
1082
     {
1108
     {
1083
	e.dxref.extension = 0;
1109
	e.dxref.extension = 0;
1084
	e.dxref.kind = K_XREF;
1110
	e.dxref.kind = K_XREF;
Line 1090... Line 1116...
1090
	lntt_next.word++;
1116
	lntt_next.word++;
1091
	break;
1117
	break;
1092
     }
1118
     }
1093
   }
1119
   }
1094
   return dnttpointer;
1120
   return dnttpointer;
1095
}
1121
}
1096
  
1122
 
1097
 
1123
 
1098
void output_DEBUG
1124
void output_DEBUG
1099
    PROTO_Z ()
1125
(void)
1100
{
1126
{
1101
    int c ;
1127
    int c;
1102
    FILE *f ;
1128
    FILE *f;
1103
    SLTPOINTER slt_prev = slt_next;
1129
    SLTPOINTER slt_prev = slt_next;
1104
    make_sltentry(SLT_END, currentlno, lntt_next);
1130
    make_sltentry(SLT_END, currentlno, lntt_next);
1105
    make_dnttentry(K_END, K_MODULE, slt_prev, last_DNTT_BEGIN_entry());
1131
    make_dnttentry(K_END, K_MODULE, slt_prev, last_DNTT_BEGIN_entry());
1106
    fclose( VT_ );
1132
    fclose(VT_);
1107
    fclose( SLT_ );
1133
    fclose(SLT_);
1108
    fclose( LNTT_ );
1134
    fclose(LNTT_);
1109
    fclose( GNTT_ );
1135
    fclose(GNTT_);
1110
    f = fopen( VT_name, "r" ) ;
1136
    f = fopen(VT_name, "r");
1111
    if ( f == NULL ) {
-
 
1112
	fail ( "Can't open temporary diagnostics file" ) ;
-
 
1113
	exit ( EXIT_FAILURE ) ;
-
 
1114
    }
-
 
1115
    while( c = fgetc ( f ), c != EOF )  outc ( c );
-
 
1116
    outnl();
-
 
1117
    fclose( VT_ );
-
 
1118
    remove( VT_name );
-
 
1119
    f = fopen( SLT_name, "r" ) ;
-
 
1120
    if ( f == NULL ) {
1137
    if (f == NULL) {
1121
	fail ( "Can't open temporary diagnostics file" ) ;
1138
	fail("Can't open temporary diagnostics file");
1122
	exit ( EXIT_FAILURE ) ;
1139
	exit(EXIT_FAILURE);
1123
    }
1140
    }
1124
    while( c = fgetc ( f ), c != EOF )  outc ( c );
1141
    while (c = fgetc(f), c != EOF) outc(c);
1125
    outnl();
1142
    outnl();
1126
    fclose( SLT_ );
1143
    fclose(VT_);
1127
    remove( SLT_name );
1144
    remove(VT_name);
1128
    f = fopen( LNTT_name, "r" ) ;
1145
    f = fopen(SLT_name, "r");
1129
    if ( f == NULL ) {
1146
    if (f == NULL) {
1130
	fail ( "Can't open temporary diagnostics file" ) ;
1147
	fail("Can't open temporary diagnostics file");
1131
	exit ( EXIT_FAILURE ) ;
1148
	exit(EXIT_FAILURE);
1132
    }
1149
    }
1133
    while ( c = fgetc ( f ), c != EOF )  outc ( c );
1150
    while (c = fgetc(f), c != EOF) outc(c);
1134
    outnl();
1151
    outnl();
-
 
1152
    fclose(SLT_);
-
 
1153
    remove(SLT_name);
-
 
1154
    f = fopen(LNTT_name, "r");
-
 
1155
    if (f == NULL) {
-
 
1156
	fail("Can't open temporary diagnostics file");
-
 
1157
	exit(EXIT_FAILURE);
-
 
1158
    }
-
 
1159
    while (c = fgetc(f), c != EOF) outc(c);
-
 
1160
    outnl();
1135
    fclose( LNTT_ );
1161
    fclose(LNTT_);
1136
    remove( LNTT_name );
1162
    remove(LNTT_name);
1137
    f = fopen( GNTT_name, "r" ) ;
1163
    f = fopen(GNTT_name, "r");
1138
    if ( f == NULL ) {
1164
    if (f == NULL) {
1139
	fail ( "Can't open temporary diagnostics file" ) ;
1165
	fail("Can't open temporary diagnostics file");
1140
	exit ( EXIT_FAILURE ) ;
1166
	exit(EXIT_FAILURE);
1141
    }
1167
    }
1142
    while( c = fgetc ( f ), c != EOF )  outc ( c );
1168
    while (c = fgetc(f), c != EOF) outc(c);
1143
    fclose( GNTT_ );
1169
    fclose(GNTT_);
1144
    remove( GNTT_name );
1170
    remove(GNTT_name);
1145
 
1171
 
1146
    fprintf(outf,"\n\t.SPACE\t$DEBUG$\n");
1172
    fprintf(outf,"\n\t.SPACE\t$DEBUG$\n");
1147
    fprintf(outf,"\t.SUBSPA\t$HEADER$\n");
1173
    fprintf(outf,"\t.SUBSPA\t$HEADER$\n");
1148
#if USE_XT
1174
#if USE_XT
1149
    fprintf(outf,"\t.WORD\t%ld\n",(gntt_next.word * DNTTBLOCKSIZE) |
1175
    fprintf(outf,"\t.WORD\t%ld\n",(gntt_next.word * DNTTBLOCKSIZE) |
1150
	     		       extension_header);	/* MSB indicates XT */
1176
	     		       extension_header);	/* MSB indicates XT */
1151
#else
1177
#else
1152
    fprintf(outf,"\t.WORD\t%ld\n",(gntt_next.word * DNTTBLOCKSIZE) | 0 );
1178
    fprintf(outf,"\t.WORD\t%ld\n",(gntt_next.word * DNTTBLOCKSIZE) | 0);
1153
	     		                        	/* MSB indicates XT */
1179
	     		                        	/* MSB indicates XT */
1154
#endif
1180
#endif
1155
    fprintf(outf,"\t.WORD\t%ld\n",lntt_next.word * DNTTBLOCKSIZE);
1181
    fprintf(outf,"\t.WORD\t%ld\n",lntt_next.word * DNTTBLOCKSIZE);
1156
    fprintf(outf,"\t.WORD\t%ld\n",slt_next * SLTBLOCKSIZE);
1182
    fprintf(outf,"\t.WORD\t%ld\n",slt_next * SLTBLOCKSIZE);
1157
    fprintf(outf,"\t.WORD\t%ld\n",vt_next);
1183
    fprintf(outf,"\t.WORD\t%ld\n",vt_next);
1158
#if USE_XT
1184
#if USE_XT
1159
    fprintf(outf,"\t.WORD\t%ld\n",xt_next * XTBLOCKSIZE);
1185
    fprintf(outf,"\t.WORD\t%ld\n",xt_next * XTBLOCKSIZE);
1160
#endif
1186
#endif
1161
    return ;
1187
    return;
1162
}
1188
}
1163
 
1189
 
1164
/*****************************************************************************/
1190
/*****************************************************************************/
1165
#endif
1191
#endif
1166
 
1192
 
1167
/*
1193
/*
1168
    ADD A NEW FILE TO THE ARRAY OF FILE DESCRIPTORS
1194
    ADD A NEW FILE TO THE ARRAY OF FILE DESCRIPTORS
1169
*/
1195
*/
1170
 
1196
 
1171
void stab_collect_files 
1197
void stab_collect_files
1172
    PROTO_N ( ( f ) )
-
 
1173
    PROTO_T ( filename f )
1198
(filename f)
1174
{
1199
{
1175
    if ( fds == null ) {
1200
    if (fds == null) {
1176
	szfds += 10 ;
1201
	szfds += 10;
1177
	fds = ( filename * ) xmalloc ( szfds * sizeof ( filename ) ) ;
1202
	fds = (filename *)xmalloc(szfds * sizeof(filename));
1178
    } else if ( nofds >= szfds ) {
1203
    } else if (nofds >= szfds) {
1179
	szfds += 10 ;
1204
	szfds += 10;
1180
	fds = ( filename * ) xrealloc ( fds, szfds * sizeof ( filename ) ) ;
1205
	fds = (filename *)xrealloc(fds, szfds * sizeof(filename));
1181
    }
1206
    }
1182
    fds [ nofds++ ] = f ;
1207
    fds[nofds++] = f;
1183
    return ;
1208
    return;
1184
}
1209
}
1185
 
1210
 
1186
 
1211
 
1187
/*
1212
/*
1188
    FIND THE FILE DESCRIPTOR CORRESPONDING TO A FILE NAME
1213
    FIND THE FILE DESCRIPTOR CORRESPONDING TO A FILE NAME
1189
*/
1214
*/
1190
 
1215
 
1191
static long find_file 
1216
static long find_file
1192
    PROTO_N ( ( f ) )
-
 
1193
    PROTO_T ( char * f )
1217
(char * f)
1194
{
1218
{
1195
    long i ;
1219
    long i;
1196
    for ( i = 0 ; i < nofds ; i++ ) {
1220
    for (i = 0; i < nofds; i++) {
1197
	if ( strcmp ( f, fds [i]->file.ints.chars ) == 0 ) return ( i ) ;
1221
	if (strcmp(f, fds[i] ->file.ints.chars) == 0) return(i);
1198
    }
1222
    }
1199
    return ( 0 ) ;
1223
    return(0);
1200
}
1224
}
1201
 
1225
 
1202
 
1226
 
1203
static char *last_proc_lab = "<<No Proc>>";
1227
static char *last_proc_lab = "<<No Proc>>";
1204
 
1228
 
1205
/*
1229
/*
1206
    OUTPUT A FILE POSITION CONSTRUCT
1230
    OUTPUT A FILE POSITION CONSTRUCT
1207
*/
1231
*/
1208
 
1232
 
1209
#define N_SLINE  0x44
1233
#define N_SLINE  0x44
1210
#define N_DSLINE 0x46
1234
#define N_DSLINE 0x46
1211
#define N_BSLINE 0x48
1235
#define N_BSLINE 0x48
1212
#define N_LBRAC  0xc0
1236
#define N_LBRAC  0xc0
1213
#define N_RBRAC  0xe0
1237
#define N_RBRAC  0xe0
1214
 
1238
 
1215
void stabd 
1239
void stabd
1216
    PROTO_N ( ( findex, lno, seg ) )
-
 
1217
    PROTO_T ( long findex X long lno X int seg )
1240
(long findex, long lno, int seg)
1218
{
1241
{
1219
   long i ;
1242
   long i;
1220
   if ( findex == currentfile && lno == currentlno ) return ;
1243
   if (findex == currentfile && lno == currentlno) return;
1221
   stab_file ( findex, 1 ) ;
1244
   stab_file(findex, 1);
1222
   if (seg != 0)		/* 0 suppresses always */
1245
   if (seg != 0)		/* 0 suppresses always */
1223
   {
1246
   {
1224
      if (seg > 0)		/* -ve line nos are put out in the stabs */
1247
      if (seg > 0)		/* -ve line nos are put out in the stabs */
1225
      {
1248
      {
1226
	i = next_lab();
1249
	i = next_lab();
1227
	if (xdb)
1250
	if (xdb)
1228
	{
1251
	{
1229
#ifdef _SYMTAB_INCLUDED
1252
#ifdef _SYMTAB_INCLUDED
1230
	   char address[128];
1253
	   char address[128];
1231
	   sprintf(address,"L$M%ld-%s",i,last_proc_lab);
1254
	   sprintf(address,"L$M%ld-%s",i,last_proc_lab);
1232
	   make_sltentry(SLT_NORMAL, lno, (ADDRESS)address);
1255
	   make_sltentry(SLT_NORMAL, lno,(ADDRESS)address);
1233
	   last_lno = lno;
1256
	   last_lno = lno;
1234
#endif
1257
#endif
1235
	}
1258
	}
1236
	else  /*  gdb  */
1259
	else  /*  gdb  */
1237
	{
1260
	{
1238
  	   fprintf(dg_file,"\t.stabn\t0x%x,0,%ld,L$M%ld-%s\n",seg,
1261
  	   fprintf(dg_file,"\t.stabn\t0x%x,0,%ld,L$M%ld-%s\n",seg,
1239
		   lno,i,last_proc_lab) ;
1262
		   lno,i,last_proc_lab);
1240
	}
1263
	}
1241
	fprintf(dg_file,"L$M%ld\n",i) ;
1264
	fprintf(dg_file,"L$M%ld\n",i);
1242
      }
1265
      }
1243
   }
1266
   }
1244
   currentlno = lno ;
1267
   currentlno = lno;
1245
   return ;
1268
   return;
1246
}
1269
}
1247
 
1270
 
1248
 
1271
 
1249
/*
1272
/*
1250
    OUTPUT INITIAL DIAGNOSTICS FOR A DIAGNOSE_TAG
1273
    OUTPUT INITIAL DIAGNOSTICS FOR A DIAGNOSE_TAG
1251
*/
1274
*/
1252
 
1275
 
1253
/* ARGSUSED */ void stab_begin 
1276
/* ARGSUSED */ void stab_begin
1254
    PROTO_N ( ( d, proc_no, e ) )
-
 
1255
    PROTO_T ( diag_info * d X int proc_no X exp e )
1277
(diag_info * d, int proc_no, exp e)
1256
{
1278
{
1257
    exp x ;
1279
    exp x;
1258
 
1280
 
1259
    if ( d->key == DIAG_INFO_SOURCE ) {
1281
    if (d->key == DIAG_INFO_SOURCE) {
1260
	sourcemark *s = &d->data.source.beg ;
1282
	sourcemark *s = &d->data.source.beg;
1261
	long f = find_file ( s->file->file.ints.chars ) ;
1283
	long f = find_file(s->file->file.ints.chars);
1262
	stabd ( f, ( long ) s->line_no.nat_val.small_nat ,N_SLINE) ;
1284
	stabd(f,(long)s->line_no.nat_val.small_nat ,N_SLINE);
1263
	return ;
1285
	return;
1264
    }
1286
    }
1265
 
1287
 
1266
    if ( d->key != DIAG_INFO_ID ) {
1288
    if (d->key != DIAG_INFO_ID) {
1267
	/* not implemented */
1289
	/* not implemented */
1268
	return ;
1290
	return;
-
 
1291
    }
-
 
1292
 
-
 
1293
    x = d->data.id_scope.access;
-
 
1294
    /* MIPS */
-
 
1295
    if (isglob(son(x)) || no(son(x)) == 1) return;
-
 
1296
 
-
 
1297
    mark_scope(e);
-
 
1298
 
-
 
1299
    if (props(e) & 0x80) {
-
 
1300
	stab_scope_open(currentfile);
-
 
1301
	stabd(currentfile,(long)(currentlno + 1), N_SLINE);
-
 
1302
    }
-
 
1303
 
-
 
1304
    stab_local(d->data.id_scope.nme.ints.chars, d->data.id_scope.typ,
-
 
1305
		 x, 0, currentfile);
-
 
1306
 
-
 
1307
    if (last_param(son(x))) {
-
 
1308
	stabd(currentfile,(long)(currentlno + 1),N_SLINE);
1269
    }
1309
    }
1270
  
-
 
1271
    x = d->data.id_scope.access ;
-
 
1272
    /* MIPS */
-
 
1273
    if ( isglob ( son ( x ) ) || no ( son ( x ) ) == 1 ) return;
-
 
1274
 
-
 
1275
    mark_scope ( e ) ;
-
 
1276
 
-
 
1277
    if ( props ( e ) & 0x80 ) {
-
 
1278
	stab_scope_open ( currentfile ) ;
-
 
1279
	stabd ( currentfile, ( long ) ( currentlno + 1 ), N_SLINE ) ;
-
 
1280
    }
-
 
1281
 
-
 
1282
    stab_local ( d->data.id_scope.nme.ints.chars, d->data.id_scope.typ,
-
 
1283
		 x, 0, currentfile ) ;
-
 
1284
 
-
 
1285
    if ( last_param ( son ( x ) ) ) {
-
 
1286
	stabd ( currentfile, ( long ) ( currentlno + 1 ),N_SLINE) ;
-
 
1287
    }
-
 
1288
    return ;
1310
    return;
1289
}
1311
}
1290
 
1312
 
1291
 
1313
 
1292
/*
1314
/*
1293
    OUTPUT FINAL DIAGNOSTICS FOR A DIAGNOSE_TAG
1315
    OUTPUT FINAL DIAGNOSTICS FOR A DIAGNOSE_TAG
1294
*/
1316
*/
1295
 
1317
 
1296
void stab_end 
1318
void stab_end
1297
    PROTO_N ( ( d, e ) )
-
 
1298
    PROTO_T ( diag_info * d X exp e )
1319
(diag_info * d, exp e)
1299
{
1320
{
1300
    if ( d->key == DIAG_INFO_SOURCE ) {
1321
    if (d->key == DIAG_INFO_SOURCE) {
1301
	sourcemark *s = &d->data.source.end ;
1322
	sourcemark *s = &d->data.source.end;
1302
	long f = find_file ( s->file->file.ints.chars ) ;
1323
	long f = find_file(s->file->file.ints.chars);
1303
	long lno = s->line_no.nat_val.small_nat ;
1324
	long lno = s->line_no.nat_val.small_nat;
1304
	stabd (f,lno,N_SLINE) ;
1325
	stabd(f,lno,N_SLINE);
1305
	return ;
-
 
1306
    }
-
 
1307
    if ( d->key == DIAG_INFO_ID && props ( e ) & 0x80 ) {
-
 
1308
	stab_scope_close ( currentfile ) ;
-
 
1309
	return ;
1326
	return;
1310
    }
1327
    }
-
 
1328
    if (d->key == DIAG_INFO_ID && props(e) & 0x80) {
-
 
1329
	stab_scope_close(currentfile);
-
 
1330
	return;
-
 
1331
    }
1311
    return ;
1332
    return;
1312
}
1333
}
1313
 
1334
 
1314
 
1335
 
1315
/*
1336
/*
1316
    INITIALISE DIAGNOSTICS
1337
    INITIALISE DIAGNOSTICS
1317
*/
1338
*/
1318
 
1339
 
1319
void init_stab 
1340
void init_stab
1320
    PROTO_Z ()
1341
(void)
1321
{
1342
{
1322
    tmpnam ( dg_file_name ) ;
1343
    tmpnam(dg_file_name);
1323
    dg_file = fopen ( dg_file_name, "w+" ) ;
1344
    dg_file = fopen(dg_file_name, "w+");
1324
    if ( dg_file == NULL ) {
1345
    if (dg_file == NULL) {
1325
	fail ( "Can't open temporary diagnostics file" ) ;
1346
	fail("Can't open temporary diagnostics file");
1326
	exit ( EXIT_FAILURE ) ;
1347
	exit(EXIT_FAILURE);
1327
    }
1348
    }
1328
#ifdef _SYMTAB_INCLUDED
1349
#ifdef _SYMTAB_INCLUDED
1329
    NIL.word = -1;
1350
    NIL.word = -1;
1330
#else
1351
#else
1331
    NIL = 0;
1352
    NIL = 0;
1332
#endif
1353
#endif
1333
    if (xdb)
1354
    if (xdb)
1334
    {
1355
    {
1335
#ifdef _SYMTAB_INCLUDED
1356
#ifdef _SYMTAB_INCLUDED
1336
       stab_types();
1357
       stab_types();
1337
       tmpnam( VT_name ) ;
1358
       tmpnam(VT_name);
1338
       VT_ = fopen ( VT_name, "w+" ) ;
1359
       VT_ = fopen(VT_name, "w+");
1339
       if ( VT_ == NULL ) 
1360
       if (VT_ == NULL)
-
 
1361
       {
-
 
1362
	  fail("Can't open temporary diagnostics file");
-
 
1363
	  exit(EXIT_FAILURE);
-
 
1364
       }
-
 
1365
       tmpnam(SLT_name);
-
 
1366
       SLT_ = fopen(SLT_name, "w+");
-
 
1367
       if (SLT_ == NULL)
1340
       {
1368
       {
1341
	  fail ( "Can't open temporary diagnostics file" ) ;
1369
	  fail("Can't open temporary diagnostics file");
1342
	  exit ( EXIT_FAILURE ) ;
1370
	  exit(EXIT_FAILURE);
1343
       }
1371
       }
1344
       tmpnam( SLT_name ) ;
1372
       tmpnam(LNTT_name);
1345
       SLT_ = fopen ( SLT_name, "w+" ) ;
1373
       LNTT_ = fopen(LNTT_name, "w+");
1346
       if ( SLT_ == NULL ) 
1374
       if (LNTT_ == NULL)
1347
       {
1375
       {
1348
	  fail ( "Can't open temporary diagnostics file" ) ;
1376
	  fail("Can't open temporary diagnostics file");
1349
	  exit ( EXIT_FAILURE ) ;
1377
	  exit(EXIT_FAILURE);
1350
       }
1378
       }
1351
       tmpnam( LNTT_name ) ;
1379
       tmpnam(GNTT_name);
1352
       LNTT_ = fopen ( LNTT_name, "w+" ) ;
1380
       GNTT_ = fopen(GNTT_name, "w+");
1353
       if ( LNTT_ == NULL ) 
1381
       if (GNTT_ == NULL)
1354
       {
1382
       {
1355
	  fail ( "Can't open temporary diagnostics file" ) ;
1383
	  fail("Can't open temporary diagnostics file");
1356
	  exit ( EXIT_FAILURE ) ;
-
 
1357
       }
-
 
1358
       tmpnam( GNTT_name ) ;
-
 
1359
       GNTT_ = fopen ( GNTT_name, "w+" ) ;
-
 
1360
       if ( GNTT_ == NULL ) 
-
 
1361
       {
-
 
1362
	  fail ( "Can't open temporary diagnostics file" ) ;
-
 
1363
	  exit ( EXIT_FAILURE ) ;
1384
	  exit(EXIT_FAILURE);
1364
       }
1385
       }
1365
       fprintf(VT_,"\t.SPACE\t$DEBUG$\n");
1386
       fprintf(VT_,"\t.SPACE\t$DEBUG$\n");
1366
       fprintf(VT_,"\t.SUBSPA\t$VT$\n");
1387
       fprintf(VT_,"\t.SUBSPA\t$VT$\n");
1367
       fprintf(SLT_,"\t.SPACE\t$DEBUG$\n");
1388
       fprintf(SLT_,"\t.SPACE\t$DEBUG$\n");
1368
       fprintf(SLT_,"\t.SUBSPA\t$SLT$\n");
1389
       fprintf(SLT_,"\t.SUBSPA\t$SLT$\n");
Line 1374... Line 1395...
1374
       lntt_next.word = 1<<31;  /* initialise .word field */
1395
       lntt_next.word = 1<<31;  /* initialise .word field */
1375
       gntt_next.word = 1<<31;  /* initialise .word field */
1396
       gntt_next.word = 1<<31;  /* initialise .word field */
1376
       NIL.word = -1;
1397
       NIL.word = -1;
1377
#endif
1398
#endif
1378
    }
1399
    }
1379
    return ;
1400
    return;
1380
}
1401
}
1381
 
1402
 
1382
 
1403
 
1383
/*
1404
/*
1384
    INITIALIZE DIAGNOSTICS
1405
    INITIALIZE DIAGNOSTICS
1385
*/
1406
*/
1386
 
1407
 
1387
void init_stab_aux 
1408
void init_stab_aux
1388
    PROTO_Z ()
1409
(void)
1389
{
1410
{
1390
    int c ;
1411
    int c;
1391
    FILE *f ;
1412
    FILE *f;
1392
    int i, j = 0 ;
1413
    int i, j = 0;
1393
    for ( i = 0 ; i < nofds ; i++ ) {
1414
    for (i = 0; i < nofds; i++) {
1394
	char *s = fds [i]->file.ints.chars ;
1415
	char *s = fds[i] ->file.ints.chars;
1395
	int n = ( int ) strlen ( s ) ;
1416
	int n = (int)strlen(s);
1396
	if ( n && s [ n - 1 ] != 'h' ) j = i ;
1417
	if (n && s[n - 1]!= 'h')j = i;
1397
    }
1418
    }
1398
    fclose ( dg_file ) ;
1419
    fclose(dg_file);
1399
    dg_file = outf ;
1420
    dg_file = outf;
1400
    stab_file ( ( long ) j, 0 ) ;
1421
    stab_file((long)j, 0);
1401
    if (gdb)
1422
    if (gdb)
1402
    {
1423
    {
1403
       stab_types();
1424
       stab_types();
1404
    }
1425
    }
1405
    f = fopen ( dg_file_name, "r" ) ;
1426
    f = fopen(dg_file_name, "r");
1406
    if ( f == NULL ) {
1427
    if (f == NULL) {
1407
	fail ( "Can't open temporary diagnostics file" ) ;
1428
	fail("Can't open temporary diagnostics file");
1408
	exit ( EXIT_FAILURE ) ;
1429
	exit(EXIT_FAILURE);
1409
    }
1430
    }
1410
    while ( c = fgetc ( f ), c != EOF ) outc ( c ) ;
1431
    while (c = fgetc(f), c != EOF)outc(c);
1411
    fclose ( f ) ;
1432
    fclose(f);
1412
    remove ( dg_file_name ) ;
1433
    remove(dg_file_name);
1413
    return ;
1434
    return;
1414
}
1435
}
1415
 
1436
 
1416
 
1437
 
1417
/*
1438
/*
1418
    FIND THE DIAGNOSTICS CORRESPONDING TO THE CURRENT DECLARATION
1439
    FIND THE DIAGNOSTICS CORRESPONDING TO THE CURRENT DECLARATION
1419
*/
1440
*/
1420
 
1441
 
1421
/* ARGSUSED */ static diag_descriptor *find_dd 
1442
/* ARGSUSED */ static diag_descriptor *find_dd
1422
    PROTO_N ( ( e ) )
-
 
1423
    PROTO_T ( exp e )
1443
(exp e)
1424
{
1444
{
1425
    if ( diag_def == NULL ) return ( NULL ) ;
1445
    if (diag_def == NULL) return(NULL);
1426
    return ( diag_def->dec_u.dec_val.diag_info ) ;
1446
    return(diag_def->dec_u.dec_val.diag_info);
1427
}
1447
}
1428
 
1448
 
1429
 
1449
 
1430
/*
1450
/*
1431
    OUTPUT DIAGNOSTICS DIRECTIVE FOR A FILE
1451
    OUTPUT DIAGNOSTICS DIRECTIVE FOR A FILE
1432
*/
1452
*/
1433
 
1453
 
1434
void stab_file 
1454
void stab_file
1435
    PROTO_N ( ( findex, internal ) )
-
 
1436
    PROTO_T ( long findex X bool internal )
1455
(long findex, bool internal)
1437
{
1456
{
1438
    static long i = 0 ;
1457
    static long i = 0;
1439
    if ( findex == currentfile || findex < 0 || findex >= szfds ) {
1458
    if (findex == currentfile || findex < 0 || findex >= szfds) {
1440
	return ;
1459
	return;
1441
    }
1460
    }
1442
 
1461
 
1443
    if (gdb)
1462
    if (gdb)
1444
       fprintf(dg_file,"\t.file\t\"%s\"\n",fds[ findex ]->file.ints.chars);
1463
       fprintf(dg_file,"\t.file\t\"%s\"\n",fds[findex] ->file.ints.chars);
1445
    if (internal)
1464
    if (internal)
1446
    {
1465
    {
1447
       /* included file */
1466
       /* included file */
1448
       if (xdb)
1467
       if (xdb)
1449
       {
1468
       {
1450
#ifdef _SYMTAB_INCLUDED
1469
#ifdef _SYMTAB_INCLUDED
1451
	  SLTPOINTER slt_prev = slt_next;
1470
	  SLTPOINTER slt_prev = slt_next;
1452
	  VTPOINTER entry = is_vt_entry( findex );
1471
	  VTPOINTER entry = is_vt_entry(findex);
1453
	  make_sltentry(SLT_SRCFILE, currentlno, lntt_next); 
1472
	  make_sltentry(SLT_SRCFILE, currentlno, lntt_next);
1454
	  make_dnttentry(K_SRCFILE, LANG_C, ( entry==VTNIL ? vt_next : entry ), slt_prev); 
1473
	  make_dnttentry(K_SRCFILE, LANG_C,(entry==VTNIL ? vt_next : entry), slt_prev);
1455
	  if ( entry==VTNIL )
1474
	  if (entry==VTNIL)
1456
	     make_vtentry(fds[ findex ]->file.ints.chars,1,findex);
1475
	     make_vtentry(fds[findex] ->file.ints.chars,1,findex);
1457
#endif
1476
#endif
1458
       }
1477
       }
1459
       else
1478
       else
1460
	  fprintf ( dg_file,"\t.stabs\t\"%s\",0x84,0,0,L$M%ld\n",
1479
	  fprintf(dg_file,"\t.stabs\t\"%s\",0x84,0,0,L$M%ld\n",
1461
		     fds[ findex ]->file.ints.chars, i ) ;
1480
		     fds[findex] ->file.ints.chars, i);
1462
    }
1481
    }
1463
    else
1482
    else
1464
    {
1483
    {
1465
       /* source file */
1484
       /* source file */
1466
       i = next_lab () ;
1485
       i = next_lab();
1467
       if (xdb)
1486
       if (xdb)
1468
       {
1487
       {
1469
#ifdef _SYMTAB_INCLUDED
1488
#ifdef _SYMTAB_INCLUDED
1470
	  SLTPOINTER slt_prev = slt_next;
1489
	  SLTPOINTER slt_prev = slt_next;
1471
	  VTPOINTER entry = is_vt_entry(findex);
1490
	  VTPOINTER entry = is_vt_entry(findex);
1472
	  make_sltentry(SLT_SRCFILE, currentlno, lntt_next); 
1491
	  make_sltentry(SLT_SRCFILE, currentlno, lntt_next);
1473
	  make_dnttentry(K_SRCFILE, LANG_C, ( entry==VTNIL ? vt_next : entry ), slt_prev); 
1492
	  make_dnttentry(K_SRCFILE, LANG_C,(entry==VTNIL ? vt_next : entry), slt_prev);
1474
	  slt_prev =  slt_next;
1493
	  slt_prev =  slt_next;
1475
	  make_sltentry(SLT_MODULE, 1, lntt_next); 
1494
	  make_sltentry(SLT_MODULE, 1, lntt_next);
1476
	  make_dnttentry(K_MODULE, VTNIL, VTNIL, slt_prev); 
1495
	  make_dnttentry(K_MODULE, VTNIL, VTNIL, slt_prev);
1477
	  if ( entry==VTNIL )
1496
	  if (entry==VTNIL)
1478
	     make_vtentry(fds[ findex ]->file.ints.chars,1,findex);
1497
	     make_vtentry(fds[findex] ->file.ints.chars,1,findex);
1479
#endif
1498
#endif
1480
       }
1499
       }
1481
       else  /*  gdb  */
1500
       else  /*  gdb  */
1482
       {
1501
       {
1483
	  fprintf ( dg_file, "\t.stabs\t\"%s\",0x64,0,0,L$M%ld\n",
1502
	  fprintf(dg_file, "\t.stabs\t\"%s\",0x64,0,0,L$M%ld\n",
1484
       	     fds[ findex ]->file.ints.chars, i ) ;
1503
       	     fds[findex] ->file.ints.chars, i);
1485
       }
1504
       }
1486
       fprintf ( dg_file, "L$M%ld\n", i ) ;
1505
       fprintf(dg_file, "L$M%ld\n", i);
1487
    }
1506
    }
1488
    currentfile = findex ;
1507
    currentfile = findex;
1489
    return ;
1508
    return;
1490
}
1509
}
1491
 
1510
 
1492
 
1511
 
1493
/*********************  START OF A DIAGNOSTICS SCOPE  ************************/
1512
/*********************  START OF A DIAGNOSTICS SCOPE  ************************/
1494
 
1513
 
1495
static void stab_scope_open 
1514
static void stab_scope_open
1496
    PROTO_N ( ( findex ) )
-
 
1497
    PROTO_T ( long findex )
1515
(long findex)
1498
{
1516
{
1499
   stab_file(findex,1);
1517
   stab_file(findex,1);
1500
   /* nb. don't need to output bracket level */
1518
   /* nb. don't need to output bracket level */
1501
   if (xdb)
1519
   if (xdb)
1502
   {
1520
   {
1503
#ifdef _SYMTAB_INCLUDED
1521
#ifdef _SYMTAB_INCLUDED
1504
      SLTPOINTER slt_prev = slt_next;
1522
      SLTPOINTER slt_prev = slt_next;
1505
      make_sltentry(SLT_BEGIN, (BITS)currentlno, lntt_next);
1523
      make_sltentry(SLT_BEGIN,(BITS)currentlno, lntt_next);
1506
      make_dnttentry(K_BEGIN, slt_prev);
1524
      make_dnttentry(K_BEGIN, slt_prev);
1507
#endif
1525
#endif
1508
   }
1526
   }
1509
   else  /*  gdb  */
1527
   else  /*  gdb  */
1510
   {
1528
   {
Line 1521... Line 1539...
1521
}
1539
}
1522
 
1540
 
1523
 
1541
 
1524
/**********************  END OF A DIAGNOSTICS SCOPE  *************************/
1542
/**********************  END OF A DIAGNOSTICS SCOPE  *************************/
1525
 
1543
 
1526
static void stab_scope_close 
1544
static void stab_scope_close
1527
    PROTO_N ( ( findex ) )
-
 
1528
    PROTO_T ( long findex )
1545
(long findex)
1529
{
1546
{
1530
   bracket_level--;
1547
   bracket_level--;
1531
   if (bracket_level>MAX_LEX_LEVEL)
1548
   if (bracket_level>MAX_LEX_LEVEL)
1532
      return;
1549
      return;
1533
   /* nb. don't need to output bracket level */
1550
   /* nb. don't need to output bracket level */
1534
   if (xdb) 
1551
   if (xdb)
1535
   {
1552
   {
1536
#ifdef _SYMTAB_INCLUDED
1553
#ifdef _SYMTAB_INCLUDED
1537
      SLTPOINTER slt_prev = slt_next;
1554
      SLTPOINTER slt_prev = slt_next;
1538
      make_sltentry(SLT_END, currentlno, lntt_next);
1555
      make_sltentry(SLT_END, currentlno, lntt_next);
1539
      make_dnttentry(K_END, K_BEGIN, slt_prev, last_DNTT_BEGIN_entry());
1556
      make_dnttentry(K_END, K_BEGIN, slt_prev, last_DNTT_BEGIN_entry());
1540
#endif
1557
#endif
1541
   }
1558
   }
1542
   else  /*  gdb  */
1559
   else  /*  gdb  */
1543
   {
1560
   {
1544
      if (last_LBRAC_stab==BB_id-1)
1561
      if (last_LBRAC_stab==BB_id-1)
1545
      {
1562
      {
1546
	 fprintf(dg_file,"\t.stabn\t0x%x,0,0,L$BB%ld-%s\n",N_LBRAC,BB_id,
1563
	 fprintf(dg_file,"\t.stabn\t0x%x,0,0,L$BB%ld-%s\n",N_LBRAC,BB_id,
1547
	      last_proc_lab);
1564
	      last_proc_lab);
1548
	 last_LBRAC_stab = BB_id;
1565
	 last_LBRAC_stab = BB_id;
1549
      } 
1566
      }
1550
      BE_id++;
1567
      BE_id++;
1551
      fprintf(dg_file,"\t.stabn\t0x%x,0,0,L$BE%ld-%s\n",N_RBRAC,BE_id,
1568
      fprintf(dg_file,"\t.stabn\t0x%x,0,0,L$BE%ld-%s\n",N_RBRAC,BE_id,
1552
		    last_proc_lab);
1569
		    last_proc_lab);
1553
      fprintf(dg_file,"L$BE%ld\n",BE_id);
1570
      fprintf(dg_file,"L$BE%ld\n",BE_id);
1554
   }
1571
   }
Line 1557... Line 1574...
1557
 
1574
 
1558
 
1575
 
1559
/*
1576
/*
1560
    DEPTH COUNT FOR STAB TYPES
1577
    DEPTH COUNT FOR STAB TYPES
1561
*/
1578
*/
1562
 
1579
 
1563
/* static int max_depth = 64 ; */
1580
/* static int max_depth = 64 ; */
1564
static int depth_now = 0 ;
1581
static int depth_now = 0;
1565
 
1582
 
1566
 
1583
 
1567
/***************  OUTPUT THE DIAGNOSTICS FOR A SIMPLE SHAPE  *****************/
1584
/***************  OUTPUT THE DIAGNOSTICS FOR A SIMPLE SHAPE  *****************/
1568
 
1585
 
1569
static long out_sh_type 
1586
static long out_sh_type
1570
    PROTO_N ( ( s ) )
-
 
1571
    PROTO_T ( shape s )
1587
(shape s)
1572
{
1588
{
1573
    last_type_sz = shape_size ( s ) ;
1589
    last_type_sz = shape_size(s);
1574
    switch ( name(s) )
1590
    switch (name(s))
1575
      {
1591
      {
1576
      case scharhd : return ( STAB_SCHAR ) ;
1592
      case scharhd: return(STAB_SCHAR);
1577
      case ucharhd : return ( STAB_UCHAR ) ;
1593
      case ucharhd: return(STAB_UCHAR);
1578
      case swordhd : return ( STAB_SSHRT ) ;
1594
      case swordhd: return(STAB_SSHRT);
1579
      case uwordhd : return ( STAB_USHRT ) ;
1595
      case uwordhd: return(STAB_USHRT);
1580
      case slonghd : return ( STAB_SLONG ) ;
1596
      case slonghd: return(STAB_SLONG);
1581
      case ulonghd : return ( STAB_ULONG ) ;
1597
      case ulonghd: return(STAB_ULONG);
1582
      case shrealhd : return ( STAB_FLOAT ) ;
1598
      case shrealhd: return(STAB_FLOAT);
1583
      case realhd : return ( STAB_DBL ) ;
1599
      case realhd: return(STAB_DBL);
1584
      case doublehd : return ( STAB_LDBL ) ;
1600
      case doublehd: return(STAB_LDBL);
1585
      }
1601
      }
1586
    return ( STAB_VOID ) ;
1602
    return(STAB_VOID);
1587
}
1603
}
1588
 
1604
 
1589
 
1605
 
1590
/***********************  OUTPUT A DIAGNOSTICS TYPE  *************************/
1606
/***********************  OUTPUT A DIAGNOSTICS TYPE  *************************/
1591
 
1607
 
1592
 
1608
 
1593
#ifdef _SYMTAB_INCLUDED
1609
#ifdef _SYMTAB_INCLUDED
1594
 
1610
 
1595
 
1611
 
1596
struct outed_t { diag_type dt; struct outed_t *prev; }; 
1612
struct outed_t { diag_type dt; struct outed_t *prev; };
1597
typedef struct outed_t *outed;
1613
typedef struct outed_t *outed;
1598
 
1614
 
1599
static outed uo;
1615
static outed uo;
1600
static DNTTPOINTER pos;
1616
static DNTTPOINTER pos;
1601
 
1617
 
1602
 
1618
 
1603
void undo_outed 
1619
void undo_outed
1604
    PROTO_N ( ( dt ) )
-
 
1605
    PROTO_T ( diag_type dt )
1620
(diag_type dt)
1606
{
1621
{
1607
   outed p = (outed) malloc( sizeof( struct outed_t ) );
1622
   outed p = (outed)malloc(sizeof(struct outed_t));
1608
   uo->prev = p;
1623
   uo->prev = p;
1609
   p->dt = dt;
1624
   p->dt = dt;
1610
   p->prev = (struct outed_t*) 0;
1625
   p->prev = (struct outed_t*)0;
1611
   uo = p;
1626
   uo = p;
1612
}
1627
}
1613
 
1628
 
1614
 
1629
 
1615
static DNTTPOINTER traverse_diag_type 
1630
static DNTTPOINTER traverse_diag_type
1616
    PROTO_N ( ( dt ) )
-
 
1617
    PROTO_T ( diag_type dt )
1631
(diag_type dt)
1618
{
1632
{
1619
    if ( dt->been_outed ) 
1633
    if (dt->been_outed)
1620
    {
1634
    {
1621
       last_type_sz = get_stab_size( dt->been_outed );
1635
       last_type_sz = get_stab_size(dt->been_outed);
1622
       return pos;
1636
       return pos;
1623
    }
1637
    }
1624
  
1638
 
1625
#if 0
1639
#if 0
1626
    if ( depth_now >= max_depth )
1640
    if (depth_now >= max_depth)
1627
    {
1641
    {
1628
       return NIL ;
1642
       return NIL;
1629
    }
1643
    }
1630
    depth_now++ ;
1644
    depth_now++;
1631
#endif
1645
#endif
1632
  
1646
 
1633
    switch( dt->key )
1647
    switch (dt->key)
1634
      {
1648
      {
1635
      case DIAG_TYPE_PTR:
1649
      case DIAG_TYPE_PTR:
1636
	{
1650
	{
1637
	   long non;
1651
	   long non;
1638
	   diag_type pdt = dt->data.ptr.object ;
1652
	   diag_type pdt = dt->data.ptr.object;
1639
	   if ( pdt->key == DIAG_TYPE_VARIETY )
1653
	   if (pdt->key == DIAG_TYPE_VARIETY)
1640
	   {
1654
	   {
1641
	      long pn = out_sh_type( f_integer( pdt->data.var) );
1655
	      long pn = out_sh_type(f_integer(pdt->data.var));
1642
	      non = stab_ptrs[pn];
1656
	      non = stab_ptrs[pn];
1643
	      if ( non==0 )
1657
	      if (non==0)
1644
	      {
1658
	      {
1645
		 non = next_typen();
1659
		 non = next_typen();
1646
		 stab_ptrs[pn] = -non;
1660
		 stab_ptrs[pn] = -non;
1647
		 pos.word++;
1661
		 pos.word++;
1648
	      }
1662
	      }
1649
	   }
1663
	   }
1650
	   else
1664
	   else
1651
	   {
1665
	   {
1652
	      non = next_typen();
1666
	      non = next_typen();
1653
	      traverse_diag_type( pdt );
1667
	      traverse_diag_type(pdt);
1654
	      pos.word++;
1668
	      pos.word++;
1655
	   }
1669
	   }
1656
	   dt->been_outed = non;
1670
	   dt->been_outed = non;
1657
	   undo_outed( dt );
1671
	   undo_outed(dt);
1658
	   last_type_sz = 32;
1672
	   last_type_sz = 32;
1659
	   set_stab_size(non);
1673
	   set_stab_size(non);
1660
	   return pos;
1674
	   return pos;
1661
	}
1675
	}
1662
  
1676
 
1663
      case DIAG_TYPE_ARRAY:
1677
      case DIAG_TYPE_ARRAY:
1664
	{
1678
	{
1665
	   long lwb = no( dt->data.array.lower_b );
1679
	   long lwb = no(dt->data.array.lower_b);
1666
	   long upb = no( dt->data.array.upper_b );
1680
	   long upb = no(dt->data.array.upper_b);
1667
	   diag_type index_type = dt->data.array.index_type ;
1681
	   diag_type index_type = dt->data.array.index_type;
1668
	   diag_type element_type = dt->data.array.element_type ;
1682
	   diag_type element_type = dt->data.array.element_type;
1669
	   long non = next_typen();
1683
	   long non = next_typen();
1670
	   dt->been_outed = non ;
1684
	   dt->been_outed = non;
1671
	   undo_outed( dt );
1685
	   undo_outed(dt);
1672
	   traverse_diag_type( index_type );
1686
	   traverse_diag_type(index_type);
1673
	   pos.word+=2;
-
 
1674
	   traverse_diag_type( element_type );
-
 
1675
	   pos.word+=2;
1687
	   pos.word+=2;
-
 
1688
	   traverse_diag_type(element_type);
-
 
1689
	   pos.word+=2;
1676
	   last_type_sz *= ( upb-lwb+1 );
1690
	   last_type_sz *= (upb-lwb+1);
1677
	   set_stab_size(non);
1691
	   set_stab_size(non);
1678
	   return pos;
1692
	   return pos;
1679
	   break ;
1693
	   break;
1680
	}
1694
	}
1681
 
1695
 
1682
      case DIAG_TYPE_STRUCT:
1696
      case DIAG_TYPE_STRUCT:
1683
      case DIAG_TYPE_UNION:
1697
      case DIAG_TYPE_UNION:
1684
	{
1698
	{
1685
	   int i;
1699
	   int i;
1686
	   shape s;
1700
	   shape s;
1687
	   long non = next_typen();
1701
	   long non = next_typen();
1688
	   diag_field_list fields;
1702
	   diag_field_list fields;
1689
	   dt->been_outed = non;
1703
	   dt->been_outed = non;
1690
	   undo_outed( dt );
1704
	   undo_outed(dt);
1691
	   if ( dt->key == DIAG_TYPE_STRUCT )
1705
	   if (dt->key == DIAG_TYPE_STRUCT)
1692
	   {
1706
	   {
1693
	      fields = dt->data.t_struct.fields;
1707
	      fields = dt->data.t_struct.fields;
1694
	      s = dt->data.t_struct.tdf_shape;
1708
	      s = dt->data.t_struct.tdf_shape;
1695
	   } 
1709
	   }
1696
	   else
1710
	   else
1697
	   {
1711
	   {
1698
	      fields = dt->data.t_union.fields;
1712
	      fields = dt->data.t_union.fields;
1699
	      s = dt->data.t_union.tdf_shape;
1713
	      s = dt->data.t_union.tdf_shape;
1700
	   }
1714
	   }
1701
	   for(i=0;i<fields->lastused;i++)
1715
	   for (i=0;i<fields->lastused;i++)
1702
	   {
1716
	   {
1703
	      diag_field f = (fields->array)[i];
1717
	      diag_field f = (fields->array)[i];
1704
	      traverse_diag_type( f->field_type );
1718
	      traverse_diag_type(f->field_type);
1705
	      pos.word+=2;
-
 
1706
	   }
-
 
1707
	   if ( dt->key == DIAG_TYPE_STRUCT )
-
 
1708
	   {
-
 
1709
	      pos.word+=2;
1719
	      pos.word+=2;
1710
	   }
1720
	   }
-
 
1721
	   if (dt->key == DIAG_TYPE_STRUCT)
-
 
1722
	   {
-
 
1723
	      pos.word+=2;
-
 
1724
	   }
1711
	   else
1725
	   else
1712
	   {
1726
	   {
1713
	      pos.word++;
1727
	      pos.word++;
1714
	   }
1728
	   }
1715
	   last_type_sz = shape_size(s);
1729
	   last_type_sz = shape_size(s);
1716
	   set_stab_size(non);
1730
	   set_stab_size(non);
1717
	   return pos;
1731
	   return pos;
1718
	}
1732
	}
1719
  
1733
 
1720
	case DIAG_TYPE_FLOAT:
1734
	case DIAG_TYPE_FLOAT:
1721
	case DIAG_TYPE_VARIETY:
1735
	case DIAG_TYPE_VARIETY:
1722
	  {
1736
	  {
1723
	     shape sha;
1737
	     shape sha;
1724
	     if ( dt->key==DIAG_TYPE_VARIETY )
1738
	     if (dt->key==DIAG_TYPE_VARIETY)
1725
	     {
1739
	     {
1726
		sha = f_integer(dt->data.var);
1740
		sha = f_integer(dt->data.var);
1727
	     }
1741
	     }
1728
	     else
1742
	     else
1729
	     {
1743
	     {
1730
		sha = f_floating(dt->data.f_var);
1744
		sha = f_floating(dt->data.f_var);
1731
	     }
1745
	     }
1732
	     dt->been_outed = out_sh_type( sha );
1746
	     dt->been_outed = out_sh_type(sha);
1733
	     return pos;
1747
	     return pos;
1734
	  }
1748
	  }
1735
  
1749
 
1736
	case DIAG_TYPE_PROC:
1750
	case DIAG_TYPE_PROC:
1737
	  {
1751
	  {
1738
	     diag_type result_type = dt->data.proc.result_type ;
1752
	     diag_type result_type = dt->data.proc.result_type;
1739
	     long non1 = next_typen();
1753
	     long non1 = next_typen();
1740
	     long non2 = next_typen();
1754
	     long non2 = next_typen();
1741
	     dt->been_outed = non1;
1755
	     dt->been_outed = non1;
1742
	     undo_outed( dt );
1756
	     undo_outed(dt);
1743
	     pos.word++;
1757
	     pos.word++;
1744
	     traverse_diag_type ( result_type ) ;
1758
	     traverse_diag_type(result_type);
1745
	     last_type_sz = 32 ;
1759
	     last_type_sz = 32;
1746
	     set_stab_size ( non1 ) ;
1760
	     set_stab_size(non1);
1747
	     set_stab_size ( non2 ) ;
1761
	     set_stab_size(non2);
1748
	     return pos;
1762
	     return pos;
1749
	  }
1763
	  }
1750
  
1764
 
1751
	case DIAG_TYPE_LOC:
1765
	case DIAG_TYPE_LOC:
1752
	  {
1766
	  {
1753
	     return traverse_diag_type ( dt->data.loc.object ) ;
1767
	     return traverse_diag_type(dt->data.loc.object);
1754
	  }
1768
	  }
1755
  
1769
 
1756
	case DIAG_TYPE_NULL:
1770
	case DIAG_TYPE_NULL:
1757
	  {
1771
	  {
1758
	     last_type_sz = 0;
1772
	     last_type_sz = 0;
1759
	     return pos;
1773
	     return pos;
1760
	  }
1774
	  }
1761
  
1775
 
1762
	case DIAG_TYPE_BITFIELD:
1776
	case DIAG_TYPE_BITFIELD:
1763
	  {
1777
	  {
1764
	     long sz = dt->data.bitfield.no_of_bits.nat_val.small_nat ;
1778
	     long sz = dt->data.bitfield.no_of_bits.nat_val.small_nat;
1765
	     last_type_sz = sz;
1779
	     last_type_sz = sz;
1766
	     return pos;
1780
	     return pos;
1767
	  }
1781
	  }
1768
 
1782
 
1769
	case DIAG_TYPE_ENUM:
1783
	case DIAG_TYPE_ENUM:
1770
	{
1784
	{
1771
	   traverse_diag_type( dt->data.t_enum.base_type );
1785
	   traverse_diag_type(dt->data.t_enum.base_type);
1772
	   return pos;
1786
	   return pos;
1773
	}
1787
	}
1774
 
1788
 
1775
	default:
1789
	default:
1776
	{
1790
	{
1777
	   last_type_sz = 0 ;
1791
	   last_type_sz = 0;
1778
	   return pos;
1792
	   return pos;
1779
	}
1793
	}
1780
    }
1794
    }
1781
}
1795
}
1782
 
1796
 
1783
 
1797
 
1784
DNTTPOINTER pos_of_dnttpointer 
1798
DNTTPOINTER pos_of_dnttpointer
1785
    PROTO_N ( ( dt ) )
-
 
1786
    PROTO_T ( diag_type dt )
1799
(diag_type dt)
1787
{
1800
{
1788
   outed p,f;
1801
   outed p,f;
1789
   int s;
1802
   int s;
1790
   int t = typeno;
1803
   int t = typeno;
1791
   pos = lntt_next;
1804
   pos = lntt_next;
1792
   uo = (struct outed_t*) malloc( sizeof( struct outed_t ) );
1805
   uo = (struct outed_t*)malloc(sizeof(struct outed_t));
1793
   uo->prev = (struct outed_t*) 0; 
1806
   uo->prev = (struct outed_t*)0;
1794
   f = uo;
1807
   f = uo;
1795
   traverse_diag_type( dt );
1808
   traverse_diag_type(dt);
1796
   while ( f->prev )
1809
   while (f->prev)
1797
   {
1810
   {
1798
      p = f->prev;
1811
      p = f->prev;
1799
      free( f );  
1812
      free(f);
1800
      p->dt->been_outed = 0;
1813
      p->dt->been_outed = 0;
1801
      f = p;
1814
      f = p;
1802
   }
1815
   }
1803
   free( f );
1816
   free(f);
1804
   for(s=0;s<NO_STABS;s++)
1817
   for (s=0;s<NO_STABS;s++)
1805
      if ( stab_ptrs[s]<0 )
1818
      if (stab_ptrs[s] <0)
1806
	 stab_ptrs[s] = 0;
1819
	 stab_ptrs[s] = 0;
1807
   typeno = t;
1820
   typeno = t;
1808
   return pos;
1821
   return pos;
1809
}
1822
}
1810
 
1823
 
1811
 
1824
 
1812
#endif
1825
#endif
1813
 
1826
 
1814
 
1827
 
1815
#define OUT_DT_SHAPE( dt )	out_dt_shape ( ( depth_now = 0, dt ) )
1828
#define OUT_DT_SHAPE(dt)	out_dt_shape((depth_now = 0, dt))
1816
 
1829
 
1817
static DNTTPOINTER out_dt_shape 
1830
static DNTTPOINTER out_dt_shape
1818
    PROTO_N ( ( dt ) )
-
 
1819
    PROTO_T ( diag_type dt )
1831
(diag_type dt)
1820
{
1832
{
1821
    if ( dt->been_outed ) 
1833
    if (dt->been_outed)
1822
    {
1834
    {
1823
       last_type_sz = get_stab_size( dt->been_outed );
1835
       last_type_sz = get_stab_size(dt->been_outed);
1824
       if (xdb)
1836
       if (xdb)
1825
       {
1837
       {
1826
#ifdef _SYMTAB_INCLUDED
1838
#ifdef _SYMTAB_INCLUDED
1827
	  return type_info[dt->been_outed].p; 
1839
	  return type_info[dt->been_outed].p;
1828
#endif
1840
#endif
1829
       }
1841
       }
1830
       else
1842
       else
1831
       {
1843
       {
1832
	  fprintf(dg_file,"%d",(int) dt->been_outed);
1844
	  fprintf(dg_file,"%d",(int)dt->been_outed);
1833
       }
1845
       }
1834
       return NIL ;
1846
       return NIL;
1835
    }
1847
    }
1836
  
1848
 
1837
#if 0
1849
#if 0
1838
    if ( depth_now >= max_depth )
1850
    if (depth_now >= max_depth)
1839
    {
1851
    {
1840
       if (gdb)
1852
       if (gdb)
1841
	  fprintf( dg_file, "%d", STAB_SLONG ) ;
1853
	  fprintf(dg_file, "%d", STAB_SLONG);
1842
       return NIL ;
1854
       return NIL;
1843
    }
1855
    }
1844
    depth_now++ ;
1856
    depth_now++;
1845
#endif
1857
#endif
1846
  
1858
 
1847
    switch( dt->key )
1859
    switch (dt->key)
1848
      {
1860
      {
1849
      case DIAG_TYPE_PTR:
1861
      case DIAG_TYPE_PTR:
1850
	{
1862
	{
1851
	   DNTTPOINTER p = NIL;
1863
	   DNTTPOINTER p = NIL;
1852
	   long non;
1864
	   long non;
1853
	   diag_type pdt = dt->data.ptr.object ;
1865
	   diag_type pdt = dt->data.ptr.object;
1854
	   if ( pdt->key == DIAG_TYPE_VARIETY )
1866
	   if (pdt->key == DIAG_TYPE_VARIETY)
1855
	   {
1867
	   {
1856
	      long pn = out_sh_type( f_integer( pdt->data.var) );
1868
	      long pn = out_sh_type(f_integer(pdt->data.var));
1857
	      non = stab_ptrs[pn];
1869
	      non = stab_ptrs[pn];
1858
	      if ( non==0 )
1870
	      if (non==0)
1859
	      {
1871
	      {
1860
		 non = next_typen();
1872
		 non = next_typen();
1861
		 stab_ptrs[pn] = non;
1873
		 stab_ptrs[pn] = non;
1862
		 if (xdb)
1874
		 if (xdb)
1863
		 {
1875
		 {
Line 1866... Line 1878...
1866
#endif
1878
#endif
1867
		 }
1879
		 }
1868
		 else
1880
		 else
1869
		 {
1881
		 {
1870
		    fprintf(dg_file,"%ld=*%ld",non,pn);
1882
		    fprintf(dg_file,"%ld=*%ld",non,pn);
1871
		 }
1883
		 }
1872
	      }
1884
	      }
1873
	      else
1885
	      else
1874
	      {
1886
	      {
1875
		 if (xdb)
1887
		 if (xdb)
1876
		 {
1888
		 {
1877
#ifdef _SYMTAB_INCLUDED
1889
#ifdef _SYMTAB_INCLUDED
1878
		    p = type_info[non].p;  
1890
		    p = type_info[non].p;
1879
#endif
1891
#endif
1880
		 }
1892
		 }
1881
		 else
1893
		 else
1882
		 {
1894
		 {
1883
		    fprintf(dg_file,"%ld",non);
1895
		    fprintf(dg_file,"%ld",non);
1884
		 }
1896
		 }
1885
	      }
1897
	      }
1886
	   }
1898
	   }
1887
	   else
1899
	   else
1888
	   {
1900
	   {
1889
	      non = next_typen();
1901
	      non = next_typen();
1890
	      if (xdb)
1902
	      if (xdb)
1891
	      {
1903
	      {
1892
#ifdef _SYMTAB_INCLUDED
1904
#ifdef _SYMTAB_INCLUDED
1893
		 p = make_dnttentry(K_POINTER, out_dt_shape( dt->data.ptr.object ), 32);
1905
		 p = make_dnttentry(K_POINTER, out_dt_shape(dt->data.ptr.object), 32);
1894
#endif
1906
#endif
1895
	      }
1907
	      }
1896
	      else
1908
	      else
1897
	      {
1909
	      {
1898
		 fprintf(dg_file,"%ld=*",non);
1910
		 fprintf(dg_file,"%ld=*",non);
1899
		 out_dt_shape( dt->data.ptr.object );
1911
		 out_dt_shape(dt->data.ptr.object);
1900
	      }
1912
	      }
1901
	   }
1913
	   }
1902
	   dt->been_outed = non;
1914
	   dt->been_outed = non;
1903
#ifdef _SYMTAB_INCLUDED
1915
#ifdef _SYMTAB_INCLUDED
1904
	   type_info[non].p = p;
1916
	   type_info[non].p = p;
1905
#endif
1917
#endif
1906
	   last_type_sz = 32;
1918
	   last_type_sz = 32;
1907
	   set_stab_size(non);
1919
	   set_stab_size(non);
1908
	   return p;
1920
	   return p;
1909
	}
1921
	}
1910
  
1922
 
1911
      case DIAG_TYPE_ARRAY:
1923
      case DIAG_TYPE_ARRAY:
1912
	{
1924
	{
1913
	   DNTTPOINTER indextype,elemtype,p=NIL;
1925
	   DNTTPOINTER indextype,elemtype,p=NIL;
1914
#if 0
1926
#if 0
1915
	   long str = no( dt->data.array.stride );
1927
	   long str = no(dt->data.array.stride);
1916
#endif
1928
#endif
1917
	   long lwb = no( dt->data.array.lower_b );
1929
	   long lwb = no(dt->data.array.lower_b);
1918
	   long upb = no( dt->data.array.upper_b );
1930
	   long upb = no(dt->data.array.upper_b);
1919
	   diag_type index_type = dt->data.array.index_type ;
1931
	   diag_type index_type = dt->data.array.index_type;
1920
	   diag_type element_type = dt->data.array.element_type ;
1932
	   diag_type element_type = dt->data.array.element_type;
1921
	   long non = next_typen();
1933
	   long non = next_typen();
1922
	   dt->been_outed = non ;
1934
	   dt->been_outed = non;
1923
	   if (gdb)
1935
	   if (gdb)
1924
	   {
1936
	   {
1925
	      fprintf(dg_file,"%ld=ar",non);
1937
	      fprintf(dg_file,"%ld=ar",non);
1926
	      out_dt_shape( index_type );
1938
	      out_dt_shape(index_type);
1927
  	      fprintf (dg_file,";%ld;%ld;",lwb,upb);
1939
  	      fprintf(dg_file,";%ld;%ld;",lwb,upb);
1928
	   }
1940
	   }
1929
	   else
1941
	   else
1930
	   {
1942
	   {
1931
#ifdef _SYMTAB_INCLUDED
1943
#ifdef _SYMTAB_INCLUDED
1932
	      indextype = make_dnttentry(K_SUBRANGE, 0, 0, lwb, upb, out_dt_shape( index_type ),
1944
	      indextype = make_dnttentry(K_SUBRANGE, 0, 0, lwb, upb, out_dt_shape(index_type),
1933
				         last_type_sz);
1945
				         last_type_sz);
1934
#endif
1946
#endif
1935
	   }
1947
	   }
1936
	   elemtype = out_dt_shape( element_type );
1948
	   elemtype = out_dt_shape(element_type);
1937
	   if (xdb)
1949
	   if (xdb)
1938
	   {
1950
	   {
1939
#ifdef _SYMTAB_INCLUDED
1951
#ifdef _SYMTAB_INCLUDED
1940
	      unsigned long arraylength = (upb-lwb+1)<<2;
1952
	      unsigned long arraylength = (upb-lwb+1) <<2;
1941
	      unsigned long elemlength = last_type_sz>>3;
1953
	      unsigned long elemlength = last_type_sz>>3;
1942
	      p = make_dnttentry(K_ARRAY, 0, 0, 0, 1, 1, 0, 0, arraylength, indextype, elemtype, elemlength);
1954
	      p = make_dnttentry(K_ARRAY, 0, 0, 0, 1, 1, 0, 0, arraylength, indextype, elemtype, elemlength);
1943
	      type_info[non].p = p; 
1955
	      type_info[non].p = p;
1944
#endif
1956
#endif
1945
	   }
1957
	   }
1946
	   last_type_sz *= ( upb-lwb+1 );
1958
	   last_type_sz *= (upb-lwb+1);
1947
	   set_stab_size(non);
1959
	   set_stab_size(non);
1948
	   return p;
1960
	   return p;
1949
	   break ;
1961
	   break;
1950
	}
1962
	}
1951
 
1963
 
1952
      case DIAG_TYPE_STRUCT:
1964
      case DIAG_TYPE_STRUCT:
1953
      case DIAG_TYPE_UNION:
1965
      case DIAG_TYPE_UNION:
1954
	{
1966
	{
Line 1958... Line 1970...
1958
	   shape s;
1970
	   shape s;
1959
	   long non = next_typen();
1971
	   long non = next_typen();
1960
	   diag_field_list fields;
1972
	   diag_field_list fields;
1961
#ifdef _SYMTAB_INCLUDED
1973
#ifdef _SYMTAB_INCLUDED
1962
	   if (xdb)
1974
	   if (xdb)
1963
	      p = pos_of_dnttpointer( dt );
1975
	      p = pos_of_dnttpointer(dt);
1964
#endif           
1976
#endif
1965
	   dt->been_outed = non;
1977
	   dt->been_outed = non;
1966
	   if ( dt->key == DIAG_TYPE_STRUCT )
1978
	   if (dt->key == DIAG_TYPE_STRUCT)
1967
	   {
1979
	   {
1968
	      fields = dt->data.t_struct.fields;
1980
	      fields = dt->data.t_struct.fields;
1969
	      s = dt->data.t_struct.tdf_shape;
1981
	      s = dt->data.t_struct.tdf_shape;
1970
	      su = 's';
1982
	      su = 's';
1971
#ifdef _SYMTAB_INCLUDED
1983
#ifdef _SYMTAB_INCLUDED
1972
	      p.word-=2;
1984
	      p.word-=2;
1973
#endif           
1985
#endif
1974
	   } 
1986
	   }
1975
	   else
1987
	   else
1976
	   {
1988
	   {
1977
	      fields = dt->data.t_union.fields;
1989
	      fields = dt->data.t_union.fields;
1978
	      s = dt->data.t_union.tdf_shape;
1990
	      s = dt->data.t_union.tdf_shape;
1979
	      su = 'u';
1991
	      su = 'u';
1980
#ifdef _SYMTAB_INCLUDED
1992
#ifdef _SYMTAB_INCLUDED
1981
	      p.word--;
1993
	      p.word--;
1982
#endif           
1994
#endif
1983
	   }
1995
	   }
1984
	   if (xdb)
1996
	   if (xdb)
1985
	   {
1997
	   {
1986
#ifdef _SYMTAB_INCLUDED
1998
#ifdef _SYMTAB_INCLUDED
1987
	      DNTTPOINTER lastfield = NIL;
1999
	      DNTTPOINTER lastfield = NIL;
1988
	      type_info[non].p = p; 
2000
	      type_info[non].p = p;
1989
	      for(i=0;i<fields->lastused;i++)
2001
	      for (i=0;i<fields->lastused;i++)
1990
	      {
2002
	      {
1991
		 diag_field f = (fields->array)[i];
2003
		 diag_field f = (fields->array)[i];
1992
		 unsigned long bitoffset = no( f->where );
2004
		 unsigned long bitoffset = no(f->where);
1993
		 DNTTPOINTER type = out_dt_shape( f->field_type );
2005
		 DNTTPOINTER type = out_dt_shape(f->field_type);
1994
		 lastfield = make_dnttentry(K_FIELD, vt_next, bitoffset, type, last_type_sz, lastfield);
2006
		 lastfield = make_dnttentry(K_FIELD, vt_next, bitoffset, type, last_type_sz, lastfield);
1995
		 make_vtentry(f->field_name.ints.chars,0,0);
2007
		 make_vtentry(f->field_name.ints.chars,0,0);
1996
	      }
2008
	      }
1997
 
2009
 
1998
	      if ( lntt_next.word != p.word )
2010
	      if (lntt_next.word != p.word)
1999
	      {
2011
	      {
2000
		 fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables\n");
2012
		 fprintf(stderr,"hppatrans warning: trans made an error whilst compiling XDB diagnostics tables\n");
2001
	      }
2013
	      }
2002
 
2014
 
2003
 	      if ( dt->key == DIAG_TYPE_STRUCT )
2015
 	      if (dt->key == DIAG_TYPE_STRUCT)
2004
	      {
2016
	      {
2005
		 make_dnttentry(K_STRUCT, 0, lastfield, NIL, NIL, shape_size(s));
2017
		 make_dnttentry(K_STRUCT, 0, lastfield, NIL, NIL, shape_size(s));
2006
	      }
2018
	      }
2007
	      else
2019
	      else
2008
	      {
2020
	      {
2009
		 make_dnttentry(K_UNION, lastfield, shape_size(s));
2021
		 make_dnttentry(K_UNION, lastfield, shape_size(s));
2010
	      }
2022
	      }
2011
#endif
2023
#endif
2012
	   }
2024
	   }
2013
	   else
2025
	   else
2014
	   {
2026
	   {
2015
 	      fprintf(dg_file,"%ld=%c%d",non,su,shape_size(s)/8);
2027
 	      fprintf(dg_file,"%ld=%c%d",non,su,shape_size(s) /8);
2016
  	      for(i=fields->lastused-1;i>=0;i--)
2028
  	      for (i=fields->lastused-1;i>=0;i--)
2017
	      {
2029
	      {
2018
		 diag_field sf = (fields->array)[i];
2030
		 diag_field sf = (fields->array)[i];
2019
		 unsigned long offset = no( sf->where );
2031
		 unsigned long offset = no(sf->where);
2020
#if 0
2032
#if 0
2021
       	         if ( depth_now >= max_depth )
2033
       	         if (depth_now >= max_depth)
2022
		   return NIL;
2034
		   return NIL;
2023
		 depth_now++;
2035
		 depth_now++;
2024
#endif
2036
#endif
2025
		 fprintf(dg_file,"%s:",sf->field_name.ints.chars);
2037
		 fprintf(dg_file,"%s:",sf->field_name.ints.chars);
2026
		 out_dt_shape( sf->field_type );
2038
		 out_dt_shape(sf->field_type);
2027
		 fprintf(dg_file,",%ld,%ld;",offset,last_type_sz);
2039
		 fprintf(dg_file,",%ld,%ld;",offset,last_type_sz);
2028
	      }
2040
	      }
2029
	      fprintf(dg_file,";");
2041
	      fprintf(dg_file,";");
2030
	   }
2042
	   }
2031
	   last_type_sz = shape_size(s);
2043
	   last_type_sz = shape_size(s);
2032
	   set_stab_size(non);
2044
	   set_stab_size(non);
2033
	   return p ;
2045
	   return p;
2034
	}
2046
	}
2035
  
2047
 
2036
	case DIAG_TYPE_FLOAT:
2048
	case DIAG_TYPE_FLOAT:
2037
	case DIAG_TYPE_VARIETY:
2049
	case DIAG_TYPE_VARIETY:
2038
	  {
2050
	  {
2039
	     shape sha;
2051
	     shape sha;
2040
	     if ( dt->key==DIAG_TYPE_VARIETY )
2052
	     if (dt->key==DIAG_TYPE_VARIETY)
2041
	     {
2053
	     {
2042
		sha = f_integer(dt->data.var);
2054
		sha = f_integer(dt->data.var);
2043
	     }
2055
	     }
2044
	     else
2056
	     else
2045
	     {
2057
	     {
2046
		sha = f_floating(dt->data.f_var);
2058
		sha = f_floating(dt->data.f_var);
2047
	     }
2059
	     }
2048
	     dt->been_outed = out_sh_type( sha );
2060
	     dt->been_outed = out_sh_type(sha);
2049
	     if (xdb)
2061
	     if (xdb)
2050
	     {
2062
	     {
2051
#ifdef _SYMTAB_INCLUDED
2063
#ifdef _SYMTAB_INCLUDED
2052
		return type_info[dt->been_outed].p;
2064
		return type_info[dt->been_outed].p;
2053
#endif
2065
#endif
2054
	     }
2066
	     }
2055
	     else
2067
	     else
2056
	     {
2068
	     {
2057
		fprintf (dg_file,"%ld",dt->been_outed);
2069
		fprintf(dg_file,"%ld",dt->been_outed);
2058
	     }
2070
	     }
2059
	     return NIL;
2071
	     return NIL;
2060
	  }
2072
	  }
2061
  
2073
 
2062
	case DIAG_TYPE_PROC:
2074
	case DIAG_TYPE_PROC:
2063
	  {
2075
	  {
2064
	     diag_type result_type = dt->data.proc.result_type ;
2076
	     diag_type result_type = dt->data.proc.result_type;
2065
	     long non1 = next_typen();
2077
	     long non1 = next_typen();
2066
	     long non2 = next_typen();
2078
	     long non2 = next_typen();
2067
	     DNTTPOINTER p = NIL;
2079
	     DNTTPOINTER p = NIL;
2068
	     dt->been_outed = non1;
2080
	     dt->been_outed = non1;
2069
	     if (xdb)
2081
	     if (xdb)
2070
	     {
2082
	     {
2071
#ifdef _SYMTAB_INCLUDED
2083
#ifdef _SYMTAB_INCLUDED
2072
		p = make_dnttentry(K_POINTER, make_DNTTP_IMMEDIATE( T_FLABEL ), 32);
2084
		p = make_dnttentry(K_POINTER, make_DNTTP_IMMEDIATE(T_FLABEL), 32);
2073
		type_info[non1].p = p;
2085
		type_info[non1].p = p;
2074
#endif
2086
#endif
2075
	     }
2087
	     }
2076
	     else
2088
	     else
2077
	     {
2089
	     {
2078
 	        fprintf ( dg_file, "%ld=*%ld=f", non1, non2 ) ;
2090
 	        fprintf(dg_file, "%ld=*%ld=f", non1, non2);
2079
	     }
2091
	     }
2080
	     out_dt_shape ( result_type ) ;
2092
	     out_dt_shape(result_type);
2081
	     last_type_sz = 32 ;
2093
	     last_type_sz = 32;
2082
	     set_stab_size ( non1 ) ;
2094
	     set_stab_size(non1);
2083
	     set_stab_size ( non2 ) ;
2095
	     set_stab_size(non2);
2084
	     return p;
2096
	     return p;
2085
	  }
2097
	  }
2086
  
2098
 
2087
	case DIAG_TYPE_LOC:
2099
	case DIAG_TYPE_LOC:
2088
	  {
2100
	  {
2089
	     /* +++ use qualifier which gives "const"/"volatile" */
2101
	     /* +++ use qualifier which gives "const"/"volatile" */
2090
	     return out_dt_shape ( dt->data.loc.object ) ;
2102
	     return out_dt_shape(dt->data.loc.object);
2091
	  }
2103
	  }
2092
  
2104
 
2093
	case DIAG_TYPE_NULL:
2105
	case DIAG_TYPE_NULL:
2094
	  {
2106
	  {
2095
	     if (gdb)
2107
	     if (gdb)
2096
		fprintf(dg_file,"%d",STAB_VOID);
2108
		fprintf(dg_file,"%d",STAB_VOID);
2097
	     last_type_sz = 0;
2109
	     last_type_sz = 0;
2098
	     return NIL;
2110
	     return NIL;
2099
	  }
2111
	  }
2100
  
2112
 
2101
	case DIAG_TYPE_BITFIELD:
2113
	case DIAG_TYPE_BITFIELD:
2102
	  {
2114
	  {
2103
	     long sz = dt->data.bitfield.no_of_bits.nat_val.small_nat ;
2115
	     long sz = dt->data.bitfield.no_of_bits.nat_val.small_nat;
2104
	     last_type_sz = sz;
2116
	     last_type_sz = sz;
2105
	     if (xdb)
2117
	     if (xdb)
2106
	     {
2118
	     {
2107
#ifdef _SYMTAB_INCLUDED
2119
#ifdef _SYMTAB_INCLUDED
2108
 
2120
 
2109
		return type_info[STAB_SLONG].p;
2121
		return type_info[STAB_SLONG].p;
2110
#endif
2122
#endif
2111
	     }
2123
	     }
2112
	     else
2124
	     else
2113
	     {
2125
	     {
2114
		fprintf (dg_file,"%d",STAB_SLONG);
2126
		fprintf(dg_file,"%d",STAB_SLONG);
2115
	     }
2127
	     }
2116
	     return NIL;
2128
	     return NIL;
2117
	  }
2129
	  }
2118
 
2130
 
2119
	case DIAG_TYPE_ENUM:
2131
	case DIAG_TYPE_ENUM:
2120
	{
2132
	{
2121
#if 1
2133
#if 1
2122
	   /*  Currently tdfc (August 95) does not generate DIAG_TYPE_ENUM.
2134
	   /*  Currently tdfc (August 95) does not generate DIAG_TYPE_ENUM.
2123
	       Enable and test this when DIAG_TYPE_ENUM is generated.  */      
2135
	       Enable and test this when DIAG_TYPE_ENUM is generated.  */
2124
 
2136
 
2125
      /*
2137
      /*
2126
       * TypeDef:	e EnumList ;		"Enumerated type (default size, 32 bits)"
2138
       * TypeDef:	e EnumList ;		"Enumerated type (default size, 32 bits)"
2127
       * EnumList:	Enum | EnumList Enum
2139
       * EnumList:	Enum | EnumList Enum
2128
       * Enum:		NAME : OrdValue ,	"Enumerated scalar description"
2140
       * Enum:		NAME : OrdValue ,	"Enumerated scalar description"
Line 2149... Line 2161...
2149
		 firstmem = NIL;
2161
		 firstmem = NIL;
2150
	      }
2162
	      }
2151
	      make_dnttentry(K_TAGDEF,(BITS)1,(BITS)1,vt_next,lntt_next);
2163
	      make_dnttentry(K_TAGDEF,(BITS)1,(BITS)1,vt_next,lntt_next);
2152
	      make_vtentry(nm,0,0);
2164
	      make_vtentry(nm,0,0);
2153
	      p = make_dnttentry(K_ENUM, firstmem, 32);
2165
	      p = make_dnttentry(K_ENUM, firstmem, 32);
2154
	      for(i=0;i<nvals;i++)
2166
	      for (i=0;i<nvals;i++)
2155
	      {
2167
	      {
2156
		 DNTTPOINTER nextmem;
2168
		 DNTTPOINTER nextmem;
2157
		 if (i==nvals-1)
2169
		 if (i==nvals-1)
2158
		 {
2170
		 {
2159
		    nextmem = NIL;
2171
		    nextmem = NIL;
Line 2161... Line 2173...
2161
		 else
2173
		 else
2162
		 {
2174
		 {
2163
		    nextmem = lntt_next;
2175
		    nextmem = lntt_next;
2164
		    nextmem.word+=2;
2176
		    nextmem.word+=2;
2165
		 }
2177
		 }
2166
		 make_dnttentry(K_MEMENUM, vt_next, EXPINT(enumarr[i]->val), nextmem);
2178
		 make_dnttentry(K_MEMENUM, vt_next, EXPINT(enumarr[i] ->val), nextmem);
2167
		 make_vtentry(CSTRING(enumarr[i]->nme),0,0);
2179
		 make_vtentry(CSTRING(enumarr[i] ->nme),0,0);
2168
	      }
2180
	      }
2169
#endif
2181
#endif
2170
	   } 
2182
	   }
2171
	   else
2183
	   else
2172
	   {
2184
	   {
2173
	      fprintf(dg_file,"e");
2185
	      fprintf(dg_file,"e");
2174
	      for(i=0;i<nvals;i++)
2186
	      for (i=0;i<nvals;i++)
2175
	      {
2187
	      {
2176
		 fprintf(dg_file,"%s:%d,",CSTRING(enumarr[i]->nme), EXPINT(enumarr[i]->val));
2188
		 fprintf(dg_file,"%s:%d,",CSTRING(enumarr[i] ->nme), EXPINT(enumarr[i] ->val));
2177
	      }
2189
	      }
2178
	      fprintf(dg_file,";");
2190
	      fprintf(dg_file,";");
2179
	   }
2191
	   }
2180
	   non = next_typen();
2192
	   non = next_typen();
2181
	   dt->been_outed = non;
2193
	   dt->been_outed = non;
2182
	   type_info[non].p = p;
2194
	   type_info[non].p = p;
2183
	   last_type_sz = 32;
2195
	   last_type_sz = 32;
2184
	   set_stab_size(non);
2196
	   set_stab_size(non);
2185
	   return p;
2197
	   return p;
2186
#else
2198
#else
2187
	   /* For now, simply output the base integer type */
2199
	   /* For now, simply output the base integer type */
2188
	   out_dt_shape(dt->data.t_enum.base_type);
2200
	   out_dt_shape(dt->data.t_enum.base_type);
Line 2193... Line 2205...
2193
 
2205
 
2194
	default:
2206
	default:
2195
	{
2207
	{
2196
	   if (gdb)
2208
	   if (gdb)
2197
	      fprintf(dg_file,"%d",STAB_VOID);
2209
	      fprintf(dg_file,"%d",STAB_VOID);
2198
	   last_type_sz = 0 ;
2210
	   last_type_sz = 0;
2199
	   return NIL;
2211
	   return NIL;
2200
	}
2212
	}
2201
    }
2213
    }
2202
    return NIL ;
2214
    return NIL;
2203
}
2215
}
2204
 
2216
 
2205
 
2217
 
2206
/*
2218
/*
2207
    OUTPUT DIAGNOSTICS FOR A GLOBAL VARIABLE
2219
    OUTPUT DIAGNOSTICS FOR A GLOBAL VARIABLE
2208
*/
2220
*/
2209
 
2221
 
2210
void stab_global 
2222
void stab_global
2211
    PROTO_N ( ( global, id, ext ) )
-
 
2212
    PROTO_T ( exp global X char * id X bool ext )
2223
(exp global, char * id, bool ext)
2213
{
2224
{
2214
  char *nm;
2225
  char *nm;
2215
  diag_descriptor *dd = find_dd ( global ) ;
2226
  diag_descriptor *dd = find_dd(global);
2216
 
2227
 
2217
  if ( dd==NULL )
2228
  if (dd==NULL)
2218
     return;
2229
     return;
2219
  nm = dd->data.id.nme.ints.chars;
2230
  nm = dd->data.id.nme.ints.chars;
2220
  stabd ( find_file ( dd->data.id.whence.file->file.ints.chars ),
2231
  stabd(find_file(dd->data.id.whence.file->file.ints.chars),
2221
	 ( long ) dd->data.id.whence.line_no.nat_val.small_nat
2232
	(long)dd->data.id.whence.line_no.nat_val.small_nat
2222
	 , -N_DSLINE ) ;
2233
	 , -N_DSLINE);
2223
  if (xdb)
2234
  if (xdb)
2224
  {
2235
  {
2225
#ifdef _SYMTAB_INCLUDED
2236
#ifdef _SYMTAB_INCLUDED
2226
     if (ext)
2237
     if (ext)
2227
	make_dnttentry(K_SVAR, 1, 0, 0, vt_next, (STATTYPE)nm, OUT_DT_SHAPE( dd->data.id.new_type ), 0, 0, GNTT);
2238
	make_dnttentry(K_SVAR, 1, 0, 0, vt_next,(STATTYPE)nm, OUT_DT_SHAPE(dd->data.id.new_type), 0, 0, GNTT);
2228
      else
2239
      else
2229
	 make_dnttentry(K_SVAR, 0, 0, 0, vt_next, (STATTYPE)id, OUT_DT_SHAPE( dd->data.id.new_type ), 0, 0, LNTT);
2240
	 make_dnttentry(K_SVAR, 0, 0, 0, vt_next,(STATTYPE)id, OUT_DT_SHAPE(dd->data.id.new_type), 0, 0, LNTT);
2230
      make_vtentry(nm,0,0);
2241
      make_vtentry(nm,0,0);
2231
#endif
2242
#endif
2232
  }
2243
  }
2233
  else
2244
  else
2234
  {
2245
  {
2235
     fprintf(dg_file,"\t.stabs\t\"%s:%c", nm, ( ext ? 'G' : 'S' ) ) ;
2246
     fprintf(dg_file,"\t.stabs\t\"%s:%c", nm,(ext ? 'G' : 'S'));
2236
     OUT_DT_SHAPE ( dd->data.id.new_type ) ;
2247
     OUT_DT_SHAPE(dd->data.id.new_type);
2237
     fprintf(dg_file,"\",%#x,0,%d,%s\n",( ext ? 0x24 : ((no(global)!=0)?0x26:0x28) ),
2248
     fprintf(dg_file,"\",%#x,0,%d,%s\n",(ext ? 0x24 :((no(global)!=0)?0x26:0x28)),
2238
	   dd->data.id.whence.line_no.nat_val.small_nat /*0*/,
2249
	   dd->data.id.whence.line_no.nat_val.small_nat /*0*/,
2239
	   id
2250
	   id
2240
	   ) ;
2251
	  );
2241
  }
2252
  }
2242
  return ;
2253
  return;
2243
}
2254
}
2244
 
2255
 
2245
 
2256
 
2246
/*
2257
/*
2247
    OUTPUT DIAGNOSTICS FOR A PROCEDURE
2258
    OUTPUT DIAGNOSTICS FOR A PROCEDURE
2248
*/
2259
*/
2249
 
2260
 
2250
void stab_proc 
2261
void stab_proc
2251
    PROTO_N ( ( proc, id, public ) )
-
 
2252
    PROTO_T ( exp proc X char * id X bool public )
2262
(exp proc, char * id, bool public)
2253
{
2263
{
2254
   char *nm;
2264
   char *nm;
2255
   diag_descriptor *dd = find_dd ( proc ) ;
2265
   diag_descriptor *dd = find_dd(proc);
2256
   if ( dd == NULL )
2266
   if (dd == NULL)
2257
      return ;
2267
      return;
2258
   stabd ( find_file ( dd->data.id.whence.file->file.ints.chars )	,
2268
   stabd(find_file(dd->data.id.whence.file->file.ints.chars)	,
2259
	 ( long ) dd->data.id.whence.line_no.nat_val.small_nat 
2269
	(long)dd->data.id.whence.line_no.nat_val.small_nat
2260
	 ,0) ;
2270
	 ,0);
2261
   nm = id;
2271
   nm = id;
2262
   if (gdb)
2272
   if (gdb)
2263
      fprintf ( dg_file, "\t.stabs\t\"%s:%c",nm, ( public ? 'F' : 'f' ) ) ;
2273
      fprintf(dg_file, "\t.stabs\t\"%s:%c",nm,(public ? 'F' : 'f'));
2264
   OUT_DT_SHAPE ( dd->data.id.new_type->data.proc.result_type ) ;
2274
   OUT_DT_SHAPE(dd->data.id.new_type->data.proc.result_type);
2265
 
2275
 
2266
   if (gdb)
2276
   if (gdb)
2267
      fprintf ( dg_file,"\",0x24,0,%ld,%s\n",currentlno,id);
2277
      fprintf(dg_file,"\",0x24,0,%ld,%s\n",currentlno,id);
2268
 
2278
 
2269
   last_proc_lab = id;		/* id is passed from translate_capsule, 
2279
   last_proc_lab = id;		/* id is passed from translate_capsule,
2270
				 so stays in scope while needed */
2280
				 so stays in scope while needed */
2271
   if (xdb)
2281
   if (xdb)
2272
   {
2282
   {
2273
#ifdef _SYMTAB_INCLUDED
2283
#ifdef _SYMTAB_INCLUDED
2274
      DNTTPOINTER retval;
2284
      DNTTPOINTER retval;
2275
      SLTPOINTER slt_prev;
2285
      SLTPOINTER slt_prev;
2276
      BITS varargs;
2286
      BITS varargs;
2277
      VTPOINTER entry = is_vt_entry( currentfile );
2287
      VTPOINTER entry = is_vt_entry(currentfile);
2278
      slt_prev = slt_next;
2288
      slt_prev = slt_next;
2279
      make_sltentry(SLT_SRCFILE, 1, lntt_next); 
2289
      make_sltentry(SLT_SRCFILE, 1, lntt_next);
2280
      make_dnttentry(K_SRCFILE, LANG_C, ( entry==VTNIL ? vt_next : entry ), slt_prev); 
2290
      make_dnttentry(K_SRCFILE, LANG_C,(entry==VTNIL ? vt_next : entry), slt_prev);
2281
      if ( entry==VTNIL )
2291
      if (entry==VTNIL)
2282
	 make_vtentry(fds[ currentfile ]->file.ints.chars,1,currentfile);
2292
	 make_vtentry(fds[currentfile] ->file.ints.chars,1,currentfile);
2283
 
2293
 
2284
      slt_prev = slt_next;
2294
      slt_prev = slt_next;
2285
      make_sltentry(SLT_FUNCTION, currentlno, lntt_next); 
2295
      make_sltentry(SLT_FUNCTION, currentlno, lntt_next);
2286
      retval = make_DNTTP_IMMEDIATE(T_INT);
2296
      retval = make_DNTTP_IMMEDIATE(T_INT);
2287
      varargs = (BITS) dd->data.id.new_type->data.proc.opt_args;
2297
      varargs = (BITS)dd->data.id.new_type->data.proc.opt_args;
2288
      if (strcmp(nm,"main")==0)
2298
      if (strcmp(nm,"main") ==0)
2289
      {
2299
      {
2290
	 make_dnttentry(K_FUNCTION, (BITS)public, LANG_C, (BITS)0, (BITS)0,
2300
	 make_dnttentry(K_FUNCTION,(BITS)public, LANG_C,(BITS)0,(BITS)0,
2291
			varargs, (BITS)0, vt_next, vt_next+5, NIL, slt_prev,
2301
			varargs,(BITS)0, vt_next, vt_next+5, NIL, slt_prev,
2292
			(ADDRESS)"main", retval, (ADDRESS)"main",
2302
			(ADDRESS)"main", retval,(ADDRESS)"main",
2293
			(ADDRESS)"_main_end_");
2303
			(ADDRESS)"_main_end_");
2294
	 make_vtentry( "main",0,0 );
2304
	 make_vtentry("main",0,0);
2295
	 make_vtentry( "_MAIN_",0,0 );
2305
	 make_vtentry("_MAIN_",0,0);
2296
      }
2306
      }
2297
      else
2307
      else
2298
      {
2308
      {
2299
	 char *address = nm, *lowaddr = nm, hiaddr[128];
2309
	 char *address = nm, *lowaddr = nm, hiaddr[128];
2300
	 sprintf(hiaddr,"_%s_end_",address);
2310
	 sprintf(hiaddr,"_%s_end_",address);
2301
	 make_dnttentry(K_FUNCTION, (BITS)public, LANG_C, (BITS)0, (BITS)0,
2311
	 make_dnttentry(K_FUNCTION,(BITS)public, LANG_C,(BITS)0,(BITS)0,
2302
			varargs, (BITS)0, vt_next, VTNIL, NIL, slt_prev,
2312
			varargs,(BITS)0, vt_next, VTNIL, NIL, slt_prev,
2303
			(ADDRESS)address, retval, (ADDRESS)lowaddr,
2313
			(ADDRESS)address, retval,(ADDRESS)lowaddr,
2304
			(ADDRESS)hiaddr);
2314
			(ADDRESS)hiaddr);
2305
	 make_vtentry( nm,0,0 );
2315
	 make_vtentry(nm,0,0);
2306
      }
2316
      }
2307
 
2317
 
2308
      slt_prev = slt_next;
2318
      slt_prev = slt_next;
2309
      make_sltentry(SLT_BEGIN, (BITS)currentlno, lntt_next);
2319
      make_sltentry(SLT_BEGIN,(BITS)currentlno, lntt_next);
2310
      make_dnttentry(K_BEGIN, slt_prev);
2320
      make_dnttentry(K_BEGIN, slt_prev);
2311
#endif
2321
#endif
2312
   }
2322
   }
2313
 
2323
 
2314
   return ;
2324
   return;
2315
}
2325
}
2316
 
2326
 
2317
#ifdef _SYMTAB_INCLUDED
2327
#ifdef _SYMTAB_INCLUDED
2318
void close_function_scope
2328
void close_function_scope
2319
    PROTO_N ( ( res_label ) )
-
 
2320
    PROTO_T ( int res_label )
2329
(int res_label)
2321
{
2330
{
2322
   SLTPOINTER slt_prev = slt_next;
2331
   SLTPOINTER slt_prev = slt_next;
2323
   char address[128];
2332
   char address[128];
2324
   sprintf(address,"L$$%d-%s",res_label,last_proc_lab);
2333
   sprintf(address,"L$$%d-%s",res_label,last_proc_lab);
2325
   make_sltentry(SLT_EXIT, last_lno, (ADDRESS)address);
2334
   make_sltentry(SLT_EXIT, last_lno,(ADDRESS)address);
2326
   make_sltentry(SLT_END, last_lno, lntt_next);
2335
   make_sltentry(SLT_END, last_lno, lntt_next);
2327
   make_dnttentry(K_END, K_BEGIN, slt_prev, last_DNTT_BEGIN_entry());
2336
   make_dnttentry(K_END, K_BEGIN, slt_prev, last_DNTT_BEGIN_entry());
2328
   slt_prev = slt_next;
2337
   slt_prev = slt_next;
2329
   make_sltentry(SLT_END, last_lno, lntt_next);
2338
   make_sltentry(SLT_END, last_lno, lntt_next);
2330
   make_dnttentry(K_END, K_FUNCTION, slt_prev, last_DNTT_BEGIN_entry());
2339
   make_dnttentry(K_END, K_FUNCTION, slt_prev, last_DNTT_BEGIN_entry());
2331
}
2340
}
2332
#endif
2341
#endif
2333
 
2342
 
2334
/*
2343
/*
2335
    OUTPUT DIAGNOSTICS FOR A LOCAL VARIABLE
2344
    OUTPUT DIAGNOSTICS FOR A LOCAL VARIABLE
2336
*/
2345
*/
2337
 
2346
 
2338
/* ARGSUSED */ void stab_local
2347
/* ARGSUSED */ void stab_local
2339
    PROTO_N ( ( nm, dt, ldid, disp, findex ) )
-
 
2340
    PROTO_T ( char *nm X diag_type dt X exp ldid X long disp X long findex )
2348
(char *nm, diag_type dt, exp ldid, long disp, long findex)
2341
{
2349
{
2342
    exp id = son (ldid) ;
2350
    exp id = son(ldid);
2343
    disp += boff(id).offset ;
2351
    disp += boff(id).offset;
2344
    again:
2352
    again:
2345
    if ( name(id) == ident_tag ) 
2353
    if (name(id) == ident_tag)
2346
    {
2354
    {
2347
       if ( ( props(id) & defer_bit ) == 0 )
2355
       if ((props(id) & defer_bit) == 0)
2348
       {
2356
       {
2349
	  /* +++ add assembler comment to say which reg is being used */
2357
	  /* +++ add assembler comment to say which reg is being used */
2350
	  if ( isparam(id) )
2358
	  if (isparam(id))
2351
	  {
2359
	  {
2352
	     if (xdb)
2360
	     if (xdb)
2353
	     {
2361
	     {
2354
#ifdef _SYMTAB_INCLUDED
2362
#ifdef _SYMTAB_INCLUDED
2355
		/* Seems as if parameters are treated like locals by xdb  */
2363
		/* Seems as if parameters are treated like locals by xdb  */
2356
#if 0
2364
#if 0
2357
		make_dnttentry(K_FPARAM, 0, 0, 0, 0, vt_next, disp, OUT_DT_SHAPE( dt ), NIL);
2365
		make_dnttentry(K_FPARAM, 0, 0, 0, 0, vt_next, disp, OUT_DT_SHAPE(dt), NIL);
2358
#endif
2366
#endif
2359
		make_dnttentry(K_DVAR, 0, 0, 0, vt_next, disp, OUT_DT_SHAPE( dt ), 0);
2367
		make_dnttentry(K_DVAR, 0, 0, 0, vt_next, disp, OUT_DT_SHAPE(dt), 0);
2360
		make_vtentry(nm,0,0);
2368
		make_vtentry(nm,0,0);
2361
#endif
2369
#endif
2362
	     }
2370
	     }
2363
	     else
2371
	     else
2364
	     {
2372
	     {
2365
		fprintf( dg_file, "\t.stabs\t\"%s:p", nm ) ;
2373
		fprintf(dg_file, "\t.stabs\t\"%s:p", nm);
2366
		OUT_DT_SHAPE ( dt ) ;  
2374
		OUT_DT_SHAPE(dt);
2367
		fprintf( dg_file, "\",0xa0,0,%d,%ld\n",
2375
		fprintf(dg_file, "\",0xa0,0,%d,%ld\n",
2368
#if 0
2376
#if 0
2369
			 shape_size ( sh ( son ( id ) ) ) / 8,
2377
			 shape_size(sh(son(id))) / 8,
2370
#else
2378
#else
2371
			 0,
2379
			 0,
2372
#endif
2380
#endif
2373
			 disp+(frame_sz>>3) ) ;
2381
			 disp+ (frame_sz>>3));
2374
	     }
2382
	     }
2375
	     return ;
2383
	     return;
2376
	  }
2384
	  }
2377
	  else
2385
	  else
2378
	  {
2386
	  {
2379
	     if (xdb)
2387
	     if (xdb)
2380
	     {
2388
	     {
2381
#ifdef _SYMTAB_INCLUDED
2389
#ifdef _SYMTAB_INCLUDED
2382
		make_dnttentry(K_DVAR, 0, 0, 0, vt_next, disp, 
2390
		make_dnttentry(K_DVAR, 0, 0, 0, vt_next, disp,
2383
			       OUT_DT_SHAPE( dt ),                           
2391
			       OUT_DT_SHAPE(dt),
2384
			       0);
2392
			       0);
2385
		make_vtentry(nm,0,0);
2393
		make_vtentry(nm,0,0);
2386
#endif
2394
#endif
2387
	     }
2395
	     }
2388
	     else
2396
	     else
2389
	     {
2397
	     {
2390
		fprintf ( dg_file, "\t.stabs\t\"%s:", nm ) ;
2398
		fprintf(dg_file, "\t.stabs\t\"%s:", nm);
2391
		OUT_DT_SHAPE ( dt ) ;
2399
		OUT_DT_SHAPE(dt);
2392
		fprintf (dg_file,"\",0x80,0,%ld,%ld\n",currentlno,disp+(frame_sz>>3)) ;
2400
		fprintf(dg_file,"\",0x80,0,%ld,%ld\n",currentlno,disp+ (frame_sz>>3));
2393
	     }
2401
	     }
2394
	     return ;
2402
	     return;
2395
	  }
2403
	  }
2396
       }
2404
       }
2397
       else
2405
       else
2398
       {
2406
       {
2399
	  exp sn = son(id) ;
2407
	  exp sn = son(id);
2400
	  long d = disp ;
2408
	  long d = disp;
2401
	  while ( sn != nilexp )
2409
	  while (sn != nilexp)
2402
	  {
2410
	  {
2403
	     switch ( name(sn) )
2411
	     switch (name(sn))
2404
	     {
2412
	     {
2405
		case name_tag:
2413
		case name_tag:
2406
		{
2414
		{
2407
		   disp = d + no(sn) ;
2415
		   disp = d + no(sn);
2408
		   id = son(sn) ;
2416
		   id = son(sn);
2409
		   if ( isvar(id) )
2417
		   if (isvar(id))
2410
		      dt = dt->data.ptr.object ;
2418
		      dt = dt->data.ptr.object;
2411
		   goto again ;
2419
		   goto again;
2412
		}
2420
		}
2413
		case reff_tag:
2421
		case reff_tag:
2414
		{
2422
		{
2415
		   d += no(sn) ;
2423
		   d += no(sn);
2416
		   sn = son(sn) ;
2424
		   sn = son(sn);
2417
		   break ;
2425
		   break;
2418
		}
2426
		}
2419
		case cont_tag: 
2427
		case cont_tag:
2420
		{
2428
		{
2421
		   sn = son(sn) ;
2429
		   sn = son(sn);
2422
		   break ;
2430
		   break;
2423
		}
2431
		}
2424
		default:
2432
		default:
2425
		{
2433
		{
2426
		   return ;
2434
		   return;
2427
		}
2435
		}
2428
	     }
2436
	     }
2429
	  }
2437
	  }
2430
       }
2438
       }
2431
    }
2439
    }
2432
    return ;
2440
    return;
2433
}
2441
}
2434
 
2442
 
2435
 
2443
 
2436
/*
2444
/*
2437
    DEAL WITH BASIC TYPES
2445
    DEAL WITH BASIC TYPES
2438
*/
2446
*/
2439
 
2447
 
2440
void stab_types 
2448
void stab_types
2441
    PROTO_Z ()
2449
(void)
2442
{
2450
{
2443
    no_type_info = NO_STABS ;
2451
    no_type_info = NO_STABS;
2444
    type_info = ( type_info_t * ) xmalloc ( NO_STABS * sizeof ( type_info_t ) ) ;
2452
    type_info = (type_info_t *)xmalloc(NO_STABS * sizeof(type_info_t));
2445
    if (xdb)
2453
    if (xdb)
2446
    {
2454
    {
2447
#ifdef _SYMTAB_INCLUDED
2455
#ifdef _SYMTAB_INCLUDED
2448
       type_info[STAB_SCHAR].p = make_DNTTP_IMMEDIATE( T_CHAR, 8 ) ;
2456
       type_info[STAB_SCHAR].p = make_DNTTP_IMMEDIATE(T_CHAR, 8);
2449
       type_info[STAB_UCHAR].p = make_DNTTP_IMMEDIATE( T_UNS_INT, 8 ) ;
2457
       type_info[STAB_UCHAR].p = make_DNTTP_IMMEDIATE(T_UNS_INT, 8);
2450
       type_info[STAB_SSHRT].p = make_DNTTP_IMMEDIATE( T_INT, 16 ) ;
2458
       type_info[STAB_SSHRT].p = make_DNTTP_IMMEDIATE(T_INT, 16);
2451
       type_info[STAB_USHRT].p = make_DNTTP_IMMEDIATE( T_UNS_INT, 16 ) ;
2459
       type_info[STAB_USHRT].p = make_DNTTP_IMMEDIATE(T_UNS_INT, 16);
2452
       type_info[STAB_SLONG].p = make_DNTTP_IMMEDIATE( T_LONG, 32 ) ;
2460
       type_info[STAB_SLONG].p = make_DNTTP_IMMEDIATE(T_LONG, 32);
2453
       type_info[STAB_ULONG].p = make_DNTTP_IMMEDIATE( T_UNS_LONG, 32 ) ;
2461
       type_info[STAB_ULONG].p = make_DNTTP_IMMEDIATE(T_UNS_LONG, 32);
2454
       type_info[STAB_FLOAT].p = make_DNTTP_IMMEDIATE( T_REAL, 32 ) ;
2462
       type_info[STAB_FLOAT].p = make_DNTTP_IMMEDIATE(T_REAL, 32);
2455
       type_info[STAB_DBL].p   = make_DNTTP_IMMEDIATE( T_REAL, 64 ) ;
2463
       type_info[STAB_DBL].p   = make_DNTTP_IMMEDIATE(T_REAL, 64);
2456
       type_info[STAB_LDBL].p  = make_DNTTP_IMMEDIATE( T_REAL, 128 ) ;
2464
       type_info[STAB_LDBL].p  = make_DNTTP_IMMEDIATE(T_REAL, 128);
2457
#endif
2465
#endif
2458
    }
2466
    }
2459
    else
2467
    else
2460
    {
2468
    {
2461
       fputs ( "\t.stabs\t\"int:t1=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
2469
       fputs("\t.stabs\t\"int:t1=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
2462
	    dg_file ) ;
2470
	    dg_file);
2463
       fputs ( "\t.stabs\t\"short int:t2=r1;-32768;32767;\",0x80,0,0,0\n",
2471
       fputs("\t.stabs\t\"short int:t2=r1;-32768;32767;\",0x80,0,0,0\n",
2464
	    dg_file ) ;
2472
	    dg_file);
2465
       fputs ( "\t.stabs\t\"short unsigned int:t3=r1;0;65535;\",0x80,0,0,0\n",
2473
       fputs("\t.stabs\t\"short unsigned int:t3=r1;0;65535;\",0x80,0,0,0\n",
2466
	    dg_file ) ;
2474
	    dg_file);
2467
       fputs ( "\t.stabs\t\"char:t4=r4;0;127;\",0x80,0,0,0\n",
2475
       fputs("\t.stabs\t\"char:t4=r4;0;127;\",0x80,0,0,0\n",
2468
	    dg_file ) ;
2476
	    dg_file);
2469
       fputs ( "\t.stabs\t\"signed char:t5=r1;-128;127;\",0x80,0,0,0\n",
2477
       fputs("\t.stabs\t\"signed char:t5=r1;-128;127;\",0x80,0,0,0\n",
2470
	    dg_file ) ;
2478
	    dg_file);
2471
       fputs ( "\t.stabs\t\"unsigned char:t6=r1;0;255;\",0x80,0,0,0\n",
2479
       fputs("\t.stabs\t\"unsigned char:t6=r1;0;255;\",0x80,0,0,0\n",
2472
	    dg_file ) ;
2480
	    dg_file);
2473
       fputs ( "\t.stabs\t\"long int:t7=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
2481
       fputs("\t.stabs\t\"long int:t7=r1;-2147483648;2147483647;\",0x80,0,0,0\n",
2474
	    dg_file ) ;
2482
	    dg_file);
2475
       fputs ( "\t.stabs\t\"unsigned int:t8=r1;0;-1;\",0x80,0,0,0\n",
2483
       fputs("\t.stabs\t\"unsigned int:t8=r1;0;-1;\",0x80,0,0,0\n",
2476
	    dg_file ) ;
2484
	    dg_file);
2477
       fputs ( "\t.stabs\t\"long unsigned int:t9=r1;0;-1;\",0x80,0,0,0\n",
2485
       fputs("\t.stabs\t\"long unsigned int:t9=r1;0;-1;\",0x80,0,0,0\n",
2478
	    dg_file ) ;
2486
	    dg_file);
2479
       fputs ( "\t.stabs\t\"float:t10=r1;4;0;\",0x80,0,0,0\n",
2487
       fputs("\t.stabs\t\"float:t10=r1;4;0;\",0x80,0,0,0\n",
2480
	    dg_file ) ;
2488
	    dg_file);
2481
       fputs ( "\t.stabs\t\"double:t11=r1;8;0;\",0x80,0,0,0\n",
2489
       fputs("\t.stabs\t\"double:t11=r1;8;0;\",0x80,0,0,0\n",
2482
	    dg_file ) ;
2490
	    dg_file);
2483
       fprintf ( dg_file,"\t.stabs\t\"long double:t12=r1;8;0;\",0x80,0,0,0\n");
2491
       fprintf(dg_file,"\t.stabs\t\"long double:t12=r1;8;0;\",0x80,0,0,0\n");
2484
       fputs ( "\t.stabs\t\"void:t13=13\",0x80,0,0,0\n",
2492
       fputs("\t.stabs\t\"void:t13=13\",0x80,0,0,0\n",
2485
	    dg_file ) ;
2493
	    dg_file);
2486
    }
2494
    }
2487
    type_info [0].sz = 0 ;
2495
    type_info[0].sz = 0;
2488
    type_info [1].sz = 32 ;
2496
    type_info[1].sz = 32;
2489
    type_info [2].sz = 16 ;
2497
    type_info[2].sz = 16;
2490
    type_info [3].sz = 16 ;
2498
    type_info[3].sz = 16;
2491
    type_info [4].sz = 8 ;
2499
    type_info[4].sz = 8;
2492
    type_info [5].sz = 8 ;
2500
    type_info[5].sz = 8;
2493
    type_info [6].sz = 8 ;
2501
    type_info[6].sz = 8;
2494
    type_info [7].sz = 32 ;
2502
    type_info[7].sz = 32;
2495
    type_info [8].sz = 32 ;
2503
    type_info[8].sz = 32;
2496
    type_info [9].sz = 32 ;
2504
    type_info[9].sz = 32;
2497
    type_info [10].sz = 32 ;
2505
    type_info[10].sz = 32;
2498
    type_info [11].sz = 64 ;
2506
    type_info[11].sz = 64;
2499
    type_info [12].sz = DOUBLE_SZ ;
2507
    type_info[12].sz = DOUBLE_SZ;
2500
    type_info [13].sz = 0 ;
2508
    type_info[13].sz = 0;
2501
    return ;
2509
    return;
2502
}
2510
}
2503
 
2511
 
2504
 
2512
 
2505
/*
2513
/*
2506
    DEAL WITH STRUCTURE AND UNION TAGS
2514
    DEAL WITH STRUCTURE AND UNION TAGS
2507
*/
2515
*/
2508
 
2516
 
2509
void stab_tagdefs 
2517
void stab_tagdefs
2510
    PROTO_Z ()
2518
(void)
2511
{
2519
{
2512
    diag_tagdef **di = unit_ind_diagtags ;
2520
    diag_tagdef **di = unit_ind_diagtags;
2513
    unsigned int n = unit_no_of_diagtags ;
2521
    unsigned int n = unit_no_of_diagtags;
2514
    int i;
2522
    int i;
2515
 
2523
 
2516
    for ( i = 0 ; i < n ; i++ )
2524
    for (i = 0; i < n; i++)
2517
    {
2525
    {
2518
	diag_type d = di [i]->d_type ;
2526
	diag_type d = di[i] ->d_type;
2519
	switch ( d->key )
2527
	switch (d->key)
2520
	{
2528
	{
2521
	    case DIAG_TYPE_STRUCT :
2529
	    case DIAG_TYPE_STRUCT:
2522
	    case DIAG_TYPE_UNION :
2530
	    case DIAG_TYPE_UNION:
2523
	    {
2531
	    {
2524
		char *nme ;
2532
		char *nme;
2525
		if ( d->key == DIAG_TYPE_STRUCT ) {
2533
		if (d->key == DIAG_TYPE_STRUCT) {
2526
		    nme = d->data.t_struct.nme.ints.chars ;
2534
		    nme = d->data.t_struct.nme.ints.chars;
2527
		} else {
2535
		} else {
2528
		    nme = d->data.t_union.nme.ints.chars ;
2536
		    nme = d->data.t_union.nme.ints.chars;
2529
		}
2537
		}
2530
 
2538
 
2531
		if ( nme && *nme )
2539
		if (nme && *nme)
2532
		{
2540
		{
2533
		    if (gdb)
2541
		    if (gdb)
2534
		       fprintf ( dg_file, "\t.stabs\t\"%s:", nme ) ;
2542
		       fprintf(dg_file, "\t.stabs\t\"%s:", nme);
2535
		}
2543
		}
2536
		else
2544
		else
2537
		if ( d->key == DIAG_TYPE_STRUCT )
2545
		if (d->key == DIAG_TYPE_STRUCT)
2538
		{
2546
		{
2539
/*		   static int s_count = 0 ; gcc complains */
2547
/*		   static int s_count = 0 ; gcc complains */
2540
		   if (gdb)
2548
		   if (gdb)
2541
		      fprintf ( dg_file, "\t.stabs\t\"s:") ;
2549
		      fprintf(dg_file, "\t.stabs\t\"s:");
2542
		}
2550
		}
2543
		else
2551
		else
2544
		{
2552
		{
2545
/*		   static int u_count = 0 ; gcc complains */
2553
/*		   static int u_count = 0 ; gcc complains */
2546
		   if (gdb)
2554
		   if (gdb)
2547
  		      fprintf ( dg_file, "\t.stabs\t\"u:") ;
2555
  		      fprintf(dg_file, "\t.stabs\t\"u:");
2548
		}
2556
		}
2549
		if ( d->been_outed && 0 )
2557
		if (d->been_outed && 0)
2550
		{
2558
		{
2551
		   if (gdb)
2559
		   if (gdb)
2552
		      fprintf ( dg_file, "%d", (int)d->been_outed ) ;
2560
		      fprintf(dg_file, "%d",(int)d->been_outed);
2553
		}
2561
		}
2554
		else
2562
		else
2555
		{
2563
		{
2556
		   if (gdb)
2564
		   if (gdb)
2557
		      fprintf ( dg_file, "T" ) ;
2565
		      fprintf(dg_file, "T");
2558
		   OUT_DT_SHAPE ( d ) ;
2566
		   OUT_DT_SHAPE(d);
2559
		}
2567
		}
2560
		if (gdb)
2568
		if (gdb)
2561
		   fprintf ( dg_file, "\",0x80,0,0,0\n" ) ;
2569
		   fprintf(dg_file, "\",0x80,0,0,0\n");
2562
		break ;
2570
		break;
2563
	    }
2571
	    }
2564
	    case DIAG_TYPE_UNINIT:
2572
	    case DIAG_TYPE_UNINIT:
2565
	    case DIAG_TYPE_INITED:
2573
	    case DIAG_TYPE_INITED:
2566
		assert(0);
2574
		assert(0);
2567
	    default:
2575
	    default:
2568
		break;
2576
		break;
2569
	}
2577
	}
2570
    }
2578
    }
2571
    return ;
2579
    return;
2572
}
2580
}
2573
 
2581
 
2574
 
2582
 
2575
/*
2583
/*
2576
    DEAL WITH TYPEDEFS
2584
    DEAL WITH TYPEDEFS
2577
*/
2585
*/
2578
 
2586
 
2579
void stab_typedefs 
2587
void stab_typedefs
2580
    PROTO_Z ()
2588
(void)
2581
{
2589
{
2582
    diag_descriptor *di = unit_diagvar_tab.array ;
2590
    diag_descriptor *di = unit_diagvar_tab.array;
2583
    int i, n = unit_diagvar_tab.lastused ;
2591
    int i, n = unit_diagvar_tab.lastused;
2584
    for ( i = 0 ; i < n ; i++ ) {
2592
    for (i = 0; i < n; i++) {
2585
	if ( di [i].key == DIAG_TYPEDEF_KEY )
2593
	if (di[i].key == DIAG_TYPEDEF_KEY)
2586
	{
2594
	{
2587
	    long non = next_typen () ;
2595
	    long non = next_typen();
2588
	    if (gdb)
2596
	    if (gdb)
2589
	       fprintf ( dg_file, "\t.stabs\t\"%s:t%ld=",
2597
	       fprintf(dg_file, "\t.stabs\t\"%s:t%ld=",
2590
		      di [i].data.typ.nme.ints.chars, non ) ;
2598
		      di[i].data.typ.nme.ints.chars, non);
2591
	    OUT_DT_SHAPE ( di [i].data.typ.new_type ) ;
2599
	    OUT_DT_SHAPE(di[i].data.typ.new_type);
2592
	    if (gdb)
2600
	    if (gdb)
2593
	       fprintf ( dg_file, "\",0x80,0,0,0\n" ) ;
2601
	       fprintf(dg_file, "\",0x80,0,0,0\n");
2594
	}
2602
	}
2595
    }
2603
    }
2596
    return ;
2604
    return;
2597
}
2605
}