#include "symbol_t.h"
#include "type_hash.h"
#include "adt/error.h"
+#include "adt/util.h"
#include "lang_features.h"
static struct obstack _type_obst;
} else {
entity_t *parameter = parameters->entities;
for (; parameter != NULL; parameter = parameter->base.next) {
+ if (parameter->kind != ENTITY_PARAMETER)
+ continue;
+
if (first) {
first = false;
} else {
fputs(", ", out);
}
- assert(is_declaration(parameter));
const type_t *const type = parameter->declaration.type;
if (type == NULL) {
fputs(parameter->base.symbol->string, out);
type_t *copy = obstack_alloc(type_obst, size);
memcpy(copy, type, size);
+ copy->base.firm_type = NULL;
return copy;
}
type_t *unqualified_type = duplicate_type(type);
unqualified_type->base.qualifiers = TYPE_QUALIFIER_NONE;
- type_t *result = typehash_insert(unqualified_type);
- if (result != unqualified_type) {
- obstack_free(type_obst, unqualified_type);
- }
-
- return result;
+ return identify_new_type(unqualified_type);
}
type_t *get_qualified_type(type_t *orig_type, type_qualifiers_t const qual)
return type;
}
- type = typehash_insert(copy);
- if (type != copy)
- obstack_free(type_obst, copy);
-
- return type;
+ return identify_new_type(copy);
}
/**
{
type_qualifiers_t qualifiers = TYPE_QUALIFIER_NONE;
type_modifiers_t modifiers = TYPE_MODIFIER_NONE;
+ il_alignment_t alignment = 0;
while (true) {
+ if (alignment < type->base.alignment)
+ alignment = type->base.alignment;
+
switch (type->kind) {
case TYPE_ERROR:
return type;
case TYPE_TYPEDEF: {
qualifiers |= type->base.qualifiers;
modifiers |= type->base.modifiers;
+
const typedef_type_t *typedef_type = &type->typedeft;
if (typedef_type->resolved_type != NULL) {
type = typedef_type->resolved_type;
type = typedef_type->typedefe->type;
continue;
}
- case TYPE_TYPEOF: {
- const typeof_type_t *typeof_type = &type->typeoft;
- if (typeof_type->typeof_type != NULL) {
- type = typeof_type->typeof_type;
- } else {
- type = typeof_type->expression->base.type;
- }
+ case TYPE_TYPEOF:
+ qualifiers |= type->base.qualifiers;
+ modifiers |= type->base.modifiers;
+ type = type->typeoft.typeof_type;
continue;
- }
default:
break;
}
break;
}
- if (qualifiers != TYPE_QUALIFIER_NONE || modifiers != TYPE_MODIFIER_NONE) {
+ if (qualifiers != TYPE_QUALIFIER_NONE ||
+ modifiers != TYPE_MODIFIER_NONE ||
+ alignment > type->base.alignment) {
type_t *const copy = duplicate_type(type);
/* for const with typedefed array type the element type has to be
element_type = duplicate_type(element_type);
element_type->base.qualifiers |= qualifiers;
element_type->base.modifiers |= modifiers;
+ element_type->base.alignment = alignment;
copy->array.element_type = element_type;
} else {
copy->base.qualifiers |= qualifiers;
copy->base.modifiers |= modifiers;
+ copy->base.alignment = alignment;
}
- type = typehash_insert(copy);
- if (type != copy) {
- obstack_free(type_obst, copy);
- }
+ type = identify_new_type(copy);
}
return type;
}
-type_qualifiers_t get_type_qualifier(const type_t *type, bool skip_array_type) {
+type_qualifiers_t get_type_qualifier(const type_t *type, bool skip_array_type)
+{
type_qualifiers_t qualifiers = TYPE_QUALIFIER_NONE;
while (true) {
else
type = typedef_type->typedefe->type;
continue;
- case TYPE_TYPEOF: {
- const typeof_type_t *typeof_type = &type->typeoft;
- if (typeof_type->typeof_type != NULL) {
- type = typeof_type->typeof_type;
- } else {
- type = typeof_type->expression->base.type;
- }
+ case TYPE_TYPEOF:
+ type = type->typeoft.typeof_type;
continue;
- }
case TYPE_ARRAY:
if (skip_array_type) {
type = type->array.element_type;
/**
* Find the atomic type kind representing a given size (signed).
*/
-atomic_type_kind_t find_signed_int_atomic_type_kind_for_size(unsigned size) {
+atomic_type_kind_t find_signed_int_atomic_type_kind_for_size(unsigned size)
+{
static atomic_type_kind_t kinds[32];
assert(size < 32);
ATOMIC_TYPE_LONG,
ATOMIC_TYPE_LONGLONG
};
- for(unsigned i = 0; i < sizeof(possible_kinds)/sizeof(possible_kinds[0]); ++i) {
+ for (size_t i = 0; i < lengthof(possible_kinds); ++i) {
if (get_atomic_type_size(possible_kinds[i]) == size) {
kind = possible_kinds[i];
break;
/**
* Find the atomic type kind representing a given size (signed).
*/
-atomic_type_kind_t find_unsigned_int_atomic_type_kind_for_size(unsigned size) {
+atomic_type_kind_t find_unsigned_int_atomic_type_kind_for_size(unsigned size)
+{
static atomic_type_kind_t kinds[32];
assert(size < 32);
ATOMIC_TYPE_ULONG,
ATOMIC_TYPE_ULONGLONG
};
- for(unsigned i = 0; i < sizeof(possible_kinds)/sizeof(possible_kinds[0]); ++i) {
+ for (size_t i = 0; i < lengthof(possible_kinds); ++i) {
if (get_atomic_type_size(possible_kinds[i]) == size) {
kind = possible_kinds[i];
break;
* Hash the given type and return the "singleton" version
* of it.
*/
-static type_t *identify_new_type(type_t *type)
+type_t *identify_new_type(type_t *type)
{
type_t *result = typehash_insert(type);
if (result != type) {