]> granicus.if.org Git - llvm/commitdiff
[llvm-objdump] Support detection of feature bits from the object and implement this...
authorDaniel Sanders <daniel.sanders@imgtec.com>
Thu, 16 Jun 2016 09:17:03 +0000 (09:17 +0000)
committerDaniel Sanders <daniel.sanders@imgtec.com>
Thu, 16 Jun 2016 09:17:03 +0000 (09:17 +0000)
Summary:
The Mips implementation only covers the feature bits described by the ELF
e_flags so far. Mips stores additional feature bits such as MSA in the
.MIPS.abiflags section.

Also fixed a small bug this revealed where microMIPS wouldn't add the
EF_MIPS_MICROMIPS flag when using -filetype=obj.

Reviewers: echristo, rafael

Subscribers: rafael, mehdi_amini, dsanders, sdardis, llvm-commits

Differential Revision: http://reviews.llvm.org/D21125

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

23 files changed:
include/llvm/Object/COFF.h
include/llvm/Object/ELFObjectFile.h
include/llvm/Object/MachO.h
include/llvm/Object/ObjectFile.h
include/llvm/Support/ELF.h
lib/Object/ELFObjectFile.cpp
lib/Target/Mips/MipsAsmPrinter.cpp
test/CodeGen/Mips/Fast-ISel/shift.ll
test/CodeGen/Mips/compactbranches/no-beqzc-bnezc.ll
test/CodeGen/Mips/micromips-atomic1.ll
test/MC/Mips/cpload.s
test/MC/Mips/cprestore-noreorder-noat.s
test/MC/Mips/cprestore-noreorder.s
test/MC/Mips/cprestore-reorder.s
test/MC/Mips/cpsetup.s
test/MC/Mips/micromips-el-fixup-data.s
test/MC/Mips/mips64extins.ll [deleted file]
test/MC/Mips/mips64extins.s [new file with mode: 0644]
test/MC/Mips/mips_gprel16.s
test/MC/Mips/set-defined-symbol.s
test/Object/Mips/feature.test
test/Object/Mips/objdump-micro-mips.test
tools/llvm-objdump/llvm-objdump.cpp

index 5f13137e26e65c5e56f9c05fdb986758ac20b44c..ebf9bb82f387af709c5b27e56b6ff3e38c3cc69d 100644 (file)
@@ -768,6 +768,7 @@ public:
   uint8_t getBytesInAddress() const override;
   StringRef getFileFormatName() const override;
   unsigned getArch() const override;
+  SubtargetFeatures getFeatures() const override { return SubtargetFeatures(); }
 
   import_directory_iterator import_directory_begin() const;
   import_directory_iterator import_directory_end() const;
index 52cde1a0f0f5ec025451fab039d4e5512df38a6e..f93008810a6a2d8d5d87ac8e48fe14489e8d8b69 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/Triple.h"
 #include "llvm/ADT/iterator_range.h"
+#include "llvm/MC/SubtargetFeature.h"
 #include "llvm/Object/Binary.h"
 #include "llvm/Object/ELF.h"
 #include "llvm/Object/ELFTypes.h"
