compiler: implement go:noinline and go:nosplit directives
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 10 Aug 2016 00:46:35 +0000 (00:46 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 10 Aug 2016 00:46:35 +0000 (00:46 +0000)
    Reviewed-on: https://go-review.googlesource.com/26652

From-SVN: r239315

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/gogo.cc
gcc/go/gofrontend/lex.cc

index d4c7a90d8b75345ea94fb5d0ec7d7b9cd81dfd21..72d8f1e531c2978be4bef3062d66797b99930f72 100644 (file)
@@ -1,4 +1,4 @@
-85a9c6992d9660e36972c279a5252fd9591bb765
+8da2129a005cc1f44d4d993b0b7312b64c0d68a4
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index a72ef9520ecc934542ba4728ffab07e1a4a810d9..0bbf6ac71915ce1cdeb0d28b51b52f55ab432e15 100644 (file)
@@ -5083,11 +5083,19 @@ Function::get_or_make_decl(Gogo* gogo, Named_object* no)
       if (this->calls_defer_retaddr_)
        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
       // the predeclared recover function, we need to disable
       // stack splitting for the 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
       // requested elsewhere, or if this is a nointerface function.
       // We want to put a nointerface function into a unique section
index 9498c7dfc0b9ecaa1415d72f3621ec3e0d1d76e1..692aa502fec73161912476e0d9567b267e8b439e 100644 (file)
@@ -1842,13 +1842,11 @@ Lex::skip_cpp_comment()
     {
       // Applies to the next function.  Do not split the stack when
       // entering the function.
-      // FIXME: Not implemented.
       this->pragmas_ |= GOPRAGMA_NOSPLIT;
     }
   else if (verb == "go:noinline")
     {
       // Applies to the next function.  Do not inline the function.
-      // FIXME: Not implemented.
       this->pragmas_ |= GOPRAGMA_NOINLINE;
     }
   else if (verb == "go:systemstack")