summaryrefslogtreecommitdiff
path: root/unittests/UnwindAssembly/PPC64/TestPPC64InstEmulation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'unittests/UnwindAssembly/PPC64/TestPPC64InstEmulation.cpp')
-rw-r--r--unittests/UnwindAssembly/PPC64/TestPPC64InstEmulation.cpp259
1 files changed, 0 insertions, 259 deletions
diff --git a/unittests/UnwindAssembly/PPC64/TestPPC64InstEmulation.cpp b/unittests/UnwindAssembly/PPC64/TestPPC64InstEmulation.cpp
deleted file mode 100644
index 2318540870ff..000000000000
--- a/unittests/UnwindAssembly/PPC64/TestPPC64InstEmulation.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-//===-- TestPPC64InstEmulation.cpp ------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "gtest/gtest.h"
-
-#include <vector>
-
-#include "Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.h"
-
-#include "lldb/Core/Address.h"
-#include "lldb/Core/AddressRange.h"
-#include "lldb/Symbol/UnwindPlan.h"
-#include "lldb/Target/UnwindAssembly.h"
-#include "lldb/Utility/ArchSpec.h"
-
-#include "Plugins/Disassembler/llvm/DisassemblerLLVMC.h"
-#include "Plugins/Instruction/PPC64/EmulateInstructionPPC64.h"
-#include "Plugins/Process/Utility/lldb-ppc64le-register-enums.h"
-#include "llvm/Support/TargetSelect.h"
-
-using namespace lldb;
-using namespace lldb_private;
-
-class TestPPC64InstEmulation : public testing::Test {
-public:
- static void SetUpTestCase();
- static void TearDownTestCase();
-
- // virtual void SetUp() override { }
- // virtual void TearDown() override { }
-
-protected:
-};
-
-void TestPPC64InstEmulation::SetUpTestCase() {
- llvm::InitializeAllTargets();
- llvm::InitializeAllAsmPrinters();
- llvm::InitializeAllTargetMCs();
- llvm::InitializeAllDisassemblers();
- DisassemblerLLVMC::Initialize();
- EmulateInstructionPPC64::Initialize();
-}
-
-void TestPPC64InstEmulation::TearDownTestCase() {
- DisassemblerLLVMC::Terminate();
- EmulateInstructionPPC64::Terminate();
-}
-
-TEST_F(TestPPC64InstEmulation, TestSimpleFunction) {
- ArchSpec arch("powerpc64le-linux-gnu");
- std::unique_ptr<UnwindAssemblyInstEmulation> engine(
- static_cast<UnwindAssemblyInstEmulation *>(
- UnwindAssemblyInstEmulation::CreateInstance(arch)));
- ASSERT_NE(nullptr, engine);
-
- UnwindPlan::RowSP row_sp;
- AddressRange sample_range;
- UnwindPlan unwind_plan(eRegisterKindLLDB);
- UnwindPlan::Row::RegisterLocation regloc;
-
- // prologue and epilogue of:
- // int main() {
- // int i = test();
- // return i;
- // }
- //
- // compiled with clang -O0 -g
- uint8_t data[] = {
- // prologue
- 0x02, 0x10, 0x40, 0x3c, // 0: lis r2, 4098
- 0x00, 0x7f, 0x42, 0x38, // 4: addi r2, r2, 32512
- 0xa6, 0x02, 0x08, 0x7c, // 8: mflr r0
- 0xf8, 0xff, 0xe1, 0xfb, // 12: std r31, -8(r1)
- 0x10, 0x00, 0x01, 0xf8, // 16: std r0, 16(r1)
- 0x91, 0xff, 0x21, 0xf8, // 20: stdu r1, -112(r1)
- 0x78, 0x0b, 0x3f, 0x7c, // 24: mr r31, r1
- 0x00, 0x00, 0x60, 0x38, // 28: li r3, 0
- 0x64, 0x00, 0x7f, 0x90, // 32: stw r3, 100(r31)
-
- // epilogue
- 0x70, 0x00, 0x21, 0x38, // 36: addi r1, r1, 112
- 0x10, 0x00, 0x01, 0xe8, // 40: ld r0, 16(r1)
- 0xf8, 0xff, 0xe1, 0xeb, // 44: ld r31, -8(r1)
- 0xa6, 0x03, 0x08, 0x7c, // 48: mtlr r0
- 0x20, 0x00, 0x80, 0x4e // 52: blr
- };
-
- sample_range = AddressRange(0x1000, sizeof(data));
-
- EXPECT_TRUE(engine->GetNonCallSiteUnwindPlanFromAssembly(
- sample_range, data, sizeof(data), unwind_plan));
-
- // 0: CFA=sp+0
- row_sp = unwind_plan.GetRowForFunctionOffset(0);
- EXPECT_EQ(0ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r1_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-
- // 1: CFA=sp+0 => fp=[CFA-8]
- row_sp = unwind_plan.GetRowForFunctionOffset(16);
- EXPECT_EQ(16ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r1_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_r31_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(-8, regloc.GetOffset());
-
- // 2: CFA=sp+0 => fp=[CFA-8] lr=[CFA+16]
- row_sp = unwind_plan.GetRowForFunctionOffset(20);
- EXPECT_EQ(20ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r1_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_lr_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(16, regloc.GetOffset());
-
- // 3: CFA=sp+112 => fp=[CFA-8] lr=[CFA+16]
- row_sp = unwind_plan.GetRowForFunctionOffset(24);
- EXPECT_EQ(24ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r1_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(112, row_sp->GetCFAValue().GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_r31_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(-8, regloc.GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_lr_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(16, regloc.GetOffset());
-
- // 4: CFA=r31+112 => fp=[CFA-8] lr=[CFA+16]
- row_sp = unwind_plan.GetRowForFunctionOffset(28);
- EXPECT_EQ(28ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r31_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(112, row_sp->GetCFAValue().GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_r31_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(-8, regloc.GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_lr_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(16, regloc.GetOffset());
-
- // 5: CFA=sp+0 => fp=[CFA-8] lr=[CFA+16]
- row_sp = unwind_plan.GetRowForFunctionOffset(40);
- EXPECT_EQ(40ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r1_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_r31_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(-8, regloc.GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_lr_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(16, regloc.GetOffset());
-}
-
-TEST_F(TestPPC64InstEmulation, TestMediumFunction) {
- ArchSpec arch("powerpc64le-linux-gnu");
- std::unique_ptr<UnwindAssemblyInstEmulation> engine(
- static_cast<UnwindAssemblyInstEmulation *>(
- UnwindAssemblyInstEmulation::CreateInstance(arch)));
- ASSERT_NE(nullptr, engine);
-
- UnwindPlan::RowSP row_sp;
- AddressRange sample_range;
- UnwindPlan unwind_plan(eRegisterKindLLDB);
- UnwindPlan::Row::RegisterLocation regloc;
-
- // prologue and epilogue of main() (call-func.c),
- // with several calls and stack variables.
- //
- // compiled with clang -O0 -g
- uint8_t data[] = {
- // prologue
- 0xa6, 0x02, 0x08, 0x7c, // 0: mflr r0
- 0xf8, 0xff, 0xe1, 0xfb, // 4: std r31, -8(r1)
- 0x10, 0x00, 0x01, 0xf8, // 8: std r0, 16(r1)
- 0x78, 0x0b, 0x3e, 0x7c, // 12: mr r30, r1
- 0xe0, 0x06, 0x20, 0x78, // 16: clrldi r0, r1, 59
- 0xa0, 0xfa, 0x00, 0x20, // 20: subfic r0, r0, -1376
- 0x6a, 0x01, 0x21, 0x7c, // 24: stdux r1, r1, r0
- 0x78, 0x0b, 0x3f, 0x7c, // 28: mr r31, r1
-
- // epilogue
- 0x00, 0x00, 0x21, 0xe8, // 32: ld r1, 0(r1)
- 0x20, 0x00, 0x80, 0x4e // 36: blr
- };
-
- sample_range = AddressRange(0x1000, sizeof(data));
-
- EXPECT_TRUE(engine->GetNonCallSiteUnwindPlanFromAssembly(
- sample_range, data, sizeof(data), unwind_plan));
-
- // 0: CFA=sp+0
- row_sp = unwind_plan.GetRowForFunctionOffset(0);
- EXPECT_EQ(0ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r1_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-
- // 1: CFA=sp+0 => fp=[CFA-8]
- row_sp = unwind_plan.GetRowForFunctionOffset(8);
- EXPECT_EQ(8ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r1_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_r31_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(-8, regloc.GetOffset());
-
- // 2: CFA=sp+0 => fp=[CFA-8] lr=[CFA+16]
- row_sp = unwind_plan.GetRowForFunctionOffset(12);
- EXPECT_EQ(12ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r1_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-
- EXPECT_TRUE(row_sp->GetRegisterInfo(gpr_lr_ppc64le, regloc));
- EXPECT_TRUE(regloc.IsAtCFAPlusOffset());
- EXPECT_EQ(16, regloc.GetOffset());
-
- // 3: CFA=r30
- row_sp = unwind_plan.GetRowForFunctionOffset(16);
- EXPECT_EQ(16ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r30_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-
- row_sp = unwind_plan.GetRowForFunctionOffset(32);
- EXPECT_EQ(16ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r30_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-
- // 4: CFA=sp+0
- row_sp = unwind_plan.GetRowForFunctionOffset(36);
- EXPECT_EQ(36ull, row_sp->GetOffset());
- EXPECT_TRUE(row_sp->GetCFAValue().GetRegisterNumber() == gpr_r1_ppc64le);
- EXPECT_TRUE(row_sp->GetCFAValue().IsRegisterPlusOffset() == true);
- EXPECT_EQ(0, row_sp->GetCFAValue().GetOffset());
-}