@@ -51,6 +52,7 @@ class ELFObjectFileBase : public ObjectFile {
 protected:
   ELFObjectFileBase(unsigned int Type, MemoryBufferRef Source);
 
+  virtual uint16_t getEMachine() const = 0;
   virtual uint64_t getSymbolSize(DataRefImpl Symb) const = 0;
   virtual uint8_t getSymbolOther(DataRefImpl Symb) const = 0;
   virtual uint8_t getSymbolELFType(DataRefImpl Symb) const = 0;
@@ -67,6 +69,8 @@ public:
   elf_symbol_iterator_range symbols() const;
 
   static inline bool classof(const Binary *v) { return v->isELF(); }
+
+  SubtargetFeatures getFeatures() const override;
 };
 
 class ELFSectionRef : public SectionRef {
@@ -179,6 +183,7 @@ ELFObjectFileBase::symbols() const {
 }
 
 template <class ELFT> class ELFObjectFile : public ELFObjectFileBase {
+  uint16_t getEMachine() const override;
   uint64_t getSymbolSize(DataRefImpl Sym) const override;
 
 public:
@@ -427,6 +432,11 @@ uint32_t ELFObjectFile<ELFT>::getSymbolAlignment(DataRefImpl Symb) const {
   return 0;
 }
 
+template <class ELFT>
+uint16_t ELFObjectFile<ELFT>::getEMachine() const {
+  return EF.getHeader()->e_machine;
+}
+
 template <class ELFT>
 uint64_t ELFObjectFile<ELFT>::getSymbolSize(DataRefImpl Sym) const {
   return getSymbol(Sym)->st_size;
index 6a079a964bfbd6985479c79695f6aaa5190531cd..53915a9f0b553bcfda9ddc886a4a1e91f522f14d 100644 (file)
@@ -262,6 +262,7 @@ public:
 
   StringRef getFileFormatName() const override;
   unsigned getArch() const override;
+  SubtargetFeatures getFeatures() const override { return SubtargetFeatures(); }
   Triple getArchTriple(const char **McpuDefault = nullptr) const;
 
   relocation_iterator section_rel_begin(unsigned Index) const;
index 0f0f10b8c192ebde66106bb5f5ab779dc0dffacf..838495657b9231db82ccc9e5258604e8debfbd71 100644 (file)
@@ -15,6 +15,7 @@
 #define LLVM_OBJECT_OBJECTFILE_H
 
 #include "llvm/ADT/StringRef.h"
+#include "llvm/MC/SubtargetFeature.h"
 #include "llvm/Object/SymbolicFile.h"
 #include "llvm/Support/DataTypes.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -262,6 +263,7 @@ public:
 
   virtual StringRef getFileFormatName() const = 0;
   virtual /* Triple::ArchType */ unsigned getArch() const = 0;
+  virtual SubtargetFeatures getFeatures() const = 0;
 
   /// Returns platform-specific object flags, if any.
   virtual std::error_code getPlatformFlags(unsigned &Result) const {
index 352fd8a5cdef7f77fb05e2c4aba204bc24dfdeb2..5c9acc008dd73047da19b089170d1dea40f7b4ad 100644 (file)
@@ -486,6 +486,7 @@ enum : unsigned {
   EF_MIPS_ABI        = 0x0000f000, // Mask for selecting EF_MIPS_ABI_ variant.
 
   // MIPS machine variant
+  EF_MIPS_MACH_NONE    = 0x00000000, // A standard MIPS implementation.
   EF_MIPS_MACH_3900    = 0x00810000, // Toshiba R3900
   EF_MIPS_MACH_4010    = 0x00820000, // LSI R4010
   EF_MIPS_MACH_4100    = 0x00830000, // NEC VR4100
index c7df30a590351683055c28959b89ea32942f66ae..4bd69e34e3c3b37fabf164642fc82bf932404bc4 100644 (file)
@@ -55,4 +55,71 @@ ObjectFile::createELFObjectFile(MemoryBufferRef Obj) {
   return std::move(R);
 }
 
+SubtargetFeatures ELFObjectFileBase::getFeatures() const {
+  switch (getEMachine()) {
+  case ELF::EM_MIPS: {
+    SubtargetFeatures Features;
+    unsigned PlatformFlags;
+    getPlatformFlags(PlatformFlags);
+
+    switch (PlatformFlags & ELF::EF_MIPS_ARCH) {
+    case ELF::EF_MIPS_ARCH_1:
+      break;
+    case ELF::EF_MIPS_ARCH_2:
+      Features.AddFeature("mips2");
+      break;
+    case ELF::EF_MIPS_ARCH_3:
+      Features.AddFeature("mips3");
+      break;
+    case ELF::EF_MIPS_ARCH_4:
+      Features.AddFeature("mips4");
+      break;
+    case ELF::EF_MIPS_ARCH_5:
+      Features.AddFeature("mips5");
+      break;
+    case ELF::EF_MIPS_ARCH_32:
+      Features.AddFeature("mips32");
+      break;
+    case ELF::EF_MIPS_ARCH_64:
+      Features.AddFeature("mips64");
+      break;
+    case ELF::EF_MIPS_ARCH_32R2:
+      Features.AddFeature("mips32r2");
+      break;
+    case ELF::EF_MIPS_ARCH_64R2:
+      Features.AddFeature("mips64r2");
+      break;
+    case ELF::EF_MIPS_ARCH_32R6:
+      Features.AddFeature("mips32r6");
+      break;
+    case ELF::EF_MIPS_ARCH_64R6:
+      Features.AddFeature("mips64r6");
+      break;
+    default:
+      llvm_unreachable("Unknown EF_MIPS_ARCH value");
+    }
+
+    switch (PlatformFlags & ELF::EF_MIPS_MACH) {
+    case ELF::EF_MIPS_MACH_NONE:
+      // No feature associated with this value.
+      break;
+    case ELF::EF_MIPS_MACH_OCTEON:
+      Features.AddFeature("cnmips");
+      break;
+    default:
+      llvm_unreachable("Unknown EF_MIPS_ARCH value");
+    }
+
+    if (PlatformFlags & ELF::EF_MIPS_ARCH_ASE_M16)
+      Features.AddFeature("mips16");
+    if (PlatformFlags & ELF::EF_MIPS_MICROMIPS)
+      Features.AddFeature("micromips");
+
+    return Features;
+  }
+  default:
+    return SubtargetFeatures();
+  }
+}
+
 } // end namespace llvm
index e6333f9a4b7677dde7824cadc72f9e8b2f3647eb..d48cac76c03f0c65f611aad93debcdcbec42a587 100644 (file)
@@ -325,9 +325,10 @@ void MipsAsmPrinter::EmitFunctionEntryLabel() {
   if (Subtarget->isTargetNaCl())
     EmitAlignment(std::max(MF->getAlignment(), MIPS_NACL_BUNDLE_ALIGN));
 
-  if (Subtarget->inMicroMipsMode())
+  if (Subtarget->inMicroMipsMode()) {
     TS.emitDirectiveSetMicroMips();
-  else
+    TS.setUsesMicroMips();
+  } else
     TS.emitDirectiveSetNoMicroMips();
 
   if (Subtarget->inMips16Mode())
index 9fe694bb582734fac70de52bbb5980fdf97a8b92..651fb6ad1f5ac12c38206eddb0348a6770e1a687 100644 (file)
@@ -1,5 +1,5 @@
 ; RUN: llc -march=mipsel -mcpu=mips32r2 -O0 -fast-isel=true -filetype=obj %s -o - \
-; RUN:   | llvm-objdump -arch mipsel -mcpu=mips32r2 -d - | FileCheck %s
+; RUN:   | llvm-objdump -d - | FileCheck %s
 
 ; This test checks that encoding for srl is correct when fast-isel for mips32r2 is used.
 
index e4a22820048665ed3f9eabd2bbfeeb5c8a02673f..f6fef90d01b93ed623d854f4750fbccf0fae663a 100644 (file)
@@ -1,5 +1,6 @@
 ; RUN: llc -march=mipsel -mcpu=mips32r6  -disable-mips-delay-filler < %s | FileCheck %s
-; RUN: llc -march=mips -mcpu=mips32r6 -disable-mips-delay-filler < %s -filetype=obj -o - | llvm-objdump -arch=mips -mcpu=mips32r6 -d - | FileCheck %s -check-prefix=ENCODING
+; RUN: llc -march=mips -mcpu=mips32r6 -disable-mips-delay-filler < %s \
+; RUN:   -filetype=obj -o - | llvm-objdump -d - | FileCheck %s -check-prefix=ENCODING
 
 ; bnezc and beqzc have restriction that $rt != 0
 
index 37c3d7682e4f420b143006a9601723b1834a7540..d7c66c27b6e22f174cedcb205bed890c57325c4f 100644 (file)
@@ -1,6 +1,5 @@
 ; RUN: llc -march=mipsel -filetype=obj --disable-machine-licm -mattr=micromips < %s -o - \
-; RUN:   | llvm-objdump -no-show-raw-insn -arch mipsel -mcpu=mips32r2 -mattr=micromips -d - \
-; RUN:   | FileCheck %s -check-prefix=MICROMIPS
+; RUN:   | llvm-objdump -no-show-raw-insn -d - | FileCheck %s -check-prefix=MICROMIPS
 
 ; Use llvm-objdump to check wheter the encodings of microMIPS atomic instructions are correct.
 ; While emitting assembly files directly when in microMIPS mode, it is possible to emit a mips32r2
index 842e0c7937c048979769b9c108315f31d84d9408..3bbad60e578dd9c0b8accec80ce9c8658dae3db8 100644 (file)
@@ -1,16 +1,13 @@
 # RUN: llvm-mc %s -arch=mips -mcpu=mips32r2 | FileCheck %s -check-prefix=ASM
 #
-# RUN: llvm-mc %s -arch=mips -mcpu=mips32r2 -mattr=+o32 -filetype=obj -o -| \
-# RUN:  llvm-objdump -d -r -arch=mips - | \
-# RUN:    FileCheck %s -check-prefix=OBJ-O32
+# RUN: llvm-mc %s -arch=mips -mcpu=mips32r2 -filetype=obj -o -| \
+# RUN:  llvm-objdump -d -r - | FileCheck %s -check-prefix=OBJ-O32
 
 # RUN: llvm-mc %s -arch=mips64 -mcpu=mips64r2 -target-abi n32 -filetype=obj -o -| \
-# RUN:  llvm-objdump -d -r -arch=mips - | \
-# RUN:    FileCheck %s -check-prefix=OBJ-N32
+# RUN:  llvm-objdump -d -r - | FileCheck %s -check-prefix=OBJ-N32
 
-# RUN: llvm-mc %s -arch=mips64 -mcpu=mips64r2 -mattr=+n64 -filetype=obj -o -| \
-# RUN:  llvm-objdump -d -r -arch=mips - | \
-# RUN:    FileCheck %s -check-prefix=OBJ-N64
+# RUN: llvm-mc %s -arch=mips64 -mcpu=mips64r2 -filetype=obj -o -| \
+# RUN:  llvm-objdump -d -r - | FileCheck %s -check-prefix=OBJ-N64
 
 # ASM:    .text
 # ASM:    .option pic2
index 25ceac1c63a7863f269c1a77fa2d0d9bb8592bb4..07c4dd2ea358d6837ee9551a3f558ab946be536c 100644 (file)
@@ -12,8 +12,7 @@
 # RUN:   FileCheck %s -check-prefix=NO-STORE
 
 # RUN: llvm-mc %s -arch=mips64 -mcpu=mips64 -filetype=obj -o - | \
-# RUN:   llvm-objdump -d -r - | \
-# RUN:   FileCheck %s -check-prefix=NO-STORE
+# RUN:   llvm-objdump -d -r - | FileCheck %s -check-prefix=NO-STORE
 
   .text
   .ent foo
index 1d1997493f560579397e043c7d31de4f8a4ff50d..6740ad92b272a1071efd5aceca52e70eb35438e4 100644 (file)
@@ -2,8 +2,7 @@
 # RUN:  FileCheck %s
 
 # RUN: llvm-mc %s -arch=mips -mcpu=mips32 --position-independent -filetype=obj -o -| \
-# RUN:  llvm-objdump -d -r -arch=mips - | \
-# RUN:   FileCheck %s -check-prefix=CHECK-FOR-STORE
+# RUN:  llvm-objdump -d -r - | FileCheck %s -check-prefix=CHECK-FOR-STORE
 
 # RUN: llvm-mc %s -arch=mips -mcpu=mips32 -mattr=+micromips --position-independent -show-encoding | \
 # RUN:  FileCheck %s -check-prefix=MICROMIPS
index eeb4e8e99c7f371c5f9c8440817874950c521ab2..a7fae259318da95135373f401df9ea11ab79b1de 100644 (file)
@@ -2,8 +2,7 @@
 # RUN:  FileCheck %s
 
 # RUN: llvm-mc %s -arch=mips -mcpu=mips32 --position-independent -filetype=obj -o -| \
-# RUN:  llvm-objdump -d -r -arch=mips - | \
-# RUN:   FileCheck %s -check-prefix=CHECK-FOR-STORE
+# RUN:  llvm-objdump -d -r - | FileCheck %s -check-prefix=CHECK-FOR-STORE
 
 # RUN: llvm-mc %s -arch=mips -mcpu=mips32 -mattr=+micromips --position-independent -show-encoding | \
 # RUN:  FileCheck %s -check-prefix=MICROMIPS
index 255c1f620194c47b48b3a49eba745fe1341411f1..f858b21ee87234fa08d3b66591e4eef60e530061 100644 (file)
@@ -1,20 +1,19 @@
-# RUN: llvm-mc -triple mips64-unknown-unknown -target-abi o32 -filetype=obj -o - %s | \
-# RUN:   llvm-objdump -d -r -arch=mips64 - | \
-# RUN:     FileCheck -check-prefix=ALL -check-prefix=O32 %s
+# RUN: llvm-mc -triple mips64-unknown-linux -target-abi o32 -filetype=obj -o - %s | \
+# RUN:   llvm-objdump -d -r - | FileCheck -check-prefix=ALL -check-prefix=O32 %s
 
 # RUN: llvm-mc -triple mips64-unknown-unknown -target-abi o32 %s | \
 # RUN:   FileCheck -check-prefix=ALL -check-prefix=ASM %s
 
-# RUN: llvm-mc -triple mips64-unknown-unknown -target-abi n32 -filetype=obj -o - %s | \
-# RUN:   llvm-objdump -d -r -arch=mips64 - | \
-# RUN:     FileCheck -check-prefix=ALL -check-prefix=NXX -check-prefix=N32 %s
+# RUN: llvm-mc -triple mips64-unknown-linux -target-abi n32 -filetype=obj -o - %s | \
+# RUN:   llvm-objdump -d -r - | \
+# RUN:   FileCheck -check-prefix=ALL -check-prefix=NXX -check-prefix=N32 %s
 
 # RUN: llvm-mc -triple mips64-unknown-unknown -target-abi n32 %s | \
 # RUN:   FileCheck -check-prefix=ALL -check-prefix=ASM %s
 
-# RUN: llvm-mc -triple mips64-unknown-unknown %s -filetype=obj -o - | \
-# RUN:   llvm-objdump -d -r -arch=mips64 - | \
-# RUN:     FileCheck -check-prefix=ALL -check-prefix=NXX -check-prefix=N64 %s
+# RUN: llvm-mc -triple mips64-unknown-linux %s -filetype=obj -o - | \
+# RUN:   llvm-objdump -d -r - | \
+# RUN:   FileCheck -check-prefix=ALL -check-prefix=NXX -check-prefix=N64 %s
 
 # RUN: llvm-mc -triple mips64-unknown-unknown %s | \
 # RUN:   FileCheck -check-prefix=ALL -check-prefix=ASM %s
index 34eb7f8d4eec632747d65dc2eab2402a750e972f..aa85838339fc0f913d5665de34dee8638eb42ccf 100644 (file)
@@ -1,6 +1,6 @@
 # RUN: llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 \
 # RUN:   -mattr=+micromips 2>&1 -filetype=obj > %t.o
-# RUN: llvm-objdump %t.o -mattr=+micromips -d | FileCheck %s
+# RUN: llvm-objdump %t.o -d | FileCheck %s
 
 # Check that fixup data is written in the microMIPS specific little endian
 # byte order.
diff --git a/test/MC/Mips/mips64extins.ll b/test/MC/Mips/mips64extins.ll
deleted file mode 100644 (file)
index f29e1f6..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-; RUN: llc -march=mips64el -filetype=obj -mcpu=mips64r2 -target-abi=n64 %s -o - \
-; RUN:   | llvm-objdump -disassemble -mattr +mips64r2 - | FileCheck %s
-
-define i64 @dext(i64 %i) nounwind readnone {
-entry:
-; CHECK: dext ${{[0-9]+}}, ${{[0-9]+}}, 5, 10
-  %shr = lshr i64 %i, 5
-  %and = and i64 %shr, 1023
-  ret i64 %and
-}
-
-define i64 @dextu(i64 %i) nounwind readnone {
-entry:
-; CHECK: dextu ${{[0-9]+}}, ${{[0-9]+}}, 34, 6
-  %shr = lshr i64 %i, 34
-  %and = and i64 %shr, 63
-  ret i64 %and
-}
-
-define i64 @dextm(i64 %i) nounwind readnone {
-entry:
-; CHECK: dextm ${{[0-9]+}}, ${{[0-9]+}}, 5, 34
-  %shr = lshr i64 %i, 5
-  %and = and i64 %shr, 17179869183
-  ret i64 %and
-}
-
-define i64 @dins(i64 %i, i64 %j) nounwind readnone {
-entry:
-; CHECK: dins ${{[0-9]+}}, ${{[0-9]+}}, 8, 10
-  %shl2 = shl i64 %j, 8
-  %and = and i64 %shl2, 261888
-  %and3 = and i64 %i, -261889
-  %or = or i64 %and3, %and
-  ret i64 %or
-}
-
-define i64 @dinsm(i64 %i, i64 %j) nounwind readnone {
-entry:
-; CHECK: dinsm ${{[0-9]+}}, ${{[0-9]+}}, 10, 1
-  %shl4 = shl i64 %j, 10
-  %and = and i64 %shl4, 8796093021184
-  %and5 = and i64 %i, -8796093021185
-  %or = or i64 %and5, %and
-  ret i64 %or
-}
-
-define i64 @dinsu(i64 %i, i64 %j) nounwind readnone {
-entry:
-; CHECK: dinsu ${{[0-9]+}}, ${{[0-9]+}}, 40, 13
-  %shl4 = shl i64 %j, 40
-  %and = and i64 %shl4, 9006099743113216
-  %and5 = and i64 %i, -9006099743113217
-  %or = or i64 %and5, %and
-  ret i64 %or
-}
diff --git a/test/MC/Mips/mips64extins.s b/test/MC/Mips/mips64extins.s
new file mode 100644 (file)
index 0000000..3f1973b
--- /dev/null
@@ -0,0 +1,9 @@
+# RUN: llvm-mc -arch=mips64el -filetype=obj -mcpu=mips64r2 -target-abi=n64 %s -o - \
+# RUN:   | llvm-objdump -disassemble - | FileCheck %s
+
+        dext $2, $4, 5, 10   # CHECK: dext ${{[0-9]+}}, ${{[0-9]+}}, 5, 10
+        dextu $2, $4, 34, 6  # CHECK: dextu ${{[0-9]+}}, ${{[0-9]+}}, 34, 6
+        dextm $2, $4, 5, 34  # CHECK: dextm ${{[0-9]+}}, ${{[0-9]+}}, 5, 34
+        dins $4, $5, 8, 10   # CHECK: dins ${{[0-9]+}}, ${{[0-9]+}}, 8, 10
+        dinsm $4, $5, 10, 1  # CHECK: dinsm ${{[0-9]+}}, ${{[0-9]+}}, 10, 1
+        dinsu $4, $5, 40, 13 # CHECK: dinsu ${{[0-9]+}}, ${{[0-9]+}}, 40, 13
index 9f2d1006f176e8debbd6dee80cafdd7f08ef4809..a6e09c6c7b0b3ff76068dc4084fc5d56862afd40 100644 (file)
@@ -4,11 +4,9 @@
 // field.
 
 // RUN: llvm-mc -mcpu=mips32r2 -triple=mipsel-pc-linux -filetype=obj %s -o - \
-// RUN: | llvm-objdump -disassemble -mattr +mips32r2 - \
-// RUN: | FileCheck %s
+// RUN: | llvm-objdump -disassemble - | FileCheck %s
 // RUN: llvm-mc -mcpu=mips32r2 -triple=mips-pc-linux -filetype=obj %s -o - \
-// RUN: | llvm-objdump -disassemble -mattr +mips32r2 - \
-// RUN: | FileCheck %s
+// RUN: | llvm-objdump -disassemble - | FileCheck %s
 
        .text
        .abicalls
index 54db45da27b99e2c420c0f54af2e4d9f02955b1c..20988779783ba27a6a1adeb51a5e91be4b645260 100644 (file)
@@ -1,5 +1,5 @@
 # RUN: llvm-mc %s -arch=mips -mcpu=mips32 -filetype=obj -o - | \
-# RUN:   llvm-objdump -d -r -arch=mips - | FileCheck %s
+# RUN:   llvm-objdump -d -r - | FileCheck %s
 
   .global foo
   .weak bar
index e4d81a159f7bd4450a27c9a055226b9da86f1aae..dc0e7ade3faf922da0e9d6cbbbb4a6af08c44741 100644 (file)
@@ -1,3 +1,4 @@
+RUN: llvm-objdump -disassemble %p/../Inputs/dext-test.elf-mips64r2 | FileCheck %s
 RUN: llvm-objdump -disassemble -mattr +mips64r2 %p/../Inputs/dext-test.elf-mips64r2 \
 RUN:   | FileCheck %s
 
index 0f28dc1a5f1c6b1caffdd20de5b4c86f7d01bbbd..6264d95dac8752468fdadb7e36bb33ae45015ad8 100644 (file)
@@ -1,3 +1,4 @@
+RUN: llvm-objdump -d %p/../Inputs/micro-mips.elf-mipsel | FileCheck %s
 RUN: llvm-objdump -d -mattr=micromips %p/../Inputs/micro-mips.elf-mipsel \
 RUN:   | FileCheck %s
 
index 38550b915301a3be0746192a66edfad4af996cd5..3beb01ad6eb4a541ab6fd034e1d299c48dbeac60 100644 (file)
@@ -931,12 +931,10 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
   const Target *TheTarget = getTarget(Obj);
 
   // Package up features to be passed to target/subtarget
-  std::string FeaturesStr;
+  SubtargetFeatures Features = Obj->getFeatures();
   if (MAttrs.size()) {
-    SubtargetFeatures Features;
     for (unsigned i = 0; i != MAttrs.size(); ++i)
       Features.AddFeature(MAttrs[i]);
-    FeaturesStr = Features.getString();
   }
 
   std::unique_ptr<const MCRegisterInfo> MRI(
@@ -950,7 +948,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
   if (!AsmInfo)
     report_fatal_error("error: no assembly info for target " + TripleName);
   std::unique_ptr<const MCSubtargetInfo> STI(
-      TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr));
+      TheTarget->createMCSubtargetInfo(TripleName, MCPU, Features.getString()));
   if (!STI)
     report_fatal_error("error: no subtarget info for target " + TripleName);
   std::unique_ptr<const MCInstrInfo> MII(TheTarget->createMCInstrInfo());