xref: /llvm-project/lldb/unittests/ObjectFile/PECOFF/TestPECallFrameInfo.cpp (revision a4a00ced0cf8cc5663ff0ced801d6139153f3f76)
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