180814287SRaphael Isemann //===-- TestPECallFrameInfo.cpp -------------------------------------------===//
230c2441aSAleksandr Urakov //
330c2441aSAleksandr Urakov //
430c2441aSAleksandr Urakov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
530c2441aSAleksandr Urakov // See https://llvm.org/LICENSE.txt for license information.
630c2441aSAleksandr Urakov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
730c2441aSAleksandr Urakov //
830c2441aSAleksandr Urakov //===----------------------------------------------------------------------===//
930c2441aSAleksandr Urakov
1030c2441aSAleksandr Urakov #include "gtest/gtest.h"
1130c2441aSAleksandr Urakov
1230c2441aSAleksandr Urakov #include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h"
1330c2441aSAleksandr Urakov #include "Plugins/Process/Utility/lldb-x86-register-enums.h"
145dca0596SRaphael Isemann #include "TestingSupport/SubsystemRAII.h"
1530c2441aSAleksandr Urakov #include "TestingSupport/TestUtilities.h"
1630c2441aSAleksandr Urakov
1730c2441aSAleksandr Urakov #include "lldb/Core/Module.h"
1830c2441aSAleksandr Urakov #include "lldb/Symbol/CallFrameInfo.h"
1930c2441aSAleksandr Urakov #include "lldb/Symbol/UnwindPlan.h"
2030c2441aSAleksandr Urakov #include "llvm/Testing/Support/Error.h"
2130c2441aSAleksandr Urakov
2230c2441aSAleksandr Urakov using namespace lldb_private;
2330c2441aSAleksandr Urakov using namespace lldb;
2430c2441aSAleksandr Urakov
2530c2441aSAleksandr Urakov class PECallFrameInfoTest : public testing::Test {
265dca0596SRaphael Isemann SubsystemRAII<FileSystem, ObjectFilePECOFF> subsystems;
2730c2441aSAleksandr Urakov
2830c2441aSAleksandr Urakov protected:
2930c2441aSAleksandr Urakov void GetUnwindPlan(addr_t file_addr, UnwindPlan &plan) const;
3030c2441aSAleksandr Urakov };
3130c2441aSAleksandr Urakov
GetUnwindPlan(addr_t file_addr,UnwindPlan & plan) const3230c2441aSAleksandr Urakov void PECallFrameInfoTest::GetUnwindPlan(addr_t file_addr, UnwindPlan &plan) const {
3330c2441aSAleksandr Urakov llvm::Expected<TestFile> ExpectedFile = TestFile::fromYaml(
3430c2441aSAleksandr Urakov R"(
3530c2441aSAleksandr Urakov --- !COFF
3630c2441aSAleksandr Urakov OptionalHeader:
3730c2441aSAleksandr Urakov AddressOfEntryPoint: 0
3830c2441aSAleksandr Urakov ImageBase: 16777216
3930c2441aSAleksandr Urakov SectionAlignment: 4096
4030c2441aSAleksandr Urakov FileAlignment: 512
4130c2441aSAleksandr Urakov MajorOperatingSystemVersion: 6
4230c2441aSAleksandr Urakov MinorOperatingSystemVersion: 0
4330c2441aSAleksandr Urakov MajorImageVersion: 0
4430c2441aSAleksandr Urakov MinorImageVersion: 0
4530c2441aSAleksandr Urakov MajorSubsystemVersion: 6
4630c2441aSAleksandr Urakov MinorSubsystemVersion: 0
4730c2441aSAleksandr Urakov Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
4830c2441aSAleksandr Urakov DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT ]
4930c2441aSAleksandr Urakov SizeOfStackReserve: 1048576
5030c2441aSAleksandr Urakov SizeOfStackCommit: 4096
5130c2441aSAleksandr Urakov SizeOfHeapReserve: 1048576
5230c2441aSAleksandr Urakov SizeOfHeapCommit: 4096
5330c2441aSAleksandr Urakov ExportTable:
5430c2441aSAleksandr Urakov RelativeVirtualAddress: 0
5530c2441aSAleksandr Urakov Size: 0
5630c2441aSAleksandr Urakov ImportTable:
5730c2441aSAleksandr Urakov RelativeVirtualAddress: 0
5830c2441aSAleksandr Urakov Size: 0
5930c2441aSAleksandr Urakov ResourceTable:
6030c2441aSAleksandr Urakov RelativeVirtualAddress: 0
6130c2441aSAleksandr Urakov Size: 0
6230c2441aSAleksandr Urakov ExceptionTable:
6330c2441aSAleksandr Urakov RelativeVirtualAddress: 12288
6430c2441aSAleksandr Urakov Size: 60
6530c2441aSAleksandr Urakov CertificateTable:
6630c2441aSAleksandr Urakov RelativeVirtualAddress: 0
6730c2441aSAleksandr Urakov Size: 0
6830c2441aSAleksandr Urakov BaseRelocationTable:
6930c2441aSAleksandr Urakov RelativeVirtualAddress: 0
7030c2441aSAleksandr Urakov Size: 0
7130c2441aSAleksandr Urakov Debug:
7230c2441aSAleksandr Urakov RelativeVirtualAddress: 0
7330c2441aSAleksandr Urakov Size: 0
7430c2441aSAleksandr Urakov Architecture:
7530c2441aSAleksandr Urakov RelativeVirtualAddress: 0
7630c2441aSAleksandr Urakov Size: 0
7730c2441aSAleksandr Urakov GlobalPtr:
7830c2441aSAleksandr Urakov RelativeVirtualAddress: 0
7930c2441aSAleksandr Urakov Size: 0
8030c2441aSAleksandr Urakov TlsTable:
8130c2441aSAleksandr Urakov RelativeVirtualAddress: 0
8230c2441aSAleksandr Urakov Size: 0
8330c2441aSAleksandr Urakov LoadConfigTable:
8430c2441aSAleksandr Urakov RelativeVirtualAddress: 0
8530c2441aSAleksandr Urakov Size: 0
8630c2441aSAleksandr Urakov BoundImport:
8730c2441aSAleksandr Urakov RelativeVirtualAddress: 0
8830c2441aSAleksandr Urakov Size: 0
8930c2441aSAleksandr Urakov IAT:
9030c2441aSAleksandr Urakov RelativeVirtualAddress: 0
9130c2441aSAleksandr Urakov Size: 0
9230c2441aSAleksandr Urakov DelayImportDescriptor:
9330c2441aSAleksandr Urakov RelativeVirtualAddress: 0
9430c2441aSAleksandr Urakov Size: 0
9530c2441aSAleksandr Urakov ClrRuntimeHeader:
9630c2441aSAleksandr Urakov RelativeVirtualAddress: 0
9730c2441aSAleksandr Urakov Size: 0
9830c2441aSAleksandr Urakov header:
9930c2441aSAleksandr Urakov Machine: IMAGE_FILE_MACHINE_AMD64
10030c2441aSAleksandr Urakov Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE ]
10130c2441aSAleksandr Urakov sections:
10230c2441aSAleksandr Urakov - Name: .text
10330c2441aSAleksandr Urakov Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
10430c2441aSAleksandr Urakov VirtualAddress: 4096
10530c2441aSAleksandr Urakov VirtualSize: 4096
10630c2441aSAleksandr Urakov - Name: .rdata
10730c2441aSAleksandr Urakov Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
10830c2441aSAleksandr Urakov VirtualAddress: 8192
10930c2441aSAleksandr Urakov VirtualSize: 68
11030c2441aSAleksandr Urakov SectionData: 010C06000C3208F006E00470036002302105020005540D0000100000001100000020000019400E352F74670028646600213465001A3315015E000EF00CE00AD008C00650
11130c2441aSAleksandr Urakov
11230c2441aSAleksandr Urakov
11330c2441aSAleksandr Urakov # Unwind info at 0x2000:
11430c2441aSAleksandr Urakov # 01 0C 06 00 No chained info, prolog size = 0xC, unwind codes size is 6 words, no frame register
11530c2441aSAleksandr Urakov # 0C 32 UOP_AllocSmall(2) 3 * 8 + 8 bytes, offset in prolog is 0xC
11630c2441aSAleksandr Urakov # 08 F0 UOP_PushNonVol(0) R15(0xF), offset in prolog is 8
11730c2441aSAleksandr Urakov # 06 E0 UOP_PushNonVol(0) R14(0xE), offset in prolog is 6
11830c2441aSAleksandr Urakov # 04 70 UOP_PushNonVol(0) RDI(7), offset in prolog is 4
11930c2441aSAleksandr Urakov # 03 60 UOP_PushNonVol(0) RSI(6), offset in prolog is 3
12030c2441aSAleksandr Urakov # 02 30 UOP_PushNonVol(0) RBX(3), offset in prolog is 2
12130c2441aSAleksandr Urakov # Corresponding prolog:
12230c2441aSAleksandr Urakov # 00 push rbx
12330c2441aSAleksandr Urakov # 02 push rsi
12430c2441aSAleksandr Urakov # 03 push rdi
12530c2441aSAleksandr Urakov # 04 push r14
12630c2441aSAleksandr Urakov # 06 push r15
12730c2441aSAleksandr Urakov # 08 sub rsp, 20h
12830c2441aSAleksandr Urakov
12930c2441aSAleksandr Urakov # Unwind info at 0x2010:
13030c2441aSAleksandr Urakov # 21 05 02 00 Has chained info, prolog size = 5, unwind codes size is 2 words, no frame register
13130c2441aSAleksandr Urakov # 05 54 0D 00 UOP_SaveNonVol(4) RBP(5) to RSP + 0xD * 8, offset in prolog is 5
13230c2441aSAleksandr Urakov # Chained runtime function:
13330c2441aSAleksandr Urakov # 00 10 00 00 Start address is 0x1000
13430c2441aSAleksandr Urakov # 00 11 00 00 End address is 0x1100
13530c2441aSAleksandr Urakov # 00 20 00 00 Unwind info RVA is 0x2000
13630c2441aSAleksandr Urakov # Corresponding prolog:
13730c2441aSAleksandr Urakov # 00 mov [rsp+68h], rbp
13830c2441aSAleksandr Urakov
13930c2441aSAleksandr Urakov # Unwind info at 0x2024:
14030c2441aSAleksandr Urakov # 19 40 0E 35 No chained info, prolog size = 0x40, unwind codes size is 0xE words, frame register is RBP, frame register offset is RSP + 3 * 16
14130c2441aSAleksandr Urakov # 2F 74 67 00 UOP_SaveNonVol(4) RDI(7) to RSP + 0x67 * 8, offset in prolog is 0x2F
14230c2441aSAleksandr Urakov # 28 64 66 00 UOP_SaveNonVol(4) RSI(6) to RSP + 0x66 * 8, offset in prolog is 0x28
14330c2441aSAleksandr Urakov # 21 34 65 00 UOP_SaveNonVol(4) RBX(3) to RSP + 0x65 * 8, offset in prolog is 0x21
14430c2441aSAleksandr Urakov # 1A 33 UOP_SetFPReg(3), offset in prolog is 0x1A
14530c2441aSAleksandr Urakov # 15 01 5E 00 UOP_AllocLarge(1) 0x5E * 8 bytes, offset in prolog is 0x15
14630c2441aSAleksandr Urakov # 0E F0 UOP_PushNonVol(0) R15(0xF), offset in prolog is 0xE
14730c2441aSAleksandr Urakov # 0C E0 UOP_PushNonVol(0) R14(0xE), offset in prolog is 0xC
14830c2441aSAleksandr Urakov # 0A D0 UOP_PushNonVol(0) R13(0xD), offset in prolog is 0xA
14930c2441aSAleksandr Urakov # 08 C0 UOP_PushNonVol(0) R12(0xC), offset in prolog is 8
15030c2441aSAleksandr Urakov # 06 50 UOP_PushNonVol(0) RBP(5), offset in prolog is 6
15130c2441aSAleksandr Urakov # Corresponding prolog:
15230c2441aSAleksandr Urakov # 00 mov [rsp+8], rcx
15330c2441aSAleksandr Urakov # 05 push rbp
15430c2441aSAleksandr Urakov # 06 push r12
15530c2441aSAleksandr Urakov # 08 push r13
15630c2441aSAleksandr Urakov # 0A push r14
15730c2441aSAleksandr Urakov # 0C push r15
15830c2441aSAleksandr Urakov # 0E sub rsp, 2F0h
15930c2441aSAleksandr Urakov # 15 lea rbp, [rsp+30h]
16030c2441aSAleksandr Urakov # 1A mov [rbp+2F8h], rbx
16130c2441aSAleksandr Urakov # 21 mov [rbp+300h], rsi
16230c2441aSAleksandr Urakov # 28 mov [rbp+308h], rdi
16330c2441aSAleksandr Urakov
16430c2441aSAleksandr Urakov - Name: .pdata
16530c2441aSAleksandr Urakov Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
16630c2441aSAleksandr Urakov VirtualAddress: 12288
16730c2441aSAleksandr Urakov VirtualSize: 60
16830c2441aSAleksandr Urakov SectionData: 000000000000000000000000000000000000000000000000001000000011000000200000001100000012000010200000001200000013000024200000
16930c2441aSAleksandr Urakov
17030c2441aSAleksandr Urakov # 00 00 00 00
17130c2441aSAleksandr Urakov # 00 00 00 00 Test correct processing of empty runtime functions at begin
17230c2441aSAleksandr Urakov # 00 00 00 00
17330c2441aSAleksandr Urakov
17430c2441aSAleksandr Urakov # 00 00 00 00
17530c2441aSAleksandr Urakov # 00 00 00 00 Test correct processing of empty runtime functions at begin
17630c2441aSAleksandr Urakov # 00 00 00 00
17730c2441aSAleksandr Urakov
17830c2441aSAleksandr Urakov # 00 10 00 00 Start address is 0x1000
17930c2441aSAleksandr Urakov # 00 11 00 00 End address is 0x1100
18030c2441aSAleksandr Urakov # 00 20 00 00 Unwind info RVA is 0x2000
18130c2441aSAleksandr Urakov
18230c2441aSAleksandr Urakov # 00 11 00 00 Start address is 0x1100
18330c2441aSAleksandr Urakov # 00 12 00 00 End address is 0x1200
18430c2441aSAleksandr Urakov # 10 20 00 00 Unwind info RVA is 0x2010
18530c2441aSAleksandr Urakov
18630c2441aSAleksandr Urakov # 00 12 00 00 Start address is 0x1200
18730c2441aSAleksandr Urakov # 00 13 00 00 End address is 0x1300
18830c2441aSAleksandr Urakov # 24 20 00 00 Unwind info RVA is 0x2024
18930c2441aSAleksandr Urakov
19030c2441aSAleksandr Urakov symbols: []
19130c2441aSAleksandr Urakov ...
19230c2441aSAleksandr Urakov )");
19330c2441aSAleksandr Urakov ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
19430c2441aSAleksandr Urakov
195*a4a00cedSFred Riss ModuleSP module_sp = std::make_shared<Module>(ExpectedFile->moduleSpec());
19630c2441aSAleksandr Urakov ObjectFile *object_file = module_sp->GetObjectFile();
19730c2441aSAleksandr Urakov ASSERT_NE(object_file, nullptr);
19830c2441aSAleksandr Urakov
19930c2441aSAleksandr Urakov std::unique_ptr<CallFrameInfo> cfi = object_file->CreateCallFrameInfo();
20030c2441aSAleksandr Urakov ASSERT_NE(cfi.get(), nullptr);
20130c2441aSAleksandr Urakov
20230c2441aSAleksandr Urakov SectionList *sect_list = object_file->GetSectionList();
20330c2441aSAleksandr Urakov ASSERT_NE(sect_list, nullptr);
20430c2441aSAleksandr Urakov
20530c2441aSAleksandr Urakov EXPECT_TRUE(cfi->GetUnwindPlan(Address(file_addr, sect_list), plan));
20630c2441aSAleksandr Urakov }
20730c2441aSAleksandr Urakov
TEST_F(PECallFrameInfoTest,Basic_eh)20830c2441aSAleksandr Urakov TEST_F(PECallFrameInfoTest, Basic_eh) {
20930c2441aSAleksandr Urakov UnwindPlan plan(eRegisterKindLLDB);
21030c2441aSAleksandr Urakov GetUnwindPlan(0x1001080, plan);
21130c2441aSAleksandr Urakov EXPECT_EQ(plan.GetRowCount(), 7);
21230c2441aSAleksandr Urakov
21330c2441aSAleksandr Urakov UnwindPlan::Row row;
21430c2441aSAleksandr Urakov row.SetOffset(0);
21530c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 8);
21630c2441aSAleksandr Urakov row.SetRegisterLocationToIsCFAPlusOffset(lldb_rsp_x86_64, 0, true);
21730c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rip_x86_64, -8, true);
21830c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(0), row);
21930c2441aSAleksandr Urakov
22030c2441aSAleksandr Urakov row.SetOffset(2);
22130c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x10);
22230c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rbx_x86_64, -0x10, true);
22330c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(1), row);
22430c2441aSAleksandr Urakov
22530c2441aSAleksandr Urakov row.SetOffset(3);
22630c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x18);
22730c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rsi_x86_64, -0x18, true);
22830c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(2), row);
22930c2441aSAleksandr Urakov
23030c2441aSAleksandr Urakov row.SetOffset(4);
23130c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x20);
23230c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rdi_x86_64, -0x20, true);
23330c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(3), row);
23430c2441aSAleksandr Urakov
23530c2441aSAleksandr Urakov row.SetOffset(6);
23630c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x28);
23730c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_r14_x86_64, -0x28, true);
23830c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(4), row);
23930c2441aSAleksandr Urakov
24030c2441aSAleksandr Urakov row.SetOffset(8);
24130c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x30);
24230c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_r15_x86_64, -0x30, true);
24330c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(5), row);
24430c2441aSAleksandr Urakov
24530c2441aSAleksandr Urakov row.SetOffset(0xC);
24630c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x50);
24730c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(6), row);
24830c2441aSAleksandr Urakov }
24930c2441aSAleksandr Urakov
TEST_F(PECallFrameInfoTest,Chained_eh)25030c2441aSAleksandr Urakov TEST_F(PECallFrameInfoTest, Chained_eh) {
25130c2441aSAleksandr Urakov UnwindPlan plan(eRegisterKindLLDB);
25230c2441aSAleksandr Urakov GetUnwindPlan(0x1001180, plan);
25330c2441aSAleksandr Urakov EXPECT_EQ(plan.GetRowCount(), 2);
25430c2441aSAleksandr Urakov
25530c2441aSAleksandr Urakov UnwindPlan::Row row;
25630c2441aSAleksandr Urakov row.SetOffset(0);
25730c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x50);
25830c2441aSAleksandr Urakov row.SetRegisterLocationToIsCFAPlusOffset(lldb_rsp_x86_64, 0, true);
25930c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rip_x86_64, -8, true);
26030c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rbx_x86_64, -0x10, true);
26130c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rsi_x86_64, -0x18, true);
26230c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rdi_x86_64, -0x20, true);
26330c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_r14_x86_64, -0x28, true);
26430c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_r15_x86_64, -0x30, true);
26530c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(0), row);
26630c2441aSAleksandr Urakov
26730c2441aSAleksandr Urakov row.SetOffset(5);
26830c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rbp_x86_64, 0x18, true);
26930c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(1), row);
27030c2441aSAleksandr Urakov }
27130c2441aSAleksandr Urakov
TEST_F(PECallFrameInfoTest,Frame_reg_eh)27230c2441aSAleksandr Urakov TEST_F(PECallFrameInfoTest, Frame_reg_eh) {
27330c2441aSAleksandr Urakov UnwindPlan plan(eRegisterKindLLDB);
27430c2441aSAleksandr Urakov GetUnwindPlan(0x1001280, plan);
27530c2441aSAleksandr Urakov EXPECT_EQ(plan.GetRowCount(), 11);
27630c2441aSAleksandr Urakov
27730c2441aSAleksandr Urakov UnwindPlan::Row row;
27830c2441aSAleksandr Urakov row.SetOffset(0);
27930c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 8);
28030c2441aSAleksandr Urakov row.SetRegisterLocationToIsCFAPlusOffset(lldb_rsp_x86_64, 0, true);
28130c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rip_x86_64, -8, true);
28230c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(0), row);
28330c2441aSAleksandr Urakov
28430c2441aSAleksandr Urakov row.SetOffset(6);
28530c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x10);
28630c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rbp_x86_64, -0x10, true);
28730c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(1), row);
28830c2441aSAleksandr Urakov
28930c2441aSAleksandr Urakov row.SetOffset(8);
29030c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x18);
29130c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_r12_x86_64, -0x18, true);
29230c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(2), row);
29330c2441aSAleksandr Urakov
29430c2441aSAleksandr Urakov row.SetOffset(0xA);
29530c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x20);
29630c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_r13_x86_64, -0x20, true);
29730c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(3), row);
29830c2441aSAleksandr Urakov
29930c2441aSAleksandr Urakov row.SetOffset(0xC);
30030c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x28);
30130c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_r14_x86_64, -0x28, true);
30230c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(4), row);
30330c2441aSAleksandr Urakov
30430c2441aSAleksandr Urakov row.SetOffset(0xE);
30530c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x30);
30630c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_r15_x86_64, -0x30, true);
30730c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(5), row);
30830c2441aSAleksandr Urakov
30930c2441aSAleksandr Urakov row.SetOffset(0x15);
31030c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64, 0x320);
31130c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(6), row);
31230c2441aSAleksandr Urakov
31330c2441aSAleksandr Urakov row.SetOffset(0x1A);
31430c2441aSAleksandr Urakov row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rbp_x86_64, 0x2F0);
31530c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(7), row);
31630c2441aSAleksandr Urakov
31730c2441aSAleksandr Urakov row.SetOffset(0x21);
31830c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rbx_x86_64, 8, true);
31930c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(8), row);
32030c2441aSAleksandr Urakov
32130c2441aSAleksandr Urakov row.SetOffset(0x28);
32230c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rsi_x86_64, 0x10, true);
32330c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(9), row);
32430c2441aSAleksandr Urakov
32530c2441aSAleksandr Urakov row.SetOffset(0x2F);
32630c2441aSAleksandr Urakov row.SetRegisterLocationToAtCFAPlusOffset(lldb_rdi_x86_64, 0x18, true);
32730c2441aSAleksandr Urakov EXPECT_EQ(*plan.GetRowAtIndex(10), row);
32830c2441aSAleksandr Urakov }
329