From 29a17145ad4985df032785cc1b4716fd7875d47b Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 11 Jan 2012 04:04:14 +0000 Subject: [PATCH] Add big endian mips support. Based on a patch by Jack Carter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147924 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Mips/MCTargetDesc/MipsAsmBackend.cpp | 21 +++++++++---------- .../Mips/MCTargetDesc/MipsMCTargetDesc.cpp | 12 +++++++---- .../Mips/MCTargetDesc/MipsMCTargetDesc.h | 3 ++- test/MC/Mips/elf_basic.s | 2 ++ 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp b/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp index bd9b6412a58..f4227f794b7 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp @@ -71,7 +71,9 @@ static unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { namespace { class MipsAsmBackend : public MCAsmBackend { public: - MipsAsmBackend(const Target &T) : MCAsmBackend() {} + uint8_t OSABI; + MipsAsmBackend(const Target &T, uint8_t OSABI_) : + MCAsmBackend(), OSABI(OSABI_) {} /// ApplyFixup - Apply the \arg Value for given \arg Fixup into the provided /// data fragment, at the offset specified by the fixup and following the @@ -191,10 +193,8 @@ public: class MipsEB_AsmBackend : public MipsAsmBackend { public: - uint8_t OSABI; - MipsEB_AsmBackend(const Target &T, uint8_t _OSABI) - : MipsAsmBackend(T), OSABI(_OSABI) {} + : MipsAsmBackend(T, _OSABI) {} MCObjectWriter *createObjectWriter(raw_ostream &OS) const { return createMipsELFObjectWriter(OS, /*IsLittleEndian*/ false, OSABI); @@ -203,10 +203,8 @@ public: class MipsEL_AsmBackend : public MipsAsmBackend { public: - uint8_t OSABI; - MipsEL_AsmBackend(const Target &T, uint8_t _OSABI) - : MipsAsmBackend(T), OSABI(_OSABI) {} + : MipsAsmBackend(T, _OSABI) {} MCObjectWriter *createObjectWriter(raw_ostream &OS) const { return createMipsELFObjectWriter(OS, /*IsLittleEndian*/ true, OSABI); @@ -214,11 +212,12 @@ public: }; } // namespace -MCAsmBackend *llvm::createMipsAsmBackend(const Target &T, StringRef TT) { - Triple TheTriple(TT); +MCAsmBackend *llvm::createMipsBEAsmBackend(const Target &T, StringRef TT) { + uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(Triple(TT).getOS()); + return new MipsEB_AsmBackend(T, OSABI); +} - // just return little endian for now - // +MCAsmBackend *llvm::createMipsLEAsmBackend(const Target &T, StringRef TT) { uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(Triple(TT).getOS()); return new MipsEL_AsmBackend(T, OSABI); } diff --git a/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp b/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp index 4584d6d4e1f..154ca17ba0f 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp @@ -136,10 +136,14 @@ extern "C" void LLVMInitializeMipsTargetMC() { TargetRegistry::RegisterMCObjectStreamer(TheMips64elTarget, createMCStreamer); // Register the asm backend. - TargetRegistry::RegisterMCAsmBackend(TheMipsTarget, createMipsAsmBackend); - TargetRegistry::RegisterMCAsmBackend(TheMipselTarget, createMipsAsmBackend); - TargetRegistry::RegisterMCAsmBackend(TheMips64Target, createMipsAsmBackend); - TargetRegistry::RegisterMCAsmBackend(TheMips64elTarget, createMipsAsmBackend); + TargetRegistry::RegisterMCAsmBackend(TheMipsTarget, + createMipsBEAsmBackend); + TargetRegistry::RegisterMCAsmBackend(TheMipselTarget, + createMipsLEAsmBackend); + TargetRegistry::RegisterMCAsmBackend(TheMips64Target, + createMipsBEAsmBackend); + TargetRegistry::RegisterMCAsmBackend(TheMips64elTarget, + createMipsLEAsmBackend); TargetRegistry::RegisterMCCodeEmitter(TheMipsTarget, createMipsMCCodeEmitter); TargetRegistry::RegisterMCCodeEmitter(TheMipselTarget, diff --git a/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.h b/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.h index de8234787dc..63cb24052de 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.h +++ b/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.h @@ -36,7 +36,8 @@ MCCodeEmitter *createMipsMCCodeEmitter(const MCInstrInfo &MCII, const MCSubtargetInfo &STI, MCContext &Ctx); -MCAsmBackend *createMipsAsmBackend(const Target &T, StringRef TT); +MCAsmBackend *createMipsBEAsmBackend(const Target &T, StringRef TT); +MCAsmBackend *createMipsLEAsmBackend(const Target &T, StringRef TT); MCObjectWriter *createMipsELFObjectWriter(raw_ostream &OS, bool IsLittleEndian, diff --git a/test/MC/Mips/elf_basic.s b/test/MC/Mips/elf_basic.s index 4a53a8047ea..46211823b66 100644 --- a/test/MC/Mips/elf_basic.s +++ b/test/MC/Mips/elf_basic.s @@ -1,5 +1,7 @@ +; RUN: llc -filetype=obj -mtriple mips-unknown-linux %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE %s ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-LE %s ; Check that we produce the correct endian. +; CHECK-BE: ('e_indent[EI_DATA]', 0x02) ; CHECK-LE: ('e_indent[EI_DATA]', 0x01)