OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [gcc/] [c-semantics.c] - Diff between revs 816 and 826

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 816 Rev 826
/* This file contains subroutine used by the C front-end to construct GENERIC.
/* This file contains subroutine used by the C front-end to construct GENERIC.
   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
   Written by Benjamin Chelf (chelf@codesourcery.com).
   Written by Benjamin Chelf (chelf@codesourcery.com).
 
 
This file is part of GCC.
This file is part of GCC.
 
 
GCC is free software; you can redistribute it and/or modify it under
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
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
Software Foundation; either version 3, or (at your option) any later
version.
version.
 
 
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
<http://www.gnu.org/licenses/>.  */
 
 
#include "config.h"
#include "config.h"
#include "system.h"
#include "system.h"
#include "coretypes.h"
#include "coretypes.h"
#include "tm.h"
#include "tm.h"
#include "tree.h"
#include "tree.h"
#include "function.h"
#include "function.h"
#include "splay-tree.h"
#include "splay-tree.h"
#include "varray.h"
#include "varray.h"
#include "c-common.h"
#include "c-common.h"
#include "except.h"
#include "except.h"
/* In order for the format checking to accept the C frontend
/* In order for the format checking to accept the C frontend
   diagnostic framework extensions, you must define this token before
   diagnostic framework extensions, you must define this token before
   including toplev.h.  */
   including toplev.h.  */
#define GCC_DIAG_STYLE __gcc_cdiag__
#define GCC_DIAG_STYLE __gcc_cdiag__
#include "toplev.h"
#include "toplev.h"
#include "flags.h"
#include "flags.h"
#include "ggc.h"
#include "ggc.h"
#include "rtl.h"
#include "rtl.h"
#include "output.h"
#include "output.h"
#include "timevar.h"
#include "timevar.h"
#include "predict.h"
#include "predict.h"
#include "tree-inline.h"
#include "tree-inline.h"
#include "gimple.h"
#include "gimple.h"
#include "tree-iterator.h"
#include "tree-iterator.h"
#include "langhooks.h"
#include "langhooks.h"
 
 
/* Create an empty statement tree rooted at T.  */
/* Create an empty statement tree rooted at T.  */
 
 
tree
tree
push_stmt_list (void)
push_stmt_list (void)
{
{
  tree t;
  tree t;
  t = alloc_stmt_list ();
  t = alloc_stmt_list ();
  TREE_CHAIN (t) = cur_stmt_list;
  TREE_CHAIN (t) = cur_stmt_list;
  cur_stmt_list = t;
  cur_stmt_list = t;
  return t;
  return t;
}
}
 
 
/* Finish the statement tree rooted at T.  */
/* Finish the statement tree rooted at T.  */
 
 
tree
tree
pop_stmt_list (tree t)
pop_stmt_list (tree t)
{
{
  tree u = cur_stmt_list, chain;
  tree u = cur_stmt_list, chain;
 
 
  /* Pop statement lists until we reach the target level.  The extra
  /* Pop statement lists until we reach the target level.  The extra
     nestings will be due to outstanding cleanups.  */
     nestings will be due to outstanding cleanups.  */
  while (1)
  while (1)
    {
    {
      chain = TREE_CHAIN (u);
      chain = TREE_CHAIN (u);
      TREE_CHAIN (u) = NULL_TREE;
      TREE_CHAIN (u) = NULL_TREE;
      if (chain)
      if (chain)
        STATEMENT_LIST_HAS_LABEL (chain) |= STATEMENT_LIST_HAS_LABEL (u);
        STATEMENT_LIST_HAS_LABEL (chain) |= STATEMENT_LIST_HAS_LABEL (u);
      if (t == u)
      if (t == u)
        break;
        break;
      u = chain;
      u = chain;
    }
    }
  cur_stmt_list = chain;
  cur_stmt_list = chain;
 
 
  /* If the statement list is completely empty, just return it.  This is
  /* If the statement list is completely empty, just return it.  This is
     just as good small as build_empty_stmt, with the advantage that
     just as good small as build_empty_stmt, with the advantage that
     statement lists are merged when they appended to one another.  So
     statement lists are merged when they appended to one another.  So
     using the STATEMENT_LIST avoids pathological buildup of EMPTY_STMT_P
     using the STATEMENT_LIST avoids pathological buildup of EMPTY_STMT_P
     statements.  */
     statements.  */
  if (TREE_SIDE_EFFECTS (t))
  if (TREE_SIDE_EFFECTS (t))
    {
    {
      tree_stmt_iterator i = tsi_start (t);
      tree_stmt_iterator i = tsi_start (t);
 
 
      /* If the statement list contained exactly one statement, then
      /* If the statement list contained exactly one statement, then
         extract it immediately.  */
         extract it immediately.  */
      if (tsi_one_before_end_p (i))
      if (tsi_one_before_end_p (i))
        {
        {
          u = tsi_stmt (i);
          u = tsi_stmt (i);
          tsi_delink (&i);
          tsi_delink (&i);
          free_stmt_list (t);
          free_stmt_list (t);
          t = u;
          t = u;
        }
        }
    }
    }
 
 
  return t;
  return t;
}
}
 
 
/* Build a generic statement based on the given type of node and
/* Build a generic statement based on the given type of node and
   arguments. Similar to `build_nt', except that we set
   arguments. Similar to `build_nt', except that we set
   EXPR_LOCATION to LOC. */
   EXPR_LOCATION to LOC. */
