Use correct section types syntax for architecture
authorBen Gamari <bgamari.foss@gmail.com>
Tue, 11 Jul 2017 19:41:55 +0000 (15:41 -0400)
committerBen Gamari <ben@smart-cactus.org>
Tue, 11 Jul 2017 20:32:43 +0000 (16:32 -0400)
Previously GHC would always assume that section types began with `@` while
producing assembly, which is not true. For instance, in ARM assembly syntax
section types begin with `%`. This abstracts out section type pretty-printing
and adjusts it to correctly account for the target architectures assembly
flavor.

Reviewers: austin, hvr, Phyx

Reviewed By: Phyx

Subscribers: Phyx, rwbarton, thomie, erikd

GHC Trac Issues: #13937

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

aclocal.m4
compiler/ghc.cabal.in
compiler/main/DriverPipeline.hs
compiler/main/Elf.hs
compiler/nativeGen/AsmCodeGen.hs
compiler/nativeGen/Dwarf/Constants.hs
compiler/nativeGen/PprBase.hs
compiler/utils/AsmUtils.hs [new file with mode: 0644]

index c31c881..71a874f 100644 (file)
@@ -321,9 +321,18 @@ AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS],
     dnl so we empty CFLAGS while running this test
     CFLAGS2="$CFLAGS"
     CFLAGS=
