124 lines
3.2 KiB
C++
124 lines
3.2 KiB
C++
/* $Header$ */
|
|
|
|
/* internal type representation */
|
|
|
|
/* structure for struct/union elements */
|
|
struct fields {
|
|
long fld_pos; /* position of field */
|
|
long fld_bitsize; /* size in bits */
|
|
struct type *fld_type; /* type of field */
|
|
char *fld_name; /* name of field */
|
|
};
|
|
|
|
/* structure for enumeration literals */
|
|
struct literal {
|
|
long lit_val; /* value of literal */
|
|
char *lit_name; /* name of literal */
|
|
};
|
|
|
|
/* structure for parameters */
|
|
struct param {
|
|
struct type *par_type; /* type of parameter */
|
|
char par_kind; /* kind of parameter ('p', 'i', or 'v') */
|
|
};
|
|
|
|
typedef struct type {
|
|
short ty_class;
|
|
#define T_SUBRANGE 1
|
|
#define T_ARRAY 2
|
|
#define T_STRUCT 3
|
|
#define T_UNION 4
|
|
#define T_ENUM 5
|
|
#define T_POINTER 6
|
|
#define T_FILE 7
|
|
#define T_PROCEDURE 8
|
|
#define T_SET 9
|
|
#define T_REAL 10
|
|
#define T_INTEGER 11
|
|
#define T_VOID 12
|
|
#define T_UNSIGNED 13
|
|
#define T_STRING 14 /* only for string constants ... */
|
|
#define T_INCOMPLETE 100
|
|
short ty_flags;
|
|
#define T_CROSS 0x0001
|
|
long ty_size;
|
|
struct symbol *ty_sym;
|
|
union {
|
|
/* cross references */
|
|
char *typ_tag;
|
|
#define ty_tag ty_v.typ_tag
|
|
/* procedures/functions: */
|
|
struct {
|
|
int typ_nparams;
|
|
struct type *typ_retval;
|
|
struct param *typ_params;
|
|
long typ_nbparams;
|
|
} ty_proc;
|
|
#define ty_nparams ty_v.ty_proc.typ_nparams
|
|
#define ty_retval ty_v.ty_proc.typ_retval
|
|
#define ty_params ty_v.ty_proc.typ_params
|
|
#define ty_nbparams ty_v.ty_proc.typ_nbparams
|
|
/* pointers, files: */
|
|
struct type *typ_ptrto;
|
|
#define ty_ptrto ty_v.typ_ptrto
|
|
#define ty_fileof ty_v.typ_ptrto
|
|
/* arrays: */
|
|
struct {
|
|
long typ_lb, typ_hb;
|
|
struct type *typ_index;
|
|
struct type *typ_elements;
|
|
} ty_array;
|
|
#define ty_lb ty_v.ty_array.typ_lb
|
|
#define ty_hb ty_v.ty_array.typ_hb
|
|
#define ty_index ty_v.ty_array.typ_index
|
|
#define ty_elements ty_v.ty_array.typ_elements
|
|
/* subranges: */
|
|
struct {
|
|
long typ_low, typ_up;
|
|
int typ_A;
|
|
struct type *typ_base;
|
|
} ty_subrange;
|
|
#define ty_A ty_v.ty_subrange.typ_A
|
|
#define ty_low ty_v.ty_subrange.typ_low
|
|
#define ty_up ty_v.ty_subrange.typ_up
|
|
#define ty_base ty_v.ty_subrange.typ_base
|
|
/* structures/unions: */
|
|
struct {
|
|
unsigned typ_nfields; /* number of field structures */
|
|
struct fields *typ_fields;
|
|
} ty_struct;
|
|
#define ty_nfields ty_v.ty_struct.typ_nfields
|
|
#define ty_fields ty_v.ty_struct.typ_fields
|
|
/* enumerations: */
|
|
struct {
|
|
unsigned typ_nenums; /* number of enumeration literals */
|
|
struct literal *typ_literals;
|
|
} ty_enum;
|
|
#define ty_nenums ty_v.ty_enum.typ_nenums
|
|
#define ty_literals ty_v.ty_enum.typ_literals
|
|
/* bit sets: */
|
|
struct {
|
|
struct type *typ_setbase; /* base type of set elements */
|
|
long typ_setlow; /* low bound */
|
|
} ty_set;
|
|
#define ty_setbase ty_v.ty_set.typ_setbase
|
|
#define ty_setlow ty_v.ty_set.typ_setlow
|
|
} ty_v;
|
|
} t_type, *p_type;
|
|
|
|
/* ALLOCDEF "type" 50 */
|
|
|
|
extern p_type
|
|
subrange_type(),
|
|
array_type(),
|
|
*tp_lookup();
|
|
extern long
|
|
param_size(),
|
|
compute_size();
|
|
|
|
extern p_type char_type, uchar_type, bool_type, int_type,
|
|
long_type, double_type, string_type;
|
|
extern p_type void_type, incomplete_type;
|
|
extern long int_size, pointer_size, long_size, double_size;
|
|
|