compiler: Don't track fields in compiler-generated hash and eq funcs.
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 10 Dec 2014 00:56:00 +0000 (00:56 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 10 Dec 2014 00:56:00 +0000 (00:56 +0000)
Also, lower field tracking calls.

From-SVN: r218554

gcc/go/gofrontend/expressions.cc
gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/gogo.h
gcc/go/gofrontend/types.cc

index 024b2c4b2ee0df932a535d3597fa080ee0a87821..0916adc3f3eec6047edfce0d433b0441f4802205 100644 (file)
@@ -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
index 453db9af9c1acc405ec70ec5a246573eb1ddcb66..d7f4437d4f473e201f0e38f0ba56c50b2890ddca 100644 (file)
@@ -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)
 {
 }
index 10aea696c2604dff6ddf053ddcdc319c4d94c45f..a75ae4b9542d025d7e410254f307f23be6ac193f 100644 (file)
@@ -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;
index 7035524033a4b465530aaa855ba3309d16f21a42..6533cd46ea2977a27b2110cefb1a6f68eb86e646 100644 (file)
@@ -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)