OSDN Git Service

* config/h8300/h8300.h (OK_FOR_U): Support 'U' constraint for H8300SX.
[pf3gnuchains/gcc-fork.git] / gcc / tree-iterator.c
index c4c3010..43218f6 100644 (file)
@@ -1,12 +1,12 @@
 /* Iterator routines for manipulating GENERIC and GIMPLE tree statements.
 /* Iterator routines for manipulating GENERIC and GIMPLE tree statements.
-   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
    Contributed by Andrew MacLeod  <amacleod@redhat.com>
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
    Contributed by Andrew MacLeod  <amacleod@redhat.com>
 
 This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GCC is distributed in the hope that it will be useful,
 any later version.
 
 GCC is distributed in the hope that it will be useful,
@@ -15,15 +15,14 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to
-the Free Software Foundation, 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
-#include "tree-gimple.h"
+#include "gimple.h"
 #include "tree-iterator.h"
 #include "ggc.h"
 
 #include "tree-iterator.h"
 #include "ggc.h"
 
@@ -40,6 +39,7 @@ alloc_stmt_list (void)
   if (list)
     {
       stmt_list_cache = TREE_CHAIN (list);
   if (list)
     {
       stmt_list_cache = TREE_CHAIN (list);
+      gcc_assert (stmt_list_cache != list);
       memset (list, 0, sizeof(struct tree_common));
       TREE_SET_CODE (list, STATEMENT_LIST);
     }
       memset (list, 0, sizeof(struct tree_common));
       TREE_SET_CODE (list, STATEMENT_LIST);
     }
@@ -54,6 +54,9 @@ free_stmt_list (tree t)
 {
   gcc_assert (!STATEMENT_LIST_HEAD (t));
   gcc_assert (!STATEMENT_LIST_TAIL (t));
 {
   gcc_assert (!STATEMENT_LIST_HEAD (t));
   gcc_assert (!STATEMENT_LIST_TAIL (t));
+  /* If this triggers, it's a sign that the same list is being freed
+     twice.  */
+  gcc_assert (t != stmt_list_cache || stmt_list_cache == NULL);
   TREE_CHAIN (t) = stmt_list_cache;
   stmt_list_cache = t;
 }
   TREE_CHAIN (t) = stmt_list_cache;
   stmt_list_cache = t;
 }
@@ -86,7 +89,7 @@ tsi_link_before (tree_stmt_iterator *i, tree t, enum tsi_iterator_update mode)
     }
   else
     {
     }
   else
     {
-      head = ggc_alloc (sizeof (*head));
+      head = GGC_NEW (struct tree_statement_list_node);
       head->prev = NULL;
       head->next = NULL;
       head->stmt = t;
       head->prev = NULL;
       head->next = NULL;
       head->stmt = t;
@@ -162,7 +165,7 @@ tsi_link_after (tree_stmt_iterator *i, tree t, enum tsi_iterator_update mode)
     }
   else
     {
     }
   else
     {
-      head = ggc_alloc (sizeof (*head));
+      head = GGC_NEW (struct tree_statement_list_node);
       head->prev = NULL;
       head->next = NULL;
       head->stmt = t;
       head->prev = NULL;
       head->next = NULL;
       head->stmt = t;
@@ -235,61 +238,6 @@ tsi_delink (tree_stmt_iterator *i)
   i->ptr = next;
 }
 
   i->ptr = next;
 }
 
-/* Move all statements in the statement list after I to a new
-   statement list.  I itself is unchanged.  */
-
-tree
-tsi_split_statement_list_after (const tree_stmt_iterator *i)
-{
-  struct tree_statement_list_node *cur, *next;
-  tree old_sl, new_sl;
-
-  cur = i->ptr;
-  /* How can we possibly split after the end, or before the beginning?  */
-  gcc_assert (cur);
-  next = cur->next;
-
-  old_sl = i->container;
-  new_sl = alloc_stmt_list ();
-  TREE_SIDE_EFFECTS (new_sl) = 1;
-
-  STATEMENT_LIST_HEAD (new_sl) = next;
-  STATEMENT_LIST_TAIL (new_sl) = STATEMENT_LIST_TAIL (old_sl);
-  STATEMENT_LIST_TAIL (old_sl) = cur;
-  cur->next = NULL;
-  next->prev = NULL;
-
-  return new_sl;
-}
-
-/* Move all statements in the statement list before I to a new
-   statement list.  I is set to the head of the new list.  */
-
-tree
-tsi_split_statement_list_before (tree_stmt_iterator *i)
-{
-  struct tree_statement_list_node *cur, *prev;
-  tree old_sl, new_sl;
-
-  cur = i->ptr;
-  /* How can we possibly split after the end, or before the beginning?  */
-  gcc_assert (cur);
-  prev = cur->prev;
-
-  old_sl = i->container;
-  new_sl = alloc_stmt_list ();
-  TREE_SIDE_EFFECTS (new_sl) = 1;
-  i->container = new_sl;
-
-  STATEMENT_LIST_HEAD (new_sl) = cur;
-  STATEMENT_LIST_TAIL (new_sl) = STATEMENT_LIST_TAIL (old_sl);
-  STATEMENT_LIST_TAIL (old_sl) = prev;
-  cur->prev = NULL;
-  prev->next = NULL;
-
-  return new_sl;
-}
-
 /* Return the first expression in a sequence of COMPOUND_EXPRs,
    or in a STATEMENT_LIST.  */
 
 /* Return the first expression in a sequence of COMPOUND_EXPRs,
    or in a STATEMENT_LIST.  */
 
@@ -307,6 +255,7 @@ expr_first (tree expr)
 
   while (TREE_CODE (expr) == COMPOUND_EXPR)
     expr = TREE_OPERAND (expr, 0);
 
   while (TREE_CODE (expr) == COMPOUND_EXPR)
     expr = TREE_OPERAND (expr, 0);
+
   return expr;
 }
 
   return expr;
 }
 
@@ -327,30 +276,6 @@ expr_last (tree expr)
 
   while (TREE_CODE (expr) == COMPOUND_EXPR)
     expr = TREE_OPERAND (expr, 1);
 
   while (TREE_CODE (expr) == COMPOUND_EXPR)
     expr = TREE_OPERAND (expr, 1);
-  return expr;
-}
-
-/* If EXPR is a single statement return it.  If EXPR is a
-   STATEMENT_LIST containing exactly one statement S, return S.
-   Otherwise, return NULL.  */
-
-tree 
-expr_only (tree expr)
-{
-  if (expr == NULL_TREE)
-    return NULL_TREE;
-
-  if (TREE_CODE (expr) == STATEMENT_LIST)
-    {
-      struct tree_statement_list_node *n = STATEMENT_LIST_TAIL (expr);
-      if (n && STATEMENT_LIST_HEAD (expr) == n)
-       return n->stmt;
-      else
-       return NULL_TREE;
-    }
-
-  if (TREE_CODE (expr) == COMPOUND_EXPR)
-    return NULL_TREE;
 
   return expr;
 }
 
   return expr;
 }