diff --git a/src/backends/llvm/llvm.c b/src/backends/llvm/llvm.c
index 185367a2e166920ada40a3e629ab72a38b747261..2c6602b00557145f393900ad856462e408f816af 100644
--- a/src/backends/llvm/llvm.c
+++ b/src/backends/llvm/llvm.c
@@ -26,6 +26,13 @@ HParseResult* make_result(HArena *arena, HParsedToken *tok) {
 }
 
 void h_llvm_declare_common(HLLVMParserCompileContext *ctxt) {
+#if SIZE_MAX == 0xffffffffffffffff
+  ctxt->llvm_size_t = LLVMInt64Type();
+#elif SIZE_MAX == 0xffffffff
+  ctxt->llvm_size_t = LLVMInt32Type();
+#else
+#error "SIZE_MAX is not consistent with either 64 or 32-bit platform, couldn't guess LLVM type for size_t"
+#endif
   ctxt->llvm_inputstream = LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HInputStream_");
   LLVMTypeRef llvm_inputstream_struct_types[] = {
     LLVMPointerType(LLVMInt8Type(), 0),
@@ -46,12 +53,20 @@ void h_llvm_declare_common(HLLVMParserCompileContext *ctxt) {
   LLVMTypeRef llvm_parsedtoken_struct_types[] = {
     LLVMInt32Type(), // actually an enum value
     LLVMInt64Type(), // actually this is a union; the largest thing in it is 64 bits
-    LLVMInt64Type(), // FIXME sizeof(size_t) will be 32 bits on 32-bit platforms
-    LLVMInt64Type(), // FIXME ditto
+    ctxt->llvm_size_t,
+    ctxt->llvm_size_t,
     LLVMInt8Type()
   };
   LLVMStructSetBody(ctxt->llvm_parsedtoken, llvm_parsedtoken_struct_types, 5, 0);
   ctxt->llvm_parsedtokenptr = LLVMPointerType(ctxt->llvm_parsedtoken, 0);
+  /* The HBytes struct is one of the cases for the union in HParsedToken */
+  ctxt->llvm_hbytes = LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HBytes_");
+  LLVMTypeRef llvm_hbytes_struct_types[] = {
+    LLVMPointerType(LLVMInt8Type(), 0), /* HBytes.token */
+    ctxt->llvm_size_t                   /* HBytes.len */
+  };
+  LLVMStructSetBody(ctxt->llvm_hbytes, llvm_hbytes_struct_types, 2, 0);
+  ctxt->llvm_hbytesptr = LLVMPointerType(ctxt->llvm_hbytes, 0);
   ctxt->llvm_parseresult = LLVMStructCreateNamed(LLVMGetGlobalContext(), "struct.HParseResult_");
   LLVMTypeRef llvm_parseresult_struct_types[] = {
     ctxt->llvm_parsedtokenptr,
diff --git a/src/backends/llvm/llvm.h b/src/backends/llvm/llvm.h
index 0721c3733b818877090af2e420d611902b375e5b..49d681c449367da7a8b7c467e93a2cc182088723 100644
--- a/src/backends/llvm/llvm.h
+++ b/src/backends/llvm/llvm.h
@@ -20,6 +20,7 @@ struct HLLVMParserCompileContext_ {
   LLVMValueRef func;
   LLVMBuilderRef builder;
   /* Typerefs */
+  LLVMTypeRef llvm_size_t;
   LLVMTypeRef llvm_inputstream;
   LLVMTypeRef llvm_inputstreamptr;
   LLVMTypeRef llvm_arena;
@@ -28,6 +29,8 @@ struct HLLVMParserCompileContext_ {
   LLVMTypeRef llvm_parsedtokenptr;
   LLVMTypeRef llvm_parseresult;
   LLVMTypeRef llvm_parseresultptr;
+  LLVMTypeRef llvm_hbytes;
+  LLVMTypeRef llvm_hbytesptr;
   /* Set up in function preamble */
   LLVMValueRef stream;
   LLVMValueRef arena;