diff mbox

Go patch committed: expose the runtime code in a Call_expression

Message ID CAOyqgcXk0wWs=P+tVS0xM_o7kzxX7fQGdXVUZkGV0oFyW82H5A@mail.gmail.com
State New
Headers show

Commit Message

Ian Lance Taylor April 23, 2016, 4:58 a.m. UTC
This patch by Chris Manghane exposes the runtime function code in a
Call_expression, in the cases where function call is to a runtime
function.  This isn't useful by itself but is a prerequisite for
future work.  Bootstrapped and ran Go testsuite on
x86_64-pc-linux-gnu.  Committed to mainline.

Ian
diff mbox

Patch

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 235380)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-97b358f525584e45fa2e3d83fc7d3a091900927a
+944c3ca6ac7c204585fd73936894fe05de535b94
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/expressions.cc
===================================================================
--- gcc/go/gofrontend/expressions.cc	(revision 234304)
+++ gcc/go/gofrontend/expressions.cc	(working copy)
@@ -1141,7 +1141,13 @@  Expression*
 Expression::make_func_reference(Named_object* function, Expression* closure,
 				Location location)
 {
-  return new Func_expression(function, closure, location);
+  Func_expression* fe = new Func_expression(function, closure, location);
+
+  // Detect references to builtin functions and set the runtime code if
+  // appropriate.
+  if (function->is_function_declaration())
+    fe->set_runtime_code(Runtime::name_to_code(function->name()));
+  return fe;
 }
 
 // Class Func_descriptor_expression.
Index: gcc/go/gofrontend/expressions.h
===================================================================
--- gcc/go/gofrontend/expressions.h	(revision 234304)
+++ gcc/go/gofrontend/expressions.h	(working copy)
@@ -11,6 +11,7 @@ 
 #include <mpc.h>
 
 #include "operator.h"
+#include "runtime.h"
 
 class Gogo;
 class Translate_context;
@@ -2149,7 +2150,8 @@  class Func_expression : public Expressio
   Func_expression(Named_object* function, Expression* closure,
 		  Location location)
     : Expression(EXPRESSION_FUNC_REFERENCE, location),
-      function_(function), closure_(closure)
+      function_(function), closure_(closure),
+      runtime_code_(Runtime::NUMBER_OF_FUNCTIONS)
   { }
 
   // Return the object associated with the function.
@@ -2163,6 +2165,23 @@  class Func_expression : public Expressio
   closure()
   { return this->closure_; }
 
+  // Return whether this is a reference to a runtime function.
+  bool
+  is_runtime_function() const
+  { return this->runtime_code_ != Runtime::NUMBER_OF_FUNCTIONS; }
+
+  // Return the runtime code for this function expression.
+  // Returns Runtime::NUMBER_OF_FUNCTIONS if this is not a reference to a
+  // runtime function.
+  Runtime::Function
+  runtime_code() const
+  { return this->runtime_code_; }
+
+  // Set the runtime code for this function expression.
+  void
+  set_runtime_code(Runtime::Function code)
+  { this->runtime_code_ = code; }
+
   // Return a backend expression for the code of a function.
   static Bexpression*
   get_code_pointer(Gogo*, Named_object* function, Location loc);
@@ -2204,6 +2223,8 @@  class Func_expression : public Expressio
   // be a struct holding pointers to all the variables referenced by
   // this function and defined in enclosing functions.
   Expression* closure_;
+  // The runtime code for the referenced function.
+  Runtime::Function runtime_code_;
 };
 
 // A function descriptor.  A function descriptor is a struct with a
Index: gcc/go/gofrontend/runtime.cc
===================================================================
--- gcc/go/gofrontend/runtime.cc	(revision 234304)
+++ gcc/go/gofrontend/runtime.cc	(working copy)
@@ -402,3 +402,39 @@  Runtime::map_iteration_type()
 				Linemap::predeclared_location());
   return Type::make_array_type(runtime_function_type(RFT_POINTER), iexpr);
 }
+
+
+// Get the runtime code for a named builtin function.  This is used as a helper
+// when creating function references for call expressions.  Every reference to
+// a builtin runtime function should have the associated runtime code.  If the
+// name is ambiguous and can refer to many runtime codes, return
+// NUMBER_OF_FUNCTIONS.
+
+Runtime::Function
+Runtime::name_to_code(const std::string& name)
+{
+  Function code = Runtime::NUMBER_OF_FUNCTIONS;
+
+  // Aliases seen in function declaration code.
+  // TODO(cmang): Add other aliases.
+  if (name == "new")
+    code = Runtime::NEW;
+  else if (name == "close")
+    code = Runtime::CLOSE;
+  else if (name == "copy")
+    code = Runtime::COPY;
+  else if (name == "append")
+    code = Runtime::APPEND;
+  else if (name == "delete")
+    code = Runtime::MAPDELETE;
+  else
+    {
+      // Look through the known names for a match.
+      for (size_t i = 0; i < Runtime::NUMBER_OF_FUNCTIONS; i++)
+	{
+	  if (strcmp(runtime_functions[i].name, name.c_str()) == 0)
+	    code = static_cast<Runtime::Function>(i);
+	}
+    }
+  return code;
+}
Index: gcc/go/gofrontend/runtime.h
===================================================================
--- gcc/go/gofrontend/runtime.h	(revision 234304)
+++ gcc/go/gofrontend/runtime.h	(working copy)
@@ -43,6 +43,10 @@  class Runtime
   static Type*
   map_iteration_type();
 
+  // Return the runtime code for a named builtin function.
+  static Function
+  name_to_code(const std::string&);
+
  private:
   static Named_object*
   runtime_declaration(Function);