diff --git a/configuration/common.nix b/configuration/common.nix
index 0c213cc6ba395c89de8d56596cbb2eee02a5699a..83bcd10d2486b8980e84f3bacbd082543611eb03 100644
--- a/configuration/common.nix
+++ b/configuration/common.nix
@@ -62,6 +62,17 @@ final: prev: {
       ];
     });
 
+  llvm-hs-pure = overrideCabal
+    prev.llvm-hs-pure
+    (_:
+      {
+        patches = [
+          ./patches/llvm-hs-pure-01.patch
+      ];
+    });
+
+  llvm-hs = addPkgconfigDepend prev.llvm-hs pkgs.llvm_15;
+
   postgresql-syntax = overrideCabal
     prev.postgresql-syntax
     (_:
diff --git a/configuration/patches/llvm-hs-pure-01.patch b/configuration/patches/llvm-hs-pure-01.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5c8d22ec664c95393b64bde37fb051592c6c4b02
--- /dev/null
+++ b/configuration/patches/llvm-hs-pure-01.patch
@@ -0,0 +1,18 @@
+commit af0b103ced22302ab04b11301380c88dbd7bc138
+Author: Ellis Kesterton <erk4@st-andrews.ac.uk>
+Date:   Sun Dec 24 12:05:23 2023 +0000
+
+    Update to base 4.19
+
+diff --git a/src/LLVM/Prelude.hs b/src/LLVM/Prelude.hs
+index 1fe0e08..60737d2 100644
+--- a/src/LLVM/Prelude.hs
++++ b/src/LLVM/Prelude.hs
+@@ -30,6 +30,7 @@ import Prelude hiding (
+     minimum, maximum, sum, product, all, any, and, or,
+     concatMap,
+     elem, notElem,
++    unzip,
+   )
+ import Data.Data (Data, Typeable)
+ import GHC.Generics (Generic)
diff --git a/horizon.dhall b/horizon.dhall
index a8cbb7e7295b0f45462c90a0e51f2f184ae9f9cc..bb04b69403650b843aac73b90fd2568b77d7c568 100644
--- a/horizon.dhall
+++ b/horizon.dhall
@@ -364,6 +364,16 @@ let packages =
       , linear-base = H.callHackage "linear-base" "0.4.0"
       , linear-generics = H.callHackage "linear-generics" "0.2.2"
       , list-transformer = H.callHackage "list-transformer" "1.1.0"
+      , llvm-hs =
+          H.callGit
+            "https://github.com/llvm-hs/llvm-hs"
+            "5bca2c1a2a3aa98ecfb19181e7a5ebbf3e212b76"
+            (Some "llvm-hs/")
+      , llvm-hs-pure =
+          H.callGit
+            "https://github.com/llvm-hs/llvm-hs"
+            "5bca2c1a2a3aa98ecfb19181e7a5ebbf3e212b76"
+            (Some "llvm-hs-pure/")
       , lockfree-queue = H.callHackage "lockfree-queue" "0.2.4"
       , log-base = H.callHackage "log-base" "0.12.0.1"
       , log-effectful =
diff --git a/horizon.lock b/horizon.lock
index 7ba8d61417b43bb50c8685932147300f1893c3eb..78f28b48f15c4edaf39fc5147e5a7a320494d37e 100644
--- a/horizon.lock
+++ b/horizon.lock
@@ -1150,6 +1150,14 @@
   , mapValue =
       "c1864bce656723a3fec4ef5d7ec8c37cab959938da675b74b0d6013df277b72d"
   }
