[commit: ghc] master: Fix DWARF generation for MinGW (#10468) (a66ef35)

git at git.haskell.org git at git.haskell.org
Thu Jun 11 17:10:35 UTC 2015


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/a66ef3567ea29c93a9c010befc672602dc1c644c/ghc

>---------------------------------------------------------------

commit a66ef3567ea29c93a9c010befc672602dc1c644c
Author: Peter Wortmann <scpmw at leeds.ac.uk>
Date:   Thu Jun 11 12:09:55 2015 -0500

    Fix DWARF generation for MinGW (#10468)
    
    Fortunately this is relatively straightforward - all we need to do is
    switch to a non-ELF-specific way of specifying object file sections and
    make sure that section-relative addresses work correctly. This is enough
    to make "gdb" work on MinGW builds.


>---------------------------------------------------------------

a66ef3567ea29c93a9c010befc672602dc1c644c
 compiler/nativeGen/Dwarf.hs           |  2 +-
 compiler/nativeGen/Dwarf/Constants.hs | 12 +++++++-----
 compiler/nativeGen/Dwarf/Types.hs     | 14 ++++++++------
 3 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/compiler/nativeGen/Dwarf.hs b/compiler/nativeGen/Dwarf.hs
index ff86fd8..34f1ed6 100644
--- a/compiler/nativeGen/Dwarf.hs
+++ b/compiler/nativeGen/Dwarf.hs
@@ -86,7 +86,7 @@ compileUnitHeader unitU = sdocWithPlatform $ \plat ->
   in vcat [ ptext (sLit "\t.long ") <> length  -- compilation unit size
           , ppr cuLabel <> colon
           , ptext (sLit "\t.word 3")           -- DWARF version
-          , pprDwWord (sectionOffset dwarfAbbrevLabel dwarfAbbrevLabel)
+          , sectionOffset dwarfAbbrevLabel dwarfAbbrevLabel
                                                -- abbrevs offset
           , ptext (sLit "\t.byte ") <> ppr (platformWordSize plat) -- word size
           ]
diff --git a/compiler/nativeGen/Dwarf/Constants.hs b/compiler/nativeGen/Dwarf/Constants.hs
index 2cd54a7..4b334fc 100644
--- a/compiler/nativeGen/Dwarf/Constants.hs
+++ b/compiler/nativeGen/Dwarf/Constants.hs
@@ -122,12 +122,14 @@ dwarfFrameSection  = dwarfSection "frame"
 dwarfGhcSection    = dwarfSection "ghc"
 
 dwarfSection :: String -> SDoc
-dwarfSection name = sdocWithPlatform $ \plat ->
+dwarfSection name = sdocWithPlatform $ \plat -> ftext $ mkFastString $
   case platformOS plat of
-    OSDarwin -> ftext $ mkFastString $
-                  ".section __DWARF,__debug_" ++ name ++ ",regular,debug"
-    _other   -> ftext $ mkFastString $
-                  ".section .debug_" ++ name ++ ",\"\", at progbits"
+    os | osElfTarget os
+       -> "\t.section .debug_" ++ name ++ ",\"\", at progbits"
+       | osMachOTarget os
+       -> "\t.section __DWARF,__debug_" ++ name ++ ",regular,debug"
+       | otherwise
+       -> "\t.section .debug_" ++ name ++ ",\"dr\""
 
 -- | Dwarf section labels
 dwarfInfoLabel, dwarfAbbrevLabel, dwarfLineLabel, dwarfFrameLabel :: LitString
diff --git a/compiler/nativeGen/Dwarf/Types.hs b/compiler/nativeGen/Dwarf/Types.hs
index 520b5ae..00d0535 100644
--- a/compiler/nativeGen/Dwarf/Types.hs
+++ b/compiler/nativeGen/Dwarf/Types.hs
@@ -119,7 +119,7 @@ pprDwarfInfoOpen haveSrc (DwarfCompileUnit _ name producer compDir lineLbl) =
   $$ pprString compDir
   $$ pprFlag True -- use UTF8
   $$ if haveSrc
-     then pprData4' (sectionOffset lineLbl dwarfLineLabel)
+     then sectionOffset lineLbl dwarfLineLabel
      else empty
 pprDwarfInfoOpen _ (DwarfSubprogram _ name label) = sdocWithDynFlags $ \df ->
   pprAbbrev DwAbbrSubprogram
@@ -431,11 +431,13 @@ escapeChar c
 
 -- | Generate an offset into another section. This is tricky because
 -- this is handled differently depending on platform: Mac Os expects
--- us to calculate the offset using assembler arithmetic. Meanwhile,
--- GNU tools expect us to just reference the target directly, and will
--- figure out on their own that we actually need an offset.
+-- us to calculate the offset using assembler arithmetic. Linux expects
+-- us to just reference the target directly, and will figure out on
+-- their own that we actually need an offset. Finally, Windows has
+-- a special directive to refer to relative offsets. Fun.
 sectionOffset :: LitString -> LitString -> SDoc
 sectionOffset target section = sdocWithPlatform $ \plat ->
   case platformOS plat of
-    OSDarwin -> ptext target <> char '-' <> ptext section
-    _other   -> ptext target
+    OSDarwin  -> pprDwWord (ptext target <> char '-' <> ptext section)
+    OSMinGW32 -> text "\t.secrel32 " <> ptext target
+    _other    -> pprDwWord (ptext target)



More information about the ghc-commits mailing list