-dead_strip is now the default on Darwin
authorDemi Obenour <demiobenour@gmail.com>
Thu, 5 Jan 2017 22:06:26 +0000 (17:06 -0500)
committerBen Gamari <ben@smart-cactus.org>
Tue, 10 Jan 2017 18:22:30 +0000 (13:22 -0500)
This enables subsections-via-symbols (-dead_strip) by default on Darwin.
The Static Reference Table (SRT) needs to be split in order for
-dead_strip to be helpful, so this commit always splits it on Darwin
systems.

Test Plan: GHC CI on Darwin

Reviewers: erikd, austin, bgamari

Reviewed By: erikd, bgamari

Subscribers: erikd, thomie

Differential Revision: https://phabricator.haskell.org/D2911

GHC Trac Issues: #11040, #13049

compiler/main/DriverPipeline.hs
compiler/main/HscMain.hs

index 133bdde..a62233d 100644 (file)
@@ -1794,6 +1794,9 @@ linkBinary' staticLink dflags o_files dep_packages = do
               in ["-L" ++ l] ++ ["-Wl,-rpath", "-Wl," ++ libpath]
          | otherwise = ["-L" ++ l]
 
+    let dead_strip = if osMachOTarget (platformOS platform)
+                      then ["-Wl,-dead_strip"]
+                      else []
     let lib_paths = libraryPaths dflags
     let lib_path_opts = map ("-L"++) lib_paths
 
@@ -1808,16 +1811,17 @@ linkBinary' staticLink dflags o_files dep_packages = do
                                  -- HS packages, because libtool doesn't accept other options.
                                  -- In the case of iOS these need to be added by hand to the
                                  -- final link in Xcode.
-            else other_flags ++ package_hs_libs ++ extra_libs -- -Wl,-u,<sym> contained in other_flags
-                                                              -- needs to be put before -l<package>,
-                                                              -- otherwise Solaris linker fails linking
-                                                              -- a binary with unresolved symbols in RTS
-                                                              -- which are defined in base package
-                                                              -- the reason for this is a note in ld(1) about
-                                                              -- '-u' option: "The placement of this option
-                                                              -- on the command line is significant.
-                                                              -- This option must be placed before the library
-                                                              -- that defines the symbol."
+            else other_flags ++ dead_strip ++ package_hs_libs ++ extra_libs
+                 -- -Wl,-u,<sym> contained in other_flags
+                 -- needs to be put before -l<package>,
+                 -- otherwise Solaris linker fails linking
+                 -- a binary with unresolved symbols in RTS
+                 -- which are defined in base package
+                 -- the reason for this is a note in ld(1) about
+                 -- '-u' option: "The placement of this option
+                 -- on the command line is significant.
+                 -- This option must be placed before the library
+                 -- that defines the symbol."
 
     -- frameworks
     pkg_framework_opts <- getPkgFrameworkOpts dflags platform dep_packages
index 7d80912..12e8a1d 100644 (file)
@@ -137,6 +137,7 @@ import Maybes
 
 import DynFlags
 import ErrUtils
+import Platform ( platformOS, OS(OSDarwin) )
 
 import Outputable
 import NameEnv
@@ -1392,7 +1393,8 @@ doCodeGen hsc_env this_mod data_tycons
     -- we generate one SRT for the whole module.
     let
      pipeline_stream
-      | gopt Opt_SplitObjs dflags || gopt Opt_SplitSections dflags
+      | gopt Opt_SplitObjs dflags || gopt Opt_SplitSections dflags ||
+        platformOS (targetPlatform dflags) == OSDarwin
         = {-# SCC "cmmPipeline" #-}
           let run_pipeline us cmmgroup = do
                 let (topSRT', us') = initUs us emptySRT