aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2011-04-15 21:18:58 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-04-15 21:18:58 +0000
commit00b44a6e1e2dea070bf9e3323c77422c76f65058 (patch)
tree3e1ab62aa60980f2a3e9ed7cc27f39ca7964b8ef /gcc/go
parenteb229cf45a207f2c75bbab37ecbe7caa4f23b853 (diff)
downloadgcc-00b44a6e1e2dea070bf9e3323c77422c76f65058.zip
gcc-00b44a6e1e2dea070bf9e3323c77422c76f65058.tar.gz
gcc-00b44a6e1e2dea070bf9e3323c77422c76f65058.tar.bz2
Add compound_list to backend interface.
* 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. From-SVN: r172521
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/ChangeLog9
-rw-r--r--gcc/go/go-gcc.cc40
-rw-r--r--gcc/go/gofrontend/backend.h4
-rw-r--r--gcc/go/gofrontend/statements.cc34
4 files changed, 50 insertions, 37 deletions
diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog
index 0b4c721..b6f91c4 100644
--- a/gcc/go/ChangeLog
+++ b/gcc/go/ChangeLog
@@ -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.
diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc
index acdbfd0..6cd402e 100644
--- a/gcc/go/go-gcc.cc
+++ b/gcc/go/go-gcc.cc
@@ -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);
diff --git a/gcc/go/gofrontend/backend.h b/gcc/go/gofrontend/backend.h
index 516ace9..bd761bd 100644
--- a/gcc/go/gofrontend/backend.h
+++ b/gcc/go/gofrontend/backend.h
@@ -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;
diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc
index 4875ed7..8e00d37 100644
--- a/gcc/go/gofrontend/statements.cc
+++ b/gcc/go/gofrontend/statements.cc
@@ -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.