X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Ftr%2Ftypegmod.c;h=6d2d8da67a89443b6ffc4eceecc14d3b076bda50;hb=a748501db974593cc1ddd3955c1663340c5af353;hp=4a44ef97ee9ef524c4f72627cefd2b235e6eee7a;hpb=2da89aec2e7d54d70940cccfa82f74c83e5221eb;p=libfirm diff --git a/ir/tr/typegmod.c b/ir/tr/typegmod.c index 4a44ef97e..6d2d8da67 100644 --- a/ir/tr/typegmod.c +++ b/ir/tr/typegmod.c @@ -1,17 +1,25 @@ -/* Copyright (C) 2001 by Universitaet Karlsruhe -** All rights reserved. -** -** Authors: Goetz Lindenmaier -** -*/ +/* + * Project: libFIRM + * File name: ir/tr/typegmod.c + * Purpose: Functionality to modify the type graph. + * Author: Goetz Lindenmaier + * Modified by: Michael Beck + * Created: + * CVS-ID: $Id$ + * Copyright: (c) 2001-2006 Universität Karlsruhe + * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif -# include "typegmod_t.h" -# include "type_t.h" -# include "tpop_t.h" -# include "irmode.h" +#include "typegmod.h" +#include "type_t.h" +#include "tpop_t.h" +#include "irmode.h" -inline void exchange_types(type *old_type, type *new_type) { - int i; +void exchange_types(ir_type *old_type, ir_type *new_type) { + unsigned flags = old_type->flags & (tf_frame_type | tf_value_param_type | tf_global_type | tf_tls_type); /* Deallocate datastructures not directly contained in the old type. We must do this now as it is the latest point where we know the original kind of type. @@ -25,18 +33,22 @@ inline void exchange_types(type *old_type, type *new_type) { Maybe it's better to remove the id entry and shrink the list. Does this conflict with the walker? Might a type be left out during the walk? - * Deallocation: if the Id is removed from the list it will eventualle + * Deallocation: if the Id is removed from the list it will eventually disappear in a memory leak. When is impossible to determine so we - need to hold it in a seperate list for deallocation. + need to hold it in a separate list for deallocation. */ /* Exchange the types */ old_type->type_op = type_id; old_type->mode = (ir_mode *) new_type; + /* ensure that the frame, value param, global and tls flags + are set right if these types are exchanged */ + new_type->flags |= flags; } -inline type *skip_tid(type *tp) { +ir_type *skip_tid(ir_type *tp) { + /* @@@ implement the self cycle killing trick of skip_id(ir_node *) */ while (tp->type_op == type_id) - tp = (type *) tp->mode; + tp = (ir_type *) tp->mode; return tp; }