Commit a36cb5b1 by Ian Lance Taylor

compiler: implement go:noinline and go:nosplit directives

    
    Reviewed-on: https://go-review.googlesource.com/26652

From-SVN: r239315
parent 143d49f3
85a9c6992d9660e36972c279a5252fd9591bb765 8da2129a005cc1f44d4d993b0b7312b64c0d68a4
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.
...@@ -5083,11 +5083,19 @@ Function::get_or_make_decl(Gogo* gogo, Named_object* no) ...@@ -5083,11 +5083,19 @@ Function::get_or_make_decl(Gogo* gogo, Named_object* no)
if (this->calls_defer_retaddr_) if (this->calls_defer_retaddr_)
is_inlinable = false; is_inlinable = false;
// Check the //go:noinline compiler directive.
if ((this->pragmas_ & GOPRAGMA_NOINLINE) != 0)
is_inlinable = false;
// If this is a thunk created to call a function which calls // If this is a thunk created to call a function which calls
// the predeclared recover function, we need to disable // the predeclared recover function, we need to disable
// stack splitting for the thunk. // stack splitting for the thunk.
bool disable_split_stack = this->is_recover_thunk_; bool disable_split_stack = this->is_recover_thunk_;
// Check the //go:nosplit compiler directive.
if ((this->pragmas_ & GOPRAGMA_NOSPLIT) != 0)
disable_split_stack = true;
// This should go into a unique section if that has been // This should go into a unique section if that has been
// requested elsewhere, or if this is a nointerface function. // requested elsewhere, or if this is a nointerface function.
// We want to put a nointerface function into a unique section // We want to put a nointerface function into a unique section
......
...@@ -1842,13 +1842,11 @@ Lex::skip_cpp_comment() ...@@ -1842,13 +1842,11 @@ Lex::skip_cpp_comment()
{ {
// Applies to the next function. Do not split the stack when // Applies to the next function. Do not split the stack when
// entering the function. // entering the function.
// FIXME: Not implemented.
this->pragmas_ |= GOPRAGMA_NOSPLIT; this->pragmas_ |= GOPRAGMA_NOSPLIT;
} }
else if (verb == "go:noinline") else if (verb == "go:noinline")
{ {
// Applies to the next function. Do not inline the function. // Applies to the next function. Do not inline the function.
// FIXME: Not implemented.
this->pragmas_ |= GOPRAGMA_NOINLINE; this->pragmas_ |= GOPRAGMA_NOINLINE;
} }
else if (verb == "go:systemstack") else if (verb == "go:systemstack")
......
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