summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamar Christina <tamar@zhox.com>2021-06-06 18:22:52 +0100
committerZubin <zubin.duggal@gmail.com>2021-06-25 09:15:59 +0000
commitf62d4d4dd1cf96104221cf7e74eaea7f60569a29 (patch)
treeb17e9faeebea96bd29ce59beb6bd7c1218f4cf21
parentba78f87bba031e322209899f1427b0c22c7b7031 (diff)
downloadhaskell-f62d4d4dd1cf96104221cf7e74eaea7f60569a29.tar.gz
rts: move xxxHash out of the user namespace
(cherry picked from commit 74c874148fbea996cadf1d9fa50f2a44488dd82b)
-rw-r--r--hadrian/src/Settings/Packages.hs6
-rw-r--r--rts/Hash.c13
-rw-r--r--rts/ghc.mk7
-rw-r--r--rts/rts.cabal.in6
4 files changed, 25 insertions, 7 deletions
diff --git a/hadrian/src/Settings/Packages.hs b/hadrian/src/Settings/Packages.hs
index 6c994b5995..7c4041d6f5 100644
--- a/hadrian/src/Settings/Packages.hs
+++ b/hadrian/src/Settings/Packages.hs
@@ -309,10 +309,8 @@ rtsPackageArgs = package rts ? do
-- We're after pur performance here. So make sure fast math and
-- vectorization is enabled.
- , input "**/xxhash.c" ? pure
- [ "-O3"
- , "-ffast-math"
- , "-ftree-vectorize" ]
+ , input "**/Hash.c" ? pure
+ [ "-O3" ]
, inputs ["**/Evac.c", "**/Evac_thr.c"] ? arg "-funroll-loops"
diff --git a/rts/Hash.c b/rts/Hash.c
index 1588dfc975..5a688ccb60 100644
--- a/rts/Hash.c
+++ b/rts/Hash.c
@@ -13,6 +13,19 @@
#include "Hash.h"
#include "RtsUtils.h"
+
+/* This file needs to be compiled with vectorization enabled. Unfortunately
+ since we compile these things these days with cabal we can no longer
+ specify optimization per file. So we have to resort to pragmas. */
+#if defined(__GNUC__) || defined(__GNUG__)
+#pragma GCC push_options
+#pragma GCC optimize ("O3")
+#endif
+
+#define XXH_NAMESPACE __rts_
+#define XXH_STATIC_LINKING_ONLY /* access advanced declarations */
+#define XXH_PRIVATE_API
+
#include "xxhash.h"
#include <string.h>
diff --git a/rts/ghc.mk b/rts/ghc.mk
index a1610fc1f4..ef5fc7bbb4 100644
--- a/rts/ghc.mk
+++ b/rts/ghc.mk
@@ -45,7 +45,10 @@ else
ALL_DIRS += posix
endif
-rts_C_SRCS := $(wildcard rts/*.c $(foreach dir,$(ALL_DIRS),rts/$(dir)/*.c))
+tmp_rts_C_SRCS := $(wildcard rts/*.c $(foreach dir,$(ALL_DIRS),rts/$(dir)/*.c))
+# We shouldn't include this file in the binary, it's a common function so
+# it will likely clash with something later. See #19948
+rts_C_SRCS = $(filter-out rts/xxhash.c, $(tmp_rts_C_SRCS))
rts_C_HOOK_SRCS := $(wildcard rts/hooks/*.c)
rts_CMM_SRCS := $(wildcard rts/*.cmm)
@@ -428,7 +431,7 @@ rts/RtsUtils_CC_OPTS += -DTargetVendor=\"$(TargetVendor_CPP)\"
rts/RtsUtils_CC_OPTS += -DGhcUnregisterised=\"$(GhcUnregisterised)\"
rts/RtsUtils_CC_OPTS += -DTablesNextToCode=\"$(TablesNextToCode)\"
#
-rts/xxhash_CC_OPTS += -O3 -ffast-math -ftree-vectorize
+rts/Hash_CC_OPTS += -O3
# Compile various performance-critical pieces *without* -fPIC -dynamic
# even when building a shared library. If we don't do this, then the
diff --git a/rts/rts.cabal.in b/rts/rts.cabal.in
index a24e4ff1f8..cebf6795f3 100644
--- a/rts/rts.cabal.in
+++ b/rts/rts.cabal.in
@@ -497,10 +497,14 @@ library
sm/Scav_thr.c
sm/Storage.c
sm/Sweep.c
- xxhash.c
fs.c
-- I wish we had wildcards..., this would be:
-- *.c hooks/**/*.c sm/**/*.c eventlog/**/*.c linker/**/*.c
+
+ extra-source-files:
+ -- This file needs to be in the package but shouldn't be compiled on its own.
+ xxhash.c
+
if os(windows)
c-sources: win32/AsyncIO.c
win32/AwaitEvent.c