From d9b62abe94708c23ccb631aaa37853cf43bfc027 Mon Sep 17 00:00:00 2001 From: Andrea Shepard <andrea@persephoneslair.org> Date: Mon, 5 Dec 2016 17:26:28 +0000 Subject: [PATCH] Handle different size_t sizes correctly when setting up LLVM types, and include LLVM types for HBytes struct --- src/backends/llvm/llvm.c | 19 +++++++++++++++++-- src/backends/llvm/llvm.h | 3 +++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/backends/llvm/llvm.c b/src/backends/llvm/llvm.c index 185367a2..2c6602b0 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 0721c373..49d681c4 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; -- GitLab