X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=type.c;h=efa9583432bc51537b7890d8eea59bf456061cf6;hb=f7f1fcc7021a3c622316b6415c16f83d0a64ae4a;hp=2626f1dca83715e251a33aa7abb3fc927ca1bac3;hpb=f894ab556ac1b28843b78f95de1ee399574408fd;p=cparser diff --git a/type.c b/type.c index 2626f1d..efa9583 100644 --- a/type.c +++ b/type.c @@ -152,6 +152,19 @@ atomic_type_properties_t atomic_type_properties[ATOMIC_TYPE_LAST+1] = { .flags = ATOMIC_TYPE_FLAG_INTEGER | ATOMIC_TYPE_FLAG_ARITHMETIC, .rank = 5, }, + [ATOMIC_TYPE_LONGLONG] = { + .size = 8, + .alignment = 8, + .flags = ATOMIC_TYPE_FLAG_INTEGER | ATOMIC_TYPE_FLAG_ARITHMETIC + | ATOMIC_TYPE_FLAG_SIGNED, + .rank = 6, + }, + [ATOMIC_TYPE_ULONGLONG] = { + .size = 8, + .alignment = 8, + .flags = ATOMIC_TYPE_FLAG_INTEGER | ATOMIC_TYPE_FLAG_ARITHMETIC, + .rank = 6, + }, [ATOMIC_TYPE_FLOAT] = { .size = 4, .alignment = 4, @@ -208,15 +221,11 @@ void init_types(unsigned machine_size) pointer_properties.alignment = long_size; pointer_properties.struct_alignment = long_size; - props[ATOMIC_TYPE_LONGLONG] = props[ATOMIC_TYPE_LONG]; - props[ATOMIC_TYPE_ULONGLONG] = props[ATOMIC_TYPE_ULONG]; props[ATOMIC_TYPE_LONG_DOUBLE] = props[ATOMIC_TYPE_DOUBLE]; props[ATOMIC_TYPE_WCHAR_T] = props[ATOMIC_TYPE_INT]; /* set struct alignments to the same value as alignment */ - for (size_t i = 0; - i < sizeof(atomic_type_properties)/sizeof(atomic_type_properties[0]); - ++i) { + for (size_t i = 0; i != lengthof(atomic_type_properties); ++i) { props[i].struct_alignment = props[i].alignment; } } @@ -1257,6 +1266,7 @@ unsigned get_type_alignment(type_t *type) unsigned get_type_alignment_compound(type_t *type) { + assert(!is_typeref(type)); if (type->kind == TYPE_ATOMIC) return atomic_type_properties[type->atomic.akind].struct_alignment; return get_type_alignment(type); @@ -1538,7 +1548,7 @@ static entity_t *pack_bitfield_members(il_size_t *struct_offset, if (!member->compound_member.bitfield) break; - type_t *base_type = member->declaration.type; + type_t *const base_type = skip_typeref(member->declaration.type); il_alignment_t base_alignment = get_type_alignment_compound(base_type); il_alignment_t alignment_mask = base_alignment-1; if (base_alignment > alignment) @@ -1600,9 +1610,8 @@ void layout_struct_type(compound_type_t *type) continue; } - type_t *m_type = entry->declaration.type; - type_t *skipped = skip_typeref(m_type); - if (! is_type_valid(skipped)) { + type_t *const m_type = skip_typeref(entry->declaration.type); + if (!is_type_valid(m_type)) { entry = entry->base.next; continue; } @@ -1668,7 +1677,7 @@ void layout_union_type(compound_type_t *type) if (entry->kind != ENTITY_COMPOUND_MEMBER) continue; - type_t *m_type = entry->declaration.type; + type_t *m_type = skip_typeref(entry->declaration.type); if (! is_type_valid(skip_typeref(m_type))) continue; @@ -1695,7 +1704,7 @@ function_parameter_t *allocate_parameter(type_t *const type) } type_t *make_function_2_type(type_t *return_type, type_t *argument_type1, - type_t *argument_type2) + type_t *argument_type2, decl_modifiers_t modifiers) { function_parameter_t *const parameter2 = allocate_parameter(argument_type2); function_parameter_t *const parameter1 = allocate_parameter(argument_type1); @@ -1704,25 +1713,29 @@ type_t *make_function_2_type(type_t *return_type, type_t *argument_type1, type_t *type = allocate_type_zero(TYPE_FUNCTION); type->function.return_type = return_type; type->function.parameters = parameter1; + type->function.modifiers |= modifiers; type->function.linkage = LINKAGE_C; return identify_new_type(type); } -type_t *make_function_1_type(type_t *return_type, type_t *argument_type) +type_t *make_function_1_type(type_t *return_type, type_t *argument_type, + decl_modifiers_t modifiers) { function_parameter_t *const parameter = allocate_parameter(argument_type); type_t *type = allocate_type_zero(TYPE_FUNCTION); type->function.return_type = return_type; type->function.parameters = parameter; + type->function.modifiers |= modifiers; type->function.linkage = LINKAGE_C; return identify_new_type(type); } type_t *make_function_1_type_variadic(type_t *return_type, - type_t *argument_type) + type_t *argument_type, + decl_modifiers_t modifiers) { function_parameter_t *const parameter = allocate_parameter(argument_type); @@ -1730,16 +1743,18 @@ type_t *make_function_1_type_variadic(type_t *return_type, type->function.return_type = return_type; type->function.parameters = parameter; type->function.variadic = true; + type->function.modifiers |= modifiers; type->function.linkage = LINKAGE_C; return identify_new_type(type); } -type_t *make_function_0_type(type_t *return_type) +type_t *make_function_0_type(type_t *return_type, decl_modifiers_t modifiers) { type_t *type = allocate_type_zero(TYPE_FUNCTION); type->function.return_type = return_type; type->function.parameters = NULL; + type->function.modifiers |= modifiers; type->function.linkage = LINKAGE_C; return identify_new_type(type);