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 {
|
type Frame struct {
|
||||||
pkgPrefix string
|
pkgPrefix string
|
||||||
name string // full name, including package
|
llvmFn llvm.Value
|
||||||
params map[*ssa.Parameter]int // arguments to the function
|
params map[*ssa.Parameter]int // arguments to the function
|
||||||
locals map[ssa.Value]llvm.Value // local variables
|
locals map[ssa.Value]llvm.Value // local variables
|
||||||
blocks map[*ssa.BasicBlock]llvm.BasicBlock
|
blocks map[*ssa.BasicBlock]llvm.BasicBlock
|
||||||
|
@ -336,7 +336,6 @@ func (c *Compiler) parseFuncDecl(pkgPrefix string, f *ssa.Function) (*Frame, err
|
||||||
|
|
||||||
frame := &Frame{
|
frame := &Frame{
|
||||||
pkgPrefix: pkgPrefix,
|
pkgPrefix: pkgPrefix,
|
||||||
name: name,
|
|
||||||
params: make(map[*ssa.Parameter]int),
|
params: make(map[*ssa.Parameter]int),
|
||||||
locals: make(map[ssa.Value]llvm.Value),
|
locals: make(map[ssa.Value]llvm.Value),
|
||||||
blocks: make(map[*ssa.BasicBlock]llvm.BasicBlock),
|
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)
|
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
|
return frame, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error {
|
func (c *Compiler) parseFunc(frame *Frame, f *ssa.Function) error {
|
||||||
// Pre-create all basic blocks in the function.
|
// Pre-create all basic blocks in the function.
|
||||||
llvmFn := c.mod.NamedFunction(frame.name)
|
|
||||||
for _, block := range f.DomPreorder() {
|
for _, block := range f.DomPreorder() {
|
||||||
llvmBlock := c.ctx.AddBasicBlock(llvmFn, block.Comment)
|
llvmBlock := c.ctx.AddBasicBlock(frame.llvmFn, block.Comment)
|
||||||
frame.blocks[block] = llvmBlock
|
frame.blocks[block] = llvmBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load function parameters
|
// Load function parameters
|
||||||
for _, param := range f.Params {
|
for _, param := range f.Params {
|
||||||
llvmParam := llvmFn.Param(frame.params[param])
|
llvmParam := frame.llvmFn.Param(frame.params[param])
|
||||||
frame.locals[param] = llvmParam
|
frame.locals[param] = llvmParam
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче