Skip to content

Commit 73c03b9

Browse files
committed
XtensaMCCodeEmitter: Set PCRel at fixup creation
Avoid reliance on the MCAssembler::evaluateFixup workaround that checks MCFixupKindInfo::FKF_IsPCRel. Additionally, standardize how fixups are appended. This helper will facilitate future fixup data structure optimizations.
1 parent 2bfc488 commit 73c03b9

File tree

2 files changed

+31
-23
lines changed

2 files changed

+31
-23
lines changed

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaAsmBackend.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,16 @@ class XtensaAsmBackend : public MCAsmBackend {
5353
MCFixupKindInfo XtensaAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
5454
const static MCFixupKindInfo Infos[Xtensa::NumTargetFixupKinds] = {
5555
// name offset bits flags
56-
{"fixup_xtensa_branch_6", 0, 16, MCFixupKindInfo::FKF_IsPCRel},
57-
{"fixup_xtensa_branch_8", 16, 8, MCFixupKindInfo::FKF_IsPCRel},
58-
{"fixup_xtensa_branch_12", 12, 12, MCFixupKindInfo::FKF_IsPCRel},
59-
{"fixup_xtensa_jump_18", 6, 18, MCFixupKindInfo::FKF_IsPCRel},
56+
{"fixup_xtensa_branch_6", 0, 16, 0},
57+
{"fixup_xtensa_branch_8", 16, 8, 0},
58+
{"fixup_xtensa_branch_12", 12, 12, 0},
59+
{"fixup_xtensa_jump_18", 6, 18, 0},
6060
{"fixup_xtensa_call_18", 6, 18,
61-
MCFixupKindInfo::FKF_IsPCRel |
62-
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits},
61+
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits},
6362
{"fixup_xtensa_l32r_16", 8, 16,
64-
MCFixupKindInfo::FKF_IsPCRel |
65-
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits},
66-
{"fixup_xtensa_loop_8", 16, 8, MCFixupKindInfo::FKF_IsPCRel}};
63+
MCFixupKindInfo::FKF_IsAlignedDownTo32Bits},
64+
{"fixup_xtensa_loop_8", 16, 8, 0},
65+
};
6766

6867
if (Kind < FirstTargetFixupKind)
6968
return MCAsmBackend::getFixupKindInfo(Kind);

llvm/lib/Target/Xtensa/MCTargetDesc/XtensaMCCodeEmitter.cpp

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,22 @@ MCCodeEmitter *llvm::createXtensaMCCodeEmitter(const MCInstrInfo &MCII,
150150
return new XtensaMCCodeEmitter(MCII, Ctx, true);
151151
}
152152

153+
static void addFixup(SmallVectorImpl<MCFixup> &Fixups, uint32_t Offset,
154+
const MCExpr *Value, uint16_t Kind) {
155+
bool PCRel = false;
156+
switch (Kind) {
157+
case Xtensa::fixup_xtensa_branch_6:
158+
case Xtensa::fixup_xtensa_branch_8:
159+
case Xtensa::fixup_xtensa_branch_12:
160+
case Xtensa::fixup_xtensa_jump_18:
161+
case Xtensa::fixup_xtensa_call_18:
162+
case Xtensa::fixup_xtensa_l32r_16:
163+
case Xtensa::fixup_xtensa_loop_8:
164+
PCRel = true;
165+
}
166+
Fixups.push_back(MCFixup::create(Offset, Value, Kind, PCRel));
167+
}
168+
153169
void XtensaMCCodeEmitter::encodeInstruction(const MCInst &MI,
154170
SmallVectorImpl<char> &CB,
155171
SmallVectorImpl<MCFixup> &Fixups,
@@ -195,8 +211,7 @@ XtensaMCCodeEmitter::getJumpTargetEncoding(const MCInst &MI, unsigned int OpNum,
195211
return MO.getImm();
196212

197213
const MCExpr *Expr = MO.getExpr();
198-
Fixups.push_back(
199-
MCFixup::create(0, Expr, MCFixupKind(Xtensa::fixup_xtensa_jump_18)));
214+
addFixup(Fixups, 0, Expr, Xtensa::fixup_xtensa_jump_18);
200215
return 0;
201216
}
202217

@@ -213,17 +228,14 @@ uint32_t XtensaMCCodeEmitter::getBranchTargetEncoding(
213228
case Xtensa::BGEZ:
214229
case Xtensa::BLTZ:
215230
case Xtensa::BNEZ:
216-
Fixups.push_back(
217-
MCFixup::create(0, Expr, MCFixupKind(Xtensa::fixup_xtensa_branch_12)));
231+
addFixup(Fixups, 0, Expr, Xtensa::fixup_xtensa_branch_12);
218232
return 0;
219233
case Xtensa::BEQZ_N:
220234
case Xtensa::BNEZ_N:
221-
Fixups.push_back(
222-
MCFixup::create(0, Expr, MCFixupKind(Xtensa::fixup_xtensa_branch_6)));
235+
addFixup(Fixups, 0, Expr, Xtensa::fixup_xtensa_branch_6);
223236
return 0;
224237
default:
225-
Fixups.push_back(
226-
MCFixup::create(0, Expr, MCFixupKind(Xtensa::fixup_xtensa_branch_8)));
238+
addFixup(Fixups, 0, Expr, Xtensa::fixup_xtensa_branch_8);
227239
return 0;
228240
}
229241
}
@@ -240,8 +252,7 @@ XtensaMCCodeEmitter::getLoopTargetEncoding(const MCInst &MI, unsigned int OpNum,
240252

241253
const MCExpr *Expr = MO.getExpr();
242254

243-
Fixups.push_back(
244-
MCFixup::create(0, Expr, MCFixupKind(Xtensa::fixup_xtensa_loop_8)));
255+
addFixup(Fixups, 0, Expr, Xtensa::fixup_xtensa_loop_8);
245256
return 0;
246257
}
247258

@@ -261,8 +272,7 @@ XtensaMCCodeEmitter::getCallEncoding(const MCInst &MI, unsigned int OpNum,
261272

262273
assert((MO.isExpr()) && "Unexpected operand value!");
263274
const MCExpr *Expr = MO.getExpr();
264-
Fixups.push_back(
265-
MCFixup::create(0, Expr, MCFixupKind(Xtensa::fixup_xtensa_call_18)));
275+
addFixup(Fixups, 0, Expr, Xtensa::fixup_xtensa_call_18);
266276
return 0;
267277
}
268278

@@ -281,8 +291,7 @@ XtensaMCCodeEmitter::getL32RTargetEncoding(const MCInst &MI, unsigned OpNum,
281291

282292
assert((MO.isExpr()) && "Unexpected operand value!");
283293

284-
Fixups.push_back(MCFixup::create(0, MO.getExpr(),
285-
MCFixupKind(Xtensa::fixup_xtensa_l32r_16)));
294+
addFixup(Fixups, 0, MO.getExpr(), Xtensa::fixup_xtensa_l32r_16);
286295
return 0;
287296
}
288297

0 commit comments

Comments
 (0)