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;
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:
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));
ir_type *new_d_type_struct(ident *name, type_dbg_info *db)
{
ir_type *res = new_type(type_struct, NULL, db);
+ assert(name != NULL);
res->name = name;
res->attr.sa.members = NEW_ARR_F(ir_entity *, 0);
* @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);
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("<value param>",
+ get_method_n_params(method), method->attr.ma.params);
}
/*
* build_value_type() sets the method->attr.ma.value_params type as default if
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("<value result>",
+ get_method_n_ress(method), method->attr.ma.res_type);
}
/*
* build_value_type() sets the method->attr.ma.value_ress type as default if
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)
{