Commit f22693cb by Ian Lance Taylor

compiler: Mark concurrent calls.

    
    If a call expression is executed in an independent goroutine via
    use of a Go statement, mark it as concurrent.
    
    Reviewed-on: https://go-review.googlesource.com/18700

From-SVN: r235608
parent 6181bc30
b17e404f5b8954e008b512741296d238ab7b2ef9 50b2b468a85045c66d60112dc094c31ec4897123
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -1985,8 +1985,8 @@ class Call_expression : public Expression ...@@ -1985,8 +1985,8 @@ class Call_expression : public Expression
fn_(fn), args_(args), type_(NULL), results_(NULL), call_(NULL), fn_(fn), args_(args), type_(NULL), results_(NULL), call_(NULL),
call_temp_(NULL), expected_result_count_(0), is_varargs_(is_varargs), call_temp_(NULL), expected_result_count_(0), is_varargs_(is_varargs),
varargs_are_lowered_(false), types_are_determined_(false), varargs_are_lowered_(false), types_are_determined_(false),
is_deferred_(false), issued_error_(false), is_multi_value_arg_(false), is_deferred_(false), is_concurrent_(false), issued_error_(false),
is_flattened_(false) is_multi_value_arg_(false), is_flattened_(false)
{ } { }
// The function to call. // The function to call.
...@@ -2057,6 +2057,16 @@ class Call_expression : public Expression ...@@ -2057,6 +2057,16 @@ class Call_expression : public Expression
set_is_deferred() set_is_deferred()
{ this->is_deferred_ = true; } { this->is_deferred_ = true; }
// Whether this call is concurrently executed.
bool
is_concurrent() const
{ return this->is_concurrent_; }
// Note that the call is concurrently executed.
void
set_is_concurrent()
{ this->is_concurrent_ = true; }
// We have found an error with this call expression; return true if // We have found an error with this call expression; return true if
// we should report it. // we should report it.
bool bool
...@@ -2170,6 +2180,8 @@ class Call_expression : public Expression ...@@ -2170,6 +2180,8 @@ class Call_expression : public Expression
bool types_are_determined_; bool types_are_determined_;
// True if the call is an argument to a defer statement. // True if the call is an argument to a defer statement.
bool is_deferred_; bool is_deferred_;
// True if the call is an argument to a go statement.
bool is_concurrent_;
// True if we reported an error about a mismatch between call // True if we reported an error about a mismatch between call
// results and uses. This is to avoid producing multiple errors // results and uses. This is to avoid producing multiple errors
// when there are multiple Call_result_expressions. // when there are multiple Call_result_expressions.
......
...@@ -2532,7 +2532,9 @@ Thunk_statement::build_thunk(Gogo* gogo, const std::string& thunk_name) ...@@ -2532,7 +2532,9 @@ Thunk_statement::build_thunk(Gogo* gogo, const std::string& thunk_name)
gogo->flatten_block(function, b); gogo->flatten_block(function, b);
if (may_call_recover || recover_arg != NULL) if (may_call_recover
|| recover_arg != NULL
|| this->classification() == STATEMENT_GO)
{ {
// Dig up the call expression, which may have been changed // Dig up the call expression, which may have been changed
// during lowering. // during lowering.
...@@ -2546,6 +2548,8 @@ Thunk_statement::build_thunk(Gogo* gogo, const std::string& thunk_name) ...@@ -2546,6 +2548,8 @@ Thunk_statement::build_thunk(Gogo* gogo, const std::string& thunk_name)
{ {
if (may_call_recover) if (may_call_recover)
ce->set_is_deferred(); ce->set_is_deferred();
if (this->classification() == STATEMENT_GO)
ce->set_is_concurrent();
if (recover_arg != NULL) if (recover_arg != NULL)
ce->set_recover_arg(recover_arg); ce->set_recover_arg(recover_arg);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment