diff --git a/src/backends/llvm.c b/src/backends/llvm.c
index efa7d53e70518a36c338625f2981ec4f0d35d238..9915c38b9f41ee6cb3d0a3c4f130adb7f5887942 100644
--- a/src/backends/llvm.c
+++ b/src/backends/llvm.c
@@ -5,6 +5,7 @@
 #pragma GCC diagnostic pop
 #include <llvm-c/ExecutionEngine.h>
 #include "../internal.h"
+#include "../llvm.h"
 #include "../parsers/parser_internal.h"
 
 typedef struct HLLVMParser_ {
@@ -15,13 +16,12 @@ typedef struct HLLVMParser_ {
 } HLLVMParser;
 
 void h_llvm_declare_common(LLVMModuleRef mod) {
-  LLVMTypeRef inputstream = LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HInputStream_"), 0);
-  LLVMTypeRef arena = LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HArena_"), 0);
-  LLVMTypeRef parsedtoken = LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParsedToken_"), 0);
-  LLVMTypeRef parseresult = LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParseResult_"), 0);
-  
+  llvm_inputstream = LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HInputStream_"), 0);
+  llvm_arena = LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HArena_"), 0);
+  llvm_parsedtoken = LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParsedToken_"), 0);
+  llvm_parseresult = LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParseResult_"), 0);
   LLVMTypeRef readbits_pt[] = {
-    inputstream,
+    llvm_inputstream,
     LLVMInt32Type(),
     LLVMInt8Type()
   };
@@ -29,17 +29,17 @@ void h_llvm_declare_common(LLVMModuleRef mod) {
   LLVMAddFunction(mod, "h_read_bits", readbits_ret);
 
   LLVMTypeRef amalloc_pt[] = {
-    arena,
+    llvm_arena,
     LLVMInt32Type()
   };
   LLVMTypeRef amalloc_ret = LLVMFunctionType(LLVMPointerType(LLVMVoidType(), 0), amalloc_pt, 2, 0);
   LLVMAddFunction(mod, "h_arena_malloc", amalloc_ret);
 
   LLVMTypeRef makeresult_pt[] = {
-    arena,
-    parsedtoken
+    llvm_arena,
+    llvm_parsedtoken
   };
-  LLVMTypeRef makeresult_ret = LLVMFunctionType(parseresult, makeresult_pt, 2, 0);
+  LLVMTypeRef makeresult_ret = LLVMFunctionType(llvm_parseresult, makeresult_pt, 2, 0);
   LLVMAddFunction(mod, "make_result", makeresult_ret);
   char* dump = LLVMPrintModuleToString(mod);
   fprintf(stderr, "\n\n%s\n\n", dump);
@@ -53,10 +53,10 @@ int h_llvm_compile(HAllocator* mm__, HParser* parser, const void* params) {
   // Boilerplate to set up the parser function to add to the module. It takes an HInputStream* and
   // returns an HParseResult.
   LLVMTypeRef param_types[] = {
-    LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HInputStream_"), 0),
-    LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HArena_"), 0)
+    llvm_inputstream,
+    llvm_arena
   };
-  LLVMTypeRef ret_type = LLVMFunctionType(LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParseResult_"), 0), param_types, 2, 0);
+  LLVMTypeRef ret_type = LLVMFunctionType(llvm_parseresult, param_types, 2, 0);
   LLVMValueRef parse_func = LLVMAddFunction(mod, name, ret_type);
   // Parse function is now declared; time to define itt
   LLVMBuilderRef builder = LLVMCreateBuilder();
diff --git a/src/llvm.h b/src/llvm.h
new file mode 100644
index 0000000000000000000000000000000000000000..b37036df585cb8a2450736d11896b2b5f1e9c786
--- /dev/null
+++ b/src/llvm.h
@@ -0,0 +1,11 @@
+#ifndef HAMMER_LLVM__H
+#define HAMMER_LLVM__H
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+#include <llvm-c/Core.h>
+#pragma GCC diagnostic pop
+
+LLVMTypeRef llvm_inputstream, llvm_arena, llvm_parsedtoken, llvm_parseresult;
+
+#endif // #ifndef HAMMER_LLVM__H
diff --git a/src/parsers/bits.c b/src/parsers/bits.c
index 99f87180ff683637031d54a29ddee7332f9a60c5..cdd40406c923828c1d99d574f088db0218512e6b 100644
--- a/src/parsers/bits.c
+++ b/src/parsers/bits.c
@@ -4,6 +4,7 @@
 #include <llvm-c/Core.h>
 #pragma GCC diagnostic pop
 #include "parser_internal.h"
+#include "../llvm.h"
 
 struct bits_env {
   uint8_t length;
@@ -25,7 +26,7 @@ static bool bits_llvm(LLVMBuilderRef builder, LLVMModuleRef mod, void* env) {
   /*   %result = alloca %struct.HParsedToken_*, align 8 */
   #pragma GCC diagnostic push
   #pragma GCC diagnostic ignored "-Wunused-variable"
-  LLVMValueRef result = LLVMBuildAlloca(builder, LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParsedToken_"), 0), "result");
+  LLVMValueRef result = LLVMBuildAlloca(builder, llvm_parsedtoken, "result");
   #pragma GCC diagnostic pop
   /*   store i8* %env, i8** %1, align 8 */
   /*   store %struct.HParseState_* %state, %struct.HParseState_** %2, align 8 */
diff --git a/src/parsers/ch.c b/src/parsers/ch.c
index 7e0565b7d6be361bf2de768950243459435becc6..e49757911e14a1ad6ba3c0d022e233b571bbffd2 100644
--- a/src/parsers/ch.c
+++ b/src/parsers/ch.c
@@ -5,6 +5,7 @@
 #include <llvm-c/Core.h>
 #pragma GCC diagnostic pop
 #include "parser_internal.h"
+#include "../llvm.h"
 
 static HParseResult* parse_ch(void* env, HParseState *state) {
   uint8_t c = (uint8_t)(uintptr_t)(env);
@@ -49,10 +50,10 @@ static bool ch_llvm(LLVMBuilderRef builder, LLVMModuleRef mod, void* env) {
   uint8_t c_ = (uint8_t)(uintptr_t)(env);
   LLVMValueRef c = LLVMConstInt(LLVMInt8Type(), c_, 0);
   LLVMTypeRef param_types[] = {
-    LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HInputStream_"), 0),
-    LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HArena_"), 0)
+    llvm_inputstream,
+    llvm_arena
   };
-  LLVMTypeRef ret_type = LLVMFunctionType(LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParseResult_*"), 0), param_types, 2, 0);
+  LLVMTypeRef ret_type = LLVMFunctionType(llvm_parseresult, param_types, 2, 0);
   LLVMValueRef ch = LLVMAddFunction(mod, "ch", ret_type);
   // get the parameter array to use later with h_bits
   LLVMValueRef bits_args[3];
@@ -66,10 +67,10 @@ static bool ch_llvm(LLVMBuilderRef builder, LLVMModuleRef mod, void* env) {
   LLVMBasicBlockRef end = LLVMAppendBasicBlock(ch, "ch_end");
   LLVMPositionBuilderAtEnd(builder, entry);
   // %1 = alloca %struct.HParseResult_*, align 8
-  LLVMValueRef ret = LLVMBuildAlloca(builder, LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParseResult_*"), 0), "ret");
+  LLVMValueRef ret = LLVMBuildAlloca(builder, llvm_parseresult, "ret");
   // skip %2 through %c because we have these from arguments, and %r because we'll get it later
   // %tok = alloca %struct.HParsedToken_*, align 8
-  LLVMValueRef tok = LLVMBuildAlloca(builder, LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParsedToken_*"), 0), "tok");
+  LLVMValueRef tok = LLVMBuildAlloca(builder, llvm_parsedtoken, "tok");
   // skip next instr through %8
   // %9 = call i64 @h_read_bits(%struct.HInputStream_* %8, i32 8, i8 signext 0)
   LLVMValueRef bits = LLVMBuildCall(builder, LLVMGetNamedFunction(mod, "h_read_bits"), bits_args, 3, "h_read_bits");
@@ -92,7 +93,7 @@ static bool ch_llvm(LLVMBuilderRef builder, LLVMModuleRef mod, void* env) {
   // %20 = call noalias i8* @h_arena_malloc(%struct.HArena_* %19, i64 48)
   LLVMValueRef amalloc = LLVMBuildCall(builder, LLVMGetNamedFunction(mod, "h_arena_malloc"), amalloc_args, 2, "h_arena_malloc");
   // %21 = bitcast i8* %20 to %struct.HParsedToken_*
-  LLVMValueRef cast1 = LLVMBuildBitCast(builder, amalloc, LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParsedToken_"), 0), "");
+  LLVMValueRef cast1 = LLVMBuildBitCast(builder, amalloc, llvm_parsedtoken, "");
   // store %struct.HParsedToken_* %21, %struct.HParsedToken_** %tok, align 8
   LLVMBuildStore(builder, cast1, tok);
   // %22 = load %struct.HParsedToken_** %tok, align 8
@@ -130,7 +131,7 @@ static bool ch_llvm(LLVMBuilderRef builder, LLVMModuleRef mod, void* env) {
   // ; <label>:34 - failure case
   LLVMPositionBuilderAtEnd(builder, fail);
   // store %struct.HParseResult* null, %struct.HParseResult_** %1
-  LLVMBuildStore(builder, LLVMConstNull(LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParsedToken"), 0)), ret);
+  LLVMBuildStore(builder, LLVMConstNull(llvm_parseresult), ret);
   // br label %35
   LLVMBuildBr(builder, end);