From f62d4d4dd1cf96104221cf7e74eaea7f60569a29 Mon Sep 17 00:00:00 2001
From: Tamar Christina <tamar@zhox.com>
Date: Sun, 6 Jun 2021 18:22:52 +0100
Subject: [PATCH] rts: move xxxHash out of the user namespace

(cherry picked from commit 74c874148fbea996cadf1d9fa50f2a44488dd82b)
---
 hadrian/src/Settings/Packages.hs |  6 ++----
 rts/Hash.c                       | 13 +++++++++++++
 rts/ghc.mk                       |  7 +++++--
 rts/rts.cabal.in                 |  6 +++++-
 4 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/hadrian/src/Settings/Packages.hs b/hadrian/src/Settings/Packages.hs
index 6c994b599582..7c4041d6f53f 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 1588dfc97527..5a688ccb60fc 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 a1610fc1f429..ef5fc7bbb4c8 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 a24e4ff1f806..cebf6795f352 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
-- 
GitLab