[MC] Allow backends to decide relaxation for unresolved fixups.

Differential Revision: http://reviews.llvm.org/D8217

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238659 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Colin LeMahieu 2015-05-30 18:42:22 +00:00
parent 63da212749
commit 32de7d791e
3 changed files with 34 additions and 24 deletions

View File

@ -97,6 +97,12 @@ public:
/// Target specific predicate for whether a given fixup requires the /// Target specific predicate for whether a given fixup requires the
/// associated instruction to be relaxed. /// associated instruction to be relaxed.
virtual bool fixupNeedsRelaxationAdvanced(const MCFixup &Fixup, bool Resolved,
uint64_t Value,
const MCRelaxableFragment *DF,
const MCAsmLayout &Layout) const;
/// Simple predicate for targets where !Resolved implies requiring relaxation
virtual bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, virtual bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
const MCRelaxableFragment *DF, const MCRelaxableFragment *DF,
const MCAsmLayout &Layout) const = 0; const MCAsmLayout &Layout) const = 0;

View File

@ -16,27 +16,33 @@ MCAsmBackend::MCAsmBackend() : HasDataInCodeSupport(false) {}
MCAsmBackend::~MCAsmBackend() {} MCAsmBackend::~MCAsmBackend() {}
const MCFixupKindInfo & const MCFixupKindInfo &MCAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
MCAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
static const MCFixupKindInfo Builtins[] = { static const MCFixupKindInfo Builtins[] = {
{ "FK_Data_1", 0, 8, 0 }, {"FK_Data_1", 0, 8, 0},
{ "FK_Data_2", 0, 16, 0 }, {"FK_Data_2", 0, 16, 0},
{ "FK_Data_4", 0, 32, 0 }, {"FK_Data_4", 0, 32, 0},
{ "FK_Data_8", 0, 64, 0 }, {"FK_Data_8", 0, 64, 0},
{ "FK_PCRel_1", 0, 8, MCFixupKindInfo::FKF_IsPCRel }, {"FK_PCRel_1", 0, 8, MCFixupKindInfo::FKF_IsPCRel},
{ "FK_PCRel_2", 0, 16, MCFixupKindInfo::FKF_IsPCRel }, {"FK_PCRel_2", 0, 16, MCFixupKindInfo::FKF_IsPCRel},
{ "FK_PCRel_4", 0, 32, MCFixupKindInfo::FKF_IsPCRel }, {"FK_PCRel_4", 0, 32, MCFixupKindInfo::FKF_IsPCRel},
{ "FK_PCRel_8", 0, 64, MCFixupKindInfo::FKF_IsPCRel }, {"FK_PCRel_8", 0, 64, MCFixupKindInfo::FKF_IsPCRel},
{ "FK_GPRel_1", 0, 8, 0 }, {"FK_GPRel_1", 0, 8, 0},
{ "FK_GPRel_2", 0, 16, 0 }, {"FK_GPRel_2", 0, 16, 0},
{ "FK_GPRel_4", 0, 32, 0 }, {"FK_GPRel_4", 0, 32, 0},
{ "FK_GPRel_8", 0, 64, 0 }, {"FK_GPRel_8", 0, 64, 0},
{ "FK_SecRel_1", 0, 8, 0 }, {"FK_SecRel_1", 0, 8, 0},
{ "FK_SecRel_2", 0, 16, 0 }, {"FK_SecRel_2", 0, 16, 0},
{ "FK_SecRel_4", 0, 32, 0 }, {"FK_SecRel_4", 0, 32, 0},
{ "FK_SecRel_8", 0, 64, 0 } {"FK_SecRel_8", 0, 64, 0}};
};
assert((size_t)Kind <= array_lengthof(Builtins) && "Unknown fixup kind"); assert((size_t)Kind <= array_lengthof(Builtins) && "Unknown fixup kind");
return Builtins[Kind]; return Builtins[Kind];
} }
bool MCAsmBackend::fixupNeedsRelaxationAdvanced(
const MCFixup &Fixup, bool Resolved, uint64_t Value,
const MCRelaxableFragment *DF, const MCAsmLayout &Layout) const {
if (!Resolved)
return true;
return fixupNeedsRelaxation(Fixup, Value, DF, Layout);
}

View File

@ -895,13 +895,11 @@ void MCAssembler::Finish() {
bool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup, bool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,
const MCRelaxableFragment *DF, const MCRelaxableFragment *DF,
const MCAsmLayout &Layout) const { const MCAsmLayout &Layout) const {
// If we cannot resolve the fixup value, it requires relaxation.
MCValue Target; MCValue Target;
uint64_t Value; uint64_t Value;
if (!evaluateFixup(Layout, Fixup, DF, Target, Value)) bool Resolved = evaluateFixup(Layout, Fixup, DF, Target, Value);
return true; return getBackend().fixupNeedsRelaxationAdvanced(Fixup, Resolved, Value, DF,
Layout);
return getBackend().fixupNeedsRelaxation(Fixup, Value, DF, Layout);
} }
bool MCAssembler::fragmentNeedsRelaxation(const MCRelaxableFragment *F, bool MCAssembler::fragmentNeedsRelaxation(const MCRelaxableFragment *F,