summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorAndreas Klebinger <klebinger.andreas@gmx.at>2020-11-17 19:01:08 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-11-26 16:00:32 -0500
commita84e53f978341135355c5c82cd7af2ae2efa5e72 (patch)
tree931c79cf29f6ce8fbb38b19a5c1250a0855d5ca5 /includes
parentbe5d74caab64abf9d986fc7290f62731db7e73e7 (diff)
downloadhaskell-a84e53f978341135355c5c82cd7af2ae2efa5e72.tar.gz
RTS: Fix failed inlining of copy_tag.
On windows using gcc-10 gcc failed to inline copy_tag into evacuate. To fix this we now set the always_inline attribute for the various copy* functions in Evac.c. The main motivation here is not the overhead of the function call, but rather that this allows the code to "specialize" for the size of the closure we copy which is often known at compile time. An earlier commit also tried to avoid evacuate_large inlining. But didn't quite succeed. So I also marked evacuate_large as noinline. Fixes #12416
Diffstat (limited to 'includes')
-rw-r--r--includes/Rts.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/includes/Rts.h b/includes/Rts.h
index 1e5a60262b..027d5173a1 100644
--- a/includes/Rts.h
+++ b/includes/Rts.h
@@ -37,12 +37,17 @@ extern "C" {
#include "HsFFI.h"
#include "RtsAPI.h"
-// Turn off inlining when debugging - it obfuscates things
+// Disencourage gcc from inlining when debugging - it obfuscates things
#if defined(DEBUG)
# undef STATIC_INLINE
# define STATIC_INLINE static
#endif
+// Fine grained inlining control helpers.
+#define ATTR_ALWAYS_INLINE __attribute__((always_inline))
+#define ATTR_NOINLINE __attribute__((noinline))
+
+
#include "rts/Types.h"
#include "rts/Time.h"