summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/GHC/Driver/Flags.hs1
-rw-r--r--compiler/GHC/Driver/Session.hs6
-rw-r--r--compiler/GHC/Linker/Static.hs3
-rw-r--r--docs/users_guide/phases.rst14
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.