Author: jmolenda Date: Wed Mar 6 19:16:45 2019 New Revision: 355578 URL: http://llvm.org/viewvc/llvm-project?rev=355578&view=rev Log: When disassembling Aarch64 target and vendor Apple, set the cpu to "apple-latest" which llvm uses to indicate the newest supported ISA. Add a unit test; I'm only testing an armv8.1 instruction in this unit test which would already be disassembled correctly because we set the disassembler to ARM v8.2 mode, but it ensures that nothing has been broken by adding this cpu spec.
<rdar://problem/38714781> Added: lldb/trunk/unittests/Disassembler/TestArm64Disassembly.cpp Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp lldb/trunk/unittests/Disassembler/CMakeLists.txt Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=355578&r1=355577&r2=355578&view=diff ============================================================================== --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original) +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Wed Mar 6 19:16:45 2019 @@ -970,6 +970,7 @@ 6DEC6F391BD66D750091ABA6 /* TaskPool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DEC6F381BD66D750091ABA6 /* TaskPool.cpp */; }; 23CB15421D66DA9300EDDDE1 /* TaskPoolTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2321F9451BDD346100BA9A93 /* TaskPoolTest.cpp */; }; 2689007413353E1A00698AC0 /* Terminal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268DA873130095ED00C9483A /* Terminal.cpp */; }; + AFEABBF72230BF840097046F /* TestArm64Disassembly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AFEABBF62230BF840097046F /* TestArm64Disassembly.cpp */; }; 4CEC86A4204738C5009B37B1 /* TestArm64InstEmulation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CEC86A3204738C5009B37B1 /* TestArm64InstEmulation.cpp */; }; AF7F97682141FA4500795BC0 /* TestArmv7Disassembly.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AF7F97662141FA3800795BC0 /* TestArmv7Disassembly.cpp */; }; 23CB15401D66DA9300EDDDE1 /* TestClangASTContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 23CB150C1D66CF5600EDDDE1 /* TestClangASTContext.cpp */; }; @@ -3094,6 +3095,7 @@ 2321F9451BDD346100BA9A93 /* TaskPoolTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TaskPoolTest.cpp; sourceTree = "<group>"; }; 268DA873130095ED00C9483A /* Terminal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Terminal.cpp; sourceTree = "<group>"; }; 268DA871130095D000C9483A /* Terminal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Terminal.h; path = include/lldb/Host/Terminal.h; sourceTree = "<group>"; }; + AFEABBF62230BF840097046F /* TestArm64Disassembly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TestArm64Disassembly.cpp; path = unittests/Disassembler/TestArm64Disassembly.cpp; sourceTree = SOURCE_ROOT; }; 4CEC86A3204738C5009B37B1 /* TestArm64InstEmulation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TestArm64InstEmulation.cpp; path = UnwindAssembly/ARM64/TestArm64InstEmulation.cpp; sourceTree = "<group>"; }; AF7F97662141FA3800795BC0 /* TestArmv7Disassembly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TestArmv7Disassembly.cpp; path = unittests/Disassembler/TestArmv7Disassembly.cpp; sourceTree = SOURCE_ROOT; }; 23CB150C1D66CF5600EDDDE1 /* TestClangASTContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestClangASTContext.cpp; sourceTree = "<group>"; }; @@ -6890,6 +6892,7 @@ AF7F97652141FA2100795BC0 /* Disassembler */ = { isa = PBXGroup; children = ( + AFEABBF62230BF840097046F /* TestArm64Disassembly.cpp */, AF7F97662141FA3800795BC0 /* TestArmv7Disassembly.cpp */, ); name = Disassembler; @@ -7787,6 +7790,7 @@ 9A3D43D91F3151C400EB767C /* StatusTest.cpp in Sources */, 23CB15341D66DA9300EDDDE1 /* CPlusPlusLanguageTest.cpp in Sources */, 9A2057381F3B8E7E00F6C293 /* FileSystemTest.cpp in Sources */, + AFEABBF72230BF840097046F /* TestArm64Disassembly.cpp in Sources */, 9A2057201F3B8D2500F6C293 /* UnixSignalsTest.cpp in Sources */, 2668A2EE20AF417D00D94111 /* PathMappingListTest.cpp in Sources */, AFAFD80A1E57E1B90017A14F /* ModuleCacheTest.cpp in Sources */, Modified: lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp?rev=355578&r1=355577&r2=355578&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp (original) +++ lldb/trunk/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp Wed Mar 6 19:16:45 2019 @@ -1196,6 +1196,11 @@ DisassemblerLLVMC::DisassemblerLLVMC(con if (triple.getArch() == llvm::Triple::aarch64) features_str += "+v8.2a"; + if (triple.getArch() == llvm::Triple::aarch64 + && triple.getVendor() == llvm::Triple::Apple) { + cpu = "apple-latest"; + } + // We use m_disasm_up.get() to tell whether we are valid or not, so if this // isn't good for some reason, we won't be valid and FindPlugin will fail and // we won't get used. Modified: lldb/trunk/unittests/Disassembler/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Disassembler/CMakeLists.txt?rev=355578&r1=355577&r2=355578&view=diff ============================================================================== --- lldb/trunk/unittests/Disassembler/CMakeLists.txt (original) +++ lldb/trunk/unittests/Disassembler/CMakeLists.txt Wed Mar 6 19:16:45 2019 @@ -1,5 +1,6 @@ if("ARM" IN_LIST LLVM_TARGETS_TO_BUILD) add_lldb_unittest(DisassemblerTests + TestArm64Disassembly.cpp TestArmv7Disassembly.cpp LINK_LIBS lldbCore Added: lldb/trunk/unittests/Disassembler/TestArm64Disassembly.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Disassembler/TestArm64Disassembly.cpp?rev=355578&view=auto ============================================================================== --- lldb/trunk/unittests/Disassembler/TestArm64Disassembly.cpp (added) +++ lldb/trunk/unittests/Disassembler/TestArm64Disassembly.cpp Wed Mar 6 19:16:45 2019 @@ -0,0 +1,80 @@ +//===-- TestArm64Disassembly.cpp ------------------------------------*- C++ +//-*-===// + +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "gtest/gtest.h" + +#include "lldb/Core/Address.h" +#include "lldb/Core/Disassembler.h" +#include "lldb/Utility/ArchSpec.h" +#include "lldb/Target/ExecutionContext.h" + +#include "Plugins/Disassembler/llvm/DisassemblerLLVMC.h" +#include "llvm/Support/TargetSelect.h" + +using namespace lldb; +using namespace lldb_private; + +class TestArm64Disassembly : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + + // virtual void SetUp() override { } + // virtual void TearDown() override { } + +protected: +}; + +void TestArm64Disassembly::SetUpTestCase() { + llvm::InitializeAllTargets(); + llvm::InitializeAllAsmPrinters(); + llvm::InitializeAllTargetMCs(); + llvm::InitializeAllDisassemblers(); + DisassemblerLLVMC::Initialize(); +} + +void TestArm64Disassembly::TearDownTestCase() { + DisassemblerLLVMC::Terminate(); +} + +TEST_F(TestArm64Disassembly, TestArmv81Instruction) { + ArchSpec arch("arm64-apple-ios"); + + const unsigned num_of_instructions = 2; + uint8_t data[] = { + 0xff, 0x43, 0x00, 0xd1, // 0xd10043ff : sub sp, sp, #0x10 + 0x62, 0x7c, 0xa1, 0xc8, // 0xc8a17c62 : cas x1, x2, [x3] (cas defined in ARM v8.1 & newer) + }; + + DisassemblerSP disass_sp; + Address start_addr(0x100); + disass_sp = Disassembler::DisassembleBytes(arch, nullptr, nullptr, start_addr, + &data, sizeof (data), num_of_instructions, false); + + // If we failed to get a disassembler, we can assume it is because + // the llvm we linked against was not built with the ARM target, + // and we should skip these tests without marking anything as failing. + + if (disass_sp) { + const InstructionList inst_list (disass_sp->GetInstructionList()); + EXPECT_EQ (num_of_instructions, inst_list.GetSize()); + + InstructionSP inst_sp; + const char *mnemonic; + ExecutionContext exe_ctx (nullptr, nullptr, nullptr); + inst_sp = inst_list.GetInstructionAtIndex (0); + mnemonic = inst_sp->GetMnemonic(&exe_ctx); + ASSERT_STREQ ("sub", mnemonic); + + inst_sp = inst_list.GetInstructionAtIndex (1); + mnemonic = inst_sp->GetMnemonic(&exe_ctx); + ASSERT_STREQ ("cas", mnemonic); + } +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits