Complete RTS compiler args (#418)
authorZhen Zhang <izgzhen@gmail.com>
Sat, 23 Sep 2017 19:55:22 +0000 (03:55 +0800)
committerAndrey Mokhov <andrey.mokhov@gmail.com>
Sat, 23 Sep 2017 19:55:22 +0000 (21:55 +0200)
cfg/system.config.in
src/Oracles/Flag.hs
src/Settings/Packages/Rts.hs

index b172703..698dd8a 100644 (file)
@@ -123,6 +123,7 @@ ffi-lib-dir       = @FFILibDir@
 #=======================
 
 with-libdw = @UseLibdw@
+have-lib-mingw-ex = @HaveLibMingwEx@
 
 # Installation:
 #=======================
index 0783aa4..90b2d78 100644 (file)
@@ -18,6 +18,7 @@ data Flag = ArSupportsAtFile
           | SolarisBrokenShld
           | SplitObjectsBroken
           | WithLibdw
+          | HaveLibMingwEx
           | UseSystemFfi
 
 -- Note, if a flag is set to empty string we treat it as set to NO. This seems
@@ -35,6 +36,7 @@ flag f = do
             SolarisBrokenShld  -> "solaris-broken-shld"
             SplitObjectsBroken -> "split-objects-broken"
             WithLibdw          -> "with-libdw"
+            HaveLibMingwEx     -> "have-lib-mingw-ex"
             UseSystemFfi       -> "use-system-ffi"
     value <- lookupValueOrError configFile key
     when (value `notElem` ["YES", "NO", ""]) . error $ "Configuration flag "
index 989df0a..10940e4 100644 (file)
@@ -20,6 +20,15 @@ rtsBuildPath = buildPath rtsContext
 rtsConfIn :: FilePath
 rtsConfIn = pkgPath rts -/- "package.conf.in"
 
+-- | Minimum supported Windows version.
+-- These numbers can be found at:
+-- https://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx
+-- If we're compiling on windows, enforce that we only support Vista SP1+
+-- Adding this here means it doesn't have to be done in individual .c files
+-- and also centralizes the versioning.
+rtsWindowsVersion :: String
+rtsWindowsVersion = "0x06000100"
+
 rtsLibffiLibraryName :: Action FilePath
 rtsLibffiLibraryName = do
     useSystemFfi <- flag UseSystemFfi
@@ -29,6 +38,16 @@ rtsLibffiLibraryName = do
         (False, False) -> "Cffi"
         (_    , True ) -> "Cffi-6"
 
+rtsLibffiIncludeArgs :: Args
+rtsLibffiIncludeArgs = package libffi ? builder (Ghc CompileCWithGhc) ? do
+  useSystemFfi <- expr $ flag UseSystemFfi
+  ffiIncludeDir <- getSetting FfiIncludeDir
+  mconcat [
+    useSystemFfi ? pure (map ("-I" ++) $ words ffiIncludeDir),
+    -- ffi.h triggers prototype warnings, so disable them here:
+    inputs [ "//Interpreter.c", "//Storage.c", "//Adjustor.c" ] ?
+    arg "-Wno-strict-prototypes" ]
+
 rtsLibffiLibrary :: Way -> Action FilePath
 rtsLibffiLibrary way = do
     name    <- rtsLibffiLibraryName
@@ -36,6 +55,47 @@ rtsLibffiLibrary way = do
     rtsPath <- rtsBuildPath
     return $ rtsPath -/- "lib" ++ name ++ suf
 
+-- ref: mk/config.mk.in
+ghcRtsWithLibDw :: Action Bool
+ghcRtsWithLibDw = do
+    goodArch <- anyTargetArch ["i386", "x86_64"]
+    withLibDw <- flag HaveLibMingwEx
+    return $ goodArch && withLibDw
+
+-- Compile various performance-critical pieces *without* -fPIC -dynamic
+-- even when building a shared library.  If we don't do this, then the
+-- GC runs about 50% slower on x86 due to the overheads of PIC.  The
+-- cost of doing this is a little runtime linking and less sharing, but
+-- not much.
+--
+-- On x86_64 this doesn't work, because all objects in a shared library
+-- must be compiled with -fPIC (since the 32-bit relocations generated
+-- by the default small memory can't be resolved at runtime).  So we
+-- only do this on i386.
+--
+-- This apparently doesn't work on OS X (Darwin) nor on Solaris.
+-- On Darwin we get errors of the form
+--
+--  ld: absolute addressing (perhaps -mdynamic-no-pic) used in _stg_ap_0_fast from rts/dist/build/Apply.dyn_o not allowed in slidable image
+--
+-- and lots of these warnings:
+--
+--  ld: warning codegen in _stg_ap_pppv_fast (offset 0x0000005E) prevents image from loading in dyld shared cache
+--
+-- On Solaris we get errors like:
+--
+-- Text relocation remains                         referenced
+--     against symbol                  offset      in file
+-- .rodata (section)                   0x11        rts/dist/build/Apply.dyn_o
+--   ...
+-- ld: fatal: relocations remain against allocatable but non-writable sections
+-- collect2: ld returned 1 exit status
+speedHack :: Action Bool
+speedHack = do
+    i386 <- anyTargetArch ["i386"]
+    goodOS <- not <$> anyTargetOs ["darwin", "solaris2"]
+    return $ i386 && goodOS
+
 rtsPackageArgs :: Args
 rtsPackageArgs = package rts ? do
     projectVersion <- getSetting ProjectVersion
@@ -100,12 +160,39 @@ rtsPackageArgs = package rts ? do
 
             , inputs ["//Evac.c", "//Evac_thr.c"] ? arg "-funroll-loops"
 
+            , speedHack ?
+              inputs [ "//Evac.c", "//Evac_thr.c"
+                     , "//Scav.c", "//Scav_thr.c"
+                     , "//Compact.c", "//GC.c" ] ? arg "-fno-PIC"
+              -- -static is also necessary for these bits, otherwise the NCG
+              -- generates dynamic references:
+            , speedHack ?
+              inputs [ "//Updates.c", "//StgMiscClosures.c"
+                     , "//PrimOps.c", "//Apply.c"
+                     , "//AutoApply.c" ] ? pure [ "-fno-PIC", "-static" ]
+              -- inlining warnings happen in Compact
+            , inputs ["//Compact.c"] ? arg "-Wno-inline"
+              -- emits warnings about call-clobbered registers on x86_64
+            , inputs [ "//StgCRun.c", "//RetainerProfile.c"
+                     , "//win32/ConsoleHandler.c", "//win32/ThrIOManager.c"] ? arg "-w"
+            , inputs ["//RetainerSet.c"] ? arg "-Wno-format"
+              -- The above warning suppression flags are a temporary kludge.
+              -- While working on this module you are encouraged to remove it and fix
+              -- any warnings in the module. See
+              --     http://ghc.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
+              -- for details
+
+            , (not <$> flag GccIsClang) ?
+              inputs ["//Compact.c"] ? arg "-finline-limit=2500"
+
             , inputs ["//Evac_thr.c", "//Scav_thr.c"] ?
               pure [ "-DPARALLEL_GC", "-Irts/sm" ]
 
             , input "//StgCRun.c" ? windowsHost ? arg "-Wno-return-local-addr"
             , input "//RetainerProfile.c" ? flag GccIsClang ?
-              pure [ "-Wno-incompatible-pointer-types" ] ]
+              pure [ "-Wno-incompatible-pointer-types" ]
+            , targetOs == "mingw32" ? arg ("-DWINVER=" ++ rtsWindowsVersion)
+            , ghcRtsWithLibDw ? arg "-DUSE_LIBDW" ]
 
     mconcat
         [ builder (Cc FindCDependencies) ? mconcat cArgs
@@ -122,137 +209,7 @@ rtsPackageArgs = package rts ? do
           output "//package.conf.install.raw" ?
           pure [ "-DINSTALLING"
                , "-DLIB_DIR=\"" ++ destDir ++ ghclibDir ++ "\""
-               , "-DINCLUDE_DIR=\"" ++ destDir ++ ghclibDir -/- "include\"" ] ]
-
--- # If we're compiling on windows, enforce that we only support XP+
--- # Adding this here means it doesn't have to be done in individual .c files
--- # and also centralizes the versioning.
--- ifeq "$$(TargetOS_CPP)" "mingw32"
--- rts_dist_$1_CC_OPTS += -DWINVER=$(rts_WINVER)
--- endif
-
--- #-----------------------------------------------------------------------------
--- # Use system provided libffi
-
--- ifeq "$(UseSystemLibFFI)" "YES"
-
--- rts_PACKAGE_CPP_OPTS += -DFFI_INCLUDE_DIR=$(FFIIncludeDir)
--- rts_PACKAGE_CPP_OPTS += -DFFI_LIB_DIR=$(FFILibDir)
--- rts_PACKAGE_CPP_OPTS += '-DFFI_LIB='
-
--- endif
-
--- #-----------------------------------------------------------------------------
--- # Add support for reading DWARF debugging information, if available
-
--- ifeq "$(GhcRtsWithLibdw)" "YES"
--- rts_CC_OPTS          += -DUSE_LIBDW
--- rts_PACKAGE_CPP_OPTS += -DUSE_LIBDW
--- endif
-
--- # If -DDEBUG is in effect, adjust package conf accordingly..
--- ifneq "$(strip $(filter -optc-DDEBUG,$(GhcRtsHcOpts)))" ""
--- rts_PACKAGE_CPP_OPTS += -DDEBUG
--- endif
-
--- ifeq "$(HaveLibMingwEx)" "YES"
--- rts_PACKAGE_CPP_OPTS += -DHAVE_LIBMINGWEX
--- endif
-
-
-
--- #-----------------------------------------------------------------------------
--- # Flags for compiling specific files
--- #
--- #
-
--- # Compile various performance-critical pieces *without* -fPIC -dynamic
--- # even when building a shared library.  If we don't do this, then the
--- # GC runs about 50% slower on x86 due to the overheads of PIC.  The
--- # cost of doing this is a little runtime linking and less sharing, but
--- # not much.
--- #
--- # On x86_64 this doesn't work, because all objects in a shared library
--- # must be compiled with -fPIC (since the 32-bit relocations generated
--- # by the default small memory can't be resolved at runtime).  So we
--- # only do this on i386.
--- #
--- # This apparently doesn't work on OS X (Darwin) nor on Solaris.
--- # On Darwin we get errors of the form
--- #
--- #  ld: absolute addressing (perhaps -mdynamic-no-pic) used in _stg_ap_0_fast from rts/dist/build/Apply.dyn_o not allowed in slidable image
--- #
--- # and lots of these warnings:
--- #
--- #  ld: warning codegen in _stg_ap_pppv_fast (offset 0x0000005E) prevents image from loading in dyld shared cache
--- #
--- # On Solaris we get errors like:
--- #
--- # Text relocation remains                         referenced
--- #     against symbol                  offset      in file
--- # .rodata (section)                   0x11        rts/dist/build/Apply.dyn_o
--- #   ...
--- # ld: fatal: relocations remain against allocatable but non-writable sections
--- # collect2: ld returned 1 exit status
-
--- ifeq "$(TargetArch_CPP)" "i386"
--- i386_SPEED_HACK := "YES"
--- ifeq "$(TargetOS_CPP)" "darwin"
--- i386_SPEED_HACK := "NO"
--- endif
--- ifeq "$(TargetOS_CPP)" "solaris2"
--- i386_SPEED_HACK := "NO"
--- endif
--- endif
-
--- ifeq "$(TargetArch_CPP)" "i386"
--- ifeq "$(i386_SPEED_HACK)" "YES"
--- rts/sm/Evac_HC_OPTS           += -fno-PIC
--- rts/sm/Evac_thr_HC_OPTS       += -fno-PIC
--- rts/sm/Scav_HC_OPTS           += -fno-PIC
--- rts/sm/Scav_thr_HC_OPTS       += -fno-PIC
--- rts/sm/Compact_HC_OPTS        += -fno-PIC
--- rts/sm/GC_HC_OPTS             += -fno-PIC
-
--- # -static is also necessary for these bits, otherwise the NCG
--- # -generates dynamic references:
--- rts/Updates_HC_OPTS += -fno-PIC -static
--- rts/StgMiscClosures_HC_OPTS += -fno-PIC -static
--- rts/PrimOps_HC_OPTS += -fno-PIC -static
--- rts/Apply_HC_OPTS += -fno-PIC -static
--- rts/dist/build/AutoApply_HC_OPTS += -fno-PIC -static
--- endif
--- endif
-
--- # add CFLAGS for libffi
--- # ffi.h triggers prototype warnings, so disable them here:
--- ifeq "$(UseSystemLibFFI)" "YES"
--- LIBFFI_CFLAGS = $(addprefix -I,$(FFIIncludeDir))
--- else
--- LIBFFI_CFLAGS =
--- endif
--- rts/Interpreter_CC_OPTS += -Wno-strict-prototypes $(LIBFFI_CFLAGS)
--- rts/Adjustor_CC_OPTS    += -Wno-strict-prototypes $(LIBFFI_CFLAGS)
--- rts/sm/Storage_CC_OPTS  += -Wno-strict-prototypes $(LIBFFI_CFLAGS)
-
--- # inlining warnings happen in Compact
--- rts/sm/Compact_CC_OPTS += -Wno-inline
-
--- # emits warnings about call-clobbered registers on x86_64
--- rts/StgCRun_CC_OPTS += -w
-
--- rts/RetainerProfile_CC_OPTS += -w
--- rts/RetainerSet_CC_OPTS += -Wno-format
--- # On Windows:
--- rts/win32/ConsoleHandler_CC_OPTS += -w
--- rts/win32/ThrIOManager_CC_OPTS += -w
--- # The above warning suppression flags are a temporary kludge.
--- # While working on this module you are encouraged to remove it and fix
--- # any warnings in the module. See
--- #     http://ghc.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
--- # for details
-
--- # Without this, thread_obj will not be inlined (at least on x86 with GCC 4.1.0)
--- ifneq "$(CC_CLANG_BACKEND)" "1"
--- rts/sm/Compact_CC_OPTS += -finline-limit=2500
--- endif
+               , "-DINCLUDE_DIR=\"" ++ destDir ++ ghclibDir -/- "include\"" ]
+        , builder HsCpp ? mconcat
+            [ ghcRtsWithLibDw ? arg "-DUSE_LIBDW"
+            , flag HaveLibMingwEx ? arg "-DHAVE_LIBMINGWEX" ] ]