Every node has now a pinned attribute that is inherited from the op.
[libfirm] / ir / tr / typegmod.c
index d6138fc..8b7748b 100644 (file)
@@ -1,35 +1,50 @@
-/* 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:
+ * Created:
+ * CVS-ID:      $Id$
+ * Copyright:   (c) 2001-2003 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 "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) {
   /* Deallocate datastructures not directly contained in the
-     old type */
-  /* @@@@ */
+     old type.  We must do this now as it is the latest point
+     where we know the original kind of type.
+     */
+  free_type_attrs(old_type);
 
-  /* Remove old type from type list.  Will this confuscate the
-     iterators? */
-  /* @@@ */
-
-  /* Ev. add to a list of id types for later deallocation. */
-  /* @@@ */
+  /* @@@@
+     Things to deal with:
+     * After exchange_types the type has two entries in the list of
+       all types in irp.  So far this is fine for the walker.
+       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 eventually
+       disappear in a memory leak.  When is impossible to determine so we
+       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;
 }
 
-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;
 }