* Go patch committed: Don't crash when using field tracking
@ 2014-12-10 0:56 Ian Lance Taylor
0 siblings, 0 replies; only message in thread
From: Ian Lance Taylor @ 2014-12-10 0:56 UTC (permalink / raw)
To: gcc-patches, gofrontend-dev
[-- Attachment #1: Type: text/plain, Size: 644 bytes --]
This patch to the Go compiler fixes a crash when using field tracking.
The code was failing to lower a function call added by the field
tracking code. When called in a type equality function for a type
that was not otherwise used, this could cause a crash as the type was
never lowered. This patch fixes that problem. I also observed that
it's entirely unnecessary to add field tracking information for a
reference from a compiler generated equality function, so this patch
also avoids doing that, thus fixing the compiler crash in a different
way. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu.
Committed to mainline.
Ian
[-- Attachment #2: foo.txt --]
[-- Type: text/plain, Size: 3235 bytes --]
diff -r 5633f8241f0b go/expressions.cc
--- a/go/expressions.cc Mon Dec 08 10:01:53 2014 -0800
+++ b/go/expressions.cc Tue Dec 09 16:41:41 2014 -0800
@@ -10729,6 +10729,10 @@
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 @@
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 -r 5633f8241f0b go/gogo.cc
--- a/go/gogo.cc Mon Dec 08 10:01:53 2014 -0800
+++ b/go/gogo.cc Tue Dec 09 16:41:41 2014 -0800
@@ -4433,6 +4433,7 @@
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 -r 5633f8241f0b go/gogo.h
--- a/go/gogo.h Mon Dec 08 10:01:53 2014 -0800
+++ b/go/gogo.h Tue Dec 09 16:41:41 2014 -0800
@@ -1071,6 +1071,18 @@
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 @@
// 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 -r 5633f8241f0b go/types.cc
--- a/go/types.cc Mon Dec 08 10:01:53 2014 -0800
+++ b/go/types.cc Tue Dec 09 16:41:41 2014 -0800
@@ -1805,6 +1805,7 @@
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 @@
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)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2014-12-10 0:56 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-12-10 0:56 Go patch committed: Don't crash when using field tracking Ian Lance Taylor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).