OSDN Git Service

Add compound_list to backend interface.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Apr 2011 21:18:58 +0000 (21:18 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 15 Apr 2011 21:18:58 +0000 (21:18 +0000)
* go-gcc.cc (Gcc_backend::compound_statement): New function.
(Gcc_backend::assignment_statement): Use error_statement.
(Gcc_backend::return_statement): Likewise.
(Gcc_backend::if_statement): Likewise.
(Gcc_backend::switch_statement): Likewise.
(Gcc_backend::statement_list): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@172521 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/ChangeLog
gcc/go/go-gcc.cc
gcc/go/gofrontend/backend.h
gcc/go/gofrontend/statements.cc

index 0b4c721..b6f91c4 100644 (file)
@@ -1,3 +1,12 @@
+2011-04-15  Ian Lance Taylor  <iant@google.com>
+
+       * go-gcc.cc (Gcc_backend::compound_statement): New function.
+       (Gcc_backend::assignment_statement): Use error_statement.
+       (Gcc_backend::return_statement): Likewise.
+       (Gcc_backend::if_statement): Likewise.
+       (Gcc_backend::switch_statement): Likewise.
+       (Gcc_backend::statement_list): Likewise.
+
 2011-04-14  Ian Lance Taylor  <iant@google.com>
 
        * go-gcc.cc (Backend::error_statement): New function.
index acdbfd0..6cd402e 100644 (file)
@@ -191,6 +191,9 @@ class Gcc_backend : public Backend
                   source_location);
 
   Bstatement*
+  compound_statement(Bstatement*, Bstatement*);
+
+  Bstatement*
   statement_list(const std::vector<Bstatement*>&);
 
   // Labels.
