This reverts commit r200064 and r200051.
authorRafael Espindola <rafael.espindola@gmail.com>
Sat, 25 Jan 2014 15:06:56 +0000 (15:06 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sat, 25 Jan 2014 15:06:56 +0000 (15:06 +0000)
r200064 depends on r200051.

r200051 is broken: I tries to replace .mips_hack_elf_flags, which is a good
thing, but what it replaces it with is even worse.

The new emitMipsELFFlags it adds corresponds to no assembly directive, is not
marked as a hack and is not even printed to the .s file.

The patch also introduces more uses of hasRawTextSupport.

The correct way to remove .mips_hack_elf_flags is to have the mips target
streamer handle the default flags (and command line options). That way the
same code path is used for asm and obj. The streamer interface should *really*
correspond to what is printed in the .s file.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200078 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/AsmParser/MipsAsmParser.cpp
lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp
lib/Target/Mips/MipsAsmPrinter.cpp
lib/Target/Mips/MipsAsmPrinter.h
lib/Target/Mips/MipsTargetStreamer.h
test/CodeGen/Mips/elf_eflags.ll [deleted file]
test/CodeGen/Mips/elf_st_other.ll [deleted file]
test/MC/Mips/elf_eflags.ll [new file with mode: 0644]
test/MC/Mips/elf_eflags.s
test/MC/Mips/elf_st_other.ll [new file with mode: 0644]

index 35ad7680be622d7973e7a380c0a7c621db739d3f..aae2dcd16e7ef4dd91359c313c6e7aa772235170 100644 (file)
@@ -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);
index d026471d0fdb4191af3163253be3f796d893643d..6b57dff2c83d8c1b74bc3d701418f801a50ce61d 100644 (file)
 
 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::emitMipsELFFlags(unsigned Flags) { return; }
+void MipsTargetAsmStreamer::emitMipsHackELFFlags(unsigned Flags) {
+  if (!PrintHackDirectives)
+    return;
+
+  OS << "\t.mips_hack_elf_flags 0x";
+  OS.write_hex(Flags);
+  OS << '\n';
+}
 
 void MipsTargetAsmStreamer::emitDirectiveSetMicroMips() {
   OS << "\t.set\tmicromips\n";
@@ -75,7 +85,7 @@ MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
   return static_cast<MCELFStreamer &>(*Streamer);
 }
 
-void MipsTargetELFStreamer::emitMipsELFFlags(unsigned Flags) {
+void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) {
   MCAssembler &MCA = getStreamer().getAssembler();
   MCA.setELFHeaderEFlags(Flags);
 }
index 24c3b61b0109df788e90d4ae9e40726363fb43ba..2f49e74ab8245c51315f10c830c175ee943e0f01 100644 (file)
@@ -108,6 +108,7 @@ void MipsAsmPrinter::EmitInstruction(const MachineInstr *MI) {
     return;
   }
 
+
   MachineBasicBlock::const_instr_iterator I = MI;
   MachineBasicBlock::const_instr_iterator E = MI->getParent()->instr_end();
 
@@ -633,12 +634,8 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) {
 
 }
 
