Subversion Repositories tendra.SVN

Rev

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

Rev Author Line No. Line
2 7u83 1
/*
2
    		 Crown Copyright (c) 1996
3
 
4
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
6
    acting through the Defence Evaluation and Research Agency
7
    (DERA).  It is made available to Recipients with a
8
    royalty-free licence for its use, reproduction, transfer
9
    to other parties and amendment for any purpose not excluding
10
    product development provided that any such use et cetera
11
    shall be deemed to be acceptance of the following conditions:-
12
 
13
        (1) Its Recipients shall ensure that this Notice is
14
        reproduced upon any copies or amended versions of it;
15
 
16
        (2) Any amended version of it shall be clearly marked to
17
        show both the nature of and the organisation responsible
18
        for the relevant amendment or amendments;
19
 
20
        (3) Its onward transfer from a recipient to another
21
        party shall be deemed to be that party's acceptance of
22
        these conditions;
23
 
24
        (4) DERA gives no warranty or assurance as to its
25
        quality or suitability for any purpose and DERA accepts
26
        no liability whatsoever in relation to any use to which
27
        it may be put.
28
*/
29
/*
30
			    VERSION INFORMATION
31
			    ===================
32
 
33
--------------------------------------------------------------------------
34
$Header: /u/g/release/CVSROOT/Source/src/installers/680x0/common/stab_types.c,v 1.1.1.1 1998/01/17 15:55:50 release Exp $
35
--------------------------------------------------------------------------
36
$Log: stab_types.c,v $
37
 * Revision 1.1.1.1  1998/01/17  15:55:50  release
38
 * First version to be checked into rolling release.
39
 *
40
Revision 1.1.1.1  1997/10/13 12:43:01  ma
41
First version.
42
 
43
Revision 1.1.1.1  1997/03/14 07:50:22  ma
44
Imported from DRA
45
 
46
 * Revision 1.1.1.1  1996/09/20  10:57:01  john
47
 *
48
 * Revision 1.2  1996/07/05  14:31:36  john
49
 * Removed copyright message
50
 *
51
 * Revision 1.1  95/03/08  16:46:11  ra
52
 * Added missing files.
53
 *
54
 * Revision 1.3  94/02/21  16:08:10  16:08:10  ra (Robert Andrews)
55
 * Clear up a couple of long-int confusions.
56
 *
57
 * Revision 1.2  93/04/19  13:38:52  13:38:52  ra (Robert Andrews)
58
 * struct_fields and union_fields have been renamed diag_field.
59
 *
60
 * Revision 1.1  93/02/22  17:17:11  17:17:11  ra (Robert Andrews)
61
 * Initial revision
62
 *
63
--------------------------------------------------------------------------
64
*/
65
 
66
 
67
#include "config.h"
68
#include "common_types.h"
69
#include "expmacs.h"
70
#include "externs.h"
71
#include "instrs.h"
72
#include "mach.h"
73
#include "mach_ins.h"
74
#include "mach_op.h"
75
#include "output.h"
76
#include "shapemacs.h"
77
#include "utility.h"
78
#include "xdb_output.h"
79
#include "stab_types.h"
80
 
81
 
82
/*
83
    CREATE A STABS INSTRUCTION
84
*/
85
 
86
void make_stabs
87
    PROTO_N ( ( s, a, b, op ) )
88
    PROTO_T ( char *s X int a X long b X mach_op *op )
89
{
90
    mach_op *p = make_extern_data ( s, 0 ) ;
91
    p->of = make_int_data ( ( long ) a ) ;
92
    p->of->of = make_int_data ( 0 ) ;
93
    p->of->of->of = make_int_data ( b ) ;
94
    p->of->of->of->of = ( op ? op : make_int_data ( 0 ) ) ;
95
    make_instr ( m_stabs, p, null, 0 ) ;
96
    return ;
97
}
98
 
99
 
100
/*
101
    CREATE A STABN INSTRUCTION
102
*/
103
 
104
void make_stabn
105
    PROTO_N ( ( a, lab ) )
106
    PROTO_T ( int a X long lab )
107
{
108
    mach_op *p = make_int_data ( ( long ) a ) ;
109
    p->of = make_int_data ( 0 ) ;
110
    p->of->of = make_int_data ( 0 ) ;
111
    p->of->of->of = make_lab_data ( lab, 0 ) ;
112
    make_instr ( m_stabn, p, null, 0 ) ;
113
    return ;
114
}
115
 
