Skip to content

Commit d0cab8c

Browse files
committed
cmd/internal/obj/sparc64: don't replace sym+offset(FP) with newoffset(RFP)
Fixes golang#10. Change-Id: I8511cd93b8046b03d75ec4d49dc92b4fd2805fd0
1 parent fa53602 commit d0cab8c

File tree

2 files changed

+34
-24
lines changed

2 files changed

+34
-24
lines changed

src/cmd/internal/obj/sparc64/asm.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,7 @@ func aclass(a *obj.Addr) int8 {
924924
return ClassMem
925925

926926
case obj.NAME_AUTO, obj.NAME_PARAM:
927-
panic("unimplemented")
927+
return aclass(autoeditaddr(a))
928928

929929
case obj.TYPE_NONE:
930930
if a.Scale == 1 {
@@ -960,7 +960,7 @@ func aclass(a *obj.Addr) int8 {
960960
return ClassAddr
961961

962962
case obj.NAME_AUTO, obj.NAME_PARAM:
963-
panic("unimplemented")
963+
return aclass(autoeditaddr(a))
964964
}
965965
case obj.TYPE_BRANCH:
966966
return ClassBranch
@@ -975,7 +975,7 @@ func span(ctxt *obj.Link, cursym *obj.LSym) {
975975

976976
var pc int64 // relative to entry point
977977
for p := cursym.Text.Link; p != nil; p = p.Link {
978-
o, err := oplook(p)
978+
o, err := oplook(autoeditprog(p))
979979
if err != nil {
980980
ctxt.Diag(err.Error())
981981
}
@@ -988,8 +988,9 @@ func span(ctxt *obj.Link, cursym *obj.LSym) {
988988

989989
var text []uint32 // actual assembled bytes
990990
for p := cursym.Text.Link; p != nil; p = p.Link {
991-
o, _ := oplook(p)
992-
out, _ := asmout(p, o, cursym)
991+
p1 := autoeditprog(p)
992+
o, _ := oplook(p1)
993+
out, _ := asmout(p1, o, cursym)
993994
text = append(text, out...)
994995
}
995996

src/cmd/internal/obj/sparc64/obj.go

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -101,25 +101,40 @@ func init() {
101101
}
102102
}
103103

104-
// Autoedit rewrites off(SP), off(FP), $off(SP), and $off(FP) to new(RFP).
105-
func autoedit(a *obj.Addr) {
104+
// AutoeditProg returns a new obj.Prog, with off(SP), off(FP), $off(SP),
105+
// and $off(FP) replaced with new(RFP).
106+
func autoeditprog(p *obj.Prog) *obj.Prog {
107+
r := new(obj.Prog)
108+
*r = *p
109+
r.From = *autoeditaddr(&r.From)
110+
r.From3 = autoeditaddr(r.From3)
111+
r.To = *autoeditaddr(&r.To)
112+
return r
113+
}
114+
115+
// Autoeditaddr returns a new obj.Addr, with off(SP), off(FP), $off(SP),
116+
// and $off(FP) replaced with new(RFP).
117+
func autoeditaddr(a *obj.Addr) *obj.Addr {
106118
if a == nil {
107-
return
119+
return nil
108120
}
109121
if a.Type != obj.TYPE_MEM && a.Type != obj.TYPE_ADDR {
110-
return
122+
return a
111123
}
112-
if a.Name == obj.NAME_PARAM {
113-
a.Reg = REG_RFP
114-
a.Offset += MinStackFrameSize + StackBias
115-
a.Name = obj.TYPE_NONE
116-
return
124+
r := new(obj.Addr)
125+
*r = *a
126+
if r.Name == obj.NAME_PARAM {
127+
r.Reg = REG_RFP
128+
r.Offset += MinStackFrameSize + StackBias
129+
r.Name = obj.TYPE_NONE
130+
return r
117131
}
118-
if a.Name == obj.NAME_AUTO {
119-
a.Reg = REG_RFP
120-
a.Offset += StackBias
121-
a.Name = obj.TYPE_NONE
132+
if r.Name == obj.NAME_AUTO {
133+
r.Reg = REG_RFP
134+
r.Offset += StackBias
135+
r.Name = obj.TYPE_NONE
122136
}
137+
return r
123138
}
124139

125140
// yfix rewrites references to Y registers (issued by compiler)
@@ -156,12 +171,6 @@ func yfix(p *obj.Prog) {
156171
}
157172

158173
func progedit(ctxt *obj.Link, p *obj.Prog) {
159-
// Rewite virtual SP/FP references to RFP. This has to happen
160-
// before any call to aclass, so it must be first here.
161-
autoedit(&p.From)
162-
autoedit(p.From3)
163-
autoedit(&p.To)
164-
165174
// Rewrite constant moves to memory to go through an intermediary
166175
// register
167176
switch p.As {

0 commit comments

Comments
 (0)