.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,
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;
}
}
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);
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)
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;
}
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;
}
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);
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);
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);