From 95d8c764a7740dd3acef229dbfe55183ea5145c6 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Fri, 14 Dec 2007 14:19:18 +0000 Subject: [PATCH] clone method can add a prefix [r16978] --- include/libfirm/typerep.h | 6 +- ir/ana/irmemory.c | 6 +- ir/tr/type.c | 114 ++++++++++++++++++++------------------ 3 files changed, 68 insertions(+), 58 deletions(-) diff --git a/include/libfirm/typerep.h b/include/libfirm/typerep.h index b07856422..35be8bdf8 100644 --- a/include/libfirm/typerep.h +++ b/include/libfirm/typerep.h @@ -1821,11 +1821,13 @@ ir_type *new_d_type_method(ident *name, int n_param, int n_res, dbg_info *db); /** Clone an existing method type. * - * @param tp the method type to clone. + * @param tp the method type to clone. + * @param prefix if non-null, will be the prefix for the name of + * the cloned type * * @return the cloned method type. */ -ir_type *clone_type_method(ir_type *tp); +ir_type *clone_type_method(ir_type *tp, ident *prefix); /* -- manipulate private fields of method. -- */ diff --git a/ir/ana/irmemory.c b/ir/ana/irmemory.c index c5f7bc9a2..15859305a 100644 --- a/ir/ana/irmemory.c +++ b/ir/ana/irmemory.c @@ -1103,13 +1103,17 @@ static pmap *mtp_map; * Clone a method type if not already cloned. */ static ir_type *clone_type_and_cache(ir_type *tp) { + static ident *prefix = NULL; ir_type *res; pmap_entry *e = pmap_find(mtp_map, tp); if (e) return e->value; - res = clone_type_method(tp); + if (prefix == NULL) + prefix = new_id_from_chars("C", 1); + + res = clone_type_method(tp, prefix); pmap_insert(mtp_map, tp, res); return res; diff --git a/ir/tr/type.c b/ir/tr/type.c index df55dd980..444933c46 100644 --- a/ir/tr/type.c +++ b/ir/tr/type.c @@ -1207,20 +1207,25 @@ ir_type *new_type_method(ident *name, int n_param, int n_res) { } /* clone an existing method type */ -ir_type *clone_type_method(ir_type *tp) { +ir_type *clone_type_method(ir_type *tp, ident *prefix) { ir_type *res; ident *name; + ir_mode *mode; int n_params, n_res; dbg_info *db; assert(is_Method_type(tp)); - name = tp->name; + name = tp->name; + if (prefix != NULL) + mangle(prefix, name); + + mode = tp->mode; n_params = tp->attr.ma.n_params; n_res = tp->attr.ma.n_res; db = tp->dbi; - res = new_type(type_method, mode_P_code, name, db); + res = new_type(type_method, mode, name, db); res->flags = tp->flags; res->size = tp->size; @@ -2085,56 +2090,55 @@ void set_default_size(ir_type *tp, unsigned size) { * The frame type must have already an fixed layout. */ ir_entity *frame_alloc_area(ir_type *frame_type, int size, unsigned alignment, int at_start) { - ir_entity *area; - ir_type *tp; - ident *name; - char buf[32]; - unsigned frame_align; - int i, offset, frame_size; - static unsigned area_cnt = 0; - static ir_type *a_byte = NULL; - - assert(is_frame_type(frame_type)); - assert(get_type_state(frame_type) == layout_fixed); - assert(get_type_alignment_bytes(frame_type) > 0); - - if (! a_byte) - a_byte = new_type_primitive(new_id_from_chars("byte", 4), mode_Bu); - - snprintf(buf, sizeof(buf), "area%u", area_cnt++); - name = new_id_from_str(buf); - - /* align the size */ - frame_align = get_type_alignment_bytes(frame_type); - size = (size + frame_align - 1) & ~(frame_align - 1); - - tp = new_type_array(mangle_u(get_type_ident(frame_type), name), 1, a_byte); - set_array_bounds_int(tp, 0, 0, size); - set_type_alignment_bytes(tp, alignment); - - frame_size = get_type_size_bytes(frame_type); - if (at_start) { - /* fix all offsets so far */ - for (i = get_class_n_members(frame_type) - 1; i >= 0; --i) { - ir_entity *ent = get_class_member(frame_type, i); - - set_entity_offset(ent, get_entity_offset(ent) + size); - } - /* calculate offset and new type size */ - offset = 0; - frame_size += size; - } - else { - /* calculate offset and new type size */ - offset = (frame_size + alignment - 1) & ~(alignment - 1); - frame_size = offset + size; - } - - area = new_entity(frame_type, name, tp); - set_entity_offset(area, offset); - set_type_size_bytes(frame_type, frame_size); - - /* mark this entity as compiler generated */ - set_entity_compiler_generated(area, 1); - return area; + ir_entity *area; + ir_type *tp; + ident *name; + char buf[32]; + unsigned frame_align; + int i, offset, frame_size; + static unsigned area_cnt = 0; + static ir_type *a_byte = NULL; + + assert(is_frame_type(frame_type)); + assert(get_type_state(frame_type) == layout_fixed); + assert(get_type_alignment_bytes(frame_type) > 0); + + if (! a_byte) + a_byte = new_type_primitive(new_id_from_chars("byte", 4), mode_Bu); + + snprintf(buf, sizeof(buf), "area%u", area_cnt++); + name = new_id_from_str(buf); + + /* align the size */ + frame_align = get_type_alignment_bytes(frame_type); + size = (size + frame_align - 1) & ~(frame_align - 1); + + tp = new_type_array(mangle_u(get_type_ident(frame_type), name), 1, a_byte); + set_array_bounds_int(tp, 0, 0, size); + set_type_alignment_bytes(tp, alignment); + + frame_size = get_type_size_bytes(frame_type); + if (at_start) { + /* fix all offsets so far */ + for (i = get_class_n_members(frame_type) - 1; i >= 0; --i) { + ir_entity *ent = get_class_member(frame_type, i); + + set_entity_offset(ent, get_entity_offset(ent) + size); + } + /* calculate offset and new type size */ + offset = 0; + frame_size += size; + } else { + /* calculate offset and new type size */ + offset = (frame_size + alignment - 1) & ~(alignment - 1); + frame_size = offset + size; + } + + area = new_entity(frame_type, name, tp); + set_entity_offset(area, offset); + set_type_size_bytes(frame_type, frame_size); + + /* mark this entity as compiler generated */ + set_entity_compiler_generated(area, 1); + return area; } -- 2.20.1