From 75886be3ed368054a88667a6d6ac9fdc312ab257 Mon Sep 17 00:00:00 2001
From: "Meredith L. Patterson" <mlp@thesmartpolitenerd.com>
Date: Sat, 6 Aug 2016 18:12:16 +0200
Subject: [PATCH] working on getting LLVM working for one parser

---
 src/parsers/ch.c | 39 +++++++++++++++++++--------------------
 1 file changed, 19 insertions(+), 20 deletions(-)

diff --git a/src/parsers/ch.c b/src/parsers/ch.c
index a6822bac..1dceb2cb 100644
--- a/src/parsers/ch.c
+++ b/src/parsers/ch.c
@@ -49,13 +49,13 @@ static bool ch_llvm(LLVMBuilderRef builder, LLVMModuleRef mod, void* env) {
     LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "%struct.HInputStream_"), 0),
     LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "%struct.HArena_"), 0)
   };
-  LLVMTypeRef ret_type = LLVMFunctionType(LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "%struct.HParseResult_"), 0), param_types, 2, 0);
+  LLVMTypeRef ret_type = LLVMFunctionType(LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "%struct.HParseResult_*"), 0), param_types, 2, 0);
   LLVMValueRef ch = LLVMAddFunction(mod, "ch", ret_type);
   // get the parameter array to use later with h_bits
-  LLVMValueRef params[3];
-  LLVMGetParams(ch, params);
-  params[1] = LLVMConstInt(LLVMInt32Type(), 8, 0);
-  params[2] = LLVMConstInt(LLVMInt8Type(), 0, 0);
+  LLVMValueRef bits_args[3];
+  LLVMGetParams(ch, bits_args);
+  bits_args[1] = LLVMConstInt(LLVMInt32Type(), 8, 0);
+  bits_args[2] = LLVMConstInt(LLVMInt8Type(), 0, 0);
   LLVMValueRef arena = LLVMGetParam(ch, 1);
   LLVMBasicBlockRef entry = LLVMAppendBasicBlock(ch, "ch_entry");
   LLVMBasicBlockRef success = LLVMAppendBasicBlock(ch, "ch_success");
@@ -63,19 +63,15 @@ 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");
-  // skip %2 through %c 'cause we have these from arguments
-  // %r = alloca i8, align 1
-  LLVMValueRef r = LLVMBuildAlloca(builder, LLVMInt8Type(), "r");
+  LLVMValueRef ret = LLVMBuildAlloca(builder, LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "%struct.HParseResult_*"), 0), "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, LLVMPointerType(LLVMStructCreateNamed(LLVMGetGlobalContext(), "%struct.HParsedToken_*"), 0), "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"), params, 1, "h_read_bits");
+  LLVMValueRef bits = LLVMBuildCall(builder, LLVMGetNamedFunction(mod, "h_read_bits"), bits_args, 3, "h_read_bits");
   // %10 = trunc i64 %9 to i8
-  LLVMValueRef tmp = LLVMBuildTrunc(builder, bits, LLVMInt8Type(), "");
-  // store i8 %10, i8* %r, align 1
-  LLVMBuildStore(builder, bits, r);
+  LLVMValueRef r = LLVMBuildTrunc(builder, bits, LLVMInt8Type(), "");
   // %11 = load i8* %c
   // %12 = zext i8 %11 to i32
   // %13 = load i8* %r, align 1
@@ -109,13 +105,16 @@ static bool ch_llvm(LLVMBuilderRef builder, LLVMModuleRef mod, void* env) {
   // %25 = zext i8 %24 to i64
   // %26 = load %struct.HParsedToken_** %tok, align 8
   // %27 = getelementptr inbounds %struct.HParsedToken_* %26, i32 0, i32 1
-  LLVMValueRef bounds2[] = {
-    LLVMConstInt(LLVMInt32Type(), 0, 0),
-    LLVMConstInt(LLVMInt32Type(), 0, 1)
-  };
-  LLVMValueRef uint = LLVMBuildInBoundsGEP(builder, tok, bounds2, 1, "uint");
+  /* LLVMValueRef bounds2[] = { */
+  /*   LLVMConstInt(LLVMInt32Type(), 0, 0), */
+  /*   LLVMConstInt(LLVMInt32Type(), 0, 1) */
+  /* }; */
+  /* LLVMValueRef uint = LLVMBuildInBoundsGEP(builder, tok, bounds2, 1, "uint"); */
   // %28 = bitcast %union.anon* %27 to i64*
-  LLVMValueRef cast2 = LLVMBuildBitCast(builder, uint, LLVMInt64Type(), "result");
+  //LLVMValueRef cast2 = LLVMBuildBitCast(builder, uint, LLVMInt64Type(), "result");
+  LLVMValueRef uint = LLVMConstInt(LLVMInt32Type(), TT_UINT, 0);
+  LLVMBuildInsertValue(builder, tok, uint, 0, 0);
+  LLVMBuildInsertValue(builder, tok, r, 1, 0);
   // we already have the arena and the token, so skip to %33
   // %33 = call %struct.HParseResult_* @make_result(%struct.HArena_* %31, %struct.HParsedToken_* %32)
   LLVMValueRef result_args[] = { arena, tok };
-- 
GitLab