1 //===- llvm/unittest/DebugInfo/DWARFExpressionCompactPrinterTest.cpp ------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "DwarfGenerator.h"
10 #include "llvm/ADT/ArrayRef.h"
11 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
12 #include "llvm/DebugInfo/DWARF/DWARFDie.h"
13 #include "llvm/DebugInfo/DWARF/DWARFExpression.h"
14 #include "llvm/MC/MCInstrInfo.h"
15 #include "llvm/MC/MCRegisterInfo.h"
16 #include "llvm/MC/TargetRegistry.h"
17 #include "llvm/Support/DataExtractor.h"
18 #include "llvm/Support/TargetSelect.h"
19 #include "llvm/Testing/Support/Error.h"
20 #include "gtest/gtest.h"
23 using namespace dwarf
;
26 class DWARFExpressionCompactPrinterTest
: public ::testing::Test
{
28 std::unique_ptr
<MCRegisterInfo
> MRI
;
30 DWARFExpressionCompactPrinterTest() {
31 InitializeAllTargets();
32 InitializeAllTargetMCs();
33 InitializeAllAsmPrinters();
35 std::string TripleName
= "armv8a-linux-gnueabi";
38 const Target
*TheTarget
=
39 TargetRegistry::lookupTarget(TripleName
, ErrorStr
);
44 MRI
.reset(TheTarget
->createMCRegInfo(TripleName
));
47 void TestExprPrinter(ArrayRef
<uint8_t> ExprData
, StringRef Expected
);
51 void DWARFExpressionCompactPrinterTest::TestExprPrinter(
52 ArrayRef
<uint8_t> ExprData
, StringRef Expected
) {
53 // If we didn't build ARM, do not run the test.
57 // Print the expression, passing in the subprogram DIE, and check that the
58 // result is as expected.
60 raw_string_ostream
OS(Result
);
61 DataExtractor
DE(ExprData
, true, 8);
62 DWARFExpression
Expr(DE
, 8);
63 Expr
.printCompact(OS
, *MRI
);
64 EXPECT_EQ(OS
.str(), Expected
);
67 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_reg0
) {
68 TestExprPrinter({DW_OP_reg0
}, "R0");
71 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_reg10
) {
72 TestExprPrinter({DW_OP_reg10
}, "R10");
75 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_regx
) {
76 TestExprPrinter({DW_OP_regx
, 0x80, 0x02}, "D0");
79 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_breg0
) {
80 TestExprPrinter({DW_OP_breg0
, 0x04}, "[R0+4]");
83 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_breg0_large_offset
) {
84 TestExprPrinter({DW_OP_breg0
, 0x80, 0x02}, "[R0+256]");
87 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_breg13
) {
88 TestExprPrinter({DW_OP_breg13
, 0x10}, "[SP+16]");
91 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_breg13_zero_offset
) {
92 TestExprPrinter({DW_OP_breg13
, 0x00}, "[SP]");
95 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_breg0_negative
) {
96 TestExprPrinter({DW_OP_breg0
, 0x70}, "[R0-16]");
99 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_bregx
) {
100 TestExprPrinter({DW_OP_bregx
, 0x0d, 0x28}, "[SP+40]");
103 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_stack_value
) {
104 TestExprPrinter({DW_OP_breg13
, 0x04, DW_OP_stack_value
}, "SP+4");
107 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_entry_value
) {
108 TestExprPrinter({DW_OP_entry_value
, 0x01, DW_OP_reg0
, DW_OP_stack_value
},
112 TEST_F(DWARFExpressionCompactPrinterTest
, Test_OP_entry_value_mem
) {
114 {DW_OP_entry_value
, 0x02, DW_OP_breg13
, 0x10, DW_OP_stack_value
},