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> 

llvm-svn: 355578
This commit is contained in:
Jason Molenda 2019-03-07 03:16:45 +00:00
parent 815a05ca6b
commit a583486065
4 changed files with 90 additions and 0 deletions

View File

@ -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 */,

View File

@ -1196,6 +1196,11 @@ DisassemblerLLVMC::DisassemblerLLVMC(const ArchSpec &arch,
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.

View File

@ -1,5 +1,6 @@
if("ARM" IN_LIST LLVM_TARGETS_TO_BUILD)
add_lldb_unittest(DisassemblerTests
TestArm64Disassembly.cpp
TestArmv7Disassembly.cpp
LINK_LIBS
lldbCore

View File

@ -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);
}
}