180814287SRaphael Isemann //===-- PDBFPOProgramToDWARFExpressionTests.cpp ---------------------------===//
2758657e5SAleksandr Urakov //
3ee21a66aSAleksandr Urakov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ee21a66aSAleksandr Urakov // See https://llvm.org/LICENSE.txt for license information.
5ee21a66aSAleksandr Urakov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6758657e5SAleksandr Urakov //
7758657e5SAleksandr Urakov //===----------------------------------------------------------------------===//
8758657e5SAleksandr Urakov
9758657e5SAleksandr Urakov #include "gtest/gtest.h"
10758657e5SAleksandr Urakov
11758657e5SAleksandr Urakov #include "Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.h"
12758657e5SAleksandr Urakov
13758657e5SAleksandr Urakov #include "lldb/Core/StreamBuffer.h"
14758657e5SAleksandr Urakov #include "lldb/Utility/ArchSpec.h"
15758657e5SAleksandr Urakov #include "lldb/Utility/DataBufferHeap.h"
16758657e5SAleksandr Urakov #include "lldb/Utility/DataExtractor.h"
17758657e5SAleksandr Urakov #include "lldb/Utility/StreamString.h"
18*290e4823Sserge-sans-paille #include "llvm/DebugInfo/DIContext.h"
19ba03bcbcSPavel Labath #include "llvm/DebugInfo/DWARF/DWARFExpression.h"
20758657e5SAleksandr Urakov
21758657e5SAleksandr Urakov using namespace lldb;
22758657e5SAleksandr Urakov using namespace lldb_private;
23758657e5SAleksandr Urakov using namespace lldb_private::npdb;
24758657e5SAleksandr Urakov
25758657e5SAleksandr Urakov /// Valid programs tests
26758657e5SAleksandr Urakov
27758657e5SAleksandr Urakov static void
CheckValidProgramTranslation(llvm::StringRef fpo_program,llvm::StringRef target_register_name,llvm::StringRef expected_dwarf_expression)28758657e5SAleksandr Urakov CheckValidProgramTranslation(llvm::StringRef fpo_program,
29758657e5SAleksandr Urakov llvm::StringRef target_register_name,
30758657e5SAleksandr Urakov llvm::StringRef expected_dwarf_expression) {
31758657e5SAleksandr Urakov // program translation
32ba03bcbcSPavel Labath StreamBuffer<32> stream(Stream::eBinary, 4, eByteOrderLittle);
33758657e5SAleksandr Urakov ASSERT_TRUE(TranslateFPOProgramToDWARFExpression(
34ba03bcbcSPavel Labath fpo_program, target_register_name, llvm::Triple::x86, stream));
35758657e5SAleksandr Urakov
36758657e5SAleksandr Urakov // print dwarf expression to comparable textual representation
37ba03bcbcSPavel Labath llvm::DataExtractor extractor({stream.GetData(), stream.GetSize()},
38ba03bcbcSPavel Labath /*IsLittleEndian=*/true, /*AddressSize=*/4);
39758657e5SAleksandr Urakov
40ba03bcbcSPavel Labath std::string result;
41ba03bcbcSPavel Labath llvm::raw_string_ostream os(result);
42ba03bcbcSPavel Labath llvm::DWARFExpression(extractor, /*AddressSize=*/4, llvm::dwarf::DWARF32)
430b057320SDavid Blaikie .print(os, llvm::DIDumpOptions(), nullptr, nullptr);
44758657e5SAleksandr Urakov
45758657e5SAleksandr Urakov // actual check
46ba03bcbcSPavel Labath ASSERT_EQ(expected_dwarf_expression, os.str());
47758657e5SAleksandr Urakov }
48758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,SingleAssignmentRegisterRef)49758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, SingleAssignmentRegisterRef) {
50758657e5SAleksandr Urakov CheckValidProgramTranslation("$T0 $ebp = ", "$T0", "DW_OP_breg6 +0");
51758657e5SAleksandr Urakov }
52758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,MultipleIndependentAssignments)53758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, MultipleIndependentAssignments) {
540ff89dacSPavel Labath CheckValidProgramTranslation("$T1 1 = $T0 0 =", "$T0", "DW_OP_consts +0");
55758657e5SAleksandr Urakov }
56758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,MultipleDependentAssignments)57758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, MultipleDependentAssignments) {
58758657e5SAleksandr Urakov CheckValidProgramTranslation(
59758657e5SAleksandr Urakov "$T1 $ebp 4 + = $T0 $T1 8 - 128 @ = ", "$T0",
600ff89dacSPavel Labath "DW_OP_breg6 +0, DW_OP_consts +4, DW_OP_plus, DW_OP_consts +8, "
610ff89dacSPavel Labath "DW_OP_minus, DW_OP_consts +128, DW_OP_lit1, DW_OP_minus, DW_OP_not, "
62758657e5SAleksandr Urakov "DW_OP_and");
63758657e5SAleksandr Urakov }
64758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,DependencyChain)65758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, DependencyChain) {
66758657e5SAleksandr Urakov CheckValidProgramTranslation("$T1 0 = $T0 $T1 = $ebp $T0 =", "$ebp",
670ff89dacSPavel Labath "DW_OP_consts +0");
68758657e5SAleksandr Urakov }
69758657e5SAleksandr Urakov
70758657e5SAleksandr Urakov /// Invalid programs tests
71758657e5SAleksandr Urakov static void
CheckInvalidProgramTranslation(llvm::StringRef fpo_program,llvm::StringRef target_register_name)72758657e5SAleksandr Urakov CheckInvalidProgramTranslation(llvm::StringRef fpo_program,
73758657e5SAleksandr Urakov llvm::StringRef target_register_name) {
74758657e5SAleksandr Urakov // initial setup
75758657e5SAleksandr Urakov ArchSpec arch_spec("i686-pc-windows");
76758657e5SAleksandr Urakov llvm::Triple::ArchType arch_type = arch_spec.GetMachine();
77758657e5SAleksandr Urakov ByteOrder byte_order = arch_spec.GetByteOrder();
78758657e5SAleksandr Urakov uint32_t address_size = arch_spec.GetAddressByteSize();
79758657e5SAleksandr Urakov
80758657e5SAleksandr Urakov // program translation
81758657e5SAleksandr Urakov StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order);
82758657e5SAleksandr Urakov EXPECT_FALSE(TranslateFPOProgramToDWARFExpression(
83758657e5SAleksandr Urakov fpo_program, target_register_name, arch_type, stream));
843e30062aSJonas Devlieghere EXPECT_EQ((size_t)0, stream.GetSize());
85758657e5SAleksandr Urakov }
86758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,InvalidAssignmentSingle)87758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, InvalidAssignmentSingle) {
88758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 0", "$T0");
89758657e5SAleksandr Urakov }
90758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,InvalidAssignmentMultiple)91758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, InvalidAssignmentMultiple) {
92758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T1 0 = $T0 0", "$T0");
93758657e5SAleksandr Urakov }
94758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,UnknownOp)95758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, UnknownOp) {
96758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 $ebp 0 & = ", "$T0");
97758657e5SAleksandr Urakov }
98758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,InvalidOpBinary)99758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, InvalidOpBinary) {
100758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 0 + = ", "$T0");
101758657e5SAleksandr Urakov }
102758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,InvalidOpUnary)103758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, InvalidOpUnary) {
104758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 ^ = ", "$T0");
105758657e5SAleksandr Urakov }
106758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,MissingTargetRegister)107758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, MissingTargetRegister) {
108758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T1 0 = ", "$T0");
109758657e5SAleksandr Urakov }
110758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,UnresolvedRegisterReference)111758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, UnresolvedRegisterReference) {
112758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 $abc = ", "$T0");
113758657e5SAleksandr Urakov }
114758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,UnresolvedRegisterAssignmentReference)115758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests,
116758657e5SAleksandr Urakov UnresolvedRegisterAssignmentReference) {
117758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T2 0 = $T0 $T1 = ", "$T0");
118758657e5SAleksandr Urakov }
119758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,UnresolvedCyclicRegisterAssignmentReference)120758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests,
121758657e5SAleksandr Urakov UnresolvedCyclicRegisterAssignmentReference) {
122758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T1 $T0 = $T0 $T1 = ", "$T0");
123758657e5SAleksandr Urakov }
124758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,UnresolvedDependentCyclicRegisterAssignmentReference)125758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests,
126758657e5SAleksandr Urakov UnresolvedDependentCyclicRegisterAssignmentReference) {
127758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T1 $T0 = $T0 $T1 = $T2 $T1 =", "$T2");
128758657e5SAleksandr Urakov }
129758657e5SAleksandr Urakov
TEST(PDBFPOProgramToDWARFExpressionTests,UnsupportedRASearch)130758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, UnsupportedRASearch) {
131758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 .raSearch = ", "$T0");
132758657e5SAleksandr Urakov }
133