static ir_type *create_atomic_type(const atomic_type_t *type)
{
+ dbg_info *dbgi = get_dbg_info(&type->type.source_position);
ir_mode *mode = get_atomic_mode(type);
ident *id = get_mode_ident(mode);
- ir_type *irtype = new_type_primitive(id, mode);
+ ir_type *irtype = new_d_type_primitive(id, mode, dbgi);
if(type->akind == ATOMIC_TYPE_LONG_DOUBLE
|| type->akind == ATOMIC_TYPE_DOUBLE) {
ident *id = unique_ident("functiontype");
int n_parameters = count_parameters(function_type);
int n_results = return_type == type_void ? 0 : 1;
- ir_type *irtype = new_type_method(id, n_parameters, n_results);
+ dbg_info *dbgi = get_dbg_info(&function_type->type.source_position);
+ ir_type *irtype = new_d_type_method(id, n_parameters, n_results, dbgi);
if(return_type != type_void) {
ir_type *restype = get_ir_type(return_type);
* again (might be a struct). We therefore first create a void* pointer
* and then set the real points_to type
*/
- ir_type *ir_type = new_type_pointer(unique_ident("pointer"),
- ir_type_void, mode_P_data);
+ dbg_info *dbgi = get_dbg_info(&type->type.source_position);
+ ir_type *ir_type = new_d_type_pointer(unique_ident("pointer"),
+ ir_type_void, mode_P_data, dbgi);
type->type.firm_type = ir_type;
ir_points_to = get_ir_type(points_to);
ir_type *ir_element_type = get_ir_type(element_type);
ident *id = unique_ident("array");
- ir_type *ir_type = new_type_array(id, 1, ir_element_type);
+ dbg_info *dbgi = get_dbg_info(&type->type.source_position);
+ ir_type *ir_type = new_d_type_array(id, 1, ir_element_type, dbgi);
if(type->size != NULL) {
int n_elements = fold_constant(type->size);
char name[32];
snprintf(name, sizeof(name), "I%u", size);
ident *id = new_id_from_str(name);
- res = new_type_primitive(mangle_u(get_type_ident(base_tp), id), mode);
+ dbg_info *dbgi = get_dbg_info(&builtin_source_position);
+ res = new_d_type_primitive(mangle_u(get_type_ident(base_tp), id), mode, dbgi);
set_primitive_base_type(res, base_tp);
return res;
snprintf(name, sizeof(name), "U%u", size);
ident *id = new_id_from_str(name);
- res = new_type_primitive(mangle_u(get_type_ident(base_tp), id), mode);
+ dbg_info *dbgi = get_dbg_info(&builtin_source_position);
+ res = new_d_type_primitive(mangle_u(get_type_ident(base_tp), id), mode, dbgi);
set_primitive_base_type(res, base_tp);
return res;
} else {
id = unique_ident("__anonymous_struct");
}
- ir_type *irtype = new_type_struct(id);
+ dbg_info *dbgi = get_dbg_info(&type->type.source_position);
+ ir_type *irtype = new_d_type_struct(id, dbgi);
type->type.firm_type = irtype;
(unsigned char) bits_remainder);
add_struct_member(irtype, entity);
entry->declaration_kind = DECLARATION_KIND_COMPOUND_MEMBER;
+ assert(entry->v.entity == NULL);
entry->v.entity = entity;
}
}
} else {
id = unique_ident("__anonymous_union");
}
- ir_type *irtype = new_type_union(id);
+ dbg_info *dbgi = get_dbg_info(&type->type.source_position);
+ ir_type *irtype = new_d_type_union(id, dbgi);
type->type.firm_type = irtype;
const string_t *const value)
{
ir_type *const global_type = get_glob_type();
- ir_type *const type = new_type_array(unique_ident("strtype"), 1,
- ir_type_const_char);
+ dbg_info *const dbgi = get_dbg_info(src_pos);
+ ir_type *const type = new_d_type_array(unique_ident("strtype"), 1,
+ ir_type_const_char, dbgi);
ident *const id = unique_ident(id_prefix);
- dbg_info *const dbgi = get_dbg_info(src_pos);
ir_entity *const entity = new_d_entity(global_type, id, type, dbgi);
set_entity_ld_ident(entity, id);
set_entity_variability(entity, variability_constant);
{
ir_type *const global_type = get_glob_type();
ir_type *const elem_type = ir_type_wchar_t;
- ir_type *const type = new_type_array(unique_ident("strtype"), 1,
- elem_type);
+ dbg_info *const dbgi = get_dbg_info(&literal->base.source_position);
+ ir_type *const type = new_d_type_array(unique_ident("strtype"), 1,
+ elem_type, dbgi);
ident *const id = unique_ident("Lstr");
- dbg_info *const dbgi = get_dbg_info(&literal->base.source_position);
ir_entity *const entity = new_d_entity(global_type, id, type, dbgi);
set_entity_ld_ident(entity, id);
set_entity_variability(entity, variability_constant);
/* we need to construct a new method type matching the call
* arguments... */
int n_res = get_method_n_ress(ir_method_type);
- new_method_type = new_type_method(unique_ident("calltype"),
- n_parameters, n_res);
+ dbg_info *dbgi = get_dbg_info(&call->base.source_position);
+ new_method_type = new_d_type_method(unique_ident("calltype"),
+ n_parameters, n_res, dbgi);
set_method_calling_convention(new_method_type,
get_method_calling_convention(ir_method_type));
set_method_additional_properties(new_method_type,
* Allocate a type node of given kind and initialize all
* fields with zero.
*/
-static type_t *allocate_type_zero(type_kind_t kind)
+static type_t *allocate_type_zero(type_kind_t kind, source_position_t source_position)
{
size_t size = get_type_struct_size(kind);
type_t *res = obstack_alloc(type_obst, size);
memset(res, 0, size);
- res->base.kind = kind;
+ res->base.kind = kind;
+ res->base.source_position = source_position;
return res;
}
record_declaration(declaration);
- type_t *typedef_type = allocate_type_zero(TYPE_TYPEDEF);
+ type_t *typedef_type = allocate_type_zero(TYPE_TYPEDEF, builtin_source_position);
typedef_type->typedeft.declaration = declaration;
return typedef_type;
declaration->parent_scope = scope;
}
- type_t *const type = allocate_type_zero(TYPE_ENUM);
+ type_t *const type = allocate_type_zero(TYPE_ENUM, declaration->source_position);
type->enumt.declaration = declaration;
if(token.type == '{') {
expect(')');
- type_t *typeof_type = allocate_type_zero(TYPE_TYPEOF);
+ type_t *typeof_type = allocate_type_zero(TYPE_TYPEOF, expression->base.source_position);
typeof_type->typeoft.expression = expression;
typeof_type->typeoft.typeof_type = type;
static type_t *create_builtin_type(symbol_t *const symbol,
type_t *const real_type)
{
- type_t *type = allocate_type_zero(TYPE_BUILTIN);
+ type_t *type = allocate_type_zero(TYPE_BUILTIN, builtin_source_position);
type->builtin.symbol = symbol;
type->builtin.real_type = real_type;
|| declaration->storage_class != STORAGE_CLASS_TYPEDEF)
return NULL;
- type_t *type = allocate_type_zero(TYPE_TYPEDEF);
+ type_t *type = allocate_type_zero(TYPE_TYPEDEF, declaration->source_position);
type->typedeft.declaration = declaration;
return type;
/* TODO: if is_type_valid(type) for the following rules should issue
* an error */
case T_struct: {
- type = allocate_type_zero(TYPE_COMPOUND_STRUCT);
+ type = allocate_type_zero(TYPE_COMPOUND_STRUCT, HERE);
type->compound.declaration = parse_compound_type_specifier(true);
break;
}
case T_union: {
- type = allocate_type_zero(TYPE_COMPOUND_UNION);
+ type = allocate_type_zero(TYPE_COMPOUND_UNION, HERE);
type->compound.declaration = parse_compound_type_specifier(false);
break;
atomic_type = ATOMIC_TYPE_INVALID;
}
- type = allocate_type_zero(TYPE_ATOMIC);
+ type = allocate_type_zero(TYPE_ATOMIC, builtin_source_position);
type->atomic.akind = atomic_type;
newtype = 1;
} else {
CONSTRUCT_POINTER,
CONSTRUCT_FUNCTION,
CONSTRUCT_ARRAY
-} construct_type_type_t;
+} construct_type_kind_t;
typedef struct construct_type_t construct_type_t;
struct construct_type_t {
- construct_type_type_t type;
+ construct_type_kind_t kind;
construct_type_t *next;
};
parsed_pointer_t *pointer = obstack_alloc(&temp_obst, sizeof(pointer[0]));
memset(pointer, 0, sizeof(pointer[0]));
- pointer->construct_type.type = CONSTRUCT_POINTER;
+ pointer->construct_type.kind = CONSTRUCT_POINTER;
pointer->type_qualifiers = parse_type_qualifiers();
return (construct_type_t*) pointer;
parsed_array_t *array = obstack_alloc(&temp_obst, sizeof(array[0]));
memset(array, 0, sizeof(array[0]));
- array->construct_type.type = CONSTRUCT_ARRAY;
+ array->construct_type.kind = CONSTRUCT_ARRAY;
if(token.type == T_static) {
array->is_static = true;
{
eat('(');
- type_t *type = allocate_type_zero(TYPE_FUNCTION);
+ type_t *type = allocate_type_zero(TYPE_FUNCTION, declaration->source_position);
declaration_t *parameters = parse_parameters(&type->function);
if(declaration != NULL) {
construct_function_type_t *construct_function_type =
obstack_alloc(&temp_obst, sizeof(construct_function_type[0]));
memset(construct_function_type, 0, sizeof(construct_function_type[0]));
- construct_function_type->construct_type.type = CONSTRUCT_FUNCTION;
+ construct_function_type->construct_type.kind = CONSTRUCT_FUNCTION;
construct_function_type->function_type = type;
expect(')');
{
construct_type_t *iter = construct_list;
for( ; iter != NULL; iter = iter->next) {
- switch(iter->type) {
+ switch(iter->kind) {
case CONSTRUCT_INVALID:
panic("invalid type construction found");
case CONSTRUCT_FUNCTION: {
case CONSTRUCT_POINTER: {
parsed_pointer_t *parsed_pointer = (parsed_pointer_t*) iter;
- type_t *pointer_type = allocate_type_zero(TYPE_POINTER);
+ type_t *pointer_type = allocate_type_zero(TYPE_POINTER, (source_position_t){NULL, 0});
pointer_type->pointer.points_to = type;
pointer_type->base.qualifiers = parsed_pointer->type_qualifiers;
case CONSTRUCT_ARRAY: {
parsed_array_t *parsed_array = (parsed_array_t*) iter;
- type_t *array_type = allocate_type_zero(TYPE_ARRAY);
+ type_t *array_type = allocate_type_zero(TYPE_ARRAY, (source_position_t){NULL, 0});
array_type->base.qualifiers = parsed_array->type_qualifiers;
array_type->array.element_type = type;
if(hashed_type != type) {
/* the function type was constructed earlier freeing it here will
* destroy other types... */
- if(iter->type != CONSTRUCT_FUNCTION) {
+ if(iter->kind != CONSTRUCT_FUNCTION) {
free_type(type);
}
type = hashed_type;
environment_pop_to(top);
}
-static type_t *make_bitfield_type(type_t *base, expression_t *size)
+static type_t *make_bitfield_type(type_t *base, expression_t *size, source_position_t source_position)
{
- type_t *type = allocate_type_zero(TYPE_BITFIELD);
+ type_t *type = allocate_type_zero(TYPE_BITFIELD, source_position);
type->bitfield.base = base;
type->bitfield.size = size;
declaration_t *declaration;
if(token.type == ':') {
+ source_position_t source_position = HERE;
next_token();
type_t *base_type = specifiers->type;
base_type);
}
- type_t *type = make_bitfield_type(base_type, size);
+ type_t *type = make_bitfield_type(base_type, size, source_position);
declaration = allocate_declaration_zero();
declaration->namespc = NAMESPACE_NORMAL;
declaration->storage_class = STORAGE_CLASS_NONE;
- declaration->source_position = token.source_position;
+ declaration->source_position = source_position;
declaration->modifiers = specifiers->decl_modifiers;
declaration->type = type;
} else {
type_t *type = skip_typeref(orig_type);
if(token.type == ':') {
+ source_position_t source_position = HERE;
next_token();
expression_t *size = parse_constant_expression();
"integer type", orig_type);
}
- type_t *bitfield_type = make_bitfield_type(orig_type, size);
+ type_t *bitfield_type = make_bitfield_type(orig_type, size, source_position);
declaration->type = bitfield_type;
} else {
/* TODO we ignore arrays for now... what is missing is a check
static declaration_t *create_implicit_function(symbol_t *symbol,
const source_position_t source_position)
{
- type_t *ntype = allocate_type_zero(TYPE_FUNCTION);
+ type_t *ntype = allocate_type_zero(TYPE_FUNCTION, source_position);
ntype->function.return_type = type_int;
ntype->function.unspecified_parameters = true;
memset(parameter, 0, sizeof(parameter[0]));
parameter->type = argument_type;
- type_t *type = allocate_type_zero(TYPE_FUNCTION);
+ type_t *type = allocate_type_zero(TYPE_FUNCTION, builtin_source_position);
type->function.return_type = return_type;
type->function.parameters = parameter;