116
 
117
/*
118
    TYPE USED FOR BUILDING STAB TYPES
119
*/
120
 
121
#define TSIZE 100
122
 
123
typedef struct page_tag {
124
    int index ;
125
    char text [ TSIZE ] ;
126
    struct page_tag *next ;
127
} page ;
128
 
129
 
130
/*
131
    LIST OF FREE PAGES
132
*/
133
 
134
static page *free_pages = null ;
135
 
136
 
137
/*
138
    CREATE A NEW PAGE
139
*/
140
 
141
static page *new_page
142
    PROTO_Z ()
143
{
144
    page *p = free_pages ;
145
    if ( p == null ) {
146
	p = alloc_nof ( page, 1 ) ;
147
    } else {
148
	free_pages = p->next ;
149
    }
150
    p->index = 0 ;
151
    p->next = null ;
152
    return ( p ) ;
153
}
154
 
155
 
156
/*
157
    ADD A STRING TO A PAGE
158
*/
159
 
160
static page *sprint_string
161
    PROTO_N ( ( p, s ) )
162
    PROTO_T ( page *p X char *s )
163
{
164
    int i = p->index ;
165
    for ( ; *s ; s++ ) {
166
	if ( i >= TSIZE ) {
167
	    p->index = TSIZE ;
168
	    p->next = new_page () ;
169
	    p = p->next ;
170
	    i = 0 ;
171
	}
172
	p->text [i] = *s ;
173
	i++ ;
174
    }
175
    p->index = i ;
176
    return ( p ) ;
177
}
178
 
179
 
180
/*
181
    ADD A NUMBER TO A PAGE
182
*/
183
 
184
static page *sprint_number
185
    PROTO_N ( ( p, n ) )
186
    PROTO_T ( page *p X long n )
187
{
188
    char buff [100] ;
189
    ( void ) sprintf ( buff, "%ld", n ) ;
190
    return ( sprint_string ( p, buff ) ) ;
191
}
192
 
193
 
194
/*
195
    CREATE A NEW STAB TYPE
196
*/
197
 
198
static char *new_stab_type
199
    PROTO_N ( ( dt ) )
200
    PROTO_T ( diag_type dt )
201
{
202
    static long next_stab_type = 16 ;
203
    char *res = alloc_nof ( char, 8 ) ;
204
    sprintf ( res, "%ld", next_stab_type++ ) ;
205
    if ( dt ) dt->been_outed = ( OUTPUT_REC ) res ;
206
    return ( res ) ;
207
}
208
 
209
 
210
/*
211
    SIZE OF LAST TYPE ANALYSED
212
*/
213
 
214
static long last_type_sz = 0 ;
215
 
216
 
217
/*
218
    INDEX TO SIMPLE STAB TYPES
219
*/
220
 
221
#define STAB_SCHAR	0
222
#define STAB_UCHAR	1
223
#define STAB_SWORD	2
224
#define STAB_UWORD	3
225
#define STAB_SLONG	4
226
#define STAB_ULONG	5
227
#define STAB_FLOAT	6
228
#define STAB_DOUBLE	7
229
#define STAB_LDOUBLE	8
230
#define STAB_VOID	9
231
#define STAB_PTR	10
232
#define STAB_COMPLEX	-1
233
 
234
 
235
/*
236
    TABLE OF SIMPLE STAB TYPES
237
*/
238
 
239
static char *stab_tab [] = {
240
    "2", "11", "6", "8", "1", "4", "12", "13", "14", "15",
241
    null, null, null, null, null, null, null, null, null, null
242
} ;
243
 
244
 
245
/*
246
    TEST IF A TYPE IS SIMPLE
247
*/
248
 
249
static int test_type
250
    PROTO_N ( ( dt ) )
251
    PROTO_T ( diag_type dt )
