2 * Symbol lookup and handling.
4 * Copyright (C) 2003 Transmeta Corp.
7 * Licensed under the Open Software License version 1.1
19 #include "expression.h"
24 * Secondary symbol list for stuff that needs to be output because it
27 struct symbol_list
*used_list
= NULL
;
30 * If the symbol is an inline symbol, add it to the list of symbols to parse
32 void access_symbol(struct symbol
*sym
)
34 if (sym
->ctype
.modifiers
& MOD_INLINE
) {
35 if (!(sym
->ctype
.modifiers
& MOD_ACCESSED
)) {
36 add_symbol(&used_list
, sym
);
37 sym
->ctype
.modifiers
|= MOD_ACCESSED
;
42 struct symbol
*lookup_symbol(struct ident
*ident
, enum namespace ns
)
46 for (sym
= ident
->symbols
; sym
; sym
= sym
->next_id
) {
47 if (sym
->namespace & ns
) {
55 struct symbol
*alloc_symbol(struct position pos
, int type
)
57 struct symbol
*sym
= __alloc_symbol(0);
63 struct struct_union_info
{
64 unsigned long max_align
;
65 unsigned long bit_size
;
69 * Unions are easy to lay out ;)
71 static void lay_out_union(struct symbol
*sym
, void *_info
, int flags
)
73 struct struct_union_info
*info
= _info
;
75 examine_symbol_type(sym
);
76 if (sym
->ctype
.alignment
> info
->max_align
)
77 info
->max_align
= sym
->ctype
.alignment
;
78 if (sym
->bit_size
> info
->bit_size
)
79 info
->bit_size
= sym
->bit_size
;
85 * Structures are a bit more interesting to lay out
87 static void lay_out_struct(struct symbol
*sym
, void *_info
, int flags
)
89 struct struct_union_info
*info
= _info
;
90 unsigned long bit_size
, base_size
;
91 unsigned long align_bit_mask
;
93 examine_symbol_type(sym
);
94 if (sym
->ctype
.alignment
> info
->max_align
)
95 info
->max_align
= sym
->ctype
.alignment
;
97 bit_size
= info
->bit_size
;
98 base_size
= sym
->bit_size
;
99 align_bit_mask
= (sym
->ctype
.alignment
<< 3) - 1;
102 * Bitfields have some very special rules..
104 if (sym
->fieldwidth
) {
105 unsigned long bit_offset
= bit_size
& align_bit_mask
;
107 if (bit_offset
+ sym
->fieldwidth
> base_size
) {
108 bit_size
= (bit_size
+ align_bit_mask
) & ~align_bit_mask
;
111 sym
->offset
= (bit_size
- bit_offset
) >> 3;
112 sym
->bit_offset
= bit_offset
;
113 info
->bit_size
= bit_size
+ sym
->fieldwidth
;
118 * Otherwise, just align it right and add it up..
120 bit_size
= (bit_size
+ align_bit_mask
) & ~align_bit_mask
;
121 sym
->offset
= bit_size
>> 3;
123 info
->bit_size
= bit_size
+ sym
->bit_size
;
126 static void examine_struct_union_type(struct symbol
*sym
, int advance
)
128 struct struct_union_info info
= { 1, 0 };
129 unsigned long bit_size
, bit_align
;
130 void (*fn
)(struct symbol
*, void *, int);
132 fn
= advance
? lay_out_struct
: lay_out_union
;
133 symbol_iterate(sym
->symbol_list
, fn
, &info
);
135 if (!sym
->ctype
.alignment
)
136 sym
->ctype
.alignment
= info
.max_align
;
137 bit_size
= info
.bit_size
;
138 bit_align
= (sym
->ctype
.alignment
<< 3)-1;
139 bit_size
= (bit_size
+ bit_align
) & ~bit_align
;
140 sym
->bit_size
= bit_size
;
143 static void examine_array_type(struct symbol
*sym
)
145 struct symbol
*base_type
= sym
->ctype
.base_type
;
146 unsigned long bit_size
, alignment
;
150 examine_symbol_type(base_type
);
151 bit_size
= base_type
->bit_size
* get_expression_value(sym
->array_size
);
152 if (!sym
->array_size
)
154 alignment
= base_type
->ctype
.alignment
;
155 if (!sym
->ctype
.alignment
)
156 sym
->ctype
.alignment
= alignment
;
157 sym
->bit_size
= bit_size
;
160 static void examine_bitfield_type(struct symbol
*sym
)
162 struct symbol
*base_type
= sym
->ctype
.base_type
;
163 unsigned long bit_size
, alignment
;
167 examine_symbol_type(base_type
);
168 bit_size
= base_type
->bit_size
;
169 if (sym
->fieldwidth
> bit_size
) {
170 warn(sym
->pos
, "impossible field-width for this type");
171 sym
->fieldwidth
= bit_size
;
173 alignment
= base_type
->ctype
.alignment
;
174 if (!sym
->ctype
.alignment
)
175 sym
->ctype
.alignment
= alignment
;
176 sym
->bit_size
= bit_size
;
180 * "typeof" will have to merge the types together
182 void merge_type(struct symbol
*sym
, struct symbol
*base_type
)
184 sym
->ctype
.as
|= base_type
->ctype
.as
;
185 sym
->ctype
.modifiers
|= (base_type
->ctype
.modifiers
& ~MOD_STORAGE
);
186 sym
->ctype
.context
|= base_type
->ctype
.context
;
187 sym
->ctype
.contextmask
|= base_type
->ctype
.contextmask
;
188 sym
->ctype
.base_type
= base_type
->ctype
.base_type
;
192 * Fill in type size and alignment information for
193 * regular SYM_TYPE things.
195 struct symbol
*examine_symbol_type(struct symbol
* sym
)
197 unsigned int bit_size
, alignment
;
198 struct symbol
*base_type
;
199 unsigned long modifiers
;
210 examine_array_type(sym
);
213 examine_struct_union_type(sym
, 1);
216 examine_struct_union_type(sym
, 0);
220 sym
->bit_size
= bits_in_pointer
;
221 if (!sym
->ctype
.alignment
)
222 sym
->ctype
.alignment
= pointer_alignment
;
223 base_type
= sym
->ctype
.base_type
;
224 base_type
= examine_symbol_type(base_type
);
225 if (base_type
&& base_type
->type
== SYM_NODE
)
226 merge_type(sym
, base_type
);
230 sym
->bit_size
= bits_in_enum
;
231 if (!sym
->ctype
.alignment
)
232 sym
->ctype
.alignment
= enum_alignment
;
235 examine_bitfield_type(sym
);
238 /* Size and alignment had better already be set up */
241 struct symbol
*base
= evaluate_expression(sym
->initializer
);
250 /* SYM_NODE - figure out what the type of the node was.. */
251 base_type
= sym
->ctype
.base_type
;
252 modifiers
= sym
->ctype
.modifiers
;
255 base_type
= examine_symbol_type(base_type
);
256 sym
->ctype
.base_type
= base_type
;
257 if (base_type
&& base_type
->type
== SYM_NODE
)
258 merge_type(sym
, base_type
);
260 bit_size
= base_type
->bit_size
;
261 alignment
= base_type
->ctype
.alignment
;
262 if (base_type
->fieldwidth
)
263 sym
->fieldwidth
= base_type
->fieldwidth
;
267 if (!sym
->ctype
.alignment
)
268 sym
->ctype
.alignment
= alignment
;
269 sym
->bit_size
= bit_size
;
273 void check_declaration(struct symbol
*sym
)
275 struct symbol
*next
= sym
;
277 while ((next
= next
->next_id
) != NULL
) {
278 if (next
->namespace != sym
->namespace)
280 if (sym
->scope
== next
->scope
) {
281 sym
->same_symbol
= next
;
284 if (sym
->ctype
.modifiers
& next
->ctype
.modifiers
& MOD_EXTERN
) {
285 sym
->same_symbol
= next
;
289 // This may make sense from a warning standpoint:
290 // consider top-level symbols to clash with everything
291 // (but the scoping rules will mean that we actually
292 // _use_ the innermost version)
293 if (toplevel(next
->scope
)) {
294 sym
->same_symbol
= next
;
301 void bind_symbol(struct symbol
*sym
, struct ident
*ident
, enum namespace ns
)
305 warn(sym
->pos
, "internal error: symbol type already bound");
309 sym
->next_id
= ident
->symbols
;
310 ident
->symbols
= sym
;
311 sym
->id_list
= &ident
->symbols
;
314 if (ns
!= NS_TYPEDEF
&& toplevel(scope
)) {
315 sym
->ctype
.modifiers
|= MOD_TOPLEVEL
| MOD_ADDRESSABLE
;
316 if (sym
->ctype
.modifiers
& MOD_STATIC
)
320 scope
= function_scope
;
321 bind_scope(sym
, scope
);
324 static struct symbol
*create_symbol(int stream
, const char *name
, int type
, int namespace)
326 struct token
*token
= built_in_token(stream
, name
);
327 struct symbol
*sym
= alloc_symbol(token
->pos
, type
);
329 sym
->ident
= token
->ident
;
330 bind_symbol(sym
, token
->ident
, namespace);
334 static int evaluate_constant_p(struct expression
*expr
)
336 expr
->ctype
= &int_ctype
;
340 static void expand_constant_p(struct expression
*expr
)
342 struct expression
*arg
;
343 struct expression_list
*arglist
= expr
->args
;
346 FOR_EACH_PTR (arglist
, arg
) {
347 if (arg
->type
!= EXPR_VALUE
)
351 expr
->type
= EXPR_VALUE
;
356 * Type and storage class keywords need to have the symbols
357 * created for them, so that the parser can have enough semantic
358 * information to do parsing.
360 * "double" == "long float", "long double" == "long long float"
364 struct symbol
*base_type
;
365 unsigned int modifiers
;
366 struct symbol_op
*op
;
367 } symbol_init_table
[] = {
369 { "auto", NULL
, MOD_AUTO
},
370 { "register", NULL
, MOD_REGISTER
},
371 { "static", NULL
, MOD_STATIC
},
372 { "extern", NULL
, MOD_EXTERN
},
374 /* Type specifiers */
375 { "void", &void_ctype
, 0 },
376 { "char", NULL
, MOD_CHAR
},
377 { "short", NULL
, MOD_SHORT
},
378 { "int", &int_type
, 0 },
379 { "long", NULL
, MOD_LONG
},
380 { "float", &fp_type
, 0 },
381 { "double", &fp_type
, MOD_LONG
},
382 { "signed", NULL
, MOD_SIGNED
},
383 { "__signed", NULL
, MOD_SIGNED
},
384 { "__signed__", NULL
, MOD_SIGNED
},
385 { "unsigned", NULL
, MOD_UNSIGNED
},
386 { "__label__", &label_type
, MOD_LABEL
| MOD_UNSIGNED
},
388 /* Type qualifiers */
389 { "const", NULL
, MOD_CONST
},
390 { "__const", NULL
, MOD_CONST
},
391 { "__const__", NULL
, MOD_CONST
},
392 { "volatile", NULL
, MOD_VOLATILE
},
393 { "__volatile", NULL
, MOD_VOLATILE
},
394 { "__volatile__", NULL
, MOD_VOLATILE
},
396 /* Predeclared types */
397 { "__builtin_va_list", &int_type
, 0 },
400 { "typedef", NULL
, MOD_TYPEDEF
},
403 { "typeof", NULL
, MOD_TYPEOF
},
404 { "__typeof", NULL
, MOD_TYPEOF
},
405 { "__typeof__", NULL
, MOD_TYPEOF
},
408 { "attribute", NULL
, MOD_ATTRIBUTE
},
410 { "__attribute", NULL
, MOD_ATTRIBUTE
},
411 { "__attribute__", NULL
, MOD_ATTRIBUTE
},
413 { "struct", NULL
, MOD_STRUCTOF
},
414 { "union", NULL
, MOD_UNIONOF
},
415 { "enum", NULL
, MOD_ENUMOF
},
417 { "inline", NULL
, MOD_INLINE
},
418 { "__inline", NULL
, MOD_INLINE
},
419 { "__inline__", NULL
, MOD_INLINE
},
421 /* Ignored for now.. */
422 { "restrict", NULL
, 0 },
423 { "__restrict", NULL
, 0 },
428 struct symbol_op constant_p_op
= {
429 .evaluate
= evaluate_constant_p
,
430 .expand
= expand_constant_p
436 static struct symbol builtin_fn_type
= { .type
= SYM_FN
};
437 struct sym_init eval_init_table
[] = {
438 { "__builtin_constant_p", &builtin_fn_type
, MOD_TOPLEVEL
, &constant_p_op
},
447 struct symbol int_type
,
454 * C types (ie actual instances that the abstract types
457 struct symbol bool_ctype
, void_ctype
, type_ctype
,
458 char_ctype
, uchar_ctype
,
459 short_ctype
, ushort_ctype
,
460 int_ctype
, uint_ctype
,
461 long_ctype
, ulong_ctype
,
462 llong_ctype
, ullong_ctype
,
463 float_ctype
, double_ctype
, ldouble_ctype
,
464 string_ctype
, ptr_ctype
, label_ctype
;
466 struct ctype_declare
{
468 unsigned long modifiers
;
471 struct symbol
*base_type
;
472 } ctype_declaration
[] = {
473 { &bool_ctype
, 0, &bits_in_int
, &max_int_alignment
, &int_type
},
474 { &void_ctype
, 0, NULL
, NULL
, NULL
},
475 { &type_ctype
, MOD_TYPE
, NULL
, NULL
, NULL
},
476 { &label_ctype
, MOD_LABEL
| MOD_UNSIGNED
, &bits_in_pointer
, &max_int_alignment
, &label_type
},
478 { &char_ctype
, MOD_SIGNED
| MOD_CHAR
, &bits_in_char
, &max_int_alignment
, &int_type
},
479 { &uchar_ctype
, MOD_UNSIGNED
| MOD_CHAR
, &bits_in_char
, &max_int_alignment
, &int_type
},
480 { &short_ctype
, MOD_SIGNED
| MOD_SHORT
, &bits_in_short
, &max_int_alignment
, &int_type
},
481 { &ushort_ctype
, MOD_UNSIGNED
| MOD_SHORT
, &bits_in_short
, &max_int_alignment
, &int_type
},
482 { &int_ctype
, MOD_SIGNED
, &bits_in_int
, &max_int_alignment
, &int_type
},
483 { &uint_ctype
, MOD_UNSIGNED
, &bits_in_int
, &max_int_alignment
, &int_type
},
484 { &long_ctype
, MOD_SIGNED
| MOD_LONG
, &bits_in_long
, &max_int_alignment
, &int_type
},
485 { &ulong_ctype
, MOD_UNSIGNED
| MOD_LONG
, &bits_in_long
, &max_int_alignment
, &int_type
},
486 { &llong_ctype
, MOD_SIGNED
| MOD_LONG
| MOD_LONGLONG
, &bits_in_longlong
, &max_int_alignment
, &int_type
},
487 { &ullong_ctype
, MOD_UNSIGNED
| MOD_LONG
| MOD_LONGLONG
, &bits_in_longlong
, &max_int_alignment
, &int_type
},
489 { &float_ctype
, 0, &bits_in_float
, &max_fp_alignment
, &fp_type
},
490 { &double_ctype
, MOD_LONG
, &bits_in_double
, &max_fp_alignment
, &fp_type
},
491 { &ldouble_ctype
,MOD_LONG
| MOD_LONGLONG
, &bits_in_longdouble
, &max_fp_alignment
, &fp_type
},
493 { &string_ctype
, 0, &bits_in_pointer
, &pointer_alignment
, &char_ctype
},
494 { &ptr_ctype
, 0, &bits_in_pointer
, &pointer_alignment
, &void_ctype
},
499 #define __INIT_IDENT(str) { .len = sizeof(str)-1, .name = str }
500 #define __IDENT(n,str) \
501 struct ident n ## _ident = __INIT_IDENT(str)
502 #define IDENT(n) __IDENT(n, #n)
504 IDENT(struct); IDENT(union); IDENT(enum);
506 IDENT(alignof
); IDENT(__alignof
); IDENT(__alignof__
);
507 IDENT(if); IDENT(else); IDENT(return);
508 IDENT(switch); IDENT(case); IDENT(default);
509 IDENT(break); IDENT(continue);
510 IDENT(for); IDENT(while); IDENT(do); IDENT(goto);
512 IDENT(__asm__
); IDENT(__asm
); IDENT(asm);
513 IDENT(__volatile__
); IDENT(__volatile
); IDENT(volatile);
514 IDENT(__attribute__
); IDENT(__attribute
);
517 __IDENT(pragma
, "__pragma__");
519 struct ident __VA_ARGS___ident
= __INIT_IDENT("__VA_ARGS__");
520 struct ident __LINE___ident
= __INIT_IDENT("__LINE__");
521 struct ident __FILE___ident
= __INIT_IDENT("__FILE__");
523 void init_symbols(void)
525 int stream
= init_stream("builtin", -1);
526 struct sym_init
*ptr
;
528 hash_ident(&sizeof_ident
);
529 hash_ident(&alignof_ident
);
530 hash_ident(&__alignof_ident
);
531 hash_ident(&__alignof___ident
);
532 hash_ident(&if_ident
);
533 hash_ident(&else_ident
);
534 hash_ident(&return_ident
);
535 hash_ident(&switch_ident
);
536 hash_ident(&case_ident
);
537 hash_ident(&default_ident
);
538 hash_ident(&break_ident
);
539 hash_ident(&continue_ident
);
540 hash_ident(&for_ident
);
541 hash_ident(&while_ident
);
542 hash_ident(&do_ident
);
543 hash_ident(&goto_ident
);
544 hash_ident(&__attribute___ident
);
545 hash_ident(&__attribute_ident
);
546 hash_ident(&__asm___ident
);
547 hash_ident(&__asm_ident
);
548 hash_ident(&asm_ident
);
549 hash_ident(&__volatile___ident
);
550 hash_ident(&__volatile_ident
);
551 hash_ident(&volatile_ident
);
552 hash_ident(&defined_ident
);
553 hash_ident(&__LINE___ident
);
554 hash_ident(&__FILE___ident
);
555 hash_ident(&__VA_ARGS___ident
);
556 hash_ident(&pragma_ident
);
557 for (ptr
= symbol_init_table
; ptr
->name
; ptr
++) {
559 sym
= create_symbol(stream
, ptr
->name
, SYM_NODE
, NS_TYPEDEF
);
560 sym
->ctype
.base_type
= ptr
->base_type
;
561 sym
->ctype
.modifiers
= ptr
->modifiers
;
564 builtin_fn_type
.variadic
= 1;
565 for (ptr
= eval_init_table
; ptr
->name
; ptr
++) {
567 sym
= create_symbol(stream
, ptr
->name
, SYM_NODE
, NS_SYMBOL
);
568 sym
->ctype
.base_type
= ptr
->base_type
;
569 sym
->ctype
.modifiers
= ptr
->modifiers
;
574 void init_ctype(void)
576 struct ctype_declare
*ctype
;
578 ptr_ctype
.type
= SYM_PTR
;
579 string_ctype
.type
= SYM_PTR
;
580 for (ctype
= ctype_declaration
; ctype
->ptr
; ctype
++) {
581 struct symbol
*sym
= ctype
->ptr
;
582 unsigned long bit_size
= ctype
->bit_size
? *ctype
->bit_size
: -1;
583 unsigned long maxalign
= ctype
->maxalign
? *ctype
->maxalign
: 0;
584 unsigned long alignment
= bit_size
>> 3;
586 if (alignment
> maxalign
)
587 alignment
= maxalign
;
588 sym
->bit_size
= bit_size
;
589 sym
->ctype
.alignment
= alignment
;
590 sym
->ctype
.base_type
= ctype
->base_type
;
591 sym
->ctype
.modifiers
= ctype
->modifiers
;