From 00b44a6e1e2dea070bf9e3323c77422c76f65058 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 15 Apr 2011 21:18:58 +0000 Subject: [PATCH] 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 --- gcc/go/ChangeLog | 9 ++++++++ gcc/go/go-gcc.cc | 40 ++++++++++++++++++++++++--------- gcc/go/gofrontend/backend.h | 4 ++++ gcc/go/gofrontend/statements.cc | 34 ++++++---------------------- 4 files changed, 50 insertions(+), 37 deletions(-) diff --git a/gcc/go/ChangeLog b/gcc/go/ChangeLog index 0b4c721130f..b6f91c45edc 100644 --- a/gcc/go/ChangeLog +++ b/gcc/go/ChangeLog @@ -1,3 +1,12 @@ +2011-04-15 Ian Lance Taylor + + * 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 * go-gcc.cc (Backend::error_statement): New function. diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc index acdbfd0153c..6cd402ec854 100644 --- a/gcc/go/go-gcc.cc +++ b/gcc/go/go-gcc.cc @@ -190,6 +190,9 @@ class Gcc_backend : public Backend const std::vector& statements, source_location); + Bstatement* + compound_statement(Bstatement*, Bstatement*); + Bstatement* statement_list(const std::vector&); @@ -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& 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 516ace93759..bd761bda2be 100644 --- a/gcc/go/gofrontend/backend.h +++ b/gcc/go/gofrontend/backend.h @@ -146,6 +146,10 @@ class Backend const std::vector& 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&) = 0; diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc index 4875ed71f69..8e00d37b291 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 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 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 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 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 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. -- 2.30.2