From 86eaf198be57192edc104524d0413ec2ca6fc7c4 Mon Sep 17 00:00:00 2001 From: "Meredith L. Patterson" <mlp@thesmartpolitenerd.com> Date: Wed, 9 Nov 2016 05:29:21 +0100 Subject: [PATCH] fixing LLVM function declarations; turns out repeat calls to LLVMPointerType(...) create shadow declarations --- src/backends/llvm.c | 26 +++++++++++++------------- src/llvm.h | 11 +++++++++++ src/parsers/bits.c | 3 ++- src/parsers/ch.c | 15 ++++++++------- 4 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 src/llvm.h diff --git a/src/backends/llvm.c b/src/backends/llvm.c index efa7d53e..9915c38b 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 00000000..b37036df --- /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 99f87180..cdd40406 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 7e0565b7..e4975791 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); -- GitLab