252
{
253
    switch ( dt->key ) {
254
 
255
	case DIAG_TYPE_FLOAT : {
256
	    shape sha = f_floating ( dt->data.f_var ) ;
257
	    last_type_sz = shape_size ( sha ) ;
258
	    if ( name ( sha ) == shrealhd ) return ( STAB_FLOAT ) ;
259
	    if ( name ( sha ) == realhd ) return ( STAB_DOUBLE ) ;
260
	    return ( STAB_LDOUBLE ) ;
261
	}
262
 
263
	case DIAG_TYPE_VARIETY : {
264
	    shape sha = f_integer ( dt->data.var ) ;
265
	    last_type_sz = shape_size ( sha ) ;
266
	    switch ( name ( sha ) ) {
267
		case scharhd : return ( STAB_SCHAR ) ;
268
		case swordhd : return ( STAB_SWORD ) ;
269
		case slonghd : return ( STAB_SLONG ) ;
270
		case ucharhd : return ( STAB_UCHAR ) ;
271
		case uwordhd : return ( STAB_UWORD ) ;
272
		case ulonghd : return ( STAB_ULONG ) ;
273
	    }
274
	    break ;
275
	}
276
 
277
	case DIAG_TYPE_NULL : {
278
	    last_type_sz = 0 ;
279
	    return ( STAB_VOID ) ;
280
	}
281
 
282
	default : {
283
	    break ;
284
	}
285
    }
286
    return ( STAB_COMPLEX ) ;
287
}
288
 
289
 
290
/*
291
    BUILD UP A STAB TYPE IN A BUFFER
292
*/
293
 
294
static page *build_stab_type
295
    PROTO_N ( ( dt, ptr ) )
296
    PROTO_T ( diag_type dt X page *ptr )
