summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorJack Carter <jack.carter@imgtec.com>2014-01-25 00:24:07 +0000
committerJack Carter <jack.carter@imgtec.com>2014-01-25 00:24:07 +0000
commitca2ae49d55b42679b0b3bbed6480084b72e5f4bb (patch)
treeb384a377a09cbfd4342c83dd30739fc1ffdb26e3 /llvm/lib/Target
parentd98a7099affc792acb55f366b9c708305930a401 (diff)
downloadbcm5719-llvm-ca2ae49d55b42679b0b3bbed6480084b72e5f4bb.tar.gz
bcm5719-llvm-ca2ae49d55b42679b0b3bbed6480084b72e5f4bb.zip
[Mips] TargetStreamer ELF flag Support for default and commandline options.
This patch uses a common MipsTargetSteamer interface for both MipsAsmPrinter and MipsAsmParser for recording default and commandline driven directives that affect ELF header flags. It has been noted that the .ll tests affected by this patch belong in test/Codegen/Mips. I will move them in a separate patch. Also, a number of directives do not get expressed by AsmPrinter in the resultant .s assembly such as setting the correct ASI. I have noted this in the tests and they will be addressed in later patches. llvm-svn: 200051
Diffstat (limited to 'llvm/lib/Target')
-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