summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp59
-rw-r--r--llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp14
-rw-r--r--llvm/lib/Target/Mips/MipsAsmPrinter.cpp26
-rw-r--r--llvm/lib/Target/Mips/MipsAsmPrinter.h6
-rw-r--r--llvm/lib/Target/Mips/MipsTargetStreamer.h6
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();
OpenPOWER on IntegriCloud