297
{
298
    switch ( dt->key ) {
299
 
300
	case DIAG_TYPE_FLOAT :
301
	case DIAG_TYPE_NULL :
302
	case DIAG_TYPE_VARIETY : {
303
	    /* Simple types */
304
	    int t = test_type ( dt ) ;
305
	    ptr = sprint_string ( ptr, stab_tab [t] ) ;
306
	    break ;
307
	}
308
 
309
	case DIAG_TYPE_ARRAY : {
310
	    diag_type dtl = dt->data.array.element_type ;
311
	    long lo = no ( dt->data.array.lower_b ) ;
312
	    long hi = no ( dt->data.array.upper_b ) ;
313
	    char *stl = analyse_stab_type ( dtl, null, null ) ;
314
	    ptr = sprint_string ( ptr, new_stab_type ( dt ) ) ;
315
	    ptr = sprint_string ( ptr, "=ar1;" ) ;
316
	    ptr = sprint_number ( ptr, lo ) ;
317
	    ptr = sprint_string ( ptr, ";" ) ;
318
	    ptr = sprint_number ( ptr, hi ) ;
319
	    ptr = sprint_string ( ptr, ";" ) ;
320
	    ptr = sprint_string ( ptr, stl ) ;
321
	    last_type_sz *= ( hi - lo + 1 ) ;
322
	    break ;
323
	}
324
 
325
	case DIAG_TYPE_BITFIELD : {
326
	    long sz = dt->data.bitfield.no_of_bits.nat_val.small_nat ;
327
	    ptr = sprint_string ( ptr, "1" ) ;
328
	    last_type_sz = sz ;
329
	    break ;
330
	}
331
 
332
	case DIAG_TYPE_ENUM : {
333
	    /* Not yet supported */
334
	    ptr = sprint_string ( ptr, "1" ) ;
335
	    last_type_sz = 32 ;
336
	    break ;
337
	}
338
 
339
	case DIAG_TYPE_LOC : {
340
	    diag_type dtl = dt->data.loc.object ;
341
	    ptr = build_stab_type ( dtl, ptr ) ;
342
	    break ;
343
	}
344
 
345
	case DIAG_TYPE_PROC : {
346
	    diag_type dtl = dt->data.proc.result_type ;
347
	    char *stl = analyse_stab_type ( dtl, null, null ) ;
348
	    ptr = sprint_string ( ptr, new_stab_type ( dt ) ) ;
349
	    ptr = sprint_string ( ptr, "=*" ) ;
350
	    ptr = sprint_string ( ptr, new_stab_type ( null ) ) ;
351
	    ptr = sprint_string ( ptr, "=f" ) ;
352
	    ptr = sprint_string ( ptr, stl ) ;
353
	    last_type_sz = 32 ;
354
	    break ;
355
	}
356
 
357
	case DIAG_TYPE_PTR : {
358
	    diag_type dtl = dt->data.ptr.object ;
359
	    int t = test_type ( dtl ) ;
360
	    if ( t != STAB_COMPLEX ) {
361
		char *st = stab_tab [ STAB_PTR + t ] ;
362
		if ( st ) {
363
		    ptr = sprint_string ( ptr, st ) ;
364
		} else {
365
		    st = new_stab_type ( null ) ;
366
		    stab_tab [ STAB_PTR + t ] = st ;
367
		    ptr = sprint_string ( ptr, st ) ;
368
		    ptr = sprint_string ( ptr, "=*" ) ;
369
		    ptr = sprint_string ( ptr, stab_tab [t] ) ;
370
		}
371
	    } else {
372
		char *stl = analyse_stab_type ( dtl, null, null ) ;
373
		ptr = sprint_string ( ptr, new_stab_type ( dt ) ) ;
374
		ptr = sprint_string ( ptr, "=*" ) ;
375
		ptr = sprint_string ( ptr, stl ) ;
376
	    }
377
	    last_type_sz = 32 ;
378
	    break ;
379
	}
380
 
381
	case DIAG_TYPE_STRUCT : {
382
	    char *nm = dt->data.t_struct.nme.ints.chars ;
383
	    if ( *nm ) {
384
		char *res ;
385
		dt->data.t_struct.nme.ints.chars = "" ;
386
		res = analyse_stab_type ( dt, nm, "T" ) ;
387
		dt->data.t_struct.nme.ints.chars = nm ;
388
		make_stabs ( res, 128, L0, null ) ;
389
		res = ( char * ) dt->been_outed ;
390
		ptr = sprint_string ( ptr, res ) ;
391
	    } else {
392
		shape sha = dt->data.t_struct.tdf_shape ;
393
		long sz = shape_size ( sha ) ;
394
#if 0
395
		struct_fields *fld = dt->data.t_struct.fields->array ;
396
#else
397
		diag_field *fld = dt->data.t_struct.fields->array ;
398
#endif
399
		long i, n = ( long ) dt->data.t_struct.fields->lastused ;
400
 
401
		ptr = sprint_string ( ptr, new_stab_type ( dt ) ) ;
402
		ptr = sprint_string ( ptr, "=s" ) ;
403
		ptr = sprint_number ( ptr, sz / 8 ) ;
404
 
405
		/* Deal with structure fields */
406
		for ( i = n - 1 ; i >= 0 ; i-- ) {
407
		    char *fnm = fld [i]->field_name.ints.chars ;
408
		    long off = no ( fld [i]->where ) ;
409
		    diag_type dtl = fld [i]->field_type ;
410
		    char *q = analyse_stab_type ( dtl, null, null ) ;
411
		    ptr = sprint_string ( ptr, fnm ) ;
412
		    ptr = sprint_string ( ptr, ":" ) ;
413
		    ptr = sprint_string ( ptr, q ) ;
414
		    ptr = sprint_string ( ptr, "," ) ;
415
		    ptr = sprint_number ( ptr, off ) ;
416
		    ptr = sprint_string ( ptr, "," ) ;
417
		    ptr = sprint_number ( ptr, last_type_sz ) ;
418
		    ptr = sprint_string ( ptr, ";" ) ;
419
		}
420
		ptr = sprint_string ( ptr, ";" ) ;
421
		last_type_sz = sz ;
422
	    }
423
	    break ;
424
	}
425
 
426
	case DIAG_TYPE_UNION : {
427
	    char *nm = dt->data.t_union.nme.ints.chars ;
428
	    if ( *nm ) {
429
		char *res ;
430
		dt->data.t_struct.nme.ints.chars = "" ;
431
		res = analyse_stab_type ( dt, nm, "T" ) ;
432
		dt->data.t_struct.nme.ints.chars = nm ;
433
		make_stabs ( res, 128, L0, null ) ;
434
		res = ( char * ) dt->been_outed ;
435
		ptr = sprint_string ( ptr, res ) ;
436
	    } else {
437
		shape sha = dt->data.t_union.tdf_shape ;
438
		long sz = shape_size ( sha ) ;
439
#if 0
440
		union_fields *fld = dt->data.t_union.fields->array ;
441
#else
442
		diag_field *fld = dt->data.t_union.fields->array ;
443
#endif
444
		long i, n = ( long ) dt->data.t_union.fields->lastused ;
445
 
446
		ptr = sprint_string ( ptr, new_stab_type ( dt ) ) ;
447
		ptr = sprint_string ( ptr, "=u" ) ;
448
		ptr = sprint_number ( ptr, sz / 8 ) ;
449
 
450
		/* Deal with union fields */
451
		for ( i = n - 1 ; i >= 0 ; i-- ) {
452
		    char *fnm = fld [i]->field_name.ints.chars ;
453
		    diag_type dtl = fld [i]->field_type ;
454
		    char *q = analyse_stab_type ( dtl, null, null ) ;
455
		    ptr = sprint_string ( ptr, fnm ) ;
456
		    ptr = sprint_string ( ptr, ":" ) ;
457
		    ptr = sprint_string ( ptr, q ) ;
458
		    ptr = sprint_string ( ptr, ",0," ) ;
459
		    ptr = sprint_number ( ptr, last_type_sz ) ;
460
		    ptr = sprint_string ( ptr, ";" ) ;
461
		}
462
		ptr = sprint_string ( ptr, ";" ) ;
463
		last_type_sz = sz ;
464
	    }
465
	    break ;
466
	}
467
 
468
	default : {
469
	    ptr = sprint_string ( ptr, "15" ) ;
470
	    last_type_sz = 0 ;
471
	    break ;
472
	}
473
    }
474
    return ( ptr ) ;
475
}
476
 
