aboutsummaryrefslogtreecommitdiff
path: root/gcc/go/go-gcc.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2019-02-14 01:21:03 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2019-02-14 01:21:03 +0000
commit0ce1c30b22af976b99a1183213ff070ea206d2c9 (patch)
tree4cdc9d7600498de405e0a3725dc520f1f0afa154 /gcc/go/go-gcc.cc
parent471f9e24a61aea7284a3f67ed7cd861e0c6805e3 (diff)
downloadgcc-0ce1c30b22af976b99a1183213ff070ea206d2c9.zip
gcc-0ce1c30b22af976b99a1183213ff070ea206d2c9.tar.gz
gcc-0ce1c30b22af976b99a1183213ff070ea206d2c9.tar.bz2
go-gcc.cc: #include "opts.h".
* go-gcc.cc: #include "opts.h". (Gcc_backend::function): Compile thunks with -Os. From-SVN: r268861
Diffstat (limited to 'gcc/go/go-gcc.cc')
-rw-r--r--gcc/go/go-gcc.cc36
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/go/go-gcc.cc b/gcc/go/go-gcc.cc
index 4e9e0e3..d781ef5 100644
--- a/gcc/go/go-gcc.cc
+++ b/gcc/go/go-gcc.cc
@@ -25,6 +25,7 @@
#include <gmp.h>
#include "tree.h"
+#include "opts.h"
#include "fold-const.h"
#include "stringpool.h"
#include "stor-layout.h"
@@ -3103,6 +3104,41 @@ Gcc_backend::function(Btype* fntype, const std::string& name,
DECL_DECLARED_INLINE_P(decl) = 1;
}
+ // Optimize thunk functions for size. A thunk created for a defer
+ // statement that may call recover looks like:
+ // if runtime.setdeferretaddr(L1) {
+ // goto L1
+ // }
+ // realfn()
+ // L1:
+ // The idea is that L1 should be the address to which realfn
+ // returns. This only works if this little function is not over
+ // optimized. At some point GCC started duplicating the epilogue in
+ // the basic-block reordering pass, breaking this assumption.
+ // Optimizing the function for size avoids duplicating the epilogue.
+ // This optimization shouldn't matter for any thunk since all thunks
+ // are small.
+ size_t pos = name.find("..thunk");
+ if (pos != std::string::npos)
+ {
+ for (pos += 7; pos < name.length(); ++pos)
+ {
+ if (name[pos] < '0' || name[pos] > '9')
+ break;
+ }
+ if (pos == name.length())
+ {
+ struct cl_optimization cur_opts;
+ cl_optimization_save(&cur_opts, &global_options);
+ global_options.x_optimize_size = 1;
+ global_options.x_optimize_fast = 0;
+ global_options.x_optimize_debug = 0;
+ DECL_FUNCTION_SPECIFIC_OPTIMIZATION(decl) =
+ build_optimization_node(&global_options);
+ cl_optimization_restore(&global_options, &cur_opts);
+ }
+ }
+
go_preserve_from_gc(decl);
return new Bfunction(decl);
}