Some of the instructions in the Mips instruction set are revision
authorJack Carter <jcarter@mips.com>
Tue, 28 Aug 2012 19:24:49 +0000 (19:24 +0000)
committerJack Carter <jcarter@mips.com>
Tue, 28 Aug 2012 19:24:49 +0000 (19:24 +0000)
delimited. llvm-mc -disassemble access these through the -mattr
option.

llvm-objdump -disassemble had no such way to set the attribute so
some instructions were just not recognized for disassembly.

This patch accepts llvm-mc mechanism for specifying the attributes.

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

test/Object/Mips/dext-test.elf-mips64r2 [new file with mode: 0644]
test/Object/Mips/feature.test [new file with mode: 0644]
tools/llvm-objdump/llvm-objdump.cpp

diff --git a/test/Object/Mips/dext-test.elf-mips64r2 b/test/Object/Mips/dext-test.elf-mips64r2
new file mode 100644 (file)
index 0000000..59dbaef
Binary files /dev/null and b/test/Object/Mips/dext-test.elf-mips64r2 differ
diff --git a/test/Object/Mips/feature.test b/test/Object/Mips/feature.test
new file mode 100644 (file)
index 0000000..5e5c9f4
--- /dev/null
@@ -0,0 +1,11 @@
+RUN: llvm-objdump -disassemble -triple mips64el -mattr +mips64r2 %p/dext-test.elf-mips64r2 \
+RUN: | FileCheck %s
+
+CHECK: Disassembly of section .text:
+CHECK: .text:
+CHECK:        0:       08 00 e0 03                                     jr      $ra
+CHECK:        4:       43 49 82 7c                                     dext $2, $4, 5, 10
+CHECK:        8:       08 00 e0 03                                     jr      $ra
+CHECK:        c:       83 28 82 7c                                     dext $2, $4, 2, 6
+CHECK:       10:       08 00 e0 03                                     jr      $ra
+CHECK:       14:       43 09 82 7c                                     dext $2, $4, 5, 2
index b431c7638d75ad10d024db140279616daa96d12e..13ea4e32958a2b3d2522e8a1d8a963052e9304f8 100644 (file)
@@ -94,6 +94,12 @@ static cl::alias
 SectionHeadersShorter("h", cl::desc("Alias for --section-headers"),
                       cl::aliasopt(SectionHeaders));
 
+static cl::list<std::string>
+MAttrs("mattr",
+  cl::CommaSeparated,
+  cl::desc("Target specific attributes"),
+  cl::value_desc("a1,+a2,-a3,..."));
+
 static StringRef ToolName;
 
 static bool error(error_code ec) {
@@ -169,6 +175,15 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
   if (!TheTarget)
     return;
 
+  // Package up features to be passed to target/subtarget
+  std::string FeaturesStr;
+  if (MAttrs.size()) {
+    SubtargetFeatures Features;
+    for (unsigned i = 0; i != MAttrs.size(); ++i)
+      Features.AddFeature(MAttrs[i]);
+    FeaturesStr = Features.getString();
+  }
+
   error_code ec;
   for (section_iterator i = Obj->begin_sections(),
                         e = Obj->end_sections();
@@ -233,7 +248,7 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
     }
 
     OwningPtr<const MCSubtargetInfo> STI(
-      TheTarget->createMCSubtargetInfo(TripleName, "", ""));
+      TheTarget->createMCSubtargetInfo(TripleName, "", FeaturesStr));
 
     if (!STI) {
       errs() << "error: no subtarget info for target " << TripleName << "\n";