+, { mapKey = "llvm-hs"
+  , mapValue =
+      "5edeb371b0a6dea1d5531af4fb942d5edf8c0b1b45ffbd9089324e3a382a52a0"
+  }
+, { mapKey = "llvm-hs-pure"
+  , mapValue =
+      "bd7f0934b44aceb8d88763f5ffeee776d0186fc56c0c62cd0f2dc0b346b420de"
+  }
 , { mapKey = "lockfree-queue"
   , mapValue =
       "d5e06d5f3481122033dbf71f0c272be3a59ed40bf711569e9901fa4e6b228e17"
diff --git a/overlay.nix b/overlay.nix
index dbdab8d2e74d4b8399308714d350633f82038f8f..52442b36552bd8f3517ab1cf7a983815c40013e6 100644
--- a/overlay.nix
+++ b/overlay.nix
@@ -577,6 +577,10 @@ final: prev: with pkgs.haskell.lib; {
 
   list-transformer = final.callPackage (./pkgs/list-transformer.nix) { };
 
+  llvm-hs = final.callPackage (./pkgs/llvm-hs.nix) { };
+
+  llvm-hs-pure = final.callPackage (./pkgs/llvm-hs-pure.nix) { };
+
   lockfree-queue = final.callPackage (./pkgs/lockfree-queue.nix) { };
 
   log-base = final.callPackage (./pkgs/log-base.nix) { };
diff --git a/pkgs/llvm-hs-pure.nix b/pkgs/llvm-hs-pure.nix
new file mode 100644
index 0000000000000000000000000000000000000000..f1a9da6c4413eaafdca85a944980351905839290
--- /dev/null
+++ b/pkgs/llvm-hs-pure.nix
@@ -0,0 +1,36 @@
+{ mkDerivation, attoparsec, base, bytestring, containers, fail
+, fetchgit, lib, mtl, tasty, tasty-hunit, tasty-quickcheck
+, template-haskell, transformers, unordered-containers
+}:
+mkDerivation {
+  pname = "llvm-hs-pure";
+  version = "15.0.0";
+  src = fetchgit {
+    url = "https://github.com/llvm-hs/llvm-hs";
+    sha256 = "00jqisfaf0dq6zckp6xh3cg92yx32dbzx7p1x7dc8sa870iy7rgf";
+    rev = "5bca2c1a2a3aa98ecfb19181e7a5ebbf3e212b76";
+    fetchSubmodules = true;
+  };
+  postUnpack = "sourceRoot+=/llvm-hs-pure/; echo source root reset to $sourceRoot";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  libraryHaskellDepends = [
+    attoparsec base bytestring containers fail mtl template-haskell
+    transformers unordered-containers
+  ];
+  testHaskellDepends = [
+    base containers mtl tasty tasty-hunit tasty-quickcheck transformers
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = true;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://github.com/llvm-hs/llvm-hs/";
+  description = "Pure Haskell LLVM functionality (no FFI)";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file
diff --git a/pkgs/llvm-hs.nix b/pkgs/llvm-hs.nix
new file mode 100644
index 0000000000000000000000000000000000000000..7b28324aa07fcda90af7b0fa998207c5d2b81eee
--- /dev/null
+++ b/pkgs/llvm-hs.nix
@@ -0,0 +1,41 @@
+{ mkDerivation, Cabal, QuickCheck, array, attoparsec, base
+, bytestring, containers, directory, exceptions, fetchgit, lib
+, llvm-hs-pure, mtl, pretty-show, process, tasty, tasty-hunit
+, tasty-quickcheck, template-haskell, temporary, transformers
+, utf8-string
+}:
+mkDerivation {
+  pname = "llvm-hs";
+  version = "15.0.0";
+  src = fetchgit {
+    url = "https://github.com/llvm-hs/llvm-hs";
+    sha256 = "00jqisfaf0dq6zckp6xh3cg92yx32dbzx7p1x7dc8sa870iy7rgf";
+    rev = "5bca2c1a2a3aa98ecfb19181e7a5ebbf3e212b76";
+    fetchSubmodules = true;
+  };
+  postUnpack = "sourceRoot+=/llvm-hs/; echo source root reset to $sourceRoot";
+  isLibrary = true;
+  isExecutable = false;
+  enableSeparateDataOutput = false;
+  setupHaskellDepends = [ base Cabal containers ];
+  libraryHaskellDepends = [
+    array attoparsec base bytestring containers exceptions llvm-hs-pure
+    mtl template-haskell transformers utf8-string
+  ];
+  testHaskellDepends = [
+    base bytestring containers directory llvm-hs-pure mtl pretty-show
+    process QuickCheck tasty tasty-hunit tasty-quickcheck temporary
+    transformers
+  ];
+  enableLibraryProfiling = true;
+  enableExecutableProfiling = true;
+  doHaddock = true;
+  jailbreak = true;
+  doCheck = false;
+  doBenchmark = false;
+  hyperlinkSource = false;
+  homepage = "http://github.com/llvm-hs/llvm-hs/";
+  description = "General purpose LLVM bindings";
+  license = lib.licenses.bsd3;
+  broken = false;
+}
\ No newline at end of file