MCObjectWriter *
MipsAsmBackend::createObjectWriter(raw_pwrite_stream &OS) const {
- return createMipsELFObjectWriter(OS,
- MCELFObjectTargetWriter::getOSABI(OSType), IsLittle, Is64Bit);
+ return createMipsELFObjectWriter(OS, TheTriple);
}
// Little-endian fixup data byte ordering:
OW->WriteZeros(Count);
return true;
}
-
-// MCAsmBackend
-MCAsmBackend *llvm::createMipsAsmBackendEL32(const Target &T,
- const MCRegisterInfo &MRI,
- const Triple &TT, StringRef CPU,
- const MCTargetOptions &Options) {
- return new MipsAsmBackend(T, TT.getOS(), /*IsLittle*/ true,
- /*Is64Bit*/ false);
-}
-
-MCAsmBackend *llvm::createMipsAsmBackendEB32(const Target &T,
- const MCRegisterInfo &MRI,
- const Triple &TT, StringRef CPU,
- const MCTargetOptions &Options) {
- return new MipsAsmBackend(T, TT.getOS(), /*IsLittle*/ false,
- /*Is64Bit*/ false);
-}
-
-MCAsmBackend *llvm::createMipsAsmBackendEL64(const Target &T,
- const MCRegisterInfo &MRI,
- const Triple &TT, StringRef CPU,
- const MCTargetOptions &Options) {
- return new MipsAsmBackend(T, TT.getOS(), /*IsLittle*/ true, /*Is64Bit*/ true);
-}
-
-MCAsmBackend *llvm::createMipsAsmBackendEB64(const Target &T,
- const MCRegisterInfo &MRI,
- const Triple &TT, StringRef CPU,
- const MCTargetOptions &Options) {
- return new MipsAsmBackend(T, TT.getOS(), /*IsLittle*/ false,
- /*Is64Bit*/ true);
-}
class MCAssembler;
struct MCFixupKindInfo;
-class Target;
class MCObjectWriter;
+class MCRegisterInfo;
+class Target;
class MipsAsmBackend : public MCAsmBackend {
- Triple::OSType OSType;
+ Triple TheTriple;
bool IsLittle; // Big or little endian
- bool Is64Bit; // 32 or 64 bit words
public:
- MipsAsmBackend(const Target &T, Triple::OSType OSType, bool IsLittle,
- bool Is64Bit)
- : MCAsmBackend(), OSType(OSType), IsLittle(IsLittle), Is64Bit(Is64Bit) {}
+ MipsAsmBackend(const Target &T, const MCRegisterInfo &MRI, const Triple &TT,
+ StringRef CPU)
+ : TheTriple(TT), IsLittle(TT.isLittleEndian()) {}
MCObjectWriter *createObjectWriter(raw_pwrite_stream &OS) const override;
class MipsELFObjectWriter : public MCELFObjectTargetWriter {
public:
- MipsELFObjectWriter(bool _is64Bit, uint8_t OSABI, bool _isN64,
+ MipsELFObjectWriter(uint8_t OSABI, bool HasRelocationAddend, bool IsN64,
bool IsLittleEndian);
~MipsELFObjectWriter() override = default;
}
#endif
-MipsELFObjectWriter::MipsELFObjectWriter(bool _is64Bit, uint8_t OSABI,
- bool _isN64, bool IsLittleEndian)
- : MCELFObjectTargetWriter(_is64Bit, OSABI, ELF::EM_MIPS,
- /*HasRelocationAddend*/ _isN64,
- /*IsN64*/ _isN64) {}
+MipsELFObjectWriter::MipsELFObjectWriter(uint8_t OSABI,
+ bool HasRelocationAddend, bool IsN64,
+ bool IsLittleEndian)
+ : MCELFObjectTargetWriter(IsN64, OSABI, ELF::EM_MIPS, HasRelocationAddend,
+ IsN64) {}
unsigned MipsELFObjectWriter::getRelocType(MCContext &Ctx,
const MCValue &Target,
}
MCObjectWriter *llvm::createMipsELFObjectWriter(raw_pwrite_stream &OS,
- uint8_t OSABI,
- bool IsLittleEndian,
- bool Is64Bit) {
- MCELFObjectTargetWriter *MOTW =
- new MipsELFObjectWriter(Is64Bit, OSABI, Is64Bit, IsLittleEndian);
- return createELFObjectWriter(MOTW, OS, IsLittleEndian);
+ const Triple &TT) {
+ uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS());
+ // FIXME: We need to check an actual ABI. mips64/mips64el do not
+ // always imply the N64 ABI and RELA relocation's format.
+ bool IsN64 = TT.isArch64Bit();
+ bool HasRelocationAddend = IsN64;
+ auto *MOTW = new MipsELFObjectWriter(OSABI, HasRelocationAddend, IsN64,
+ TT.isLittleEndian());
+ return createELFObjectWriter(MOTW, OS, TT.isLittleEndian());
}
#include "MipsMCTargetDesc.h"
#include "InstPrinter/MipsInstPrinter.h"
+#include "MipsAsmBackend.h"
#include "MipsELFStreamer.h"
#include "MipsMCAsmInfo.h"
#include "MipsMCNaCl.h"
TargetRegistry::RegisterObjectTargetStreamer(
*T, createMipsObjectTargetStreamer);
+
+ // Register the asm backend.
+ RegisterMCAsmBackend<MipsAsmBackend> Y(*T);
}
// Register the MC Code Emitter
for (Target *T : {&getTheMipselTarget(), &getTheMips64elTarget()})
TargetRegistry::RegisterMCCodeEmitter(*T, createMipsMCCodeEmitterEL);
-
- // Register the asm backend.
- TargetRegistry::RegisterMCAsmBackend(getTheMipsTarget(),
- createMipsAsmBackendEB32);
- TargetRegistry::RegisterMCAsmBackend(getTheMipselTarget(),
- createMipsAsmBackendEL32);
- TargetRegistry::RegisterMCAsmBackend(getTheMips64Target(),
- createMipsAsmBackendEB64);
- TargetRegistry::RegisterMCAsmBackend(getTheMips64elTarget(),
- createMipsAsmBackendEL64);
}
const MCRegisterInfo &MRI,
MCContext &Ctx);
-MCAsmBackend *createMipsAsmBackendEB32(const Target &T,
- const MCRegisterInfo &MRI,
- const Triple &TT, StringRef CPU,
- const MCTargetOptions &Options);
-MCAsmBackend *createMipsAsmBackendEL32(const Target &T,
- const MCRegisterInfo &MRI,
- const Triple &TT, StringRef CPU,
- const MCTargetOptions &Options);
-MCAsmBackend *createMipsAsmBackendEB64(const Target &T,
- const MCRegisterInfo &MRI,
- const Triple &TT, StringRef CPU,
- const MCTargetOptions &Options);
-MCAsmBackend *createMipsAsmBackendEL64(const Target &T,
- const MCRegisterInfo &MRI,
- const Triple &TT, StringRef CPU,
- const MCTargetOptions &Options);
-
-MCObjectWriter *createMipsELFObjectWriter(raw_pwrite_stream &OS, uint8_t OSABI,
- bool IsLittleEndian, bool Is64Bit);
+MCObjectWriter *createMipsELFObjectWriter(raw_pwrite_stream &OS,
+ const Triple &TT);
namespace MIPS_MC {
StringRef selectMipsCPU(const Triple &TT, StringRef CPU);