diff options
| -rw-r--r-- | compiler/GHC/Driver/Flags.hs | 1 | ||||
| -rw-r--r-- | compiler/GHC/Driver/Session.hs | 6 | ||||
| -rw-r--r-- | compiler/GHC/Linker/Static.hs | 3 | ||||
| -rw-r--r-- | docs/users_guide/phases.rst | 14 |
4 files changed, 23 insertions, 1 deletions
diff --git a/compiler/GHC/Driver/Flags.hs b/compiler/GHC/Driver/Flags.hs index ee5144854d..7f8438bf2a 100644 --- a/compiler/GHC/Driver/Flags.hs +++ b/compiler/GHC/Driver/Flags.hs @@ -291,6 +291,7 @@ data GeneralFlag | Opt_Ticky_Dyn_Thunk | Opt_RPath | Opt_RelativeDynlibPaths + | Opt_CompactUnwind -- ^ @-fcompact-unwind@ | Opt_Hpc | Opt_FamAppCache | Opt_ExternalInterpreter diff --git a/compiler/GHC/Driver/Session.hs b/compiler/GHC/Driver/Session.hs index 780a38e3d7..6fc71e878a 100644 --- a/compiler/GHC/Driver/Session.hs +++ b/compiler/GHC/Driver/Session.hs @@ -2078,6 +2078,12 @@ dynamic_flags_deps = [ (NoArg (setGeneralFlag Opt_SingleLibFolder)) , make_ord_flag defGhcFlag "pie" (NoArg (setGeneralFlag Opt_PICExecutable)) , make_ord_flag defGhcFlag "no-pie" (NoArg (unSetGeneralFlag Opt_PICExecutable)) + , make_ord_flag defGhcFlag "fcompact-unwind" + (noArgM (\dflags -> do + if platformOS (targetPlatform dflags) == OSDarwin + then return (gopt_set dflags Opt_CompactUnwind) + else do addWarn "-compact-unwind is only implemented by the darwin platform. Ignoring." + return dflags)) ------- Specific phases -------------------------------------------- -- need to appear before -pgmL to be parsed as LLVM flags. diff --git a/compiler/GHC/Linker/Static.hs b/compiler/GHC/Linker/Static.hs index 5d63d59461..7a7dc89c82 100644 --- a/compiler/GHC/Linker/Static.hs +++ b/compiler/GHC/Linker/Static.hs @@ -218,7 +218,8 @@ linkBinary' staticLink logger tmpfs dflags unit_env o_files dep_units = do -- like -- ld: warning: could not create compact unwind for .LFB3: non-standard register 5 being saved in prolog -- on x86. - ++ (if toolSettings_ldSupportsCompactUnwind toolSettings' && + ++ (if not (gopt Opt_CompactUnwind dflags) && + toolSettings_ldSupportsCompactUnwind toolSettings' && not staticLink && (platformOS platform == OSDarwin) && case platformArch platform of diff --git a/docs/users_guide/phases.rst b/docs/users_guide/phases.rst index 8b99939d98..c931268bbd 100644 --- a/docs/users_guide/phases.rst +++ b/docs/users_guide/phases.rst @@ -1322,3 +1322,17 @@ for example). that do runtime dynamic linking, where code dynamically linked in the future might require the value of a CAF that would otherwise be garbage-collected. + +.. ghc-flag:: -fcompact-unwind + :shortdesc: Instruct the linker to produce a `__compact_unwind` section. + :type: dynamic + :category: linking + + :since: 9.4.1 + + This instructs the linker to produce an executable that supports Apple's + compact unwinding sections. These are used by C++ and Objective-C code + to unwind the stack when an exception occurs. + + In theory, the older `__eh_frame` section should also be usable for this + purpose, but this does not always work. |
