X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Ftr%2Ftype.c;h=78e03d12586db31c39549560c1340a591f1cdad5;hb=2158510961e84fb11e9195c200335f2314e49055;hp=91b52eb0c42ccf1d80d9013ae408a1c6db307e07;hpb=68a65bfe250e14635879932179477d038e04fbe4;p=libfirm diff --git a/ir/tr/type.c b/ir/tr/type.c index 91b52eb0c..78e03d125 100644 --- a/ir/tr/type.c +++ b/ir/tr/type.c @@ -76,7 +76,8 @@ ir_type *get_code_type(void) } ir_type *firm_unknown_type; -ir_type *get_unknown_type(void) { +ir_type *get_unknown_type(void) +{ return firm_unknown_type; } @@ -144,7 +145,7 @@ ir_type *new_type(const tp_op *type_op, ir_mode *mode, type_dbg_info *db) res->kind = k_type; res->type_op = type_op; res->mode = mode; - res->visibility = visibility_external_allocated; + res->visibility = ir_visibility_external; res->flags = tf_none; res->size = 0; res->align = 0; @@ -365,7 +366,6 @@ void set_type_state(ir_type *tp, ir_type_state state) case tpo_struct: for (i = 0; i < get_struct_n_members(tp); i++) { assert(get_entity_offset(get_struct_member(tp, i)) > -1); - assert((get_entity_allocation(get_struct_member(tp, i)) == allocation_automatic)); } break; case tpo_union: @@ -561,7 +561,7 @@ int equal_type(ir_type *typ1, ir_type *typ2) return 0; if (!equal_type(get_array_element_type(typ1), get_array_element_type(typ2))) return 0; - for(i = 0; i < get_array_n_dimensions(typ1); i++) { + for (i = 0; i < get_array_n_dimensions(typ1); i++) { if (get_array_lower_bound(typ1, i) != get_array_lower_bound(typ2, i) || get_array_upper_bound(typ1, i) != get_array_upper_bound(typ2, i)) return 0; @@ -597,7 +597,7 @@ int smaller_type(ir_type *st, ir_type *lt) if (get_type_tpop_code(st) != get_type_tpop_code(lt)) return 0; - switch(get_type_tpop_code(st)) { + switch (get_type_tpop_code(st)) { case tpo_class: return is_SubClass_of(st, lt); @@ -692,12 +692,12 @@ int smaller_type(ir_type *st, ir_type *lt) get_type_size_bytes(set) != get_type_size_bytes(let)) return 0; } - for(i = 0; i < get_array_n_dimensions(st); i++) { + for (i = 0; i < get_array_n_dimensions(st); i++) { if (get_array_lower_bound(lt, i)) - if(get_array_lower_bound(st, i) != get_array_lower_bound(lt, i)) + if (get_array_lower_bound(st, i) != get_array_lower_bound(lt, i)) return 0; if (get_array_upper_bound(lt, i)) - if(get_array_upper_bound(st, i) != get_array_upper_bound(lt, i)) + if (get_array_upper_bound(st, i) != get_array_upper_bound(lt, i)) return 0; } } break; @@ -952,7 +952,7 @@ void remove_class_supertype(ir_type *clss, ir_type *supertype) assert(clss && (clss->type_op == type_class)); for (i = 0; i < (ARR_LEN(clss->attr.ca.supertypes)); i++) if (clss->attr.ca.supertypes[i] == supertype) { - for(; i < (ARR_LEN(clss->attr.ca.supertypes))-1; i++) + for (; i < (ARR_LEN(clss->attr.ca.supertypes))-1; i++) clss->attr.ca.supertypes[i] = clss->attr.ca.supertypes[i+1]; ARR_SETLEN(ir_entity*, clss->attr.ca.supertypes, ARR_LEN(clss->attr.ca.supertypes) - 1); break; @@ -971,18 +971,6 @@ void set_class_type_info(ir_type *clss, ir_entity *ent) ent->repr_class = clss; } -const char *get_peculiarity_name(ir_peculiarity p) -{ -#define X(a) case a: return #a - switch (p) { - X(peculiarity_description); - X(peculiarity_inherited); - X(peculiarity_existent); - } -#undef X - return "invalid peculiarity"; -} - ir_peculiarity get_class_peculiarity(const ir_type *clss) { assert(clss && (clss->type_op == type_class)); @@ -1059,7 +1047,8 @@ void set_class_mode(ir_type *tp, ir_mode *mode) tp->mode = mode; } -void set_class_size(ir_type *tp, unsigned size) { +void set_class_size(ir_type *tp, unsigned size) +{ tp->size = size; } @@ -1151,7 +1140,7 @@ void remove_struct_member(ir_type *strct, ir_entity *member) assert(strct && (strct->type_op == type_struct)); for (i = 0; i < (ARR_LEN (strct->attr.sa.members)); i++) if (strct->attr.sa.members[i] == member) { - for(; i < (ARR_LEN (strct->attr.sa.members))-1; i++) + for (; i < (ARR_LEN (strct->attr.sa.members))-1; i++) strct->attr.sa.members[i] = strct->attr.sa.members[i+1]; ARR_SETLEN(ir_entity*, strct->attr.sa.members, ARR_LEN(strct->attr.sa.members) - 1); break; @@ -1186,10 +1175,10 @@ void set_struct_size(ir_type *tp, unsigned size) * @param len number of fields * @param tps array of field types with length len */ -static ir_type *build_value_type(int len, tp_ent_pair *tps) +static ir_type *build_value_type(char const* name, int len, tp_ent_pair *tps) { int i; - ir_type *res = new_type_struct(NULL); + ir_type *res = new_type_struct(new_id_from_str(name)); res->flags |= tf_value_param_type; /* Remove type from type list. Must be treated differently than other types. */ remove_irp_type(res); @@ -1348,9 +1337,8 @@ ir_entity *get_method_value_param_ent(ir_type *method, int pos) if (!method->attr.ma.value_params) { /* parameter value type not created yet, build */ - method->attr.ma.value_params - = build_value_type(get_method_n_params(method), - method->attr.ma.params); + method->attr.ma.value_params = build_value_type("", + get_method_n_params(method), method->attr.ma.params); } /* * build_value_type() sets the method->attr.ma.value_params type as default if @@ -1419,9 +1407,8 @@ ir_entity *get_method_value_res_ent(ir_type *method, int pos) if (!method->attr.ma.value_ress) { /* result value type not created yet, build */ - method->attr.ma.value_ress - = build_value_type(get_method_n_ress(method), - method->attr.ma.res_type); + method->attr.ma.value_ress = build_value_type("", + get_method_n_ress(method), method->attr.ma.res_type); } /* * build_value_type() sets the method->attr.ma.value_ress type as default if @@ -1617,7 +1604,7 @@ void remove_union_member(ir_type *uni, ir_entity *member) assert(uni && (uni->type_op == type_union)); for (i = 0; i < (ARR_LEN(uni->attr.ua.members)); i++) { if (uni->attr.ua.members[i] == member) { - for(; i < (ARR_LEN(uni->attr.ua.members))-1; i++) + for (; i < (ARR_LEN(uni->attr.ua.members))-1; i++) uni->attr.ua.members[i] = uni->attr.ua.members[i+1]; ARR_SETLEN(ir_entity*, uni->attr.ua.members, ARR_LEN(uni->attr.ua.members) - 1); break; @@ -2240,6 +2227,43 @@ void set_default_size(ir_type *tp, unsigned size) tp->size = size; } +void default_layout_compound_type(ir_type *type) +{ + int i; + int n = get_compound_n_members(type); + int size = 0; + unsigned align_all = 1; + + for (i = 0; i < n; ++i) { + ir_entity *entity = get_compound_member(type, i); + ir_type *entity_type = get_entity_type(entity); + unsigned align; + unsigned misalign; + + if (is_Method_type(entity_type)) + continue; + + assert(get_type_state(entity_type) == layout_fixed); + align = get_type_alignment_bytes(entity_type); + align_all = align > align_all ? align : align_all; + misalign = (align ? size % align : 0); + size += (misalign ? align - misalign : 0); + + set_entity_offset(entity, size); + if (!is_Union_type(type)) { + size += get_type_size_bytes(entity_type); + } + } + if (align_all > 0 && size % align_all) { + size += align_all - (size % align_all); + } + if (align_all > get_type_alignment_bytes(type)) { + set_type_alignment_bytes(type, align_all); + } + set_type_size_bytes(type, size); + set_type_state(type, layout_fixed); +} + ir_entity *frame_alloc_area(ir_type *frame_type, int size, unsigned alignment, int at_start) {