When creating a disassembler for one of the arm variants that can
authorJason Molenda <jmolenda@apple.com>
Sat, 7 Feb 2015 06:03:49 +0000 (06:03 +0000)
committerJason Molenda <jmolenda@apple.com>
Sat, 7 Feb 2015 06:03:49 +0000 (06:03 +0000)
only execute thumb instructions, force the arch triple string to
be "thumbv..." instead of "armv..." so we do the right thing by
default when disassembling arbitrary chunks of code.
<rdar://problem/15126397>

llvm-svn: 228486

lldb/include/lldb/Core/Disassembler.h
lldb/source/Core/Disassembler.cpp

index 00f1848..64d35e6 100644 (file)
@@ -457,7 +457,7 @@ protected:
     //------------------------------------------------------------------
     // Classes that inherit from Disassembler can see and modify these
     //------------------------------------------------------------------
-    const ArchSpec m_arch;
+    ArchSpec m_arch;
     InstructionList m_instruction_list;
     lldb::addr_t m_base_addr;
     std::string m_flavor;
index 169d0ba..14fbee1 100644 (file)
@@ -1172,6 +1172,24 @@ Disassembler::Disassembler(const ArchSpec& arch, const char *flavor) :
         m_flavor.assign("default");
     else
         m_flavor.assign(flavor);
+
+    // If this is an arm variant that can only include thumb (T16, T32)
+    // instructions, force the arch triple to be "thumbv.." instead of
+    // "armv..."
+    if (arch.GetTriple().getArch() == llvm::Triple::arm
+        && (arch.GetCore() == ArchSpec::Core::eCore_arm_armv7m
+            || arch.GetCore() == ArchSpec::Core::eCore_arm_armv7em
+            || arch.GetCore() == ArchSpec::Core::eCore_arm_armv6m))
+    {
+        std::string thumb_arch_name (arch.GetTriple().getArchName().str());
+        // Replace "arm" with "thumb" so we get all thumb variants correct
+        if (thumb_arch_name.size() > 3)
+        {
+            thumb_arch_name.erase(0, 3);
+            thumb_arch_name.insert(0, "thumb");
+        }
+        m_arch.SetTriple (thumb_arch_name.c_str());
+    }
 }
 
 //----------------------------------------------------------------------