From 955aa684e5ffb0eeca10d1e51befa9378b511222 Mon Sep 17 00:00:00 2001 From: Ben Gamari <ben@smart-cactus.org> Date: Sun, 22 Jan 2023 08:11:02 -0500 Subject: [PATCH] nativeGen: Disable asm-shortcutting on Darwin Asm-shortcutting may produce relative references to symbols defined in other compilation units. This is not something that MachO relocations support (see #21972). For this reason we disable the optimisation on Darwin. We do so without a warning since this flag is enabled by `-O2`. Another way to address this issue would be to rather implement a PLT-relocatable jump-table strategy. However, this would only benefit Darwin and does not seem worth the effort. Closes #21972. --- compiler/GHC/CmmToAsm.hs | 15 +++++++++++++++ docs/users_guide/using-optimisation.rst | 6 ++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/compiler/GHC/CmmToAsm.hs b/compiler/GHC/CmmToAsm.hs index c0ac96fa799b..94bdaa648b0e 100644 --- a/compiler/GHC/CmmToAsm.hs +++ b/compiler/GHC/CmmToAsm.hs @@ -812,6 +812,19 @@ generateJumpTables ncgImpl xs = concatMap f xs -- ----------------------------------------------------------------------------- -- Shortcut branches +-- Note [No asm-shortcutting on Darwin] +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- Asm-shortcutting may produce relative references to symbols defined in +-- other compilation units. This is not something that MachO relocations +-- support (see #21972). For this reason we disable the optimisation on Darwin. +-- We do so in the backend without a warning since this flag is enabled by +-- `-O2`. +-- +-- Another way to address this issue would be to rather implement a +-- PLT-relocatable jump-table strategy. However, this would only benefit Darwin +-- and does not seem worth the effort as this optimisation generally doesn't +-- offer terribly great benefits. + shortcutBranches :: forall statics instr jumpDest. (Outputable jumpDest) => NCGConfig @@ -822,6 +835,8 @@ shortcutBranches shortcutBranches config ncgImpl tops weights | ncgEnableShortcutting config + -- See Note [No asm-shortcutting on Darwin] + , not $ osMachOTarget $ platformOS $ ncgPlatform config = ( map (apply_mapping ncgImpl mapping) tops' , shortcutWeightMap mappingBid <$!> weights ) | otherwise diff --git a/docs/users_guide/using-optimisation.rst b/docs/users_guide/using-optimisation.rst index d3ca68a1df46..df87fdb6a3da 100644 --- a/docs/users_guide/using-optimisation.rst +++ b/docs/users_guide/using-optimisation.rst @@ -262,8 +262,10 @@ by saying ``-fno-wombat``. of a unconditionally jump, we replace all jumps to A by jumps to the successor of A. - This is mostly done during Cmm passes. However this can miss corner cases. So at -O2 - we run the pass again at the asm stage to catch these. + This is mostly done during Cmm passes. However this can miss corner cases. + So at ``-O2`` this flag runs the pass again at the assembly stage to catch + these. Note that due to platform limitations (:ghc-ticket:`21972`) this flag + does nothing on macOS. .. ghc-flag:: -fblock-layout-cfg :shortdesc: Use the new cfg based block layout algorithm. -- GitLab