1 Star 1 Fork 1

U语言组织/U语言

forked from 秋来冬风/U语言 
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
stack.go 1.85 KB
一键复制 编辑 原始数据 按行查看 历史
package amd64
import (
"fmt"
"strconv"
"sync"
"sync/atomic"
"gitee.com/u-language/u-language/ucom/ast"
"gitee.com/u-language/u-language/ucom/enum"
)
// 栈分配记录
type Stack struct {
allmap *sync.Map //key=string value=StackVarInfo
size int64
}
func NewStack(sbt *ast.Sbt) *Stack {
var ret *Stack = new(Stack)
ret.allmap = new(sync.Map)
ret.size = 0
sbt.Range(func(key string, value ast.SymbolInfo) bool {
if !(value.Kind == enum.SymbolVar || value.Kind == enum.SymbolNoParameVar) {
return true
}
var IsStackAlloc bool
if v, ok := value.Info.(*ast.VarNode); ok {
IsStackAlloc = v.IsFunc
} else {
IsStackAlloc = value.Info.(*ast.VarInfoSbt).IsStackAlloc
}
if IsStackAlloc {
size := ast.RetTypeSize(value.Type())
offset := atomic.AddInt64(&ret.size, size)
ret.allmap.Store(key, NewStackVarInfo(offset))
}
return true
})
return ret
}
// 查询是否记录了变量
// - name是变量名
func (s *Stack) HaveVar(name string) StackVarInfo {
v, ok := s.allmap.Load(name)
if ok {
return v.(StackVarInfo)
}
panic(fmt.Errorf("不存在的局部变量 %s", name))
}
// 栈变量信息
type StackVarInfo struct {
//偏移量
offset int64
}
func NewStackVarInfo(offset int64) StackVarInfo {
return StackVarInfo{offset: offset}
}
func (info StackVarInfo) IsZero() bool {
return info.offset == 0
}
// 分配函数栈
func StackAllocText(size int64) TextNode {
var ret = make([]TextNode, 3)
ret[0] = NewSrcNumDestReg(RSP, strconv.FormatInt(size+8, 10), SUB)
ret[1] = NewSrcRegDestRegOffset(RBP, RBP, -8, MOV)
ret[2] = NewSrcRegOffsetDestReg(RBP, RBP, -8, LEA)
return NewStackAllocKind(ret)
}
// 释放函数栈
func StackFreeText(size int64) TextNode {
var ret = make([]TextNode, 2)
ret[0] = NewSrcRegMemDestReg(RBP, RBP, MOV)
ret[1] = NewSrcNumDestReg(RSP, strconv.FormatInt(size+8, 10), ADD)
return NewStackFreeKind(ret)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/u-language/u-language.git
git@gitee.com:u-language/u-language.git
u-language
u-language
U语言
df767d8a61bb

搜索帮助