aboutsummaryrefslogtreecommitdiff
path: root/lang/ghc
diff options
context:
space:
mode:
authorGleb Popov <arrowd@FreeBSD.org>2019-01-06 12:18:06 +0000
committerGleb Popov <arrowd@FreeBSD.org>2019-01-06 12:18:06 +0000
commite2c3fdc1fdeca1ffbdfef680e3e712ddc2e7e06f (patch)
treeec6e8ffeefbf83bfc231412c2c7a6b883ecd5bd8 /lang/ghc
parente8d137116e2942f75f1fed8f603384210db17ec0 (diff)
downloadports-e2c3fdc1fdeca1ffbdfef680e3e712ddc2e7e06f.tar.gz
ports-e2c3fdc1fdeca1ffbdfef680e3e712ddc2e7e06f.zip
Notes
Diffstat (limited to 'lang/ghc')
-rw-r--r--lang/ghc/Makefile6
-rw-r--r--lang/ghc/bsd.cabal.options.mk2
-rw-r--r--lang/ghc/bsd.hackage.mk6
-rw-r--r--lang/ghc/distinfo6
-rw-r--r--lang/ghc/files/extra-patch-aclocal.m440
-rw-r--r--lang/ghc/files/patch-configure22
-rw-r--r--lang/ghc/files/patch-fix-build-on-arm231
-rw-r--r--lang/ghc/files/patch-ghc.mk11
-rw-r--r--lang/ghc/files/patch-llvm-targets12
-rw-r--r--lang/ghc/files/patch-rts_posix_OSMem.c250
10 files changed, 19 insertions, 567 deletions
diff --git a/lang/ghc/Makefile b/lang/ghc/Makefile
index 0c6d28d39da0..96a9a825c4a4 100644
--- a/lang/ghc/Makefile
+++ b/lang/ghc/Makefile
@@ -18,11 +18,11 @@ COMMENT= Compiler for the functional language Haskell
LICENSE= BSD3CLAUSE
LICENSE_FILE= ${WRKSRC}/LICENSE
-GHC_VERSION= 8.4.4
+GHC_VERSION= 8.6.3
HSCOLOUR_VERSION= 1.24.4
-LLVM_VERSION= 50
+LLVM_VERSION= 60
-CONFLICTS_INSTALL= ghc-7.4.* ghc-7.6.* ghc-7.8.* ghc-7.10.* ghc-8.0.* ghc-8.4.3
+CONFLICTS_INSTALL= ghc-7.4.* ghc-7.6.* ghc-7.8.* ghc-7.10.* ghc-8.0.* ghc-8.4.* ghc-8.6.2
.include "${.CURDIR}/../../lang/ghc/bsd.ghc.mk"
diff --git a/lang/ghc/bsd.cabal.options.mk b/lang/ghc/bsd.cabal.options.mk
index 9935dc931a02..5f49889c6623 100644
--- a/lang/ghc/bsd.cabal.options.mk
+++ b/lang/ghc/bsd.cabal.options.mk
@@ -18,7 +18,7 @@ GHC_CMD?= ${LOCALBASE}/bin/ghc
HADDOCK_CMD?= ${LOCALBASE}/bin/haddock
HSCOLOUR_CMD?= ${LOCALBASE}/bin/HsColour
-GHC_VERSION?= 8.4.4
+GHC_VERSION?= 8.6.3
HSCOLOUR_VERSION= 1.24.4
diff --git a/lang/ghc/bsd.hackage.mk b/lang/ghc/bsd.hackage.mk
index 53471a89622a..1a0166f3093c 100644
--- a/lang/ghc/bsd.hackage.mk
+++ b/lang/ghc/bsd.hackage.mk
@@ -95,6 +95,7 @@ basement_port?= devel/hs-basement
basic-prelude_port?= devel/hs-basic-prelude
bencode_port?= textproc/hs-bencode
bifunctors_port?= devel/hs-bifunctors
+bitarray_port?= devel/hs-bitarray
bits-atomic_port?= devel/hs-bits-atomic
blaze-builder_port?= devel/hs-blaze-builder
blaze-builder-enumerator_port?= devel/hs-blaze-builder-enumerator
@@ -158,6 +159,7 @@ cpphs_port?= devel/hs-cpphs
cprng-aes_port?= security/hs-cprng-aes
cpu_port?= sysutils/hs-cpu
criterion_port?= benchmarks/hs-criterion
+criterion-measurement_port?= benchmarks/hs-criterion-measurement
Crypto_port?= security/hs-Crypto
crypto-api_port?= security/hs-crypto-api
crypto-cipher-types_port?= security/hs-crypto-cipher-types
@@ -198,6 +200,7 @@ datetime_port?= devel/hs-datetime
DAV_port?= www/hs-DAV # executable
dbus_port?= devel/hs-dbus
deepseq-generics_port?= devel/hs-deepseq-generics
+dense-linear-algebra_port?= math/hs-dense-linear-algebra
dia-base_port?= graphics/hs-dia-base
dia-functions_port?= graphics/hs-dia-functions
Diff_port?= textproc/hs-Diff
@@ -311,6 +314,7 @@ hslogger_port?= devel/hs-hslogger
hslua_port?= devel/hs-hslua
hslua-module-text_port?= devel/hs-hslua-module-text
HsOpenSSL_port?= security/hs-HsOpenSSL
+HsYAML_port?= textproc/hs-HsYAML
hspec_port?= devel/hs-hspec # executable
hspec-core_port?= devel/hs-hspec-core
hspec-discover_port?= devel/hs-hspec-discover # executable
@@ -355,6 +359,7 @@ lhs2tex_port?= textproc/hs-lhs2tex
libmpd_port?= audio/hs-libmpd
libxml_port?= textproc/hs-libxml
libxml-sax_port?= textproc/hs-libxml-sax # lib_depends
+libyaml_port?= textproc/hs-libyaml
lifted-async_port?= devel/hs-lifted-async
lifted-base_port?= devel/hs-lifted-base
List_port?= devel/hs-List
@@ -548,6 +553,7 @@ typed-process_port?= devel/hs-typed-process
unamb_port?= devel/hs-unamb
unexceptionalio_port?= devel/hs-unexceptionalio
unicode-show_port?= devel/hs-unicode-show
+unicode-transforms_port?= textproc/hs-unicode-transforms
uniplate_port?= devel/hs-uniplate
unix-compat_port?= devel/hs-unix-compat
unix-time_port?= devel/hs-unix-time
diff --git a/lang/ghc/distinfo b/lang/ghc/distinfo
index 4ee3ee5c367f..c3a9a30b28a0 100644
--- a/lang/ghc/distinfo
+++ b/lang/ghc/distinfo
@@ -1,6 +1,6 @@
-TIMESTAMP = 1541010522
-SHA256 (ghc-8.4.4-src.tar.xz) = 11117735a58e507c481c09f3f39ae5a314e9fbf49fc3109528f99ea7959004b2
-SIZE (ghc-8.4.4-src.tar.xz) = 11319500
+TIMESTAMP = 1541010523
+SHA256 (ghc-8.6.3-src.tar.xz) = 9f9e37b7971935d88ba80426c36af14b1e0b3ec1d9c860f44a4391771bc07f23
+SIZE (ghc-8.6.3-src.tar.xz) = 19138116
SHA256 (ghc-8.4.3-boot-amd64-freebsd.tar.xz) = 0e0324a539d471a813ed4d18c537fb19be22a4e250bd5434a3a911b9d5343724
SIZE (ghc-8.4.3-boot-amd64-freebsd.tar.xz) = 67718400
SHA256 (ghc-8.4.3-boot-i386-freebsd.tar.xz) = 65fcd48b1c0166e028b3f6d50ad295525e6b84490da82663ec66165e57e87972
diff --git a/lang/ghc/files/extra-patch-aclocal.m4 b/lang/ghc/files/extra-patch-aclocal.m4
index 8adc3e28b4e3..5e674d2f9556 100644
--- a/lang/ghc/files/extra-patch-aclocal.m4
+++ b/lang/ghc/files/extra-patch-aclocal.m4
@@ -1,46 +1,8 @@
--- aclocal.m4.orig 2018-03-25 21:22:32 UTC
+++ aclocal.m4
-@@ -648,6 +648,14 @@ AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS],
- $3="$$3 -D_HPUX_SOURCE"
- $5="$$5 -D_HPUX_SOURCE"
- ;;
-+ arm*freebsd*)
-+ # On arm/freebsd, tell gcc to generate Arm
-+ # instructions (ie not Thumb) and to link using the gold linker.
-+ # Forcing LD to be ld.gold is done in FIND_LD m4 macro.
-+ $2="$$2 -marm"
-+ $3="$$3 -Wl,-z,noexecstack"
-+ $4="$$4 -z noexecstack"
-+ ;;
- arm*linux*)
- # On arm/linux and arm/android, tell gcc to generate Arm
- # instructions (ie not Thumb).
-@@ -656,6 +664,11 @@ AC_DEFUN([FPTOOLS_SET_C_LD_FLAGS],
- $4="$$4 -z noexecstack"
- ;;
-
-+ aarch64*freebsd*)
-+ $3="$$3 -Wl,-z,noexecstack"
-+ $4="$$4 -z noexecstack"
-+ ;;
-+
- aarch64*linux*)
- $3="$$3 -Wl,-z,noexecstack"
- $4="$$4 -z noexecstack"
-@@ -1917,6 +1930,10 @@ case "$1" in
- # converts the canonicalized target into someting llvm can understand
- AC_DEFUN([GHC_LLVM_TARGET], [
- case "$2-$3" in
-+ *-freebsd*-gnueabihf)
-+ llvm_target_vendor="unknown"
-+ llvm_target_os="freebsd-gnueabihf"
-+ ;;
- hardfloat-*eabi)
- llvm_target_vendor="unknown"
- llvm_target_os="$3""hf"
@@ -2361,13 +2378,6 @@ AC_DEFUN([FIND_LD],[
[enable_ld_override=yes])
-
+
find_ld() {
- # Make sure the user didn't specify LD manually.
- if test "z$LD" != "z"; then
diff --git a/lang/ghc/files/patch-configure b/lang/ghc/files/patch-configure
deleted file mode 100644
index a3ff7aea111a..000000000000
--- a/lang/ghc/files/patch-configure
+++ /dev/null
@@ -1,22 +0,0 @@
---- configure.orig 2018-03-06 20:04:54 UTC
-+++ configure
-@@ -9108,6 +9108,19 @@ $as_echo_n "checking Setting up CFLAGS, LDFLAGS, IGNOR
- IGNORE_LINKER_LD_FLAGS="$IGNORE_LINKER_LD_FLAGS -z noexecstack"
- ;;
-
-+ arm*freebsd*)
-+ # On arm/freebsd, tell gcc to generate Arm
-+ # instructions (ie not Thumb).
-+ CFLAGS="$CFLAGS -marm"
-+ LDFLAGS="$LDFLAGS -Wl,-z,noexecstack"
-+ IGNORE_LINKER_LD_FLAGS="$IGNORE_LINKER_LD_FLAGS -z noexecstack"
-+ ;;
-+
-+ aarch64*freebsd*)
-+ LDFLAGS="$LDFLAGS -Wl,-z,noexecstack"
-+ IGNORE_LINKER_LD_FLAGS="$IGNORE_LINKER_LD_FLAGS -z noexecstack"
-+ ;;
-+
- powerpc-ibm-aix*)
- # We need `-D_THREAD_SAFE` to unlock the thread-local `errno`.
- CFLAGS="$CFLAGS -D_THREAD_SAFE"
diff --git a/lang/ghc/files/patch-fix-build-on-arm b/lang/ghc/files/patch-fix-build-on-arm
deleted file mode 100644
index 824d6bae07b5..000000000000
--- a/lang/ghc/files/patch-fix-build-on-arm
+++ /dev/null
@@ -1,231 +0,0 @@
-From d8495549ba9d194815c2d0eaee6797fc7c00756a Mon Sep 17 00:00:00 2001
-From: Kavon Farvardin <kavon@farvard.in>
-Date: Sun, 28 Oct 2018 12:11:49 -0400
-Subject: [PATCH] Fix for T14251 on ARM
-
-We now calculate the SSE register padding needed to fix the calling
-convention in LLVM in a robust way: grouping them by whether
-registers in that class overlap (with the same class overlapping
-itself).
-
-My prior patch assumed that no matter the platform, physical
-register Fx aliases with Dx, etc, for our calling convention.
-
-This is unfortunately not the case for any platform except x86-64.
-
-Test Plan:
-Only know how to test on x86-64, but it should be tested on ARM with:
-
-`make test WAYS=llvm && make test WAYS=optllvm`
-
-Reviewers: bgamari, angerman
-
-Reviewed By: bgamari
-
-Subscribers: rwbarton, carter
-
-GHC Trac Issues: #15780, #14251, #15747
-
-Differential Revision: https://phabricator.haskell.org/D5254
----
- compiler/llvmGen/LlvmCodeGen/Base.hs | 123 ++++++++++++++++++++++----------
- compiler/llvmGen/LlvmCodeGen/CodeGen.hs | 6 +-
- 2 files changed, 90 insertions(+), 39 deletions(-)
-
-diff --git a/compiler/llvmGen/LlvmCodeGen/Base.hs b/compiler/llvmGen/LlvmCodeGen/Base.hs
-index ec91bac..0a40b73 100644
---- compiler/llvmGen/LlvmCodeGen/Base.hs
-+++ compiler/llvmGen/LlvmCodeGen/Base.hs
-@@ -26,7 +26,7 @@ module LlvmCodeGen.Base (
-
- cmmToLlvmType, widthToLlvmFloat, widthToLlvmInt, llvmFunTy,
- llvmFunSig, llvmFunArgs, llvmStdFunAttrs, llvmFunAlign, llvmInfAlign,
-- llvmPtrBits, tysToParams, llvmFunSection, padLiveArgs, isSSE,
-+ llvmPtrBits, tysToParams, llvmFunSection, padLiveArgs, isFPR,
-
- strCLabel_llvm, strDisplayName_llvm, strProcedureName_llvm,
- getGlobalPtr, generateExternDecls,
-@@ -47,6 +47,7 @@ import CodeGen.Platform ( activeStgRegs )
- import DynFlags
- import FastString
- import Cmm hiding ( succ )
-+import CmmUtils ( regsOverlap )
- import Outputable as Outp
- import Platform
- import UniqFM
-@@ -58,8 +59,7 @@ import ErrUtils
- import qualified Stream
-
- import Control.Monad (ap)
--import Data.List (sort)
--import Data.Maybe (mapMaybe)
-+import Data.List (sort, groupBy, head)
-
- -- ----------------------------------------------------------------------------
- -- * Some Data Types
-@@ -152,36 +152,91 @@ llvmFunArgs dflags live =
- map (lmGlobalRegArg dflags) (filter isPassed allRegs)
- where platform = targetPlatform dflags
- allRegs = activeStgRegs platform
-- paddedLive = map (\(_,r) -> r) $ padLiveArgs live
-+ paddedLive = map (\(_,r) -> r) $ padLiveArgs dflags live
- isLive r = r `elem` alwaysLive || r `elem` paddedLive
-- isPassed r = not (isSSE r) || isLive r
--
--
--isSSE :: GlobalReg -> Bool
--isSSE (FloatReg _) = True
--isSSE (DoubleReg _) = True
--isSSE (XmmReg _) = True
--isSSE (YmmReg _) = True
--isSSE (ZmmReg _) = True
--isSSE _ = False
--
--sseRegNum :: GlobalReg -> Maybe Int
--sseRegNum (FloatReg i) = Just i
--sseRegNum (DoubleReg i) = Just i
--sseRegNum (XmmReg i) = Just i
--sseRegNum (YmmReg i) = Just i
--sseRegNum (ZmmReg i) = Just i
--sseRegNum _ = Nothing
--
---- the bool indicates whether the global reg was added as padding.
---- the returned list is not sorted in any particular order,
---- but does indicate the set of live registers needed, with SSE padding.
--padLiveArgs :: LiveGlobalRegs -> [(Bool, GlobalReg)]
--padLiveArgs live = allRegs
-+ isPassed r = not (isFPR r) || isLive r
-+
-+
-+isFPR :: GlobalReg -> Bool
-+isFPR (FloatReg _) = True
-+isFPR (DoubleReg _) = True
-+isFPR (XmmReg _) = True
-+isFPR (YmmReg _) = True
-+isFPR (ZmmReg _) = True
-+isFPR _ = False
-+
-+sameFPRClass :: GlobalReg -> GlobalReg -> Bool
-+sameFPRClass (FloatReg _) (FloatReg _) = True
-+sameFPRClass (DoubleReg _) (DoubleReg _) = True
-+sameFPRClass (XmmReg _) (XmmReg _) = True
-+sameFPRClass (YmmReg _) (YmmReg _) = True
-+sameFPRClass (ZmmReg _) (ZmmReg _) = True
-+sameFPRClass _ _ = False
-+
-+normalizeFPRNum :: GlobalReg -> GlobalReg
-+normalizeFPRNum (FloatReg _) = FloatReg 1
-+normalizeFPRNum (DoubleReg _) = DoubleReg 1
-+normalizeFPRNum (XmmReg _) = XmmReg 1
-+normalizeFPRNum (YmmReg _) = YmmReg 1
-+normalizeFPRNum (ZmmReg _) = ZmmReg 1
-+normalizeFPRNum _ = error "normalizeFPRNum expected only FPR regs"
-+
-+getFPRCtor :: GlobalReg -> Int -> GlobalReg
-+getFPRCtor (FloatReg _) = FloatReg
-+getFPRCtor (DoubleReg _) = DoubleReg
-+getFPRCtor (XmmReg _) = XmmReg
-+getFPRCtor (YmmReg _) = YmmReg
-+getFPRCtor (ZmmReg _) = ZmmReg
-+getFPRCtor _ = error "getFPRCtor expected only FPR regs"
-+
-+fprRegNum :: GlobalReg -> Int
-+fprRegNum (FloatReg i) = i
-+fprRegNum (DoubleReg i) = i
-+fprRegNum (XmmReg i) = i
-+fprRegNum (YmmReg i) = i
-+fprRegNum (ZmmReg i) = i
-+fprRegNum _ = error "fprRegNum expected only FPR regs"
-+
-+-- | Input: dynflags, and the list of live registers
-+--
-+-- Output: An augmented list of live registers, where padding was
-+-- added to the list of registers to ensure the calling convention is
-+-- correctly used by LLVM.
-+--
-+-- Each global reg in the returned list is tagged with a bool, which
-+-- indicates whether the global reg was added as padding, or was an original
-+-- live register.
-+--
-+-- That is, True => padding, False => a real, live global register.
-+--
-+-- Also, the returned list is not sorted in any particular order.
-+--
-+padLiveArgs :: DynFlags -> LiveGlobalRegs -> [(Bool, GlobalReg)]
-+padLiveArgs dflags live =
-+ if platformUnregisterised plat
-+ then taggedLive -- not using GHC's register convention for platform.
-+ else padding ++ taggedLive
-+ where
-+ taggedLive = map (\x -> (False, x)) live
-+ plat = targetPlatform dflags
-+
-+ fprLive = filter isFPR live
-+ padding = concatMap calcPad $ groupBy sharesClass fprLive
-+
-+ sharesClass :: GlobalReg -> GlobalReg -> Bool
-+ sharesClass a b = sameFPRClass a b || overlappingClass
-+ where
-+ overlappingClass = regsOverlap dflags (norm a) (norm b)
-+ norm = CmmGlobal . normalizeFPRNum
-+
-+ calcPad :: [GlobalReg] -> [(Bool, GlobalReg)]
-+ calcPad rs = getFPRPadding (getFPRCtor $ head rs) rs
-+
-+getFPRPadding :: (Int -> GlobalReg) -> LiveGlobalRegs -> [(Bool, GlobalReg)]
-+getFPRPadding paddingCtor live = padding
- where
-- sseRegNums = sort $ mapMaybe sseRegNum live
-- (_, padding) = foldl assignSlots (1, []) $ sseRegNums
-- allRegs = padding ++ map (\r -> (False, r)) live
-+ fprRegNums = sort $ map fprRegNum live
-+ (_, padding) = foldl assignSlots (1, []) $ fprRegNums
-
- assignSlots (i, acc) regNum
- | i == regNum = -- don't need padding here
-@@ -195,11 +250,7 @@ padLiveArgs live = allRegs
-
- genPad start n =
- take n $ flip map (iterate (+1) start) (\i ->
-- (True, FloatReg i))
-- -- NOTE: Picking float should be fine for the following reasons:
-- -- (1) Float aliases with all the other SSE register types on
-- -- the given platform.
-- -- (2) The argument is not live anyways.
-+ (True, paddingCtor i))
-
-
- -- | Llvm standard fun attributes
-diff --git a/compiler/llvmGen/LlvmCodeGen/CodeGen.hs b/compiler/llvmGen/LlvmCodeGen/CodeGen.hs
-index 1873400..21abc65 100644
---- compiler/llvmGen/LlvmCodeGen/CodeGen.hs
-+++ compiler/llvmGen/LlvmCodeGen/CodeGen.hs
-@@ -1814,14 +1814,14 @@ funPrologue live cmmBlocks = do
- -- STG Liveness optimisation done here.
- funEpilogue :: LiveGlobalRegs -> LlvmM ([LlvmVar], LlvmStatements)
- funEpilogue live = do
-+ dflags <- getDynFlags
-
- -- the bool indicates whether the register is padding.
- let alwaysNeeded = map (\r -> (False, r)) alwaysLive
-- livePadded = alwaysNeeded ++ padLiveArgs live
-+ livePadded = alwaysNeeded ++ padLiveArgs dflags live
-
- -- Set to value or "undef" depending on whether the register is
- -- actually live
-- dflags <- getDynFlags
- let loadExpr r = do
- (v, _, s) <- getCmmRegVal (CmmGlobal r)
- return (Just $ v, s)
-@@ -1833,7 +1833,7 @@ funEpilogue live = do
- loads <- flip mapM allRegs $ \r -> case () of
- _ | (False, r) `elem` livePadded
- -> loadExpr r -- if r is not padding, load it
-- | not (isSSE r) || (True, r) `elem` livePadded
-+ | not (isFPR r) || (True, r) `elem` livePadded
- -> loadUndef r
- | otherwise -> return (Nothing, nilOL)
-
---
-1.9.1
-
diff --git a/lang/ghc/files/patch-ghc.mk b/lang/ghc/files/patch-ghc.mk
index 8ab4d6e13130..25e8affef3f9 100644
--- a/lang/ghc/files/patch-ghc.mk
+++ b/lang/ghc/files/patch-ghc.mk
@@ -1,4 +1,4 @@
---- ghc.mk.orig 2017-01-03 15:59:18 UTC
+--- ghc.mk.orig 2018-09-16 20:53:54 UTC
+++ ghc.mk
@@ -96,6 +96,7 @@ endif
# Catch make if it runs away into an infinite loop
@@ -8,14 +8,13 @@
else
$(error Make has restarted itself $(MAKE_RESTARTS) times; is there a makefile bug? See http://ghc.haskell.org/trac/ghc/wiki/Building/Troubleshooting#Makehasrestarteditself3timesisthereamakefilebug for details)
endif
-@@ -459,10 +460,7 @@ PACKAGES_STAGE1 += ghc-boot-th
- PACKAGES_STAGE1 += ghc-boot
- PACKAGES_STAGE1 += template-haskell
+@@ -461,9 +462,7 @@ PACKAGES_STAGE1 += template-haskell
PACKAGES_STAGE1 += ghc-compact
--
+ PACKAGES_STAGE1 += ghc-heap
+
-ifeq "$(HADDOCK_DOCS)" "YES"
PACKAGES_STAGE1 += xhtml
-endif
-
+
ifeq "$(WITH_TERMINFO)" "YES"
PACKAGES_STAGE1 += terminfo
diff --git a/lang/ghc/files/patch-llvm-targets b/lang/ghc/files/patch-llvm-targets
deleted file mode 100644
index c66e44cda054..000000000000
--- a/lang/ghc/files/patch-llvm-targets
+++ /dev/null
@@ -1,12 +0,0 @@
---- llvm-targets.orig 2018-03-17 14:04:41 UTC
-+++ llvm-targets
-@@ -20,4 +20,9 @@
- ,("aarch64-apple-ios", ("e-m:o-i64:64-i128:128-n32:64-S128", "generic", "+neon"))
- ,("i386-apple-ios", ("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128", "yonah", ""))
- ,("x86_64-apple-ios", ("e-m:o-i64:64-f80:128-n8:16:32:64-S128", "core2", ""))
-+,("armv6-unknown-freebsd-gnueabihf", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "arm1176jzf-s", "+strict-align"))
-+,("armv7-unknown-freebsd-gnueabihf", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "generic", "+strict-align"))
-+,("aarch64-unknown-freebsd", ("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128", "generic", "+neon"))
-+,("amd64-portbld-freebsd", ("e-m:e-i64:64-f80:128-n8:16:32:64-S128", "x86-64", ""))
-+,("i386-portbld-freebsd", ("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128", "i486", ""))
- ]
diff --git a/lang/ghc/files/patch-rts_posix_OSMem.c b/lang/ghc/files/patch-rts_posix_OSMem.c
deleted file mode 100644
index dce26edcfced..000000000000
--- a/lang/ghc/files/patch-rts_posix_OSMem.c
+++ /dev/null
@@ -1,250 +0,0 @@
---- rts/posix/OSMem.c.orig 2017-11-28 16:39:14 UTC
-+++ rts/posix/OSMem.c
-@@ -36,6 +36,10 @@
- #if defined(HAVE_NUMAIF_H)
- #include <numaif.h>
- #endif
-+#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_SYS_TIME_H)
-+#include <sys/time.h>
-+#include <sys/resource.h>
-+#endif
-
- #include <errno.h>
-
-@@ -45,6 +49,29 @@
- #include <sys/sysctl.h>
- #endif
-
-+#ifndef MAP_FAILED
-+# define MAP_FAILED ((void *)-1)
-+#endif
-+
-+#if defined(hpux_HOST_OS)
-+# ifndef MAP_ANON
-+# define MAP_ANON MAP_ANONYMOUS
-+# endif
-+#endif
-+
-+#ifndef darwin_HOST_OS
-+# undef RESERVE_FLAGS
-+# if defined(MAP_GUARD)
-+# define RESERVE_FLAGS MAP_GUARD /* FreeBSD */
-+# elif defined(MAP_NORESERVE)
-+# define RESERVE_FLAGS MAP_NORESERVE | MAP_ANON | MAP_PRIVATE;
-+# else
-+# if defined(USE_LARGE_ADDRESS_SPACE)
-+# error USE_LARGE_ADDRESS_SPACE needs MAP_NORESERVE or MAP_GUARD
-+# endif
-+# endif
-+#endif
-+
- static void *next_request = 0;
-
- void osMemInit(void)
-@@ -98,8 +125,10 @@
- The naming is chosen from the Win32 API (VirtualAlloc) which does the
- same thing and has done so forever, while support for this in Unix systems
- has only been added recently and is hidden in the posix portability mess.
-- It is confusing because to get the reserve behavior we need MAP_NORESERVE
-- (which tells the kernel not to allocate backing space), but heh...
-+ The Linux manpage suggests that mmap must be passed MAP_NORESERVE in order
-+ to get reservation-only behavior. It is confusing because to get the reserve
-+ behavior we need MAP_NORESERVE (which tells the kernel not to allocate backing
-+ space), but heh...
- */
- enum
- {
-@@ -108,6 +137,44 @@
- MEM_RESERVE_AND_COMMIT = MEM_RESERVE | MEM_COMMIT
- };
-
-+#if defined(linux_HOST_OS)
-+static void *
-+linux_retry_mmap(int operation, W_ size, void *ret, void *addr, int prot, int flags)
-+{
-+ if (addr != 0 && (operation & MEM_RESERVE)) {
-+ // Try again with no hint address.
-+ // It's not clear that this can ever actually help,
-+ // but since our alternative is to abort, we may as well try.
-+ ret = mmap(0, size, prot, flags, -1, 0);
-+ }
-+ if (ret == MAP_FAILED && errno == EPERM) {
-+ // Linux is not willing to give us any mapping,
-+ // so treat this as an out-of-memory condition
-+ // (really out of virtual address space).
-+ errno = ENOMEM;
-+ }
-+ return ret;
-+}
-+#endif /* defined(linux_HOST_OS) */
-+
-+static void
-+post_mmap_madvise(int operation, W_ size, void *ret)
-+{
-+#if defined(MADV_WILLNEED)
-+ if (operation & MEM_COMMIT) {
-+ madvise(ret, size, MADV_WILLNEED);
-+# if defined(MADV_DODUMP)
-+ madvise(ret, size, MADV_DODUMP);
-+# endif
-+ } else {
-+ madvise(ret, size, MADV_DONTNEED);
-+# if defined(MADV_DONTDUMP)
-+ madvise(ret, size, MADV_DONTDUMP);
-+# endif
-+ }
-+#endif
-+}
-+
- /* Returns NULL on failure; errno set */
- static void *
- my_mmap (void *addr, W_ size, int operation)
-@@ -149,69 +216,44 @@
- VM_PROT_READ|VM_PROT_WRITE);
- }
-
--#else
-+#else /* defined(darwin_HOST_OS) */
-
- int prot, flags;
-- if (operation & MEM_COMMIT)
-+ if (operation & MEM_COMMIT) {
- prot = PROT_READ | PROT_WRITE;
-- else
-+ } else {
- prot = PROT_NONE;
-- if (operation == MEM_RESERVE)
--# if defined(MAP_NORESERVE)
-- flags = MAP_NORESERVE;
-+ }
-+
-+ if (operation == MEM_RESERVE) {
-+# if defined(RESERVE_FLAGS)
-+ flags = RESERVE_FLAGS;
- # else
--# if defined(USE_LARGE_ADDRESS_SPACE)
--# error USE_LARGE_ADDRESS_SPACE needs MAP_NORESERVE
--# endif
- errorBelch("my_mmap(,,MEM_RESERVE) not supported on this platform");
- # endif
-- else if (operation == MEM_COMMIT)
-- flags = MAP_FIXED;
-- else
-- flags = 0;
-+ } else if (operation == MEM_COMMIT) {
-+ flags = MAP_FIXED | MAP_ANON | MAP_PRIVATE;
-+ } else {
-+ flags = MAP_ANON | MAP_PRIVATE;
-+ }
-
--#if defined(hpux_HOST_OS)
-- ret = mmap(addr, size, prot, flags | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
--#elif defined(linux_HOST_OS)
-- ret = mmap(addr, size, prot, flags | MAP_ANON | MAP_PRIVATE, -1, 0);
-- if (ret == (void *)-1 && errno == EPERM) {
-+ ret = mmap(addr, size, prot, flags, -1, 0);
-+# if defined(linux_HOST_OS)
-+ if (ret == MAP_FAILED && errno == EPERM) {
- // Linux may return EPERM if it tried to give us
- // a chunk of address space below mmap_min_addr,
- // See Trac #7500.
-- if (addr != 0 && (operation & MEM_RESERVE)) {
-- // Try again with no hint address.
-- // It's not clear that this can ever actually help,
-- // but since our alternative is to abort, we may as well try.
-- ret = mmap(0, size, prot, flags | MAP_ANON | MAP_PRIVATE, -1, 0);
-- }
-- if (ret == (void *)-1 && errno == EPERM) {
-- // Linux is not willing to give us any mapping,
-- // so treat this as an out-of-memory condition
-- // (really out of virtual address space).
-- errno = ENOMEM;
-- }
-+ ret = linux_retry_mmap(operation, size, ret, addr, prot, flags);
- }
--
-- if (operation & MEM_COMMIT) {
-- madvise(ret, size, MADV_WILLNEED);
--#if defined(MADV_DODUMP)
-- madvise(ret, size, MADV_DODUMP);
--#endif
-- } else {
-- madvise(ret, size, MADV_DONTNEED);
--#if defined(MADV_DONTDUMP)
-- madvise(ret, size, MADV_DONTDUMP);
--#endif
-- }
--
--#else
-- ret = mmap(addr, size, prot, flags | MAP_ANON | MAP_PRIVATE, -1, 0);
--#endif
--#endif
--
-- if (ret == (void *)-1) {
-+# endif
-+ if (ret == MAP_FAILED) {
- return NULL;
- }
-+#endif /* defined(darwin_HOST_OS) */
-+
-+ // Map in committed pages rather than take a fault for each chunk.
-+ // Also arrange to include them in core-dump files.
-+ post_mmap_madvise(operation, size, ret);
-
- return ret;
- }
-@@ -435,6 +477,8 @@
- void *base, *top;
- void *start, *end;
-
-+ ASSERT((len & ~MBLOCK_MASK) == len);
-+
- /* We try to allocate len + MBLOCK_SIZE,
- because we need memory which is MBLOCK_SIZE aligned,
- and then we discard what we don't need */
-@@ -500,8 +544,19 @@
- (void*)startAddress, (void*)minimumAddress);
- }
-
-+#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_SYS_TIME_H)
-+ struct rlimit limit;
-+ if (!getrlimit(RLIMIT_AS, &limit)
-+ && limit.rlim_cur > 0
-+ && *len > limit.rlim_cur) {
-+ *len = limit.rlim_cur;
-+ }
-+#endif
-+
- attempt = 0;
- while (1) {
-+ *len &= ~MBLOCK_MASK;
-+
- if (*len < MBLOCK_SIZE) {
- // Give up if the system won't even give us 16 blocks worth of heap
- barf("osReserveHeapMemory: Failed to allocate heap storage");
-@@ -512,9 +567,14 @@
- if (at == NULL) {
- // This means that mmap failed which we take to mean that we asked
- // for too much memory. This can happen due to POSIX resource
-- // limits. In this case we reduce our allocation request by a factor
-- // of two and try again.
-- *len /= 2;
-+ // limits. In this case we reduce our allocation request by a
-+ // fraction of the current size and try again.
-+ //
-+ // Note that the previously would instead decrease the request size
-+ // by a factor of two; however, this meant that significant amounts
-+ // of memory will be wasted (e.g. imagine a machine with 512GB of
-+ // physical memory but a 511GB ulimit). See #14492.
-+ *len -= *len / 8;
- } else if ((W_)at >= minimumAddress) {
- // Success! We were given a block of memory starting above the 8 GB
- // mark, which is what we were looking for.
-@@ -536,7 +596,7 @@
- {
- void *r = my_mmap(at, size, MEM_COMMIT);
- if (r == NULL) {
-- barf("Unable to commit %d bytes of memory", size);
-+ barf("Unable to commit %" FMT_Word " bytes of memory", size);
- }
- }