/* ??? This should be obsolete with the lineno_stmt productions
/* ??? This should be obsolete with the lineno_stmt productions
   in the grammar.  */
   in the grammar.  */
 
 
tree
tree
build_stmt (location_t loc, enum tree_code code, ...)
build_stmt (location_t loc, enum tree_code code, ...)
{
{
  tree ret;
  tree ret;
  int length, i;
  int length, i;
  va_list p;
  va_list p;
  bool side_effects;
  bool side_effects;
 
 
  /* This function cannot be used to construct variably-sized nodes.  */
  /* This function cannot be used to construct variably-sized nodes.  */
  gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
  gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
 
 
  va_start (p, code);
  va_start (p, code);
 
 
  ret = make_node (code);
  ret = make_node (code);
  TREE_TYPE (ret) = void_type_node;
  TREE_TYPE (ret) = void_type_node;
  length = TREE_CODE_LENGTH (code);
  length = TREE_CODE_LENGTH (code);
  SET_EXPR_LOCATION (ret, loc);
  SET_EXPR_LOCATION (ret, loc);
 
 
  /* TREE_SIDE_EFFECTS will already be set for statements with
  /* TREE_SIDE_EFFECTS will already be set for statements with
     implicit side effects.  Here we make sure it is set for other
     implicit side effects.  Here we make sure it is set for other
     expressions by checking whether the parameters have side
     expressions by checking whether the parameters have side
     effects.  */
     effects.  */
 
 
  side_effects = false;
  side_effects = false;
  for (i = 0; i < length; i++)
  for (i = 0; i < length; i++)
    {
    {
      tree t = va_arg (p, tree);
      tree t = va_arg (p, tree);
      if (t && !TYPE_P (t))
      if (t && !TYPE_P (t))
        side_effects |= TREE_SIDE_EFFECTS (t);
        side_effects |= TREE_SIDE_EFFECTS (t);
      TREE_OPERAND (ret, i) = t;
      TREE_OPERAND (ret, i) = t;
    }
    }
 
 
  TREE_SIDE_EFFECTS (ret) |= side_effects;
  TREE_SIDE_EFFECTS (ret) |= side_effects;
 
 
  va_end (p);
  va_end (p);
  return ret;
  return ret;
}
}
 
 
/* Create a CASE_LABEL_EXPR tree node and return it.  */
/* Create a CASE_LABEL_EXPR tree node and return it.  */
 
 
tree
tree
build_case_label (location_t loc,
build_case_label (location_t loc,
                  tree low_value, tree high_value, tree label_decl)
                  tree low_value, tree high_value, tree label_decl)
{
{
  return build_stmt (loc, CASE_LABEL_EXPR, low_value, high_value, label_decl);
  return build_stmt (loc, CASE_LABEL_EXPR, low_value, high_value, label_decl);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.