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/Utility/ArchSpec.h" 14758657e5SAleksandr Urakov #include "lldb/Utility/DataBufferHeap.h" 15758657e5SAleksandr Urakov #include "lldb/Utility/DataExtractor.h" 1620c77a57SAlex Langford #include "lldb/Utility/StreamBuffer.h" 17758657e5SAleksandr Urakov #include "lldb/Utility/StreamString.h" 18290e4823Sserge-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 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) 43617ed4f0SShubham Sandeep Rastogi .print(os, llvm::DIDumpOptions(), nullptr); 44758657e5SAleksandr Urakov 45758657e5SAleksandr Urakov // actual check 46*d7796855SYoungsuk Kim ASSERT_EQ(expected_dwarf_expression, result); 47758657e5SAleksandr Urakov } 48758657e5SAleksandr Urakov 49758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, SingleAssignmentRegisterRef) { 50758657e5SAleksandr Urakov CheckValidProgramTranslation("$T0 $ebp = ", "$T0", "DW_OP_breg6 +0"); 51758657e5SAleksandr Urakov } 52758657e5SAleksandr Urakov 53758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, MultipleIndependentAssignments) { 540ff89dacSPavel Labath CheckValidProgramTranslation("$T1 1 = $T0 0 =", "$T0", "DW_OP_consts +0"); 55758657e5SAleksandr Urakov } 56758657e5SAleksandr Urakov 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 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 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 87758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, InvalidAssignmentSingle) { 88758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 0", "$T0"); 89758657e5SAleksandr Urakov } 90758657e5SAleksandr Urakov 91758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, InvalidAssignmentMultiple) { 92758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T1 0 = $T0 0", "$T0"); 93758657e5SAleksandr Urakov } 94758657e5SAleksandr Urakov 95758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, UnknownOp) { 96758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 $ebp 0 & = ", "$T0"); 97758657e5SAleksandr Urakov } 98758657e5SAleksandr Urakov 99758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, InvalidOpBinary) { 100758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 0 + = ", "$T0"); 101758657e5SAleksandr Urakov } 102758657e5SAleksandr Urakov 103758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, InvalidOpUnary) { 104758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 ^ = ", "$T0"); 105758657e5SAleksandr Urakov } 106758657e5SAleksandr Urakov 107758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, MissingTargetRegister) { 108758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T1 0 = ", "$T0"); 109758657e5SAleksandr Urakov } 110758657e5SAleksandr Urakov 111758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, UnresolvedRegisterReference) { 112758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 $abc = ", "$T0"); 113758657e5SAleksandr Urakov } 114758657e5SAleksandr Urakov 115758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, 116758657e5SAleksandr Urakov UnresolvedRegisterAssignmentReference) { 117758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T2 0 = $T0 $T1 = ", "$T0"); 118758657e5SAleksandr Urakov } 119758657e5SAleksandr Urakov 120758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, 121758657e5SAleksandr Urakov UnresolvedCyclicRegisterAssignmentReference) { 122758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T1 $T0 = $T0 $T1 = ", "$T0"); 123758657e5SAleksandr Urakov } 124758657e5SAleksandr Urakov 125758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, 126758657e5SAleksandr Urakov UnresolvedDependentCyclicRegisterAssignmentReference) { 127758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T1 $T0 = $T0 $T1 = $T2 $T1 =", "$T2"); 128758657e5SAleksandr Urakov } 129758657e5SAleksandr Urakov 130758657e5SAleksandr Urakov TEST(PDBFPOProgramToDWARFExpressionTests, UnsupportedRASearch) { 131758657e5SAleksandr Urakov CheckInvalidProgramTranslation("$T0 .raSearch = ", "$T0"); 132758657e5SAleksandr Urakov } 133