static ir_type *create_struct_type(compound_type_t *type)
{
- symbol_t *symbol = type->declaration->symbol;
+ declaration_t *declaration = type->declaration;
+ if(declaration->v.irtype != NULL) {
+ return declaration->v.irtype;
+ }
+
+ symbol_t *symbol = declaration->symbol;
ident *id;
if(symbol != NULL) {
id = unique_ident(symbol->string);
size_t align_all = 1;
size_t offset = 0;
size_t bit_offset = 0;
- declaration_t *entry = type->declaration->scope.declarations;
+ declaration_t *entry = declaration->scope.declarations;
for( ; entry != NULL; entry = entry->next) {
if(entry->namespc != NAMESPACE_NORMAL)
continue;
set_type_size_bytes(irtype, offset);
set_type_state(irtype, layout_fixed);
+ declaration->v.irtype = irtype;
+
return irtype;
}
static ir_type *create_union_type(compound_type_t *type)
{
declaration_t *declaration = type->declaration;
+ if(declaration->v.irtype != NULL) {
+ return declaration->v.irtype;
+ }
+
symbol_t *symbol = declaration->symbol;
ident *id;
if(symbol != NULL) {
add_union_member(irtype, entity);
set_entity_offset(entity, 0);
entry->declaration_kind = DECLARATION_KIND_COMPOUND_MEMBER;
+ assert(entry->v.entity == NULL);
entry->v.entity = entity;
if(entry_size > size) {
set_type_size_bytes(irtype, size);
set_type_state(irtype, layout_fixed);
+ declaration->v.irtype = irtype;
+
return irtype;
}