+    case $TargetArch in
+      arm)
+        dnl See #13937.
+        progbits="%progbits"
+        ;;
+      *)
+        progbits="@progbits"
+        ;;
+    esac
     AC_MSG_CHECKING(for GNU non-executable stack support)
     AC_COMPILE_IFELSE(
-        [AC_LANG_PROGRAM([__asm__ (".section .note.GNU-stack,\"\",@progbits");], [0])],
+        [AC_LANG_PROGRAM([__asm__ (".section .note.GNU-stack,\"\",$progbits");], [0])],
         [AC_MSG_RESULT(yes)
          HaskellHaveGnuNonexecStack=True],
         [AC_MSG_RESULT(no)
index 1427a51..f40c8ba 100644 (file)
@@ -170,6 +170,7 @@ Library
         NameShape
         RnModIface
         Avail
+        AsmUtils
         BasicTypes
         ConLike
         DataCon
index ad0e0c8..a6873fb 100644 (file)
@@ -35,6 +35,7 @@ module DriverPipeline (
 
 #include "HsVersions.h"
 
+import AsmUtils
 import PipelineMonad
 import Packages
 import HeaderInfo
@@ -1714,14 +1715,15 @@ mkNoteObjsToLinkIntoBinary dflags dep_packages = do
   where
     link_opts info = hcat [
       -- "link info" section (see Note [LinkInfo section])
-      makeElfNote dflags ghcLinkInfoSectionName ghcLinkInfoNoteName 0 info,
+      makeElfNote ghcLinkInfoSectionName ghcLinkInfoNoteName 0 info,
 
       -- ALL generated assembly must have this section to disable
       -- executable stacks.  See also
       -- compiler/nativeGen/AsmCodeGen.hs for another instance
       -- where we need to do this.
       if platformHasGnuNonexecStack (targetPlatform dflags)
-        then text ".section .note.GNU-stack,\"\",@progbits\n"
+        then text ".section .note.GNU-stack,\"\","
+             <> sectionType "progbits" <> char '\n'
         else Outputable.empty
       ]
 
index 50f11a7..599d4d9 100644 (file)
@@ -14,9 +14,9 @@ module Elf (
     makeElfNote
   ) where
 
+import AsmUtils
 import Exception
 import DynFlags
-import Platform
 import ErrUtils
 import Maybes     (MaybeT(..),runMaybeT)
 import Util       (charToC)
@@ -415,12 +415,12 @@ readElfNoteAsString dflags path sectionName noteId = action `catchIO`  \_ -> do
 -- If we add new target platforms, we need to check that the generated words
 -- are 32-bit long, otherwise we need to use platform specific directives to
 -- force 32-bit .int in asWord32.
-makeElfNote :: DynFlags -> String -> String -> Word32 -> String -> SDoc
-makeElfNote dflags sectionName noteName typ contents = hcat [
+makeElfNote :: String -> String -> Word32 -> String -> SDoc
+makeElfNote sectionName noteName typ contents = hcat [
     text "\t.section ",
     text sectionName,
     text ",\"\",",
-    text elfSectionNote,
+    sectionType "note",
     text "\n",
 
     -- note name length (+ 1 for ending \0)
@@ -453,12 +453,6 @@ makeElfNote dflags sectionName noteName typ contents = hcat [
       text (show x),
       text "\n"]
 
-    elfSectionNote :: String
-    elfSectionNote = case platformArch (targetPlatform dflags) of
-                             ArchARM _ _ _ -> "%note"
-                             _             -> "@note"
-
-
 
 ------------------
 -- Helpers
index e7a3efd..45d170e 100644 (file)
@@ -51,6 +51,7 @@ import qualified RegAlloc.Graph.Main            as Color
 import qualified RegAlloc.Graph.Stats           as Color
 import qualified RegAlloc.Graph.TrivColorable   as Color
 
+import AsmUtils
 import TargetReg
 import Platform
 import Config
@@ -770,7 +771,7 @@ makeImportsDoc dflags imports
                 -- security. GHC generated code does not need an executable
                 -- stack so add the note in:
             (if platformHasGnuNonexecStack platform
-             then text ".section .note.GNU-stack,\"\",@progbits"
+             then text ".section .note.GNU-stack,\"\"," <> sectionType "progbits"
              else Outputable.empty)
             $$
                 -- And just because every other compiler does, let's stick in
index 880c7d7..a8034ef 100644 (file)
@@ -3,6 +3,7 @@
 
 module Dwarf.Constants where
 
+import AsmUtils
 import FastString
 import Platform
 import Outputable
@@ -150,14 +151,15 @@ dwarfGhcSection     = dwarfSection "ghc"
 dwarfARangesSection = dwarfSection "aranges"
 
 dwarfSection :: String -> SDoc
-dwarfSection name = sdocWithPlatform $ \plat -> ftext $ mkFastString $
+dwarfSection name = sdocWithPlatform $ \plat ->
   case platformOS plat of
     os | osElfTarget os
-       -> "\t.section .debug_" ++ name ++ ",\"\",@progbits"
+       -> text "\t.section .debug_" <> text name <> text ",\"\","
+          <> sectionType "progbits"
        | osMachOTarget os
-       -> "\t.section __DWARF,__debug_" ++ name ++ ",regular,debug"
+       -> text "\t.section __DWARF,__debug_" <> text name <> text ",regular,debug"
        | otherwise
-       -> "\t.section .debug_" ++ name ++ ",\"dr\""
+       -> text "\t.section .debug_" <> text name <> text ",\"dr\""
 
 -- * Dwarf section labels
 dwarfInfoLabel, dwarfAbbrevLabel, dwarfLineLabel, dwarfFrameLabel :: LitString
index 76ac13e..aca4274 100644 (file)
@@ -16,6 +16,7 @@ module PprBase (
 
 where
 
+import AsmUtils
 import CLabel
 import Cmm
 import DynFlags
@@ -131,7 +132,7 @@ pprGNUSectionHeader sep t suffix = sdocWithDynFlags $ \dflags ->
       CString
         | OSMinGW32 <- platformOS (targetPlatform dflags)
                     -> empty
-        | otherwise -> text ",\"aMS\",@progbits,1"
+        | otherwise -> text ",\"aMS\"," <> sectionType "progbits" <> text ",1"
       _ -> empty
 
 -- XCOFF doesn't support relocating label-differences, so we place all
diff --git a/compiler/utils/AsmUtils.hs b/compiler/utils/AsmUtils.hs
new file mode 100644 (file)
index 0000000..55f9d6d
--- /dev/null
@@ -0,0 +1,18 @@
+-- | Various utilities used in generating assembler.
+--
+-- These are used not only by the native code generator, but also by the
+-- "DriverPipeline".
+module AsmUtils
+    ( sectionType
+    ) where
+
+import Platform
+import Outputable
+
+-- | Generate a section type (e.g. @\@progbits@). See #13937.
+sectionType :: String -- ^ section type
+            -> SDoc   -- ^ pretty assembler fragment
+sectionType ty = sdocWithPlatform $ \platform ->
+    case platformArch platform of
+      ArchARM{} -> char '%' <> text ty
+      _         -> char '@' <> text ty