Skip to content

Commit

Permalink
Move target-specific logic out of generic MCAssembler.
Browse files Browse the repository at this point in the history
Whether a fixup needs relaxation for the associated instruction is a
target-specific function, as the FIXME indicated. Create a hook for that
and use it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145881 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Jim Grosbach committed Dec 6, 2011
1 parent 7c06741 commit 370b78d
Show file tree
Hide file tree
Showing 8 changed files with 77 additions and 6 deletions.
9 changes: 9 additions & 0 deletions include/llvm/MC/MCAsmBackend.h
Expand Up @@ -16,9 +16,11 @@
#include "llvm/Support/DataTypes.h"

namespace llvm {
class MCAsmLayout;
class MCELFObjectTargetWriter;
class MCFixup;
class MCInst;
class MCInstFragment;
class MCObjectWriter;
class MCSection;
template<typename T>
Expand Down Expand Up @@ -104,6 +106,13 @@ class MCAsmBackend {
/// \param Inst - The instruction to test.
virtual bool MayNeedRelaxation(const MCInst &Inst) const = 0;

/// fixupNeedsRelaxation - Target specific predicate for whether a given
/// fixup requires the associated instruction to be relaxed.
virtual bool fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const = 0;

/// RelaxInstruction - Relax the instruction in the given fragment to the next
/// wider instruction.
///
Expand Down
2 changes: 1 addition & 1 deletion include/llvm/MC/MCAssembler.h
Expand Up @@ -717,7 +717,7 @@ class MCAssembler {

/// Check whether a fixup can be satisfied, or whether it needs to be relaxed
/// (increased in size, in order to hold its value correctly).
bool fixupNeedsRelaxation(const MCFixup &Fixup, const MCFragment *DF,
bool fixupNeedsRelaxation(const MCFixup &Fixup, const MCInstFragment *DF,
const MCAsmLayout &Layout) const;

/// Check whether the given fragment needs relaxation.
Expand Down
7 changes: 2 additions & 5 deletions lib/MC/MCAssembler.cpp
Expand Up @@ -646,7 +646,7 @@ void MCAssembler::Finish() {
}

bool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,
const MCFragment *DF,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const {
if (getRelaxAll())
return true;
Expand All @@ -657,10 +657,7 @@ bool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,
if (!evaluateFixup(Layout, Fixup, DF, Target, Value))
return true;

// Otherwise, relax if the value is too big for a (signed) i8.
//
// FIXME: This is target dependent!
return int64_t(Value) != int64_t(int8_t(Value));
return getBackend().fixupNeedsRelaxation(Fixup, Value, DF, Layout);
}

bool MCAssembler::fragmentNeedsRelaxation(const MCInstFragment *IF,
Expand Down
16 changes: 16 additions & 0 deletions lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
Expand Up @@ -102,6 +102,11 @@ class ARMAsmBackend : public MCAsmBackend {

bool MayNeedRelaxation(const MCInst &Inst) const;

bool fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const;

void RelaxInstruction(const MCInst &Inst, MCInst &Res) const;

bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const;
Expand Down Expand Up @@ -137,6 +142,17 @@ bool ARMAsmBackend::MayNeedRelaxation(const MCInst &Inst) const {
return false;
}

bool ARMAsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const {
// FIXME: This isn't correct for ARM. Just moving the "generic" logic
// into the targets for now.
//
// Relax if the value is too big for a (signed) i8.
return int64_t(Value) != int64_t(int8_t(Value));
}

void ARMAsmBackend::RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
unsigned RelaxedOp = getRelaxedOpcode(Inst.getOpcode());

Expand Down
17 changes: 17 additions & 0 deletions lib/Target/MBlaze/MCTargetDesc/MBlazeAsmBackend.cpp
Expand Up @@ -58,6 +58,11 @@ class MBlazeAsmBackend : public MCAsmBackend {

bool MayNeedRelaxation(const MCInst &Inst) const;

bool fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const;

void RelaxInstruction(const MCInst &Inst, MCInst &Res) const;

bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const;
Expand Down Expand Up @@ -87,6 +92,18 @@ bool MBlazeAsmBackend::MayNeedRelaxation(const MCInst &Inst) const {
return hasExprOrImm;
}

bool MBlazeAsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const {
// FIXME: Is this right? It's what the "generic" code was doing before,
// but is X86 specific. Is it actually true for MBlaze also, or was it
// just close enough to not be a big deal?
//
// Relax if the value is too big for a (signed) i8.
return int64_t(Value) != int64_t(int8_t(Value));
}

void MBlazeAsmBackend::RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
Res = Inst;
Res.setOpcode(getRelaxedOpcode(Inst.getOpcode()));
Expand Down
10 changes: 10 additions & 0 deletions lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
Expand Up @@ -173,6 +173,16 @@ class MipsAsmBackend : public MCAsmBackend {
return false;
}

/// fixupNeedsRelaxation - Target specific predicate for whether a given
/// fixup requires the associated instruction to be relaxed.
bool fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const {
// FIXME.
assert(0 && "RelaxInstruction() unimplemented");
}

/// RelaxInstruction - Relax the instruction in the given fragment
/// to the next wider instruction.
///
Expand Down
9 changes: 9 additions & 0 deletions lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
Expand Up @@ -93,6 +93,15 @@ const Target &TheTarget;
// FIXME.
return false;
}

bool fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const {
// FIXME.
assert(0 && "RelaxInstruction() unimplemented");
}


void RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
// FIXME.
Expand Down
13 changes: 13 additions & 0 deletions lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
Expand Up @@ -107,6 +107,11 @@ class X86AsmBackend : public MCAsmBackend {

bool MayNeedRelaxation(const MCInst &Inst) const;

bool fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const;

void RelaxInstruction(const MCInst &Inst, MCInst &Res) const;

bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const;
Expand Down Expand Up @@ -244,6 +249,14 @@ bool X86AsmBackend::MayNeedRelaxation(const MCInst &Inst) const {
return hasExp && !hasRIP;
}

bool X86AsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCInstFragment *DF,
const MCAsmLayout &Layout) const {
// Relax if the value is too big for a (signed) i8.
return int64_t(Value) != int64_t(int8_t(Value));
}

// FIXME: Can tblgen help at all here to verify there aren't other instructions
// we can relax?
void X86AsmBackend::RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
Expand Down

0 comments on commit 370b78d

Please sign in to comment.