25
`github.com/bytedance/sonic/internal/rt`
28
type FunctionLayout struct {
34
func (self FunctionLayout) String() string {
35
return self.formatFn()
38
func (self FunctionLayout) ArgSize() uint32 {
40
for _, arg := range self.Args {
41
size += arg.Type.Size()
51
func (self FunctionLayout) StackMap() *rt.StackMap {
53
var mb rt.StackMapBuilder
56
for _, v := range self.Args {
57
st = append(st, slot {
64
for _, v := range self.Rets {
66
st = append(st, slot {
74
sort.Slice(st, func(i int, j int) bool {
75
return st[i].m < st[j].m
79
for _, v := range st {
87
func (self FunctionLayout) formatFn() string {
89
return fmt.Sprintf("\n%#04x\nRets:\n%s\nArgs:\n%s", fp, self.formatSeq(self.Rets, &fp), self.formatSeq(self.Args, &fp))
92
func (self FunctionLayout) formatSeq(v []Parameter, fp *uint32) string {
94
mm := make([]string, 0, len(v))
97
for i := nb-1; i >=0; i-- {
99
mm = append(mm, fmt.Sprintf("%#04x %s", *fp, v[i].String()))
103
return strings.Join(mm, "\n")
112
func NewFrame(desc *FunctionLayout, locals []bool, ccall bool) Frame {
120
func (self *Frame) String() string {
121
out := self.desc.String()
124
out += fmt.Sprintf("\n%#4x [Return PC]", off)
126
out += fmt.Sprintf("\n%#4x [RBP]", off)
129
for _, v := range ReservedRegs(self.ccall) {
130
out += fmt.Sprintf("\n%#4x [%v]", off, v)
134
for _, b := range self.locals {
135
out += fmt.Sprintf("\n%#4x [%v]", off, b)
142
func (self *Frame) Prev() uint32 {
143
return self.Size() + PtrSize
146
func (self *Frame) Size() uint32 {
147
return uint32(self.Offs() + PtrSize)
150
func (self *Frame) Offs() uint32 {
151
return uint32(len(ReservedRegs(self.ccall)) * PtrSize + len(self.locals)*PtrSize)
154
func (self *Frame) ArgPtrs() *rt.StackMap {
155
return self.desc.StackMap()
158
func (self *Frame) LocalPtrs() *rt.StackMap {
159
var m rt.StackMapBuilder
160
for _, b := range self.locals {
161
m.AddFields(len(ReservedRegs(self.ccall)), b)
166
func alignUp(n uint32, a int) uint32 {
167
return (uint32(n) + uint32(a) - 1) &^ (uint32(a) - 1)
170
func isPointer(vt reflect.Type) bool {
172
case reflect.Bool : fallthrough
173
case reflect.Int : fallthrough
174
case reflect.Int8 : fallthrough
175
case reflect.Int16 : fallthrough
176
case reflect.Int32 : fallthrough
177
case reflect.Int64 : fallthrough
178
case reflect.Uint : fallthrough
179
case reflect.Uint8 : fallthrough
180
case reflect.Uint16 : fallthrough
181
case reflect.Uint32 : fallthrough
182
case reflect.Uint64 : fallthrough
183
case reflect.Float32 : fallthrough
184
case reflect.Float64 : fallthrough
185
case reflect.Uintptr : return false
186
case reflect.Chan : fallthrough
187
case reflect.Func : fallthrough
188
case reflect.Map : fallthrough
189
case reflect.Ptr : fallthrough
190
case reflect.UnsafePointer : return true
191
case reflect.Complex64 : fallthrough
192
case reflect.Complex128 : fallthrough
193
case reflect.Array : fallthrough
194
case reflect.Struct : panic("abi: unsupported types")
195
default : panic("abi: invalid value type")