diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 59 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp | 14 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsAsmPrinter.cpp | 26 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsAsmPrinter.h | 6 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsTargetStreamer.h | 6 |
5 files changed, 69 insertions, 42 deletions
diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index aae2dcd16e7..35ad7680be6 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -21,6 +21,9 @@ #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCTargetAsmParser.h" +#include "llvm/Support/ELF.h" +#include "llvm/Support/TargetRegistry.h" +#include "llvm/ADT/APInt.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/TargetRegistry.h" @@ -194,7 +197,6 @@ class MipsAsmParser : public MCTargetAsmParser { bool isEvaluated(const MCExpr *Expr); bool parseDirectiveSet(); - bool parseDirectiveMipsHackELFFlags(); bool parseDirectiveOption(); bool parseSetAtDirective(); @@ -257,6 +259,9 @@ class MipsAsmParser : public MCTargetAsmParser { // Example: INSERT.B $w0[n], $1 => 16 > n >= 0 bool validateMSAIndex(int Val, int RegKind); + // Set ELF flags based on defaults and commandline arguments. + void processInitialEFlags(); + public: MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser, const MCInstrInfo &MII) @@ -264,6 +269,7 @@ public: hasConsumedDollar(false) { // Initialize the set of available features. setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); + processInitialEFlags(); } MCAsmParser &getParser() const { return Parser; } @@ -2429,17 +2435,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 +2553,6 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) { return false; } - if (IDVal == ".mips_hack_elf_flags") - return parseDirectiveMipsHackELFFlags(); - if (IDVal == ".option") return parseDirectiveOption(); @@ -2577,6 +2569,43 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) { return true; } +void MipsAsmParser::processInitialEFlags() { + // Start will a clean slate. + unsigned EFlags = 0; + unsigned FeatureBits = STI.getFeatureBits(); + + // Default settings + EFlags |= ELF::EF_MIPS_NOREORDER | ELF::EF_MIPS_PIC | ELF::EF_MIPS_ABI_O32; + + // ISA + if (FeatureBits & Mips::FeatureMips64r2) { + EFlags |= ELF::EF_MIPS_ARCH_64R2; + EFlags &= ~ELF::EF_MIPS_ABI_O32; + } else if (FeatureBits & Mips::FeatureMips64) { + EFlags |= ELF::EF_MIPS_ARCH_64; + EFlags &= ~ELF::EF_MIPS_ABI_O32; + } else if (FeatureBits & Mips::FeatureMips32r2) + EFlags |= ELF::EF_MIPS_ARCH_32R2; + else if (FeatureBits & Mips::FeatureMips32) + EFlags |= ELF::EF_MIPS_ARCH_32; + else if (FeatureBits & Mips::FeatureO32) + EFlags |= ELF::EF_MIPS_ABI_O32; // This is really a zero + + // ASE + if (FeatureBits & Mips::FeatureMicroMips) + EFlags |= ELF::EF_MIPS_MICROMIPS; + else if (FeatureBits & Mips::FeatureMips16) + EFlags |= ELF::EF_MIPS_ARCH_ASE_M16; + + // ABI + // TODO: n32/eabi + + // Linkage model + // TODO: pic/cpic/static + + getTargetStreamer().emitMipsELFFlags(EFlags); +} + extern "C" void LLVMInitializeMipsAsmParser() { RegisterMCAsmParser<MipsAsmParser> X(TheMipsTarget); RegisterMCAsmParser<MipsAsmParser> Y(TheMipselTarget); diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp index 6b57dff2c83..d026471d0fd 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -21,23 +21,13 @@ using namespace llvm; -static cl::opt<bool> PrintHackDirectives("print-hack-directives", - cl::init(false), cl::Hidden); - // Pin vtable to this file. void MipsTargetStreamer::anchor() {} MipsTargetAsmStreamer::MipsTargetAsmStreamer(formatted_raw_ostream &OS) : 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::emitMipsELFFlags(unsigned Flags) { return; } void MipsTargetAsmStreamer::emitDirectiveSetMicroMips() { OS << "\t.set\tmicromips\n"; @@ -85,7 +75,7 @@ MCELFStreamer &MipsTargetELFStreamer::getStreamer() { return static_cast<MCELFStreamer &>(*Streamer); } -void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) { +void MipsTargetELFStreamer::emitMipsELFFlags(unsigned Flags) { MCAssembler &MCA = getStreamer().getAssembler(); MCA.setELFHeaderEFlags(Flags); } diff --git a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp index 2f49e74ab82..24c3b61b010 100644 --- a/llvm/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/llvm/lib/Target/Mips/MipsAsmPrinter.cpp @@ -108,7 +108,6 @@ void MipsAsmPrinter::EmitInstruction(const MachineInstr *MI) { return; } - MachineBasicBlock::const_instr_iterator I = MI; MachineBasicBlock::const_instr_iterator E = MI->getParent()->instr_end(); @@ -634,8 +633,12 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) { } -static void emitELFHeaderFlagsCG(MipsTargetStreamer &TargetStreamer, - const MipsSubtarget &Subtarget) { +void MipsAsmPrinter::processInitialEFlags() { + // Not having this check would work too, but would have us chew through + // code that it doesn't use for RawText. + if (OutStreamer.hasRawTextSupport()) + return; + // Update e_header flags unsigned EFlags = 0; @@ -643,30 +646,30 @@ static void emitELFHeaderFlagsCG(MipsTargetStreamer &TargetStreamer, // Currently we assume that -mabicalls is the default. EFlags |= ELF::EF_MIPS_CPIC; - if (Subtarget.inMips16Mode()) + if (Subtarget->inMips16Mode()) EFlags |= ELF::EF_MIPS_ARCH_ASE_M16; else EFlags |= ELF::EF_MIPS_NOREORDER; // Architecture - if (Subtarget.hasMips64r2()) + if (Subtarget->hasMips64r2()) EFlags |= ELF::EF_MIPS_ARCH_64R2; - else if (Subtarget.hasMips64()) + else if (Subtarget->hasMips64()) EFlags |= ELF::EF_MIPS_ARCH_64; - else if (Subtarget.hasMips32r2()) + else if (Subtarget->hasMips32r2()) EFlags |= ELF::EF_MIPS_ARCH_32R2; else EFlags |= ELF::EF_MIPS_ARCH_32; - if (Subtarget.inMicroMipsMode()) + if (Subtarget->inMicroMipsMode()) EFlags |= ELF::EF_MIPS_MICROMIPS; // ABI - if (Subtarget.isABI_O32()) + if (Subtarget->isABI_O32()) EFlags |= ELF::EF_MIPS_ABI_O32; // Relocation Model - Reloc::Model RM = Subtarget.getRelocationModel(); + Reloc::Model RM = Subtarget->getRelocationModel(); if (RM == Reloc::PIC_ || RM == Reloc::Default) EFlags |= ELF::EF_MIPS_PIC; else if (RM == Reloc::Static) @@ -674,14 +677,13 @@ static void emitELFHeaderFlagsCG(MipsTargetStreamer &TargetStreamer, else llvm_unreachable("Unsupported relocation model for e_flags"); - TargetStreamer.emitMipsHackELFFlags(EFlags); + getTargetStreamer().emitMipsELFFlags(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/llvm/lib/Target/Mips/MipsAsmPrinter.h b/llvm/lib/Target/Mips/MipsAsmPrinter.h index b3060ad9306..9f07914396f 100644 --- a/llvm/lib/Target/Mips/MipsAsmPrinter.h +++ b/llvm/lib/Target/Mips/MipsAsmPrinter.h @@ -50,6 +50,10 @@ private: /// pool entries so we can properly mark them as data regions. bool InConstantPool; + // If object output, set initial eflags. + // This includes both default and commandline flags that affect the output + // ELF header flags. + void processInitialEFlags(); public: @@ -61,6 +65,7 @@ public: : AsmPrinter(TM, Streamer), MCP(0), InConstantPool(false), MCInstLowering(*this) { Subtarget = &TM.getSubtarget<MipsSubtarget>(); + processInitialEFlags(); } virtual const char *getPassName() const { @@ -103,6 +108,7 @@ public: void EmitStartOfAsmFile(Module &M); void EmitEndOfAsmFile(Module &M); void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); + }; } diff --git a/llvm/lib/Target/Mips/MipsTargetStreamer.h b/llvm/lib/Target/Mips/MipsTargetStreamer.h index d6d0bf1a8e3..16591686fd8 100644 --- a/llvm/lib/Target/Mips/MipsTargetStreamer.h +++ b/llvm/lib/Target/Mips/MipsTargetStreamer.h @@ -18,7 +18,7 @@ class MipsTargetStreamer : public MCTargetStreamer { virtual void anchor(); public: - virtual void emitMipsHackELFFlags(unsigned Flags) = 0; + virtual void emitMipsELFFlags(unsigned Flags) = 0; virtual void emitDirectiveSetMicroMips() = 0; virtual void emitDirectiveSetNoMicroMips() = 0; virtual void emitDirectiveSetMips16() = 0; @@ -34,7 +34,7 @@ class MipsTargetAsmStreamer : public MipsTargetStreamer { public: MipsTargetAsmStreamer(formatted_raw_ostream &OS); - virtual void emitMipsHackELFFlags(unsigned Flags); + virtual void emitMipsELFFlags(unsigned Flags); virtual void emitDirectiveSetMicroMips(); virtual void emitDirectiveSetNoMicroMips(); virtual void emitDirectiveSetMips16(); @@ -56,7 +56,7 @@ public: virtual void emitLabel(MCSymbol *Symbol) LLVM_OVERRIDE; // FIXME: emitMipsHackELFFlags() will be removed from this class. - virtual void emitMipsHackELFFlags(unsigned Flags); + virtual void emitMipsELFFlags(unsigned Flags); virtual void emitDirectiveSetMicroMips(); virtual void emitDirectiveSetNoMicroMips(); virtual void emitDirectiveSetMips16(); |