477
 
478
/*
479
    FIND A STAB TYPE
480
*/
481
 
482
char *analyse_stab_type
483
    PROTO_N ( ( dt, nm, cl ) )
484
    PROTO_T ( diag_type dt X char *nm X char *cl )
485
{
486
    int n = 0 ;
487
    page *ptr, *p ;
488
    char *res = ( char * ) dt->been_outed ;
489
    if ( res && nm == null && cl == null ) return ( res ) ;
490
    p = ptr = new_page () ;
491
    if ( nm ) {
492
	p = sprint_string ( p, "\"" ) ;
493
	p = sprint_string ( p, nm ) ;
494
    }
495
    if ( cl ) {
496
	p = sprint_string ( p, ":" ) ;
497
	p = sprint_string ( p, cl ) ;
498
    }
499
    if ( res ) {
500
	p = sprint_string ( p, res ) ;
501
    } else {
502
	p = build_stab_type ( dt, p ) ;
503
    }
504
    if ( nm ) p = sprint_string ( p, "\"" ) ;
505
 
506
    /* Copy accumulated string */
507
    for ( p = ptr ; p ; p = p->next ) n += p->index ;
508
    res = alloc_nof ( char, n + 1 ) ;
509
    n = 0 ;
510
    for ( p = ptr ; p ; p = p->next ) {
511
	strncpy ( res + n, p->text, p->index ) ;
512
	n += p->index ;
513
    }
514
    res [n] = 0 ;
515
 
516
    /* Free pages */
517
    p =  ptr ;
518
    while ( p->next ) p = p->next ;
519
    p->next = free_pages ;
520
    free_pages = ptr ;
521
    return ( res ) ;
522
}
523
 
524
 
525
/*
526
    INITIALIZE BASIC STAB TYPES
527
*/
528
 
529
void init_stab_types
530
    PROTO_Z ()
531
{
532
    static char *stab_types [] = {
533
	"\"int:t1=r1;-2147483648;2147483647;\"",
534
	"\"char:t2=r2;0;127;\"",
535
	"\"long int:t3=r1;-2147483648;2147483647;\"",
536
	"\"unsigned int:t4=r1;0;-1;\"",
537
	"\"long unsigned int:t5=r1;0;-1;\"",
538
	"\"short int:t6=r1;-32768;32767;\"",
539
	"\"long long int:t7=r1;0;-1;\"",
540
	"\"short unsigned int:t8=r1;0;65535;\"",
541
	"\"long long unsigned int:t9=r1;0;-1;\"",
542
	"\"signed char:t10=r1;-128;127;\"",
543
	"\"unsigned char:t11=r1;0;255;\"",
544
	"\"float:t12=r1;4;0;\"",
545
	"\"double:t13=r1;8;0;\"",
546
	"\"long double:t14=r1;8;0;\"",
547
	"\"void:t15=15\""
548
    } ;
549
    int i ;
550
    for ( i = 0 ; i < 15 ; i++ ) {
551
	make_stabs ( stab_types [i], 128, L0, null ) ;
552
    }
553
    return ;
554
}