mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-30 05:29:47 +00:00
Patch by Reed Kotler at Mips Technologies. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140886 91177308-0d34-0410-b5e6-96231b3b80d8
118 lines
3.5 KiB
C++
118 lines
3.5 KiB
C++
#include "MCTargetDesc/MipsMCTargetDesc.h"
|
|
#include "llvm/ADT/Twine.h"
|
|
#include "llvm/MC/MCAssembler.h"
|
|
#include "llvm/MC/MCDirectives.h"
|
|
#include "llvm/MC/MCELFObjectWriter.h"
|
|
#include "llvm/MC/MCExpr.h"
|
|
#include "llvm/MC/MCMachObjectWriter.h"
|
|
#include "llvm/MC/MCObjectWriter.h"
|
|
#include "llvm/MC/MCSectionELF.h"
|
|
#include "llvm/MC/MCSectionMachO.h"
|
|
#include "llvm/MC/MCAsmBackend.h"
|
|
#include "llvm/MC/MCSubtargetInfo.h"
|
|
#include "llvm/Object/MachOFormat.h"
|
|
#include "llvm/Support/ELF.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
class MipsELFObjectWriter : public MCELFObjectTargetWriter {
|
|
public:
|
|
MipsELFObjectWriter(bool is64Bit, Triple::OSType OSType, uint16_t EMachine,
|
|
bool HasRelocationAddend)
|
|
: MCELFObjectTargetWriter(is64Bit, OSType, EMachine,
|
|
HasRelocationAddend) {}
|
|
};
|
|
|
|
class MipsAsmBackend : public MCAsmBackend {
|
|
public:
|
|
MipsAsmBackend(const Target &T)
|
|
: MCAsmBackend() {}
|
|
|
|
unsigned getNumFixupKinds() const {
|
|
return 1; //tbd
|
|
}
|
|
|
|
/// ApplyFixup - Apply the \arg Value for given \arg Fixup into the provided
|
|
/// data fragment, at the offset specified by the fixup and following the
|
|
/// fixup kind as appropriate.
|
|
void ApplyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
|
|
uint64_t Value) const {
|
|
}
|
|
|
|
/// @name Target Relaxation Interfaces
|
|
/// @{
|
|
|
|
/// MayNeedRelaxation - Check whether the given instruction may need
|
|
/// relaxation.
|
|
///
|
|
/// \param Inst - The instruction to test.
|
|
bool MayNeedRelaxation(const MCInst &Inst) const {
|
|
return false;
|
|
}
|
|
|
|
/// RelaxInstruction - Relax the instruction in the given fragment to the next
|
|
/// wider instruction.
|
|
///
|
|
/// \param Inst - The instruction to relax, which may be the same as the
|
|
/// output.
|
|
/// \parm Res [output] - On return, the relaxed instruction.
|
|
void RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
|
|
}
|
|
|
|
/// @}
|
|
|
|
/// WriteNopData - Write an (optimal) nop sequence of Count bytes to the given
|
|
/// output. If the target cannot generate such a sequence, it should return an
|
|
/// error.
|
|
///
|
|
/// \return - True on success.
|
|
bool WriteNopData(uint64_t Count, MCObjectWriter *OW) const {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
class MipsEB_AsmBackend : public MipsAsmBackend {
|
|
public:
|
|
Triple::OSType OSType;
|
|
|
|
MipsEB_AsmBackend(const Target &T, Triple::OSType _OSType)
|
|
: MipsAsmBackend(T), OSType(_OSType) {}
|
|
|
|
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
|
return createELFObjectWriter(createELFObjectTargetWriter(),
|
|
OS, /*IsLittleEndian*/ false);
|
|
}
|
|
|
|
MCELFObjectTargetWriter *createELFObjectTargetWriter() const {
|
|
return new MipsELFObjectWriter(false, OSType, ELF::EM_MIPS, false);
|
|
}
|
|
};
|
|
|
|
class MipsEL_AsmBackend : public MipsAsmBackend {
|
|
public:
|
|
Triple::OSType OSType;
|
|
|
|
MipsEL_AsmBackend(const Target &T, Triple::OSType _OSType)
|
|
: MipsAsmBackend(T), OSType(_OSType) {}
|
|
|
|
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
|
return createELFObjectWriter(createELFObjectTargetWriter(),
|
|
OS, /*IsLittleEndian*/ true);
|
|
}
|
|
|
|
MCELFObjectTargetWriter *createELFObjectTargetWriter() const {
|
|
return new MipsELFObjectWriter(false, OSType, ELF::EM_MIPS, false);
|
|
}
|
|
};
|
|
}
|
|
|
|
MCAsmBackend *llvm::createMipsAsmBackend(const Target &T, StringRef TT) {
|
|
Triple TheTriple(TT);
|
|
|
|
// just return little endian for now
|
|
//
|
|
return new MipsEL_AsmBackend(T, Triple(TT).getOS());
|
|
}
|