Skip to content

Instantly share code, notes, and snippets.

@HurricanKai
Created February 2, 2019 15:35
Show Gist options
  • Save HurricanKai/6e821a84e3b546d3f5e1ed3aac25c28a to your computer and use it in GitHub Desktop.
Save HurricanKai/6e821a84e3b546d3f5e1ed3aac25c28a to your computer and use it in GitHub Desktop.
const int length = 1000;
// create a module
var module = LLVM.ModuleCreateWithName("Example");
// signature
var funcType = LLVM.FunctionType(LLVM.ArrayType(LLVM.Int64Type(), length), new LLVMTypeRef[] { LLVM.ArrayType(LLVM.Int32Type(), length), LLVM.Int32Type() }, false);
// actual definition
var funcDef = LLVM.AddFunction(module, "Add", funcType);
// builder
var builder = LLVM.CreateBuilder();
var basicBlock = LLVM.AppendBasicBlock(funcDef, "init");
LLVM.PositionBuilderAtEnd(builder, basicBlock);
var cond = LLVM.AppendBasicBlock(funcDef, "for.cond");
LLVM.PositionBuilderAtEnd(builder, cond);
var body = LLVM.AppendBasicBlock(funcDef, "for.body");
LLVM.PositionBuilderAtEnd(builder, body);
var inc = LLVM.AppendBasicBlock(funcDef, "for.inc");
LLVM.PositionBuilderAtEnd(builder, inc);
var end = LLVM.AppendBasicBlock(funcDef, "for.end");
// at end of init
LLVM.PositionBuilderAtEnd(builder, basicBlock);
// alloc result array
var ar = LLVM.BuildAlloca(builder, LLVM.ArrayType(LLVM.Int64Type(), length), "array");
// left arg
var lval = LLVM.GetParam(funcDef, 0);
// right arg
var rval = LLVM.BuildZExt(builder, LLVM.GetParam(funcDef, 1), LLVM.Int64Type(), "b");
// i
var i = LLVM.BuildAlloca(builder, LLVM.Int32Type(), "i");
LLVM.BuildStore(builder, LLVM.ConstInt(LLVM.Int32Type(), 0, new LLVMBool()), i);
LLVM.BuildBr(builder, cond);
// loop.cond
LLVM.PositionBuilderAtEnd(builder, cond);
var v = LLVM.BuildLoad(builder, i, "");
var cmp = LLVM.BuildICmp(builder, LLVMIntPredicate.LLVMIntSLT, v, LLVM.ConstInt(LLVM.Int32Type(), length, new LLVMBool()), "");
LLVM.BuildCondBr(builder, cmp, body, end);
// loop.body
LLVM.PositionBuilderAtEnd(builder, body);
var element = LLVM.BuildGEP(builder, lval, new LLVMValueRef[] { i }, "");
element = LLVM.BuildLoad(builder, element, "");
element = LLVM.BuildZExt(builder, element, LLVM.Int64Type(), "");
var addRes = LLVM.BuildAdd(builder, element, rval, "");
LLVM.BuildStore(builder, addRes, LLVM.BuildGEP(builder, ar, new LLVMValueRef[] { i }, ""));
LLVM.BuildInsertElement(builder, ar, addRes, i, "");
LLVM.BuildBr(builder, inc);
// loop.inc
LLVM.PositionBuilderAtEnd(builder, inc);
var l = LLVM.BuildLoad(builder, i, "");
var r = LLVM.BuildAdd(builder, l, LLVM.ConstInt(LLVM.Int32Type(), 1, new LLVMBool(0)), "");
LLVM.BuildStore(builder, r, i);
LLVM.BuildBr(builder, cond);
// loop.end
LLVM.PositionBuilderAtEnd(builder, end);
LLVM.BuildRet(builder, ar);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment