@@ -91,6 +91,21 @@ class SparcMCCodeEmitter : public MCCodeEmitter {
91
91
92
92
} // end anonymous namespace
93
93
94
+ static void addFixup (SmallVectorImpl<MCFixup> &Fixups, uint32_t Offset,
95
+ const MCExpr *Value, uint16_t Kind) {
96
+ bool PCRel = false ;
97
+ switch (Kind) {
98
+ case ELF::R_SPARC_PC10:
99
+ case ELF::R_SPARC_PC22:
100
+ case ELF::R_SPARC_WDISP10:
101
+ case ELF::R_SPARC_WDISP16:
102
+ case ELF::R_SPARC_WDISP19:
103
+ case ELF::R_SPARC_WDISP22:
104
+ PCRel = true ;
105
+ }
106
+ Fixups.push_back (MCFixup::create (Offset, Value, Kind, PCRel));
107
+ }
108
+
94
109
void SparcMCCodeEmitter::encodeInstruction (const MCInst &MI,
95
110
SmallVectorImpl<char > &CB,
96
111
SmallVectorImpl<MCFixup> &Fixups,
@@ -135,7 +150,7 @@ getMachineOpValue(const MCInst &MI, const MCOperand &MO,
135
150
assert (MO.isExpr ());
136
151
const MCExpr *Expr = MO.getExpr ();
137
152
if (auto *SExpr = dyn_cast<MCSpecifierExpr>(Expr)) {
138
- Fixups. push_back ( MCFixup::create ( 0 , Expr, SExpr->getSpecifier () ));
153
+ addFixup (Fixups, 0 , Expr, SExpr->getSpecifier ());
139
154
return 0 ;
140
155
}
141
156
@@ -165,10 +180,10 @@ unsigned SparcMCCodeEmitter::getSImm5OpValue(const MCInst &MI, unsigned OpNo,
165
180
return CE->getValue ();
166
181
167
182
if (auto *SExpr = dyn_cast<MCSpecifierExpr>(Expr)) {
168
- Fixups. push_back ( MCFixup::create ( 0 , Expr, SExpr->getSpecifier () ));
183
+ addFixup (Fixups, 0 , Expr, SExpr->getSpecifier ());
169
184
return 0 ;
170
185
}
171
- Fixups. push_back ( MCFixup::create ( 0 , Expr, ELF::R_SPARC_5) );
186
+ addFixup (Fixups, 0 , Expr, ELF::R_SPARC_5);
172
187
return 0 ;
173
188
}
174
189
@@ -191,10 +206,10 @@ SparcMCCodeEmitter::getSImm13OpValue(const MCInst &MI, unsigned OpNo,
191
206
return CE->getValue ();
192
207
193
208
if (auto *SExpr = dyn_cast<MCSpecifierExpr>(Expr)) {
194
- Fixups. push_back ( MCFixup::create ( 0 , Expr, SExpr->getSpecifier () ));
209
+ addFixup (Fixups, 0 , Expr, SExpr->getSpecifier ());
195
210
return 0 ;
196
211
}
197
- Fixups. push_back ( MCFixup::create ( 0 , Expr, Sparc::fixup_sparc_13) );
212
+ addFixup (Fixups, 0 , Expr, Sparc::fixup_sparc_13);
198
213
return 0 ;
199
214
}
200
215
@@ -209,7 +224,7 @@ getCallTargetOpValue(const MCInst &MI, unsigned OpNo,
209
224
}
210
225
211
226
const MCOperand &MO = MI.getOperand (OpNo);
212
- Fixups. push_back ( MCFixup::create ( 0 , MO.getExpr (), Sparc::fixup_sparc_call30) );
227
+ addFixup (Fixups, 0 , MO.getExpr (), Sparc::fixup_sparc_call30);
213
228
return 0 ;
214
229
}
215
230
@@ -221,7 +236,7 @@ getBranchTargetOpValue(const MCInst &MI, unsigned OpNo,
221
236
if (MO.isReg () || MO.isImm ())
222
237
return getMachineOpValue (MI, MO, Fixups, STI);
223
238
224
- Fixups. push_back ( MCFixup::create ( 0 , MO.getExpr (), ELF::R_SPARC_WDISP22) );
239
+ addFixup (Fixups, 0 , MO.getExpr (), ELF::R_SPARC_WDISP22);
225
240
return 0 ;
226
241
}
227
242
@@ -232,7 +247,7 @@ unsigned SparcMCCodeEmitter::getBranchPredTargetOpValue(
232
247
if (MO.isReg () || MO.isImm ())
233
248
return getMachineOpValue (MI, MO, Fixups, STI);
234
249
235
- Fixups. push_back ( MCFixup::create ( 0 , MO.getExpr (), ELF::R_SPARC_WDISP19) );
250
+ addFixup (Fixups, 0 , MO.getExpr (), ELF::R_SPARC_WDISP19);
236
251
return 0 ;
237
252
}
238
253
@@ -243,8 +258,7 @@ unsigned SparcMCCodeEmitter::getBranchOnRegTargetOpValue(
243
258
if (MO.isReg () || MO.isImm ())
244
259
return getMachineOpValue (MI, MO, Fixups, STI);
245
260
246
- Fixups.push_back (MCFixup::create (0 , MO.getExpr (), ELF::R_SPARC_WDISP16));
247
-
261
+ addFixup (Fixups, 0 , MO.getExpr (), ELF::R_SPARC_WDISP16);
248
262
return 0 ;
249
263
}
250
264
@@ -255,8 +269,7 @@ unsigned SparcMCCodeEmitter::getCompareAndBranchTargetOpValue(
255
269
if (MO.isImm ())
256
270
return getMachineOpValue (MI, MO, Fixups, STI);
257
271
258
- Fixups.push_back (MCFixup::create (0 , MO.getExpr (), ELF::R_SPARC_WDISP10));
259
-
272
+ addFixup (Fixups, 0 , MO.getExpr (), ELF::R_SPARC_WDISP10);
260
273
return 0 ;
261
274
}
262
275
0 commit comments