From: Ian Lance Taylor Date: Wed, 10 Dec 2014 00:56:00 +0000 (+0000) Subject: compiler: Don't track fields in compiler-generated hash and eq funcs. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2a664a279af73c048fcfdad32eb8b6c29f27dcda;p=gcc.git compiler: Don't track fields in compiler-generated hash and eq funcs. Also, lower field tracking calls. From-SVN: r218554 --- diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 024b2c4b2ee..0916adc3f3e 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -10729,6 +10729,10 @@ Field_reference_expression::do_lower(Gogo* gogo, Named_object* function, if (field->tag().find("go:\"track\"") == std::string::npos) return this; + // References from functions generated by the compiler don't count. + if (function->func_value()->is_type_specific_function()) + return this; + // We have found a reference to a tracked field. Build a call to // the runtime function __go_fieldtrack with a string that describes // the field. FIXME: We should only call this once per referenced @@ -10785,6 +10789,7 @@ Field_reference_expression::do_lower(Gogo* gogo, Named_object* function, e = Expression::make_unary(OPERATOR_AND, e, loc); Expression* call = Runtime::make_call(Runtime::FIELDTRACK, loc, 1, e); + gogo->lower_expression(function, inserter, &call); inserter->insert(Statement::make_statement(call, false)); // Put this function, and the global variable we just created, into diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index 453db9af9c1..d7f4437d4f4 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -4433,6 +4433,7 @@ Function::Function(Function_type* type, Function* enclosing, Block* block, is_sink_(false), results_are_named_(false), nointerface_(false), is_unnamed_type_stub_method_(false), calls_recover_(false), is_recover_thunk_(false), has_recover_thunk_(false), + calls_defer_retaddr_(false), is_type_specific_function_(false), in_unique_section_(false) { } diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h index 10aea696c26..a75ae4b9542 100644 --- a/gcc/go/gofrontend/gogo.h +++ b/gcc/go/gofrontend/gogo.h @@ -1071,6 +1071,18 @@ class Function set_calls_defer_retaddr() { this->calls_defer_retaddr_ = true; } + // Whether this is a type hash or equality function created by the + // compiler. + bool + is_type_specific_function() + { return this->is_type_specific_function_; } + + // Record that this function is a type hash or equality function + // created by the compiler. + void + set_is_type_specific_function() + { this->is_type_specific_function_ = true; } + // Mark the function as going into a unique section. void set_in_unique_section() @@ -1199,6 +1211,9 @@ class Function // True if this is a thunk built for a defer statement that calls // the __go_set_defer_retaddr runtime function. bool calls_defer_retaddr_ : 1; + // True if this is a function built by the compiler to as a hash or + // equality function for some type. + bool is_type_specific_function_ : 1; // True if this function should be put in a unique section. This is // turned on for field tracking. bool in_unique_section_ : 1; diff --git a/gcc/go/gofrontend/types.cc b/gcc/go/gofrontend/types.cc index 7035524033a..6533cd46ea2 100644 --- a/gcc/go/gofrontend/types.cc +++ b/gcc/go/gofrontend/types.cc @@ -1805,6 +1805,7 @@ Type::write_specific_type_functions(Gogo* gogo, Named_type* name, Named_object* hash_fn = gogo->start_function(hash_name, hash_fntype, false, bloc); + hash_fn->func_value()->set_is_type_specific_function(); gogo->start_block(bloc); if (name != NULL && name->real_type()->named_type() != NULL) @@ -1825,6 +1826,7 @@ Type::write_specific_type_functions(Gogo* gogo, Named_type* name, Named_object *equal_fn = gogo->start_function(equal_name, equal_fntype, false, bloc); + equal_fn->func_value()->set_is_type_specific_function(); gogo->start_block(bloc); if (name != NULL && name->real_type()->named_type() != NULL)