Improve arg parsing a bit, including parsing arbitrary flags for later use. Got (after a bunch of linker pain solved by just linking in LLVM-3.8 plain and not messing with llvm-config at all) a LLVM example working
This commit is contained in:
78
llvm.krak
Normal file
78
llvm.krak
Normal file
@@ -0,0 +1,78 @@
|
||||
import vector_literals: *
|
||||
import string:*
|
||||
import io:*
|
||||
import mem: *
|
||||
import util: *
|
||||
import os: *
|
||||
|
||||
obj LLVMModule {}
|
||||
obj LLVMType {}
|
||||
obj LLVMValue {}
|
||||
obj LLVMGenericValue {}
|
||||
obj LLVMBasicBlock {}
|
||||
obj LLVMBuilder {}
|
||||
obj LLVMExecutionEngine {}
|
||||
|
||||
ext fun LLVMModuleCreateWithName(ModuleID: *char): *LLVMModule
|
||||
ext fun LLVMInt32Type(): *LLVMType
|
||||
ext fun LLVMFunctionType(ret_type: *LLVMType, param_types: **LLVMType, ParamCount: uint, isVarArg: int): *LLVMType
|
||||
ext fun LLVMAddFunction(mod: *LLVMModule, name: *char, rettype: *LLVMType): *LLVMValue
|
||||
ext fun LLVMAppendBasicBlock(func: *LLVMValue, name: *char): *LLVMBasicBlock
|
||||
ext fun LLVMCreateBuilder(): *LLVMBuilder
|
||||
ext fun LLVMPositionBuilderAtEnd(builder: *LLVMBuilder, block: *LLVMBasicBlock)
|
||||
ext fun LLVMGetParam(func: *LLVMValue, num: int): *LLVMValue
|
||||
ext fun LLVMBuildAdd(builder: *LLVMBuilder, first: *LLVMValue, second: *LLVMValue, name: *char): *LLVMValue
|
||||
ext fun LLVMBuildRet(builder: *LLVMBuilder, value: *LLVMValue): *LLVMValue
|
||||
ext fun LLVMVerifyModule(M: *LLVMModule, Action: int, error: **char): int
|
||||
var LLVMAbortProcessAction = 1
|
||||
ext fun LLVMDisposeMessage(error: *char)
|
||||
ext fun LLVMLinkInMCJIT()
|
||||
/*ext fun LLVMInitializeNativeTarget(): bool*/
|
||||
ext fun LLVMInitializeX86Target(): bool
|
||||
ext fun LLVMCreateExecutionEngineForModule(engine: **LLVMExecutionEngine, M: *LLVMModule, error: **char): int
|
||||
ext fun LLVMCreateGenericValueOfInt(Ty: *LLVMType, N: ulong, IsSigned: int): *LLVMGenericValue
|
||||
ext fun LLVMRunFunction(EE: *LLVMExecutionEngine, F: *LLVMValue, NumArgs: uint, Args: **LLVMGenericValue): *LLVMGenericValue
|
||||
ext fun LLVMGenericValueToInt(GenVal: *LLVMGenericValue, IsSigned: int): ulong
|
||||
|
||||
#link("LLVM-3.8")
|
||||
|
||||
fun main(argc: int, argv: **char): int {
|
||||
var mod = LLVMModuleCreateWithName("my_module")
|
||||
var param_types = vector(LLVMInt32Type(), LLVMInt32Type())
|
||||
var ret_type = LLVMFunctionType(LLVMInt32Type(), param_types.getBackingMemory(), (2) cast uint, 0)
|
||||
var sum = LLVMAddFunction(mod, "sum", ret_type)
|
||||
var entry = LLVMAppendBasicBlock(sum, "entry")
|
||||
var builder = LLVMCreateBuilder()
|
||||
LLVMPositionBuilderAtEnd(builder, entry)
|
||||
var tmp = LLVMBuildAdd(builder, LLVMGetParam(sum,0), LLVMGetParam(sum,1), "tmp")
|
||||
LLVMBuildRet(builder, tmp)
|
||||
|
||||
var error = null<char>()
|
||||
LLVMVerifyModule(mod, LLVMAbortProcessAction, &error)
|
||||
LLVMDisposeMessage(error)
|
||||
|
||||
var engine: *LLVMExecutionEngine
|
||||
error = null<char>()
|
||||
LLVMLinkInMCJIT()
|
||||
/*LLVMInitializeNativeTarget()*/
|
||||
// LLVMInitializeNativeTarget is static/inline :/
|
||||
LLVMInitializeX86Target()
|
||||
|
||||
if (LLVMCreateExecutionEngineForModule(&engine, mod, &error)) {
|
||||
error("Failed to create execution engine")
|
||||
}
|
||||
if (error) {
|
||||
println(string("error: ") + error)
|
||||
LLVMDisposeMessage(error)
|
||||
exit(1)
|
||||
}
|
||||
if (argc < 3) error(string("usage: ") + argv[0] + " x y")
|
||||
var x = string_to_num<ulong>(string(argv[1]))
|
||||
var y = string_to_num<ulong>(string(argv[2]))
|
||||
var args = vector(LLVMCreateGenericValueOfInt(LLVMInt32Type(), x, 0),
|
||||
LLVMCreateGenericValueOfInt(LLVMInt32Type(), y, 0))
|
||||
var res = LLVMRunFunction(engine, sum, 2u, args.getBackingMemory())
|
||||
println(string("result: ") + (LLVMGenericValueToInt(res, 0)) cast int)
|
||||
return 0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user