compiler: don't export bodies for functions marked "go:noinline"
authorIan Lance Taylor <ian@gcc.gnu.org>
Fri, 19 Jul 2019 23:10:55 +0000 (23:10 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 19 Jul 2019 23:10:55 +0000 (23:10 +0000)
    The current Mark_inline_candidates helper looks only at budget when
    deciding to mark a function or method as inline (with the proviso that
    IR constructs not yet supported by the inliner are given artificially
    high cost). This patch changes the helper to also look at whether a
    function has the "go:noinline" pragma; if it does have the pragma
    there is no point putting it into the export data (it will just make
    the export data bigger).

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/186923

From-SVN: r273611

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

index ccc1a24be26bce25d991a31a762502b53d84d362..2c536025f28331c950dbcab2d7569540ac365dc5 100644 (file)
@@ -1,4 +1,4 @@
-4df7c8d7af894ee93f50c3a50debdcf4e369a2c6
+e242929304e7a524ced56dc94605bbf6d83e6489
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index abd86868beef943da14321879fe2e52fa610a34b..30523f7209a415e9855f5f9c7fb18b4659f8afb1 100644 (file)
@@ -5109,6 +5109,8 @@ int
 Mark_inline_candidates::function(Named_object* no)
 {
   Function* func = no->func_value();
+  if ((func->pragmas() & GOPRAGMA_NOINLINE) != 0)
+    return TRAVERSE_CONTINUE;
   int budget = budget_heuristic;
   Inline_within_budget iwb(&budget);
   func->block()->traverse(&iwb);
@@ -5138,6 +5140,8 @@ Mark_inline_candidates::type(Type* t)
       Named_object* no = *p;
       go_assert(no->is_function());
       Function *func = no->func_value();
+      if ((func->pragmas() & GOPRAGMA_NOINLINE) != 0)
+        continue;
       int budget = budget_heuristic;
       Inline_within_budget iwb(&budget);
       func->block()->traverse(&iwb);