diff options
author | Ian Lance Taylor <iant@golang.org> | 2019-02-14 01:21:03 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2019-02-14 01:21:03 +0000 |
commit | 0ce1c30b22af976b99a1183213ff070ea206d2c9 (patch) | |
tree | 4cdc9d7600498de405e0a3725dc520f1f0afa154 /gcc/go/go-gcc.cc | |
parent | 471f9e24a61aea7284a3f67ed7cd861e0c6805e3 (diff) | |
download | gcc-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.cc | 36 |
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); } |