Detect cases where as(1) doesn't recognise .ident directive (#5408)
authorPHO <pho@cielonegro.org>
Wed, 30 Nov 2011 08:46:27 +0000 (17:46 +0900)
committerPHO <pho@cielonegro.org>
Thu, 8 Dec 2011 01:57:28 +0000 (10:57 +0900)
.ident directives are usually ignored by as(1), and in some cases (like Darwin/PPC) they even raise an error.

aclocal.m4
compiler/main/SysTools.lhs
compiler/nativeGen/AsmCodeGen.lhs
compiler/utils/Platform.hs
settings.in

index 4d65e4e..1d5d1f7 100644 (file)
@@ -251,6 +251,16 @@ AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS],
         [HaskellHaveSubsectionsViaSymbols=False
          AC_MSG_RESULT(no)])
 
+    dnl ** check for .ident assembler directive
+
+    AC_MSG_CHECKING(whether your assembler supports .ident directive)
+    AC_COMPILE_IFELSE(
+        [AC_LANG_SOURCE([__asm__ (".ident \"GHC x.y.z\"");])],
+        [AC_MSG_RESULT(yes)
+         HaskellHaveIdentDirective=True],
+        [AC_MSG_RESULT(no)
+         HaskellHaveIdentDirective=False])
+
     dnl *** check for GNU non-executable stack note support (ELF only)
     dnl     (.section .note.GNU-stack,"",@progbits)
 
@@ -283,6 +293,7 @@ AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS],
     AC_SUBST(HaskellTargetArch)
     AC_SUBST(HaskellTargetOs)
     AC_SUBST(HaskellHaveSubsectionsViaSymbols)
+    AC_SUBST(HaskellHaveIdentDirective)
     AC_SUBST(HaskellHaveGnuNonexecStack)
 ])
 
index 4a51b31..23906c6 100644 (file)
@@ -193,6 +193,7 @@ initSysTools mbMinusB
         ; targetArch <- readSetting "target arch"
         ; targetOS <- readSetting "target os"
         ; targetHasGnuNonexecStack <- readSetting "target has GNU nonexec stack"
+        ; targetHasIdentDirective <- readSetting "target has .ident directive"
         ; targetHasSubsectionsViaSymbols <- readSetting "target has subsections via symbols"
         ; myExtraGccViaCFlags <- getSetting "GCC extra via C opts"
         -- On Windows, mingw is distributed with GHC,
@@ -257,6 +258,7 @@ initSysTools mbMinusB
                                               platformArch = targetArch,
                                               platformOS   = targetOS,
                                               platformHasGnuNonexecStack = targetHasGnuNonexecStack,
+                                              platformHasIdentDirective = targetHasIdentDirective,
                                               platformHasSubsectionsViaSymbols = targetHasSubsectionsViaSymbols
                                           },
                         sTmpDir = normalise tmpdir,
index 0d8aab1..f9167f2 100644 (file)
@@ -525,12 +525,15 @@ makeImportsDoc dflags imports
             (if platformHasGnuNonexecStack (targetPlatform dflags)
              then Pretty.text ".section .note.GNU-stack,\"\",@progbits"
              else Pretty.empty)
+            Pretty.$$
                 -- And just because every other compiler does, lets stick in
                 -- an identifier directive: .ident "GHC x.y.z"
-            Pretty.$$ let compilerIdent = Pretty.text "GHC" Pretty.<+>
-                                         Pretty.text cProjectVersion
-                       in Pretty.text ".ident" Pretty.<+>
-                          Pretty.doubleQuotes compilerIdent
+            (if platformHasIdentDirective (targetPlatform dflags)
+             then let compilerIdent = Pretty.text "GHC" Pretty.<+>
+                                     Pretty.text cProjectVersion
+                   in Pretty.text ".ident" Pretty.<+>
+                      Pretty.doubleQuotes compilerIdent
+             else Pretty.empty)
 
  where
        -- Generate "symbol stubs" for all external symbols that might
index 027c510..7253af1 100644 (file)
@@ -23,6 +23,7 @@ data Platform
               platformArch                     :: Arch,
               platformOS                       :: OS,
               platformHasGnuNonexecStack       :: Bool,
+              platformHasIdentDirective        :: Bool,
               platformHasSubsectionsViaSymbols :: Bool
           }
         deriving (Read, Show, Eq)
index c54fcfb..50062af 100644 (file)
@@ -11,6 +11,7 @@
  ("target os", "@HaskellTargetOs@"),
  ("target arch", "@HaskellTargetArch@"),
  ("target has GNU nonexec stack", "@HaskellHaveGnuNonexecStack@"),
+ ("target has .ident directive", "@HaskellHaveIdentDirective@"),
  ("target has subsections via symbols", "@HaskellHaveSubsectionsViaSymbols@")
  ]