@@ -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