@@ -244,7 +247,7 @@ Gcc_backend::assignment_statement(Bexpression* lhs, Bexpression* rhs,
   tree lhs_tree = lhs->get_tree();
   tree rhs_tree = rhs->get_tree();
   if (lhs_tree == error_mark_node || rhs_tree == error_mark_node)
-    return this->make_statement(error_mark_node);
+    return this->error_statement();
   return this->make_statement(fold_build2_loc(location, MODIFY_EXPR,
                                              void_type_node,
                                              lhs_tree, rhs_tree));
@@ -259,10 +262,10 @@ Gcc_backend::return_statement(Bfunction* bfunction,
 {
   tree fntree = bfunction->get_tree();
   if (fntree == error_mark_node)
-    return this->make_statement(error_mark_node);
+    return this->error_statement();
   tree result = DECL_RESULT(fntree);
   if (result == error_mark_node)
-    return this->make_statement(error_mark_node);
+    return this->error_statement();
   tree ret;
   if (vals.empty())
     ret = fold_build1_loc(location, RETURN_EXPR, void_type_node, NULL_TREE);
@@ -270,7 +273,7 @@ Gcc_backend::return_statement(Bfunction* bfunction,
     {
       tree val = vals.front()->get_tree();
       if (val == error_mark_node)
-       return this->make_statement(error_mark_node);
+       return this->error_statement();
       tree set = fold_build2_loc(location, MODIFY_EXPR, void_type_node,
                                 result, vals.front()->get_tree());
       ret = fold_build1_loc(location, RETURN_EXPR, void_type_node, set);
@@ -294,7 +297,7 @@ Gcc_backend::return_statement(Bfunction* bfunction,
                                     rettmp, field, NULL_TREE);
          tree val = (*p)->get_tree();
          if (val == error_mark_node)
-           return this->make_statement(error_mark_node);
+           return this->error_statement();
          tree set = fold_build2_loc(location, MODIFY_EXPR, void_type_node,
                                     ref, (*p)->get_tree());
          append_to_statement_list(set, &stmt_list);
@@ -322,7 +325,7 @@ Gcc_backend::if_statement(Bexpression* condition, Bstatement* then_block,
   if (cond_tree == error_mark_node
       || then_tree == error_mark_node
       || else_tree == error_mark_node)
-    return this->make_statement(error_mark_node);
+    return this->error_statement();
   tree ret = build3_loc(location, COND_EXPR, void_type_node, cond_tree,
                        then_tree, else_tree);
   return this->make_statement(ret);
@@ -363,7 +366,7 @@ Gcc_backend::switch_statement(
            {
              tree t = (*pcv)->get_tree();
              if (t == error_mark_node)
-               return this->make_statement(error_mark_node);
+               return this->error_statement();
              source_location loc = EXPR_LOCATION(t);
              tree label = create_artificial_label(loc);
              tree c = build3_loc(loc, CASE_LABEL_EXPR, void_type_node,
@@ -376,19 +379,36 @@ Gcc_backend::switch_statement(
        {
          tree t = (*ps)->get_tree();
          if (t == error_mark_node)
-           return this->make_statement(error_mark_node);
+           return this->error_statement();
          append_to_statement_list(t, &stmt_list);
        }
     }
 
   tree tv = value->get_tree();
   if (tv == error_mark_node)
-    return this->make_statement(error_mark_node);
+    return this->error_statement();
   tree t = build3_loc(switch_location, SWITCH_EXPR, void_type_node,
                      tv, stmt_list, NULL_TREE);
   return this->make_statement(t);
 }
 
+// Pair of statements.
+
+Bstatement*
+Gcc_backend::compound_statement(Bstatement* s1, Bstatement* s2)
+{
+  tree stmt_list = NULL_TREE;
+  tree t = s1->get_tree();
+  if (t == error_mark_node)
+    return this->error_statement();
+  append_to_statement_list(t, &stmt_list);
+  t = s2->get_tree();
+  if (t == error_mark_node)
+    return this->error_statement();
+  append_to_statement_list(t, &stmt_list);
+  return this->make_statement(stmt_list);
+}
+
 // List of statements.
 
 Bstatement*
@@ -401,7 +421,7 @@ Gcc_backend::statement_list(const std::vector<Bstatement*>& statements)
     {
       tree t = (*p)->get_tree();
       if (t == error_mark_node)
-       return this->make_statement(error_mark_node);
+       return this->error_statement();
       append_to_statement_list(t, &stmt_list);
     }
   return this->make_statement(stmt_list);
index 516ace9..bd761bd 100644 (file)
@@ -146,6 +146,10 @@ class Backend
                   const std::vector<Bstatement*>& statements,
                   source_location) = 0;
 
+  // Create a single statement from two statements.
+  virtual Bstatement*
+  compound_statement(Bstatement*, Bstatement*) = 0;
+
   // Create a single statement from a list of statements.
   virtual Bstatement*
   statement_list(const std::vector<Bstatement*>&) = 0;
index 4875ed7..8e00d37 100644 (file)
@@ -3058,12 +3058,7 @@ Case_clauses::Case_clause::get_backend(Translate_context* context,
   else if (break_stat == NULL)
     return statements;
   else
-    {
-      std::vector<Bstatement*> list(2);
-      list[0] = statements;
-      list[1] = break_stat;
-      return context->backend()->statement_list(list);
-    }
+    return context->backend()->compound_statement(statements, break_stat);
 }
 
 // Class Case_clauses.
@@ -3332,11 +3327,9 @@ Constant_switch_statement::do_get_tree(Translate_context* context)
                                                          all_cases,
                                                          all_statements,
                                                          this->location());
-
-  std::vector<Bstatement*> stats(2);
-  stats[0] = switch_statement;
-  stats[1] = break_label->get_definition(context);
-  Bstatement* ret = context->backend()->statement_list(stats);
+  Bstatement* ldef = break_label->get_definition(context);
+  Bstatement* ret = context->backend()->compound_statement(switch_statement,
+                                                          ldef);
   return stat_to_tree(ret);
 }
 
@@ -3876,12 +3869,7 @@ Send_statement::do_get_tree(Translate_context* context)
   if (btemp == NULL)
     return stat_to_tree(s);
   else
-    {
-      std::vector<Bstatement*> stats(2);
-      stats[0] = btemp;
-      stats[1] = s;
-      return stat_to_tree(context->backend()->statement_list(stats));
-    }
+    return stat_to_tree(context->backend()->compound_statement(btemp, s));
 }
 
 // Make a send statement.
@@ -4218,10 +4206,7 @@ Select_clauses::get_backend(Translate_context* context,
        }
       if (s == NULL)
        return ldef;
-      std::vector<Bstatement*> stats(2);
-      stats[0] = s;
-      stats[1] = ldef;
-      return context->backend()->statement_list(stats);
+      return context->backend()->compound_statement(s, ldef);
     }
   gcc_assert(count > 0);
 
@@ -4347,12 +4332,7 @@ Select_clauses::add_clause_backend(
   if (s == NULL)
     (*clauses)[index] = g;
   else
-    {
-      std::vector<Bstatement*> stats(2);
-      stats[0] = s;
-      stats[1] = g;
-      (*clauses)[index] = context->backend()->statement_list(stats);
-    }
+    (*clauses)[index] = context->backend()->compound_statement(s, g);
 }
 
 // Class Select_statement.