-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;
-
+static void emitELFHeaderFlagsCG(MipsTargetStreamer &TargetStreamer,
+                                 const MipsSubtarget &Subtarget) {
   // Update e_header flags
   unsigned EFlags = 0;
 
@@ -646,30 +643,30 @@ void MipsAsmPrinter::processInitialEFlags() {
   // 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)
@@ -677,13 +674,14 @@ void MipsAsmPrinter::processInitialEFlags() {
   else
     llvm_unreachable("Unsupported relocation model for e_flags");
 
-  getTargetStreamer().emitMipsELFFlags(EFlags);
+  TargetStreamer.emitMipsHackELFFlags(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,
index 9f07914396fc0b8e9cbd94eaddceb9cf622777dc..b3060ad93067ad941a22efb3f02a2848b2af8d76 100644 (file)
@@ -50,10 +50,6 @@ 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:
 
@@ -65,7 +61,6 @@ public:
     : AsmPrinter(TM, Streamer), MCP(0), InConstantPool(false),
       MCInstLowering(*this) {
     Subtarget = &TM.getSubtarget<MipsSubtarget>();
-    processInitialEFlags();
   }
 
   virtual const char *getPassName() const {
@@ -108,7 +103,6 @@ public:
   void EmitStartOfAsmFile(Module &M);
   void EmitEndOfAsmFile(Module &M);
   void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
-
 };
 }
 
index 16591686fd8af847f44f8074ffd80422a83e1c7e..d6d0bf1a8e346a4ea8eb0dbc471338544a56c900 100644 (file)
@@ -18,7 +18,7 @@ class MipsTargetStreamer : public MCTargetStreamer {
   virtual void anchor();
 
 public:
-  virtual void emitMipsELFFlags(unsigned Flags) = 0;
+  virtual void emitMipsHackELFFlags(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 emitMipsELFFlags(unsigned Flags);
+  virtual void emitMipsHackELFFlags(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 emitMipsELFFlags(unsigned Flags);
+  virtual void emitMipsHackELFFlags(unsigned Flags);
   virtual void emitDirectiveSetMicroMips();
   virtual void emitDirectiveSetNoMicroMips();
   virtual void emitDirectiveSetMips16();
diff --git a/test/CodeGen/Mips/elf_eflags.ll b/test/CodeGen/Mips/elf_eflags.ll
deleted file mode 100644 (file)
index c7cb590..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-; This tests for directives that will result in
-; ELF EFLAGS setting with direct object.
-
-; Non-shared (static) is the absence of pic and or cpic.
-
-; EF_MIPS_NOREORDER (0x00000001) is always on by default currently
-; EF_MIPS_PIC (0x00000002)
-; EF_MIPS_CPIC (0x00000004) - See note below
-; EF_MIPS_ABI2 (0x00000020) - n32 not tested yet
-; EF_MIPS_ARCH_32 (0x50000000)
-; EF_MIPS_ARCH_64 (0x60000000)
-; EF_MIPS_ARCH_32R2 (0x70000000)
-; EF_MIPS_ARCH_64R2 (0x80000000)
-
-; Note that EF_MIPS_CPIC is set by -mabicalls which is the default on Linux
-; TODO need to support -mno-abicalls
-
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32 \
-; RUN: -relocation-model=static %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE32 %s
-;
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32 %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE32_PIC %s
-;
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 \
-; RUN: -relocation-model=static %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE32R2 %s
-;
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE32R2_PIC %s
-;
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 \
-; RUN: -mattr=+micromips -relocation-model=static %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE32R2-MICROMIPS %s
-;
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 \
-; RUN: -mattr=+micromips %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE32R2-MICROMIPS_PIC %s
-
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips64 \
-; RUN: -relocation-model=static %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE64 %s
-;
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips64 %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE64_PIC %s
-;
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips64r2 \
-; RUN: -relocation-model=static %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE64R2 %s
-;
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips64r2 %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-BE64R2_PIC %s
-
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 \
-; RUN: -mattr=+mips16 -relocation-model=pic %s -o - | \
-; RUN: FileCheck -check-prefix=CHECK-LE32R2-MIPS16 %s
-
-; 32(R1) bit with NO_REORDER and static
-; CHECK-BE32: .abicalls
-; CHECK-BE32: .option pic0
-; CHECK-BE32: .set noreorder
-; TODO: Need .set mips32
-;
-; 32(R1) bit with NO_REORDER and PIC
-; CHECK-BE32_PIC: .abicalls
-; CHECK-BE32_PIC: .set noreorder
-; TODO: Need .set mips32 and check absence of .option pic0
-;
-; 32R2 bit with NO_REORDER and static
-; CHECK-BE32R2: .abicalls
-; CHECK-BE32R2: .option pic0
-; CHECK-BE32R2: .set noreorder
-; TODO: Need .set mips32r2
-;
-; 32R2 bit with NO_REORDER and PIC
-; CHECK-BE32R2_PIC:.abicalls
-; CHECK-BE32R2_PIC:.set noreorder
-; TODO: Need .set mips32r2 and check absence of .option pic0
-;
-; 32R2 bit MICROMIPS with NO_REORDER and static
-; CHECK-BE32R2-MICROMIPS: .abicalls
-; CHECK-BE32R2-MICROMIPS: .option pic0
-; CHECK-BE32R2-MICROMIPS: .set micromips
-; CHECK-BE32R2-MICROMIPS: .set noreorder
-; TODO: Need .set mips32r2
-;
-; 32R2 bit MICROMIPS with NO_REORDER and PIC
-; CHECK-BE32R2-MICROMIPS_PIC: .abicalls
-; CHECK-BE32R2-MICROMIPS_PIC: .set micromips
-; CHECK-BE32R2-MICROMIPS_PIC: .set noreorder
-; TODO: Need .set mips32r2 and check absence of .option pic0
-;
-; 64(R1) bit with NO_REORDER and static
-; CHECK-BE64: .abicalls
-; CHECK-BE64: .set noreorder
-; TODO: Need .set mips64 and .option pic0
-;
-; 64(R1) bit with NO_REORDER and PIC
-; CHECK-BE64_PIC: .abicalls
-; CHECK-BE64_PIC: .set noreorder
-; TODO: Need .set mips64 and check absence of .option pic0
-;
-; 64R2 bit with NO_REORDER and static
-; CHECK-BE64R2: .abicalls
-; CHECK-BE64R2: .set noreorder
-; TODO: Need .set mips64r2 and .option pic0
-;
-; 64R2 bit with NO_REORDER and PIC
-; CHECK-BE64R2_PIC: .abicalls
-; CHECK-BE64R2_PIC: .set noreorder
-; TODO: Need .set mips64r2 and check absence of .option pic0
-;
-; 32R2 bit MIPS16 with PIC
-; CHECK-LE32R2-MIPS16: .abicalls
-; CHECK-LE32R2-MIPS16: .set mips16
-; TODO: Need .set mips32r2 and check absence of .option pic0 and noreorder
-
-define i32 @main() nounwind {
-entry:
-  ret i32 0
-}
diff --git a/test/CodeGen/Mips/elf_st_other.ll b/test/CodeGen/Mips/elf_st_other.ll
deleted file mode 100644 (file)
index 47828fe..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-; This tests value of ELF st_other field for function symbol table entries.
-; For microMIPS value should be equal to STO_MIPS_MICROMIPS.
-
-; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+micromips %s \
-; RUN: -o - | FileCheck %s
-
-define i32 @main() nounwind {
-entry:
-  ret i32 0
-}
-
-; CHECK: .set micromips
-; CHECK: main:
diff --git a/test/MC/Mips/elf_eflags.ll b/test/MC/Mips/elf_eflags.ll
new file mode 100644 (file)
index 0000000..8216a90
--- /dev/null
@@ -0,0 +1,69 @@
+; This tests ELF EFLAGS setting with direct object.
+; When the assembler is ready a .s file for it will
+; be created.
+
+; Non-shared (static) is the absence of pic and or cpic.
+
+; EF_MIPS_NOREORDER (0x00000001) is always on by default currently
+; EF_MIPS_PIC (0x00000002)
+; EF_MIPS_CPIC (0x00000004) - See note below
+; EF_MIPS_ABI2 (0x00000020) - n32 not tested yet
+; EF_MIPS_ARCH_32 (0x50000000)
+; EF_MIPS_ARCH_64 (0x60000000)
+; EF_MIPS_ARCH_32R2 (0x70000000)
+; EF_MIPS_ARCH_64R2 (0x80000000)
+
+; Note that EF_MIPS_CPIC is set by -mabicalls which is the default on Linux
+; TODO need to support -mno-abicalls
+
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32 -relocation-model=static %s -print-hack-directives -o - | FileCheck -check-prefix=CHECK-BE32 %s
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32 -print-hack-directives %s -o - | FileCheck -check-prefix=CHECK-BE32_PIC %s
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 -relocation-model=static %s -print-hack-directives -o - | FileCheck -check-prefix=CHECK-BE32R2 %s
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 -print-hack-directives %s -o - | FileCheck -check-prefix=CHECK-BE32R2_PIC %s
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+micromips -relocation-model=static -print-hack-directives %s -o - | FileCheck -check-prefix=CHECK-BE32R2-MICROMIPS %s
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+micromips -print-hack-directives %s -o - | FileCheck -check-prefix=CHECK-BE32R2-MICROMIPS_PIC %s
+
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips64 -relocation-model=static %s -print-hack-directives -o - | FileCheck -check-prefix=CHECK-BE64 %s
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips64 %s -print-hack-directives -o - | FileCheck -check-prefix=CHECK-BE64_PIC %s
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips64r2 -relocation-model=static -print-hack-directives %s -o - | FileCheck -check-prefix=CHECK-BE64R2 %s
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips64r2 -print-hack-directives %s -o - | FileCheck -check-prefix=CHECK-BE64R2_PIC %s
+
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+mips16 -relocation-model=pic -print-hack-directives %s -o - | FileCheck -check-prefix=CHECK-LE32R2-MIPS16 %s
+
+; 32(R1) bit with NO_REORDER and static
+; CHECK-BE32: .mips_hack_elf_flags 0x50001005
+;
+; 32(R1) bit with NO_REORDER and PIC
+; CHECK-BE32_PIC: .mips_hack_elf_flags 0x50001007
+;
+; 32R2 bit with NO_REORDER and static
+; CHECK-BE32R2: .mips_hack_elf_flags 0x70001005
+;
+; 32R2 bit with NO_REORDER and PIC
+; CHECK-BE32R2_PIC: .mips_hack_elf_flags 0x70001007
+;
+; 32R2 bit MICROMIPS with NO_REORDER and static
+; CHECK-BE32R2-MICROMIPS: .mips_hack_elf_flags 0x72001005
+;
+; 32R2 bit MICROMIPS with NO_REORDER and PIC
+; CHECK-BE32R2-MICROMIPS_PIC: .mips_hack_elf_flags 0x72001007
+;
+; 64(R1) bit with NO_REORDER and static
+; CHECK-BE64: .mips_hack_elf_flags 0x60000005
+;
+; 64(R1) bit with NO_REORDER and PIC
+; CHECK-BE64_PIC: .mips_hack_elf_flags 0x60000007
+;
+; 64R2 bit with NO_REORDER and static
+; CHECK-BE64R2: .mips_hack_elf_flags 0x80000005
+;
+; 64R2 bit with NO_REORDER and PIC
+; CHECK-BE64R2_PIC: .mips_hack_elf_flags 0x80000007
+;
+; 32R2 bit MIPS16 with PIC
+; CHECK-LE32R2-MIPS16: .mips_hack_elf_flags 0x74001006
+
+define i32 @main() nounwind {
+entry:
+  ret i32 0
+}
index c2849a5efce76bcee285d9b1bb1d47ce9896dc4c..f459689bb92bc8bea1f35552d76291b1c04db524 100644 (file)
@@ -1,21 +1,15 @@
-// RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux %s -o - | \
-// RUN: llvm-readobj -h | FileCheck %s
+// RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux %s -o -| llvm-readobj -h | FileCheck %s
+// The initial value will be set at 0x50001003 and
+// we will override that with the negation of 0x2 (option pic0
+// the addition of 0x4 (.abicalls)
 
-// From the commandline and defaults the following should be set:
-//   EF_MIPS_ARCH_32      (0x50000000)
-//   EF_MIPS_ABI_O32      (0x00001000)
-//   EF_MIPS_NOREORDER    (0x00000001)
-//   EF_MIPS_PIC          (0x00000002)
-
-// Inline directives should set or unset the following:
-//   EF_MIPS_CPIC         (0x00000004) : .abicalls
-//   EF_MIPS_ARCH_ASE_M16 (0x04000000) : .set mips16
-//   The negation of EF_MIPS_PIC : .option pic0
+        .mips_hack_elf_flags 0x50001003
 
 // CHECK: Flags [ (0x54001005)
 
         .abicalls
 
         .option pic0
-
+ // Set EF_MIPS_ARCH_ASE_M16 (0x04000000)
         .set mips16
diff --git a/test/MC/Mips/elf_st_other.ll b/test/MC/Mips/elf_st_other.ll
new file mode 100644 (file)
index 0000000..68cad48
--- /dev/null
@@ -0,0 +1,12 @@
+; This tests value of ELF st_other field for function symbol table entries.
+; For microMIPS value should be equal to STO_MIPS_MICROMIPS.
+
+; RUN: llc -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+micromips -print-hack-directives %s -o - | FileCheck %s
+
+define i32 @main() nounwind {
+entry:
+  ret i32 0
+}
+
+; CHECK: .set  micromips
+; CHECK: main: