From 8cc43cb40362b9120858264a853c0222c35fe7e7 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 18 Oct 2018 23:02:27 +0000 Subject: [PATCH] Revert SVN revision 264561, incorrectly committed directly to the GCC repo rather than to the master repo. From-SVN: r265294 --- gcc/go/gofrontend/escape.cc | 20 +++++++++++++------- gcc/go/gofrontend/expressions.cc | 2 +- gcc/go/gofrontend/gogo.h | 2 +- gcc/go/gofrontend/types.cc | 13 +++++++++---- gcc/go/gofrontend/types.h | 2 +- gcc/go/gofrontend/wb.cc | 10 +++++++--- 6 files changed, 32 insertions(+), 17 deletions(-) diff --git a/gcc/go/gofrontend/escape.cc b/gcc/go/gofrontend/escape.cc index eb23c2dc4a0..b56b4d0b57d 100644 --- a/gcc/go/gofrontend/escape.cc +++ b/gcc/go/gofrontend/escape.cc @@ -979,7 +979,7 @@ Gogo::analyze_escape() for (std::vector::iterator fn = stack.begin(); fn != stack.end(); ++fn) - this->tag_function(*fn); + this->tag_function(context, *fn); if (this->debug_escape_level() != 0) { @@ -1232,10 +1232,10 @@ Escape_analysis_loop::statement(Block*, size_t*, Statement* s) class Escape_analysis_assign : public Traverse { public: - Escape_analysis_assign(Escape_context* context) + Escape_analysis_assign(Escape_context* context, Named_object* fn) : Traverse(traverse_statements | traverse_expressions), - context_(context) + context_(context), fn_(fn) { } // Model statements within a function as assignments and flows between nodes. @@ -1272,6 +1272,8 @@ public: private: // The escape context for this set of functions. Escape_context* context_; + // The current function being analyzed. + Named_object* fn_; }; // Helper function to detect self assignment like the following. @@ -2702,7 +2704,7 @@ Gogo::assign_connectivity(Escape_context* context, Named_object* fn) int save_depth = context->loop_depth(); context->set_loop_depth(1); - Escape_analysis_assign ea(context); + Escape_analysis_assign ea(context, fn); Function::Results* res = fn->func_value()->result_variables(); if (res != NULL) { @@ -3265,13 +3267,17 @@ Gogo::propagate_escape(Escape_context* context, Node* dst) class Escape_analysis_tag { public: - Escape_analysis_tag() + Escape_analysis_tag(Escape_context* context) + : context_(context) { } // Add notes to the function's type about the escape information of its // input parameters. void tag(Named_object* fn); + + private: + Escape_context* context_; }; void @@ -3379,9 +3385,9 @@ Escape_analysis_tag::tag(Named_object* fn) // retain analysis results across imports. void -Gogo::tag_function(Named_object* fn) +Gogo::tag_function(Escape_context* context, Named_object* fn) { - Escape_analysis_tag eat; + Escape_analysis_tag eat(context); eat.tag(fn); } diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 0a6910ac879..e1feb66f66a 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -10108,7 +10108,7 @@ Call_expression::do_type() else if (results->size() == 1) ret = results->begin()->type(); else - ret = Type::make_call_multiple_result_type(); + ret = Type::make_call_multiple_result_type(this); this->type_ = ret; diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h index 07d08c2dc60..0864ee1d72a 100644 --- a/gcc/go/gofrontend/gogo.h +++ b/gcc/go/gofrontend/gogo.h @@ -680,7 +680,7 @@ class Gogo // Add notes about the escape level of a function's input and output // parameters for exporting and importing top level functions. void - tag_function(Named_object*); + tag_function(Escape_context*, Named_object*); // Reclaim memory of escape analysis Nodes. void diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index bb90e92716a..e368ee0a754 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -5441,8 +5441,9 @@ Type::make_nil_type() class Call_multiple_result_type : public Type { public: - Call_multiple_result_type() - : Type(TYPE_CALL_MULTIPLE_RESULT) + Call_multiple_result_type(Call_expression* call) + : Type(TYPE_CALL_MULTIPLE_RESULT), + call_(call) { } protected: @@ -5475,14 +5476,18 @@ class Call_multiple_result_type : public Type void do_mangled_name(Gogo*, std::string*) const { go_assert(saw_errors()); } + + private: + // The expression being called. + Call_expression* call_; }; // Make a call result type. Type* -Type::make_call_multiple_result_type() +Type::make_call_multiple_result_type(Call_expression* call) { - return new Call_multiple_result_type(); + return new Call_multiple_result_type(call); } // Class Struct_field. diff --git a/gcc/go/gofrontend/types.h b/gcc/go/gofrontend/types.h index 9e3f2f36e3c..8d0faad8b8c 100644 --- a/gcc/go/gofrontend/types.h +++ b/gcc/go/gofrontend/types.h @@ -511,7 +511,7 @@ class Type make_nil_type(); static Type* - make_call_multiple_result_type(); + make_call_multiple_result_type(Call_expression*); static Struct_type* make_struct_type(Struct_field_list* fields, Location); diff --git a/gcc/go/gofrontend/wb.cc b/gcc/go/gofrontend/wb.cc index 3f0a89f8ceb..ccd318d0440 100644 --- a/gcc/go/gofrontend/wb.cc +++ b/gcc/go/gofrontend/wb.cc @@ -189,8 +189,9 @@ Mark_address_taken::expression(Expression** pexpr) class Check_escape : public Traverse { public: - Check_escape() - : Traverse(traverse_expressions | traverse_variables) + Check_escape(Gogo* gogo) + : Traverse(traverse_expressions | traverse_variables), + gogo_(gogo) { } int @@ -198,6 +199,9 @@ class Check_escape : public Traverse int variable(Named_object*); + + private: + Gogo* gogo_; }; int @@ -617,7 +621,7 @@ Gogo::add_write_barriers() { this->propagate_writebarrierrec(); - Check_escape chk; + Check_escape chk(this); this->traverse(&chk); } -- 2.30.2