diff options
| author | Jason Molenda <jmolenda@apple.com> | 2018-09-07 01:28:48 +0000 |
|---|---|---|
| committer | Jason Molenda <jmolenda@apple.com> | 2018-09-07 01:28:48 +0000 |
| commit | 0dfb84ce9bc90fe996467f596b379c96525ed4cf (patch) | |
| tree | 707979f66162e65c4cbcdfd609490fde24737c68 /lldb/source | |
| parent | 6167c4ee74fc6109569fd4dd10115387c81f80a5 (diff) | |
| download | bcm5719-llvm-0dfb84ce9bc90fe996467f596b379c96525ed4cf.tar.gz bcm5719-llvm-0dfb84ce9bc90fe996467f596b379c96525ed4cf.zip | |
Enable the fp-armv8 disassembler feature when disassembling Cortex-M
code. This will enable disassembly of the optional subset of
neon that some Cortex cores support. Add a unit test to check
that a few of these instructions disassemble as expected.
<rdar://problem/26674303>
llvm-svn: 341623
Diffstat (limited to 'lldb/source')
| -rw-r--r-- | lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp | 6 | ||||
| -rw-r--r-- | lldb/source/Utility/ArchSpec.cpp | 5 |
2 files changed, 8 insertions, 3 deletions
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp index 6c40a0c644f..20209e9ab90 100644 --- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp +++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp @@ -1126,11 +1126,13 @@ DisassemblerLLVMC::DisassemblerLLVMC(const ArchSpec &arch, triple.getSubArch() == llvm::Triple::NoSubArch) triple.setArchName("armv8.2a"); + std::string features_str = ""; const char *triple_str = triple.getTriple().c_str(); // ARM Cortex M0-M7 devices only execute thumb instructions if (arch.IsAlwaysThumbInstructions()) { triple_str = thumb_arch.GetTriple().getTriple().c_str(); + features_str += "+fp-armv8,"; } const char *cpu = ""; @@ -1181,7 +1183,6 @@ DisassemblerLLVMC::DisassemblerLLVMC(const ArchSpec &arch, break; } - std::string features_str = ""; if (triple.getArch() == llvm::Triple::mips || triple.getArch() == llvm::Triple::mipsel || triple.getArch() == llvm::Triple::mips64 || @@ -1213,7 +1214,8 @@ DisassemblerLLVMC::DisassemblerLLVMC(const ArchSpec &arch, if (llvm_arch == llvm::Triple::arm) { std::string thumb_triple(thumb_arch.GetTriple().getTriple()); m_alternate_disasm_up = - MCDisasmInstance::Create(thumb_triple.c_str(), "", "", flavor, *this); + MCDisasmInstance::Create(thumb_triple.c_str(), "", features_str.c_str(), + flavor, *this); if (!m_alternate_disasm_up) m_disasm_up.reset(); diff --git a/lldb/source/Utility/ArchSpec.cpp b/lldb/source/Utility/ArchSpec.cpp index 1c50c313e0d..7afa924d6db 100644 --- a/lldb/source/Utility/ArchSpec.cpp +++ b/lldb/source/Utility/ArchSpec.cpp @@ -1477,7 +1477,10 @@ bool ArchSpec::IsAlwaysThumbInstructions() const { if (GetCore() == ArchSpec::Core::eCore_arm_armv7m || GetCore() == ArchSpec::Core::eCore_arm_armv7em || - GetCore() == ArchSpec::Core::eCore_arm_armv6m) { + GetCore() == ArchSpec::Core::eCore_arm_armv6m || + GetCore() == ArchSpec::Core::eCore_thumbv7m || + GetCore() == ArchSpec::Core::eCore_thumbv7em || + GetCore() == ArchSpec::Core::eCore_thumbv6m) { return true; } } |

