nativeGen: Fix string merging on Windows
authorBen Gamari <bgamari.foss@gmail.com>
Thu, 8 Dec 2016 21:33:42 +0000 (16:33 -0500)
committerBen Gamari <ben@smart-cactus.org>
Thu, 8 Dec 2016 23:44:55 +0000 (18:44 -0500)
D1290 places string constants in the `.rodata.str` section with `aMS`
section flags so that the linker can merge them. However, it seems that
ld doesn't understand these flags. It appears that `gcc
-fmerge-constants` uses the `dr` flags on Windows. Make GHC do the same.

Test Plan: Validate on Windows

Reviewers: xnyhps, austin, Phyx

Reviewed By: Phyx

Subscribers: thomie, trommler

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

GHC Trac Issues: #9577

compiler/nativeGen/PprBase.hs

index e7feb8a..10ed2fb 100644 (file)
@@ -98,16 +98,19 @@ pprGNUSectionHeader t suffix = sdocWithDynFlags $ \dflags ->
   let splitSections = gopt Opt_SplitSections dflags
       subsection | splitSections = char '.' <> ppr suffix
                  | otherwise     = empty
-  in  text ".section " <> ptext header <> subsection
+  in  text ".section " <> ptext (header dflags) <> subsection
   where
-    header = case t of
+    header dflags = case t of
       Text -> sLit ".text"
       Data -> sLit ".data"
       ReadOnlyData -> sLit ".rodata"
       RelocatableReadOnlyData -> sLit ".data.rel.ro"
       UninitialisedData -> sLit ".bss"
       ReadOnlyData16 -> sLit ".rodata.cst16"
-      CString -> sLit ".rodata.str1.1,\"aMS\",@progbits,1"
+      CString
+        | OSMinGW32 <- platformOS (targetPlatform dflags)
+          -> sLit ".rdata,\"dr\""
+        | otherwise -> sLit ".rodata.str1.1,\"aMS\",@progbits,1"
       OtherSection _ ->
         panic "PprBase.pprGNUSectionHeader: unknown section type"