Store LLVM reference instead of function name in Frame
Этот коммит содержится в:
родитель
45e7376f39
коммит
12eb9eec3c
1 изменённых файлов: 8 добавлений и 6 удалений
14
tgo.go
14
tgo.go
|
@ -54,7 +54,7 @@ type Compiler struct {
|
|||
|
||||
type Frame struct {
|
||||
pkgPrefix string
|
||||
name string // full name, including package
|
||||
llvmFn llvm.Value
|
||||
params map[*ssa.Parameter]int // arguments to the function
|
||||
locals map[ssa.Value]llvm.Value // local variables
|
||||
blocks map[*ssa.BasicBlock]llvm.BasicBlock
|
||||
|
@ -336,7 +336,6 @@ func (c *Compiler) parseFuncDecl(pkgPrefix string, f *ssa.Function) (*Frame, err
|
|||
|
||||
frame := &Frame{
|
||||
pkgPrefix: pkgPrefix,
|
||||
name: name,
|
||||
params: make(map[*ssa.Parameter]int),
|
||||
locals: make(map[ssa.Value]llvm.Value),
|
||||
blocks: make(map[*ssa.BasicBlock]llvm.BasicBlock),
|
||||
|
@ -366,21 +365,24 @@ func (c *Compiler) parseFuncDecl(pkgPrefix string, f *ssa.Function) (*Frame, err
|
|||
}
|
||||
|
||||
fnType := llvm.FunctionType(retType, paramTypes, false)
|
||||
llvm.AddFunction(c.mod, name, fnType)
|
||||
|
||||
frame.llvmFn = c.mod.NamedFunction(name)
|
||||
if frame.llvmFn.IsNil() {
|
||||
frame.llvmFn = llvm.AddFunction(c.mod, name, fnType)
|
||||
}
|
||||
return frame, nil
|
||||
}
|
||||
|
||||
func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error {
|
||||
// Pre-create all basic blocks in the function.
|
||||
llvmFn := c.mod.NamedFunction(frame.name)
|
||||
for _, block := range f.DomPreorder() {
|
||||
llvmBlock := c.ctx.AddBasicBlock(llvmFn, block.Comment)
|
||||
llvmBlock := c.ctx.AddBasicBlock(frame.llvmFn, block.Comment)
|
||||
frame.blocks[block] = llvmBlock
|
||||
}
|
||||
|
||||
// Load function parameters
|
||||
for _, param := range f.Params {
|
||||
llvmParam := llvmFn.Param(frame.params[param])
|
||||
llvmParam := frame.llvmFn.Param(frame.params[param])
|
||||
frame.locals[param] = llvmParam
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче