diff options
Diffstat (limited to 'llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp | 59 |
1 files changed, 44 insertions, 15 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); |