diff --git a/src/parsers/ch.c b/src/parsers/ch.c index 9a3dbfe9a67be6b529cacbed117e2c28a1a6f568..bdace2204a7ccaf415706da31c139a728903678c 100644 --- a/src/parsers/ch.c +++ b/src/parsers/ch.c @@ -55,6 +55,23 @@ static bool ch_llvm(HLLVMParserCompileContext *ctxt, LLVMValueRef *res) { /* Build a new LLVM function to parse a character */ + /* Allocator */ + HAllocator *mm__ = NULL; + /* Names */ + char *ch_entry_name = NULL; + int ch_entry_name_len = 0; + char *ch_success_name = NULL; + int ch_success_name_len = 0; + char *ch_end_name = NULL; + int ch_end_name_len = 0; + char *ch_read_bits_name = NULL; + int ch_read_bits_name_len = 0; + char *ch_r_name = NULL; + int ch_r_name_len = 0; + char *ch_icmp_name = NULL; + int ch_icmp_name_len = 0; + char *ch_rv_name = NULL; + int ch_rv_name_len = 0; /* Basic blocks we will be using */ LLVMBasicBlockRef entry, success, end; /* Args for call to h_read_bits() */ @@ -81,15 +98,24 @@ static bool ch_llvm(HLLVMParserCompileContext *ctxt, if (!p) return false; if (!ctxt) return false; + /* Unpack the allocator */ + mm__ = ctxt->mm__; + /* * Set up basic blocks: entry, success and failure branches, then exit - * - * TODO should these basic block names reflect the particular HParser to - * make the IR dump more comprehensible? */ - entry = LLVMAppendBasicBlock(ctxt->func, "ch_entry"); - success = LLVMAppendBasicBlock(ctxt->func, "ch_success"); - end = LLVMAppendBasicBlock(ctxt->func, "ch_end"); + ch_entry_name_len = snprintf(NULL, 0, "ch_entry_%p", p); + ch_entry_name = h_new(char, ch_entry_name_len + 1); + snprintf(ch_entry_name, ch_entry_name_len + 1, "ch_entry_%p", p); + entry = LLVMAppendBasicBlock(ctxt->func, ch_entry_name); + ch_success_name_len = snprintf(NULL, 0, "ch_success_%p", p); + ch_success_name = h_new(char, ch_success_name_len + 1); + snprintf(ch_success_name, ch_success_name_len + 1, "ch_success_%p", p); + success = LLVMAppendBasicBlock(ctxt->func, ch_success_name); + ch_end_name_len = snprintf(NULL, 0, "ch_end_%p", p); + ch_end_name = h_new(char, ch_end_name_len + 1); + snprintf(ch_end_name, ch_end_name_len + 1, "ch_end_%p", p); + end = LLVMAppendBasicBlock(ctxt->func, ch_end_name); /* Basic block: entry */ LLVMBuildBr(ctxt->builder, entry); @@ -106,20 +132,30 @@ static bool ch_llvm(HLLVMParserCompileContext *ctxt, * %read_bits = call i64 @h_read_bits(%struct.HInputStream_* %8, * i32 8, i8 signext 0) */ + ch_read_bits_name_len = snprintf(NULL, 0, "read_bits_%p", p); + ch_read_bits_name = h_new(char, ch_read_bits_name_len + 1); + snprintf(ch_read_bits_name, ch_read_bits_name_len + 1, + "read_bits_%p", p); bits = LLVMBuildCall(ctxt->builder, LLVMGetNamedFunction(ctxt->mod, "h_read_bits"), - bits_args, 3, "read_bits"); + bits_args, 3, ch_read_bits_name); /* %2 = trunc i64 %read_bits to i8 */ - r = LLVMBuildTrunc(ctxt->builder, bits, LLVMInt8Type(), ""); + ch_r_name_len = snprintf(NULL, 0, "r_%p", p); + ch_r_name = h_new(char, ch_r_name_len + 1); + snprintf(ch_r_name, ch_r_name_len + 1, "r_%p", p); + r = LLVMBuildTrunc(ctxt->builder, bits, LLVMInt8Type(), ch_r_name); /* * Check if h_read_bits succeeded * * %"c == r" = icmp eq i8 -94, %2 ; the -94 comes from c_ */ + ch_icmp_name_len = snprintf(NULL, 0, "icmp_%p", p); + ch_icmp_name = h_new(char, ch_icmp_name_len + 1); + snprintf(ch_icmp_name, ch_icmp_name_len + 1, "icmp_%p", p); cval = (uint8_t)(uintptr_t)(p->env); c = LLVMConstInt(LLVMInt8Type(), cval, 0); - icmp = LLVMBuildICmp(ctxt->builder, LLVMIntEQ, c, r, "c == r"); + icmp = LLVMBuildICmp(ctxt->builder, LLVMIntEQ, c, r, ch_icmp_name); /* * Branch so success or failure basic block, as appropriate @@ -142,7 +178,10 @@ static bool ch_llvm(HLLVMParserCompileContext *ctxt, * %rv = phi %struct.HParseResult_.3* [ %make_result, %ch_success ], * [ null, %ch_entry ] */ - rv = LLVMBuildPhi(ctxt->builder, ctxt->llvm_parseresultptr, "rv"); + ch_rv_name_len = snprintf(NULL, 0, "rv_%p", p); + ch_rv_name = h_new(char, ch_rv_name_len + 1); + snprintf(ch_rv_name, ch_rv_name_len + 1, "rv_%p", p); + rv = LLVMBuildPhi(ctxt->builder, ctxt->llvm_parseresultptr, ch_rv_name); rv_phi_incoming_blocks[0] = success; rv_phi_incoming_values[0] = mr; rv_phi_incoming_blocks[1] = entry; @@ -151,6 +190,41 @@ static bool ch_llvm(HLLVMParserCompileContext *ctxt, /* Pass rv out to caller */ *res = rv; + if (ch_entry_name) { + h_free(ch_entry_name); + ch_entry_name = NULL; + } + + if (ch_success_name) { + h_free(ch_success_name); + ch_success_name = NULL; + } + + if (ch_end_name) { + h_free(ch_end_name); + ch_end_name = NULL; + } + + if (ch_read_bits_name) { + h_free(ch_read_bits_name); + ch_read_bits_name = NULL; + } + + if (ch_r_name) { + h_free(ch_r_name); + ch_r_name = NULL; + } + + if (ch_icmp_name) { + h_free(ch_icmp_name); + ch_icmp_name = NULL; + } + + if (ch_rv_name) { + h_free(ch_rv_name); + ch_rv_name = NULL; + } + return true; }