- use unsigned instead of int where appropriate
[libfirm] / ir / tr / type.c
index a9fc299..ef77299 100644 (file)
@@ -796,6 +796,7 @@ void free_class_attrs(ir_type *clss) {
 void add_class_member(ir_type *clss, ir_entity *member) {
        assert(clss && (clss->type_op == type_class));
        assert(clss != get_entity_type(member) && "recursive type");
+       assert(get_type_state(clss) != layout_fixed);
        ARR_APP1 (ir_entity *, clss->attr.ca.members, member);
 }
 
@@ -1091,6 +1092,7 @@ void add_struct_member(ir_type *strct, ir_entity *member) {
        assert(strct && (strct->type_op == type_struct));
        assert(get_type_tpop(get_entity_type(member)) != type_method);
        assert(strct != get_entity_type(member) && "recursive type");
+       assert(get_type_state(strct) != layout_fixed);
        ARR_APP1 (ir_entity *, strct->attr.sa.members, member);
 }
 
@@ -1228,6 +1230,7 @@ ir_type *clone_type_method(ir_type *tp, ident *prefix) {
        res = new_type(type_method, mode, name, db);
 
        res->flags                         = tp->flags;
+       res->assoc_type                    = tp->assoc_type;
        res->size                          = tp->size;
        res->attr.ma.n_params              = n_params;
        res->attr.ma.params                = xcalloc(n_params, sizeof(res->attr.ma.params[0]));
@@ -1532,6 +1535,7 @@ int get_union_n_members(const ir_type *uni) {
 void add_union_member(ir_type *uni, ir_entity *member) {
        assert(uni && (uni->type_op == type_union));
        assert(uni != get_entity_type(member) && "recursive type");
+       assert(get_type_state(uni) != layout_fixed);
        ARR_APP1(ir_entity *, uni->attr.ua.members, member);
 }
 
@@ -2065,6 +2069,23 @@ ir_type *new_type_frame(ident *name) {
        return res;
 }
 
+/* Makes a clone of a frame type. */
+ir_type *clone_frame_type(ir_type *type) {
+       ir_type *res;
+       int     i, n;
+
+       assert(is_frame_type(type));
+
+       res = new_type_frame(type->name);
+       for (i = 0, n = get_class_n_members(type); i < n; ++i) {
+               ir_entity *ent  = get_class_member(type, i);
+               ir_entity *nent = copy_entity_own(ent, res);
+               set_entity_link(ent, nent);
+               set_entity_link(nent, ent);
+       }
+       return res;
+}
+
 /* Sets a lowered type for a type. This sets both associations. */
 void set_lowered_type(ir_type *tp, ir_type *lowered_type) {
        assert(is_type(tp) && is_type(lowered_type));
@@ -2104,6 +2125,7 @@ ir_entity *frame_alloc_area(ir_type *frame_type, int size, unsigned alignment, i
        assert(is_frame_type(frame_type));
        assert(get_type_state(frame_type) == layout_fixed);
        assert(get_type_alignment_bytes(frame_type) > 0);
+       set_type_state(frame_type, layout_undefined);
 
        if (! a_byte)
                a_byte = new_type_primitive(new_id_from_chars("byte", 4), mode_Bu);
@@ -2142,5 +2164,7 @@ ir_entity *frame_alloc_area(ir_type *frame_type, int size, unsigned alignment, i
 
        /* mark this entity as compiler generated */
        set_entity_compiler_generated(area, 1);
+
+       set_type_state(frame_type, layout_fixed);
        return area;
 }