mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-26 07:29:55 +00:00
MC: Add TargetAsmBackend::MayNeedRelaxation, for checking whether a particular instruction + fixups might need relaxation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99249 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8f9b80e5df
commit
337055e62f
@ -679,6 +679,10 @@ private:
|
|||||||
bool FixupNeedsRelaxation(const MCAsmFixup &Fixup, const MCFragment *DF,
|
bool FixupNeedsRelaxation(const MCAsmFixup &Fixup, const MCFragment *DF,
|
||||||
const MCAsmLayout &Layout) const;
|
const MCAsmLayout &Layout) const;
|
||||||
|
|
||||||
|
/// Check whether the given fragment needs relaxation.
|
||||||
|
bool FragmentNeedsRelaxation(const MCInstFragment *IF,
|
||||||
|
const MCAsmLayout &Layout) const;
|
||||||
|
|
||||||
/// LayoutSection - Assign offsets and sizes to the fragments in the section
|
/// LayoutSection - Assign offsets and sizes to the fragments in the section
|
||||||
/// \arg SD, and update the section size. The section file offset should
|
/// \arg SD, and update the section size. The section file offset should
|
||||||
/// already have been computed.
|
/// already have been computed.
|
||||||
|
@ -19,6 +19,8 @@ class MCInst;
|
|||||||
class MCInstFragment;
|
class MCInstFragment;
|
||||||
class MCObjectWriter;
|
class MCObjectWriter;
|
||||||
class MCSection;
|
class MCSection;
|
||||||
|
template<typename T>
|
||||||
|
class SmallVectorImpl;
|
||||||
class Target;
|
class Target;
|
||||||
class raw_ostream;
|
class raw_ostream;
|
||||||
|
|
||||||
@ -98,6 +100,15 @@ public:
|
|||||||
virtual void ApplyFixup(const MCAsmFixup &Fixup, MCDataFragment &Fragment,
|
virtual void ApplyFixup(const MCAsmFixup &Fixup, MCDataFragment &Fragment,
|
||||||
uint64_t Value) const = 0;
|
uint64_t Value) const = 0;
|
||||||
|
|
||||||
|
/// MayNeedRelaxation - Check whether the given instruction may need
|
||||||
|
/// relaxation.
|
||||||
|
///
|
||||||
|
/// \arg Inst - The instruction to test.
|
||||||
|
/// \arg Fixups - The actual fixups this instruction encoded to, for potential
|
||||||
|
/// use by the target backend.
|
||||||
|
virtual bool MayNeedRelaxation(const MCInst &Inst,
|
||||||
|
const SmallVectorImpl<MCAsmFixup> &Fixups) const = 0;
|
||||||
|
|
||||||
/// RelaxInstruction - Relax the instruction in the given fragment to the next
|
/// RelaxInstruction - Relax the instruction in the given fragment to the next
|
||||||
/// wider instruction.
|
/// wider instruction.
|
||||||
virtual void RelaxInstruction(const MCInstFragment *IF,
|
virtual void RelaxInstruction(const MCInstFragment *IF,
|
||||||
|
@ -715,7 +715,7 @@ void MCAssembler::FinishLayout(MCAsmLayout &Layout) {
|
|||||||
|
|
||||||
// Create a new data fragment for the instruction.
|
// Create a new data fragment for the instruction.
|
||||||
//
|
//
|
||||||
// FIXME: Reuse previous data fragment if possible.
|
// FIXME-PERF: Reuse previous data fragment if possible.
|
||||||
MCDataFragment *DF = new MCDataFragment();
|
MCDataFragment *DF = new MCDataFragment();
|
||||||
SD.getFragmentList().insert(it2, DF);
|
SD.getFragmentList().insert(it2, DF);
|
||||||
|
|
||||||
|
@ -383,12 +383,19 @@ void MCMachOStreamer::EmitInstruction(const MCInst &Inst) {
|
|||||||
Assembler.getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
|
Assembler.getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
|
||||||
VecOS.flush();
|
VecOS.flush();
|
||||||
|
|
||||||
// Add the fixups and data.
|
// FIXME: Eliminate this copy.
|
||||||
MCDataFragment *DF = getOrCreateDataFragment();
|
SmallVector<MCAsmFixup, 4> AsmFixups;
|
||||||
for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
|
for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
|
||||||
MCFixup &F = Fixups[i];
|
MCFixup &F = Fixups[i];
|
||||||
DF->addFixup(MCAsmFixup(DF->getContents().size()+F.getOffset(),
|
AsmFixups.push_back(MCAsmFixup(F.getOffset(), *F.getValue(),
|
||||||
*F.getValue(), F.getKind()));
|
F.getKind()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the fixups and data.
|
||||||
|
MCDataFragment *DF = getOrCreateDataFragment();
|
||||||
|
for (unsigned i = 0, e = AsmFixups.size(); i != e; ++i) {
|
||||||
|
AsmFixups[i].Offset += DF->getContents().size();
|
||||||
|
DF->addFixup(AsmFixups[i]);
|
||||||
}
|
}
|
||||||
DF->getContents().append(Code.begin(), Code.end());
|
DF->getContents().append(Code.begin(), Code.end());
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "X86FixupKinds.h"
|
#include "X86FixupKinds.h"
|
||||||
#include "llvm/ADT/Twine.h"
|
#include "llvm/ADT/Twine.h"
|
||||||
#include "llvm/MC/MCAssembler.h"
|
#include "llvm/MC/MCAssembler.h"
|
||||||
|
#include "llvm/MC/MCObjectWriter.h"
|
||||||
#include "llvm/MC/MCSectionELF.h"
|
#include "llvm/MC/MCSectionELF.h"
|
||||||
#include "llvm/MC/MCSectionMachO.h"
|
#include "llvm/MC/MCSectionMachO.h"
|
||||||
#include "llvm/MC/MachObjectWriter.h"
|
#include "llvm/MC/MachObjectWriter.h"
|
||||||
@ -52,6 +53,9 @@ public:
|
|||||||
DF.getContents()[Fixup.Offset + i] = uint8_t(Value >> (i * 8));
|
DF.getContents()[Fixup.Offset + i] = uint8_t(Value >> (i * 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MayNeedRelaxation(const MCInst &Inst,
|
||||||
|
const SmallVectorImpl<MCAsmFixup> &Fixups) const;
|
||||||
|
|
||||||
void RelaxInstruction(const MCInstFragment *IF, MCInst &Res) const;
|
void RelaxInstruction(const MCInstFragment *IF, MCInst &Res) const;
|
||||||
|
|
||||||
bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const;
|
bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const;
|
||||||
@ -82,6 +86,20 @@ static unsigned getRelaxedOpcode(unsigned Op) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool X86AsmBackend::MayNeedRelaxation(const MCInst &Inst,
|
||||||
|
const SmallVectorImpl<MCAsmFixup> &Fixups) const {
|
||||||
|
// Check for a 1byte pcrel fixup, and enforce that we would know how to relax
|
||||||
|
// this instruction.
|
||||||
|
for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
|
||||||
|
if (unsigned(Fixups[i].Kind) == X86::reloc_pcrel_1byte) {
|
||||||
|
assert(getRelaxedOpcode(Inst.getOpcode()) != Inst.getOpcode());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: Can tblgen help at all here to verify there aren't other instructions
|
// FIXME: Can tblgen help at all here to verify there aren't other instructions
|
||||||
// we can relax?
|
// we can relax?
|
||||||
void X86AsmBackend::RelaxInstruction(const MCInstFragment *IF,
|
void X86AsmBackend::RelaxInstruction(const MCInstFragment *IF,
|
||||||
|
Loading…
Reference in New Issue
Block a user