Commit 0e94da57 by Ian Lance Taylor

compiler: Expose runtime code through Func_expression.

    
    Enables us to easily check if a Call_expression is a call to a runtime
    function and, if so, which runtime function is corresponds to.
    This will be used during escape analysis.
    
    Reviewed-on: https://go-review.googlesource.com/18544

From-SVN: r235383
parent 216f7526
97b358f525584e45fa2e3d83fc7d3a091900927a 944c3ca6ac7c204585fd73936894fe05de535b94
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -1141,7 +1141,13 @@ Expression* ...@@ -1141,7 +1141,13 @@ Expression*
Expression::make_func_reference(Named_object* function, Expression* closure, Expression::make_func_reference(Named_object* function, Expression* closure,
Location location) 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. // Class Func_descriptor_expression.
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <mpc.h> #include <mpc.h>
#include "operator.h" #include "operator.h"
#include "runtime.h"
class Gogo; class Gogo;
class Translate_context; class Translate_context;
...@@ -2149,7 +2150,8 @@ class Func_expression : public Expression ...@@ -2149,7 +2150,8 @@ class Func_expression : public Expression
Func_expression(Named_object* function, Expression* closure, Func_expression(Named_object* function, Expression* closure,
Location location) Location location)
: Expression(EXPRESSION_FUNC_REFERENCE, 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. // Return the object associated with the function.
...@@ -2163,6 +2165,23 @@ class Func_expression : public Expression ...@@ -2163,6 +2165,23 @@ class Func_expression : public Expression
closure() closure()
{ return this->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. // Return a backend expression for the code of a function.
static Bexpression* static Bexpression*
get_code_pointer(Gogo*, Named_object* function, Location loc); get_code_pointer(Gogo*, Named_object* function, Location loc);
...@@ -2204,6 +2223,8 @@ class Func_expression : public Expression ...@@ -2204,6 +2223,8 @@ class Func_expression : public Expression
// be a struct holding pointers to all the variables referenced by // be a struct holding pointers to all the variables referenced by
// this function and defined in enclosing functions. // this function and defined in enclosing functions.
Expression* closure_; Expression* closure_;
// The runtime code for the referenced function.
Runtime::Function runtime_code_;
}; };
// A function descriptor. A function descriptor is a struct with a // A function descriptor. A function descriptor is a struct with a
......
...@@ -402,3 +402,39 @@ Runtime::map_iteration_type() ...@@ -402,3 +402,39 @@ Runtime::map_iteration_type()
Linemap::predeclared_location()); Linemap::predeclared_location());
return Type::make_array_type(runtime_function_type(RFT_POINTER), iexpr); 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;
}
...@@ -43,6 +43,10 @@ class Runtime ...@@ -43,6 +43,10 @@ class Runtime
static Type* static Type*
map_iteration_type(); map_iteration_type();
// Return the runtime code for a named builtin function.
static Function
name_to_code(const std::string&);
private: private:
static Named_object* static Named_object*
runtime_declaration(Function); runtime_declaration(Function);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment