ginger/main.go

84 lines
1.9 KiB
Go
Raw Normal View History

package main
import (
"fmt"
"log"
"github.com/mediocregopher/ginger/expr"
"llvm.org/llvm/bindings/go/llvm"
)
func main() {
//ee, err := expr.Parse(os.Stdin)
//if err != nil {
// panic(err)
//}
//for _, e := range ee {
// fmt.Println(e)
//}
log.Printf("initializing llvm")
llvm.LinkInMCJIT()
llvm.InitializeNativeTarget()
llvm.InitializeNativeAsmPrinter()
log.Printf("initializing build context")
2016-08-07 15:06:46 +00:00
ctx := expr.NewCtx()
bctx := expr.BuildCtx{
2016-08-02 00:08:51 +00:00
B: llvm.NewBuilder(),
M: llvm.NewModule("my_module"),
}
log.Printf("making program")
2016-08-06 18:36:46 +00:00
add := expr.Macro("add")
2016-08-20 18:48:14 +00:00
//bind := expr.Macro("bind")
op := expr.Macro("op")
in := expr.Macro("in")
2016-08-20 18:48:14 +00:00
incr := expr.NewStatement(op,
expr.NewList(
expr.NewStatement(add, expr.NewTuple(
expr.Int(1),
expr.NewStatement(in, expr.NewTuple()),
)),
),
2016-08-20 18:48:14 +00:00
)
2016-08-20 18:48:14 +00:00
stmts := []expr.Statement{
expr.NewStatement(
incr,
expr.NewStatement(incr, expr.Int(4)),
),
}
2016-08-02 00:08:51 +00:00
log.Printf("creating main function")
mainFn := llvm.AddFunction(bctx.M, "main", llvm.FunctionType(llvm.Int64Type(), []llvm.Type{}, false))
mainBlock := llvm.AddBasicBlock(mainFn, "")
bctx.B.SetInsertPoint(mainBlock, mainBlock.FirstInstruction())
log.Printf("actually processing program")
out := bctx.Build(ctx, stmts...)
bctx.B.CreateRet(out)
//bctx.Build(ctx, stmts...)
//bctx.B.CreateRet(llvm.ConstInt(llvm.Int64Type(), uint64(5), false))
fmt.Println("######## dumping IR")
bctx.M.Dump()
fmt.Println("######## done dumping IR")
2016-07-28 19:57:17 +00:00
log.Printf("verifying")
if err := llvm.VerifyModule(bctx.M, llvm.ReturnStatusAction); err != nil {
panic(err)
}
log.Printf("creating execution enging")
engine, err := llvm.NewExecutionEngine(bctx.M)
if err != nil {
panic(err)
}
log.Printf("running main function")
funcResult := engine.RunFunction(bctx.M.NamedFunction("main"), []llvm.GenericValue{})
fmt.Printf("\nOUTPUT:\n%d\n", funcResult.Int(false))
}