@@ -101,25 +101,40 @@ func init() {
101
101
}
102
102
}
103
103
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 {
106
118
if a == nil {
107
- return
119
+ return nil
108
120
}
109
121
if a .Type != obj .TYPE_MEM && a .Type != obj .TYPE_ADDR {
110
- return
122
+ return a
111
123
}
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
117
131
}
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
122
136
}
137
+ return r
123
138
}
124
139
125
140
// yfix rewrites references to Y registers (issued by compiler)
@@ -156,12 +171,6 @@ func yfix(p *obj.Prog) {
156
171
}
157
172
158
173
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
-
165
174
// Rewrite constant moves to memory to go through an intermediary
166
175
// register
167
176
switch p .As {
0 commit comments