Skip to content

Commit 438eca4

Browse files
authored
chore: pcsp for jit functions (#877)
1 parent 045dce4 commit 438eca4

File tree

3 files changed

+35
-22
lines changed

3 files changed

+35
-22
lines changed

internal/decoder/jitdec/pcsp_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@
1717
* limitations under the License.
1818
*/
1919

20-
package jitdec
20+
package jitdec
2121

2222
import (
2323
"testing"
2424
"unsafe"
2525

26-
"github.com/bytedance/sonic/internal/jit"
26+
"github.com/bytedance/sonic/internal/jit"
27+
"github.com/bytedance/sonic/loader"
2728
"github.com/stretchr/testify/assert"
2829
"github.com/stretchr/testify/require"
2930
)
@@ -139,7 +140,13 @@ func sonicSigTrap(info unsafe.Pointer, c *sigctxt, gp unsafe.Pointer) bool {
139140

140141
func TestAssembler_PCSP(t *testing.T) {
141142
testSigtrap = sonicSigTrap
142-
f := new(_MockDecoder).Load()
143+
a := new(_MockDecoder)
144+
f := a.Load()
145+
assert.Equal(t, a.Pcdata, loader.Pcdata{
146+
{Val: int32(0), PC: 7}, // subq instruction
147+
{Val: int32(_VD_size), PC: 40}, // addq instruction
148+
{Val: int32(0), PC: 42}, // ret instructions
149+
})
143150
pos, err := f("", 0, nil, nil, 0, "", nil)
144151
require.NoError(t, err)
145152
assert.Equal(t, 199, pos)

internal/jit/assembler_amd64.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ type BaseAssembler struct {
3636
i int
3737
f func()
3838
c []byte
39-
pcdata loader.Pcdata
39+
Pcdata loader.Pcdata
4040
o sync.Once
4141
pb *Backend
4242
xrefs map[string][]*obj.Prog
@@ -213,7 +213,7 @@ var jitLoader = loader.Loader{
213213

214214
func (self *BaseAssembler) Load(name string, frameSize int, argSize int, argStackmap []bool, localStackmap []bool) loader.Function {
215215
self.build()
216-
return jitLoader.LoadOne(self.c, name, frameSize, argSize, argStackmap, localStackmap, self.pcdata)
216+
return jitLoader.LoadOne(self.c, name, frameSize, argSize, argStackmap, localStackmap, self.Pcdata)
217217
}
218218

219219
/** Assembler Stages **/
@@ -266,5 +266,5 @@ func (self *BaseAssembler) validate() {
266266
}
267267

268268
func (self *BaseAssembler) assemble() {
269-
self.c, self.pcdata = self.pb.Assemble()
269+
self.c, self.Pcdata = self.pb.Assemble()
270270
}

internal/jit/backend.go

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,11 @@ func max(a, b int32) int32 {
126126
return b
127127
}
128128

129-
func pcdelta(ctxt *obj.Link, p *obj.Prog) uint32 {
130-
if p.Link != nil {
131-
return uint32(p.Link.Pc / int64(ctxt.Arch.MinLC))
129+
func nextPc(p *obj.Prog) uint32 {
130+
if p.Link != nil && p.Pc + int64(p.Isize) != p.Link.Pc {
131+
panic("p.PC + p.Isize != p.Link.PC")
132132
}
133-
return uint32(p.Pc / int64(ctxt.Arch.MinLC))
133+
return uint32(p.Pc + int64(p.Isize))
134134
}
135135

136136
// NOTE: copied from https://github.com/twitchyliquid64/golang-asm/blob/8d7f1f783b11f9a00f5bcdfcae17f5ac8f22512e/obj/x86/obj6.go#L811.
@@ -140,74 +140,80 @@ func (self *Backend) GetPcspTable(ctxt *obj.Link, cursym *obj.LSym, newprog obj.
140140
var deltasp int32
141141
var maxdepth int32
142142
foundRet := false
143-
for p := cursym.Func.Text; p != nil; p = p.Link {
143+
p := cursym.Func.Text
144+
for ; p != nil; p = p.Link {
144145
if foundRet {
145146
break
146147
}
147148
switch p.As {
148149
default: continue
149150
case x86.APUSHL, x86.APUSHFL:
150-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
151+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
151152
deltasp += 4
152153
maxdepth = max(maxdepth, deltasp)
153154
continue
154155

155156
case x86.APUSHQ, x86.APUSHFQ:
156-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
157+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
157158
deltasp += 8
158159
maxdepth = max(maxdepth, deltasp)
159160
continue
160161

161162
case x86.APUSHW, x86.APUSHFW:
162-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
163+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
163164
deltasp += 2
164165
maxdepth = max(maxdepth, deltasp)
165166
continue
166167

167168
case x86.APOPL, x86.APOPFL:
168-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
169+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
169170
deltasp -= 4
170171
continue
171172

172173
case x86.APOPQ, x86.APOPFQ:
173-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
174+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
174175
deltasp -= 8
175176
continue
176177

177178
case x86.APOPW, x86.APOPFW:
178-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
179+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
179180
deltasp -= 2
180181
continue
181182

182183
case x86.AADJSP:
183-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
184+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
184185
deltasp += int32(p.From.Offset)
185186
maxdepth = max(maxdepth, deltasp)
186187
continue
187188

188189
case x86.ASUBQ:
189190
// subq %rsp, $imm
190191
if p.To.Reg == x86.REG_SP && p.To.Type == obj.TYPE_REG {
191-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
192+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
192193
deltasp += int32(p.From.Offset)
193194
maxdepth = max(maxdepth, deltasp)
194195
}
195196
continue
196197
case x86.AADDQ:
197198
// addq %rsp, $imm
198199
if p.To.Reg == x86.REG_SP && p.To.Type == obj.TYPE_REG {
199-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
200+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
200201
deltasp -= int32(p.From.Offset)
201202
}
202203
continue
203204
case obj.ARET:
204205
if deltasp != 0 {
205206
panic("unbalanced PUSH/POP")
206207
}
207-
pcdata = append(pcdata, loader.Pcvalue{PC: pcdelta(ctxt, p), Val: int32(deltasp)})
208+
pcdata = append(pcdata, loader.Pcvalue{PC: nextPc(p), Val: int32(deltasp)})
208209
foundRet = true
209210
}
210211
}
211-
pcdata = append(pcdata, loader.Pcvalue{PC: uint32(cursym.Size), Val: int32(maxdepth)})
212+
213+
// the instructions after the RET instruction
214+
if p != nil {
215+
pcdata = append(pcdata, loader.Pcvalue{PC: uint32(cursym.Size), Val: int32(maxdepth)})
216+
}
217+
212218
return pcdata
213219
}

0 commit comments

Comments
 (0)