summaryrefslogtreecommitdiff
path: root/compiler/GHC/Utils/Fingerprint.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Utils/Fingerprint.hs')
-rw-r--r--compiler/GHC/Utils/Fingerprint.hs47
1 files changed, 47 insertions, 0 deletions
diff --git a/compiler/GHC/Utils/Fingerprint.hs b/compiler/GHC/Utils/Fingerprint.hs
new file mode 100644
index 0000000000..b8c2091135
--- /dev/null
+++ b/compiler/GHC/Utils/Fingerprint.hs
@@ -0,0 +1,47 @@
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
+
+-- ----------------------------------------------------------------------------
+--
+-- (c) The University of Glasgow 2006
+--
+-- Fingerprints for recompilation checking and ABI versioning.
+--
+-- https://gitlab.haskell.org/ghc/ghc/wikis/commentary/compiler/recompilation-avoidance
+--
+-- ----------------------------------------------------------------------------
+
+module GHC.Utils.Fingerprint (
+ readHexFingerprint,
+ fingerprintByteString,
+ -- * Re-exported from GHC.Fingerprint
+ Fingerprint(..), fingerprint0,
+ fingerprintFingerprints,
+ fingerprintData,
+ fingerprintString,
+ getFileHash
+ ) where
+
+#include "HsVersions.h"
+
+import GHC.Prelude
+
+import Foreign
+import GHC.IO
+import Numeric ( readHex )
+
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Unsafe as BS
+
+import GHC.Fingerprint
+
+-- useful for parsing the output of 'md5sum', should we want to do that.
+readHexFingerprint :: String -> Fingerprint
+readHexFingerprint s = Fingerprint w1 w2
+ where (s1,s2) = splitAt 16 s
+ [(w1,"")] = readHex s1
+ [(w2,"")] = readHex (take 16 s2)
+
+fingerprintByteString :: BS.ByteString -> Fingerprint
+fingerprintByteString bs = unsafeDupablePerformIO $
+ BS.unsafeUseAsCStringLen bs $ \(ptr, len) -> fingerprintData (castPtr ptr) len