diff --git a/src/parsers/bits.c b/src/parsers/bits.c index 91669726d4129c3e803dbc2f3cd577c5cd227bb7..4663fe2a20a45e7a93163f97699d7062f4eb240a 100644 --- a/src/parsers/bits.c +++ b/src/parsers/bits.c @@ -29,7 +29,23 @@ static HParseResult* parse_bits(void* env, HParseState *state) { static bool bits_llvm(HLLVMParserCompileContext *ctxt, HParser *p, LLVMValueRef *res) { - /* Emit LLVM IR to parse ((struct bits_env *)env)->length bits */ + /* Emit LLVM IR to parse ((struct bits_env *)(p->env))->length bits */ + + /* Allocator */ + HAllocator *mm__ = NULL; + /* Names */ + char *bits_bb_name = NULL; + int bits_bb_name_len = 0; + char *read_bits_name = NULL; + int read_bits_name_len; + /* Basic blocks */ + LLVMBasicBlockRef bits_bb; + /* Arguments for call to h_read_bits() */ + LLVMValueRef bits_args[3]; + /* Result of call to h_read_bits() */ + LLVMValueRef bits; + /* HParseResult */ + LLVMValueRef mr; if (!res) return false; if (!p) return false; @@ -37,34 +53,58 @@ static bool bits_llvm(HLLVMParserCompileContext *ctxt, *res = NULL; if (!ctxt) return false; + /* Unpack the allocator */ + mm__ = ctxt->mm__; + + /* Unpack the bits_env struct */ struct bits_env *env = (struct bits_env *)(p->env); + if (!env) return false; + /* Error out on unsupported length */ if (env->length > 64 || env->length == 0) return false; /* Set up params for call to h_read_bits */ - LLVMValueRef bits_args[3]; bits_args[0] = ctxt->stream; bits_args[1] = LLVMConstInt(LLVMInt32Type(), env->length, 0); bits_args[2] = LLVMConstInt(LLVMInt8Type(), env->signedp ? 1 : 0, 0); /* Set up basic blocks: entry, success and failure branches, then exit */ - LLVMBasicBlockRef bits_bb = LLVMAppendBasicBlock(ctxt->func, "bits"); - - /* Basic block: entry */ + bits_bb_name_len = snprintf(NULL, 0, "bits_%p", p); + bits_bb_name = h_new(char, bits_bb_name_len + 1); + snprintf(bits_bb_name, bits_bb_name_len + 1, "bits_%p", p); + bits_bb = LLVMAppendBasicBlock(ctxt->func, bits_bb_name); LLVMBuildBr(ctxt->builder, bits_bb); LLVMPositionBuilderAtEnd(ctxt->builder, bits_bb); - /* Call to h_read_bits() */ - // %read_bits = call i64 @h_read_bits(%struct.HInputStream_* %8, i32 env_->length, i8 signext env_->signedp) - LLVMValueRef bits = LLVMBuildCall(ctxt->builder, - LLVMGetNamedFunction(ctxt->mod, "h_read_bits"), bits_args, 3, "read_bits"); + /* + * Call to h_read_bits() + * + * %read_bits = call i64 @h_read_bits(%struct.HInputStream_* %8, + * i32 env_->length, + * i8 signext env_->signedp) + */ + read_bits_name_len = snprintf(NULL, 0, "read_bits_%p", p); + read_bits_name = h_new(char, read_bits_name_len + 1); + snprintf(read_bits_name, read_bits_name_len + 1, "read_bits_%p", p); + bits = LLVMBuildCall(ctxt->builder, + LLVMGetNamedFunction(ctxt->mod, "h_read_bits"), + bits_args, 3, read_bits_name); /* Make an HParseResult out of it */ - LLVMValueRef mr; h_llvm_make_tt_suint(ctxt, env->length, env->signedp, bits, &mr); /* Return mr */ *res = mr; + if (bits_bb_name) { + h_free(bits_bb_name); + bits_bb_name = NULL; + } + + if (read_bits_name) { + h_free(read_bits_name); + read_bits_name = NULL; + } + return true; }