summaryrefslogtreecommitdiff
path: root/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/Mips/AsmParser/MipsAsmParser.cpp')
-rw-r--r--lib/Target/Mips/AsmParser/MipsAsmParser.cpp59
1 files changed, 15 insertions, 44 deletions
diff --git a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
index 35ad7680be..aae2dcd16e 100644
--- a/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
+++ b/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
@@ -21,9 +21,6 @@
#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"
@@ -197,6 +194,7 @@ class MipsAsmParser : public MCTargetAsmParser {
bool isEvaluated(const MCExpr *Expr);
bool parseDirectiveSet();
+ bool parseDirectiveMipsHackELFFlags();
bool parseDirectiveOption();
bool parseSetAtDirective();
@@ -259,9 +257,6 @@ 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)
@@ -269,7 +264,6 @@ public:
hasConsumedDollar(false) {
// Initialize the set of available features.
setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
- processInitialEFlags();
}
MCAsmParser &getParser() const { return Parser; }
@@ -2435,6 +2429,17 @@ 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) {
@@ -2553,6 +2558,9 @@ bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
return false;
}
+ if (IDVal == ".mips_hack_elf_flags")
+ return parseDirectiveMipsHackELFFlags();
+
if (IDVal == ".option")
return parseDirectiveOption();
@@ -2569,43 +2577,6 @@ 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);