From d0e64d9f6ad388f5c97762c75e82be2fd62b04cc Mon Sep 17 00:00:00 2001
From: Andrea Shepard <andrea@special-circumstanc.es>
Date: Wed, 13 Nov 2019 22:49:48 +0000
Subject: [PATCH] HParser-specific labels for LLVM IR in ch.c

---
 src/parsers/ch.c | 94 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 84 insertions(+), 10 deletions(-)

diff --git a/src/parsers/ch.c b/src/parsers/ch.c
index 9a3dbfe9..bdace220 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;
 }
 
-- 
GitLab