ia32_Leave does not need esp as input operand, it only overwrites it.
[libfirm] / ir / tr / type.c
index c69d24f..2cceb45 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);
 }
 
@@ -1533,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);
 }
 
@@ -1690,7 +1693,7 @@ void set_array_upper_bound_int(ir_type *array, int dimension, int upper_bound) {
 
 int has_array_lower_bound(const ir_type *array, int dimension) {
        assert(array && (array->type_op == type_array));
-       return (get_irn_op(array->attr.aa.lower_bound[dimension]) != op_Unknown);
+       return !is_Unknown(array->attr.aa.lower_bound[dimension]);
 }
 
 ir_node *get_array_lower_bound(const ir_type *array, int dimension) {
@@ -1702,13 +1705,13 @@ long get_array_lower_bound_int(const ir_type *array, int dimension) {
        ir_node *node;
        assert(array && (array->type_op == type_array));
        node = array->attr.aa.lower_bound[dimension];
-       assert(get_irn_op(node) == op_Const);
+       assert(is_Const(node));
        return get_tarval_long(get_Const_tarval(node));
 }
 
 int has_array_upper_bound(const ir_type *array, int dimension) {
        assert(array && (array->type_op == type_array));
-       return get_irn_op(array->attr.aa.upper_bound[dimension]) != op_Unknown;
+       return !is_Unknown(array->attr.aa.upper_bound[dimension]);
 }
 
 ir_node *get_array_upper_bound(const ir_type *array, int dimension) {
@@ -1720,7 +1723,7 @@ long get_array_upper_bound_int(const ir_type *array, int dimension) {
        ir_node *node;
        assert(array && (array->type_op == type_array));
        node = array->attr.aa.upper_bound[dimension];
-       assert(get_irn_op(node) == op_Const);
+       assert(is_Const(node));
        return get_tarval_long(get_Const_tarval(node));
 }
 
@@ -2075,9 +2078,10 @@ ir_type *clone_frame_type(ir_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);
-
-               (void)copy_entity_own(ent, res);
+               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;
 }
@@ -2121,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);
@@ -2147,6 +2152,13 @@ ir_entity *frame_alloc_area(ir_type *frame_type, int size, unsigned alignment, i
                /* calculate offset and new type size */
                offset = 0;
                frame_size += size;
+
+               /* increase size to match alignment... */
+               if (alignment > frame_align) {
+                       frame_align = alignment;
+                       set_type_alignment_bytes(frame_type, frame_align);
+                       frame_size  = (frame_size + frame_align - 1) & ~(frame_align - 1);
+               }
        } else {
                /* calculate offset and new type size */
                offset = (frame_size + alignment - 1) & ~(alignment - 1);
@@ -2159,5 +2171,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;
 }