diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-01-26 06:57:13 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-01-26 06:57:13 +0000 |
commit | 5356e75b5b764fda2ab4e7f171180032be45632a (patch) | |
tree | 0519206e81056cb32f90d58a7b87d8a32c92f7f4 /lib | |
parent | 550d791907b445b1c01680bbd1a50bf0630218a0 (diff) | |
download | llvm-5356e75b5b764fda2ab4e7f171180032be45632a.tar.gz llvm-5356e75b5b764fda2ab4e7f171180032be45632a.tar.bz2 llvm-5356e75b5b764fda2ab4e7f171180032be45632a.tar.xz |
Implement the missing bits corresponding to .mips_hack_elf_flags.
These were:
* noreorder handling on the target object streamer and asm parser.
* setting the initial flag bits based on the enabled features.
* setting the elf header flag for micromips
It is *really* depressing I am the one doing this instead of someone at
mips actually taking the time to understand the infrastructure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200138 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 16 | ||||
-rw-r--r-- | lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp | 2 | ||||
-rw-r--r-- | lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp | 65 | ||||
-rw-r--r-- | lib/Target/Mips/MipsAsmPrinter.cpp | 44 | ||||
-rw-r--r-- | lib/Target/Mips/MipsTargetStreamer.h | 6 |
5 files changed, 47 insertions, 86 deletions
diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index aae2dcd16e..74e4fffcee 100644 --- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -194,7 +194,6 @@ class MipsAsmParser : public MCTargetAsmParser { bool isEvaluated(const MCExpr *Expr); bool parseDirectiveSet(); - bool parseDirectiveMipsHackELFFlags(); bool parseDirectiveOption(); bool parseSetAtDirective(); @@ -2311,6 +2310,7 @@ bool MipsAsmParser::parseSetNoReorderDirective() { return false; } Options.setNoreorder(); + getTargetStreamer().emitDirectiveSetNoReorder(); Parser.Lex(); // Consume the EndOfStatement. return false; } @@ -2429,17 +2429,6 @@ bool MipsAsmParser::parseDirectiveSet() { return true; } -bool MipsAsmParser::parseDirectiveMipsHackELFFlags() { - int64_t Flags = 0; - if (Parser.parseAbsoluteExpression(Flags)) { - TokError("unexpected token"); - return false; - } - - getTargetStreamer().emitMipsHackELFFlags(Flags); - return false; -} - /// parseDirectiveWord /// ::= .word [ expression (, expression)* ] bool MipsAsmParser::parseDirectiveWord(unsigned Size, SMLoc L) { @@ -2558,9 +2547,6 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) { return false; } - if (IDVal == ".mips_hack_elf_flags") - return parseDirectiveMipsHackELFFlags(); - if (IDVal == ".option") return parseDirectiveOption(); diff --git a/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp b/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp index 6d3662cb80..f7cf1c1e00 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsMCTargetDesc.cpp @@ -134,7 +134,7 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT, bool RelaxAll, bool NoExecStack) { MCStreamer *S = createELFStreamer(Context, MAB, OS, Emitter, RelaxAll, NoExecStack); - new MipsTargetELFStreamer(*S); + new MipsTargetELFStreamer(*S, STI); return S; } diff --git a/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp b/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp index d635bbf80f..82e8a96879 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -12,8 +12,10 @@ //===----------------------------------------------------------------------===// #include "MipsTargetStreamer.h" +#include "MipsMCTargetDesc.h" #include "llvm/MC/MCELF.h" #include "llvm/MC/MCSymbol.h" +#include "llvm/MC/MCSubtargetInfo.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ELF.h" #include "llvm/Support/ErrorHandling.h" @@ -21,9 +23,6 @@ using namespace llvm; -static cl::opt<bool> PrintHackDirectives("print-hack-directives", - cl::init(false), cl::Hidden); - // Pin vtable to this file. void MipsTargetStreamer::anchor() {} @@ -33,15 +32,6 @@ MipsTargetAsmStreamer::MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS) : MipsTargetStreamer(S), OS(OS) {} -void MipsTargetAsmStreamer::emitMipsHackELFFlags(unsigned Flags) { - if (!PrintHackDirectives) - return; - - OS << "\t.mips_hack_elf_flags 0x"; - OS.write_hex(Flags); - OS << '\n'; -} - void MipsTargetAsmStreamer::emitDirectiveSetMicroMips() { OS << "\t.set\tmicromips\n"; } @@ -96,8 +86,38 @@ void MipsTargetAsmStreamer::emitDirectiveOptionPic0() { } // This part is for ELF object output. -MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S) - : MipsTargetStreamer(S), MicroMipsEnabled(false) {} +MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S, + const MCSubtargetInfo &STI) + : MipsTargetStreamer(S), MicroMipsEnabled(false) { + MCAssembler &MCA = getStreamer().getAssembler(); + uint64_t Features = STI.getFeatureBits(); + Triple T(STI.getTargetTriple()); + + // Update e_header flags + unsigned EFlags = 0; + + // Architecture + if (Features & Mips::FeatureMips64r2) + EFlags |= ELF::EF_MIPS_ARCH_64R2; + else if (Features & Mips::FeatureMips64) + EFlags |= ELF::EF_MIPS_ARCH_64; + else if (Features & Mips::FeatureMips32r2) + EFlags |= ELF::EF_MIPS_ARCH_32R2; + else if (Features & Mips::FeatureMips32) + EFlags |= ELF::EF_MIPS_ARCH_32; + + if (T.isArch64Bit()) { + EFlags |= ELF::EF_MIPS_ABI2; + } else { + if (Features & Mips::FeatureMips64r2 || Features & Mips::FeatureMips64) + EFlags |= ELF::EF_MIPS_32BITMODE; + + // ABI + EFlags |= ELF::EF_MIPS_ABI_O32; + } + + MCA.setELFHeaderEFlags(EFlags); +} void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) { if (!isMicroMipsEnabled()) @@ -117,13 +137,13 @@ MCELFStreamer &MipsTargetELFStreamer::getStreamer() { return static_cast<MCELFStreamer &>(Streamer); } -void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) { - MCAssembler &MCA = getStreamer().getAssembler(); - MCA.setELFHeaderEFlags(Flags); -} - void MipsTargetELFStreamer::emitDirectiveSetMicroMips() { MicroMipsEnabled = true; + + MCAssembler &MCA = getStreamer().getAssembler(); + unsigned Flags = MCA.getELFHeaderEFlags(); + Flags |= ELF::EF_MIPS_MICROMIPS; + MCA.setELFHeaderEFlags(Flags); } void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() { @@ -146,7 +166,10 @@ void MipsTargetELFStreamer::emitDirectiveSetReorder() { } void MipsTargetELFStreamer::emitDirectiveSetNoReorder() { - // FIXME: implement. + MCAssembler &MCA = getStreamer().getAssembler(); + unsigned Flags = MCA.getELFHeaderEFlags(); + Flags |= ELF::EF_MIPS_NOREORDER; + MCA.setELFHeaderEFlags(Flags); } void MipsTargetELFStreamer::emitDirectiveSetMacro() { @@ -176,7 +199,7 @@ void MipsTargetELFStreamer::emitDirectiveEnt(const MCSymbol &Symbol) { void MipsTargetELFStreamer::emitDirectiveAbiCalls() { MCAssembler &MCA = getStreamer().getAssembler(); unsigned Flags = MCA.getELFHeaderEFlags(); - Flags |= ELF::EF_MIPS_CPIC; + Flags |= ELF::EF_MIPS_CPIC | ELF::EF_MIPS_PIC; MCA.setELFHeaderEFlags(Flags); } void MipsTargetELFStreamer::emitDirectiveOptionPic0() { diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp index 048e0cacfb..8ce37b9161 100644 --- a/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/lib/Target/Mips/MipsAsmPrinter.cpp @@ -636,54 +636,10 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) { } -static void emitELFHeaderFlagsCG(MipsTargetStreamer &TargetStreamer, - const MipsSubtarget &Subtarget) { - // Update e_header flags - unsigned EFlags = 0; - - // TODO: Need to add -mabicalls and -mno-abicalls flags. - // Currently we assume that -mabicalls is the default. - EFlags |= ELF::EF_MIPS_CPIC; - - if (Subtarget.inMips16Mode()) - EFlags |= ELF::EF_MIPS_ARCH_ASE_M16; - else - EFlags |= ELF::EF_MIPS_NOREORDER; - - // Architecture - if (Subtarget.hasMips64r2()) - EFlags |= ELF::EF_MIPS_ARCH_64R2; - else if (Subtarget.hasMips64()) - EFlags |= ELF::EF_MIPS_ARCH_64; - else if (Subtarget.hasMips32r2()) - EFlags |= ELF::EF_MIPS_ARCH_32R2; - else - EFlags |= ELF::EF_MIPS_ARCH_32; - - if (Subtarget.inMicroMipsMode()) - EFlags |= ELF::EF_MIPS_MICROMIPS; - - // ABI - if (Subtarget.isABI_O32()) - EFlags |= ELF::EF_MIPS_ABI_O32; - - // Relocation Model - Reloc::Model RM = Subtarget.getRelocationModel(); - if (RM == Reloc::PIC_ || RM == Reloc::Default) - EFlags |= ELF::EF_MIPS_PIC; - else if (RM == Reloc::Static) - ; // Do nothing for Reloc::Static - else - llvm_unreachable("Unsupported relocation model for e_flags"); - - TargetStreamer.emitMipsHackELFFlags(EFlags); -} - void MipsAsmPrinter::EmitEndOfAsmFile(Module &M) { // Emit Mips ELF register info Subtarget->getMReginfo().emitMipsReginfoSectionCG( OutStreamer, getObjFileLowering(), *Subtarget); - emitELFHeaderFlagsCG(getTargetStreamer(), *Subtarget); } void MipsAsmPrinter::PrintDebugValueComment(const MachineInstr *MI, diff --git a/lib/Target/Mips/MipsTargetStreamer.h b/lib/Target/Mips/MipsTargetStreamer.h index b9272dc285..a8a846023d 100644 --- a/lib/Target/Mips/MipsTargetStreamer.h +++ b/lib/Target/Mips/MipsTargetStreamer.h @@ -19,7 +19,6 @@ class MipsTargetStreamer : public MCTargetStreamer { public: MipsTargetStreamer(MCStreamer &S); - virtual void emitMipsHackELFFlags(unsigned Flags) = 0; virtual void emitDirectiveSetMicroMips() = 0; virtual void emitDirectiveSetNoMicroMips() = 0; virtual void emitDirectiveSetMips16() = 0; @@ -44,7 +43,6 @@ class MipsTargetAsmStreamer : public MipsTargetStreamer { public: MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS); - virtual void emitMipsHackELFFlags(unsigned Flags); virtual void emitDirectiveSetMicroMips(); virtual void emitDirectiveSetNoMicroMips(); virtual void emitDirectiveSetMips16(); @@ -70,12 +68,10 @@ class MipsTargetELFStreamer : public MipsTargetStreamer { public: bool isMicroMipsEnabled() const { return MicroMipsEnabled; } MCELFStreamer &getStreamer(); - MipsTargetELFStreamer(MCStreamer &S); + MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI); virtual void emitLabel(MCSymbol *Symbol) LLVM_OVERRIDE; - // FIXME: emitMipsHackELFFlags() will be removed from this class. - virtual void emitMipsHackELFFlags(unsigned Flags); virtual void emitDirectiveSetMicroMips(); virtual void emitDirectiveSetNoMicroMips(); virtual void emitDirectiveSetMips16(); |