Contribution. llir/llvm [llir]

m := ir.NewModule()

globalG := m.NewGlobalDef("g", constant.NewInt(types.I32, 2))

funcAdd := m.NewFunc("add", types.I32,
        ir.NewParam("x", types.I32),
        ir.NewParam("y", types.I32),
)
ab := funcAdd.NewBlock("")
ab.NewRet(ab.NewAdd(funcAdd.Params[0], funcAdd.Params[1]))

funcMain := m.NewFunc(
        "main",
        types.I32,
)  // omit parameters
mb := funcMain.NewBlock("") // llir/llvm would give correct default name for block without name
mb.NewRet(mb.NewCall(funcAdd, constant.NewInt(types.I32, 1), mb.NewLoad(types.I32, globalG)))

println(m.String())

Generated IR:

@g = global i32 2

define i32 @add(i32 %x, i32 %y) {
;