From 4f3952228acc6e60cd5d4e356094319bb2aca010 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 10 May 2019 19:41:55 +0000 Subject: [PATCH] compiler: permit inlining receive expressions This does not permit any new inlinable functions in the standard library. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/176637 From-SVN: r271074 --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/expressions.cc | 21 +++++++++++++++++++++ gcc/go/gofrontend/expressions.h | 10 ++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 8158367c62b..d8bcef43a92 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -b5e4ba88a2e7f3c34e9183f43370c38ea639c393 +76ab85364745e445498fe53f9ca8e37b49650779 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index ed658524240..54f6e525e1e 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -15423,6 +15423,15 @@ Receive_expression::do_get_backend(Translate_context* context) return Expression::make_compound(recv, recv_ref, loc)->get_backend(context); } +// Export a receive expression. + +void +Receive_expression::do_export(Export_function_body* efb) const +{ + efb->write_c_string("<-"); + this->channel_->export_expression(efb); +} + // Dump ast representation for a receive expression. void @@ -15432,6 +15441,16 @@ Receive_expression::do_dump_expression(Ast_dump_context* ast_dump_context) const ast_dump_context->dump_expression(channel_); } +// Import a receive expression. + +Expression* +Receive_expression::do_import(Import_expression* imp, Location loc) +{ + imp->require_c_string("<-"); + Expression* expr = Expression::import_expression(imp, loc); + return Expression::make_receive(expr, loc); +} + // Make a receive expression. Receive_expression* @@ -16783,6 +16802,8 @@ Expression::import_expression(Import_expression* imp, Location loc) // This handles integers, floats and complex constants. return Integer_expression::do_import(imp, loc); } + else if (imp->match_c_string("<-")) + return Receive_expression::do_import(imp, loc); else if (imp->match_c_string("$nil") || (imp->version() < EXPORT_FORMAT_V3 && imp->match_c_string("nil"))) diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h index 2cca8240fcd..9ed81f11ea5 100644 --- a/gcc/go/gofrontend/expressions.h +++ b/gcc/go/gofrontend/expressions.h @@ -3982,6 +3982,9 @@ class Receive_expression : public Expression channel() { return this->channel_; } + static Expression* + do_import(Import_expression*, Location); + protected: int do_traverse(Traverse* traverse) @@ -4010,6 +4013,10 @@ class Receive_expression : public Expression return Expression::make_receive(this->channel_->copy(), this->location()); } + int + do_inlining_cost() const + { return 1; } + bool do_must_eval_in_order() const { return true; } @@ -4017,6 +4024,9 @@ class Receive_expression : public Expression Bexpression* do_get_backend(Translate_context*); + void + do_export(Export_function_body*) const; + void do_dump_expression(Ast_dump_context*) const; -- 2.30.2