1a8058c6fSIgor Kudrin //===- llvm/unittest/CodeGen/DIETest.cpp ----------------------------------===//
2a8058c6fSIgor Kudrin //
3a8058c6fSIgor Kudrin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a8058c6fSIgor Kudrin // See https://llvm.org/LICENSE.txt for license information.
5a8058c6fSIgor Kudrin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a8058c6fSIgor Kudrin //
7a8058c6fSIgor Kudrin //===----------------------------------------------------------------------===//
8a8058c6fSIgor Kudrin
9a8058c6fSIgor Kudrin #include "llvm/CodeGen/DIE.h"
10a8058c6fSIgor Kudrin #include "TestAsmPrinter.h"
11*39385d4cSAlexey Lapshin #include "llvm/CodeGen/AsmPrinter.h"
12a8058c6fSIgor Kudrin #include "llvm/MC/MCContext.h"
13a8058c6fSIgor Kudrin #include "llvm/MC/MCExpr.h"
14a8058c6fSIgor Kudrin #include "llvm/Testing/Support/Error.h"
15a8058c6fSIgor Kudrin
16a8058c6fSIgor Kudrin using namespace llvm;
17a8058c6fSIgor Kudrin using testing::_;
18a8058c6fSIgor Kudrin using testing::SaveArg;
19a8058c6fSIgor Kudrin
20a8058c6fSIgor Kudrin namespace {
21a8058c6fSIgor Kudrin
22a8058c6fSIgor Kudrin using DIETestParams =
23a8058c6fSIgor Kudrin std::tuple<unsigned, dwarf::DwarfFormat, dwarf::Form, unsigned>;
24a8058c6fSIgor Kudrin
25a8058c6fSIgor Kudrin class DIEFixtureBase : public testing::TestWithParam<DIETestParams> {
26a8058c6fSIgor Kudrin protected:
SetUp()27a8058c6fSIgor Kudrin void SetUp() override {
28a8058c6fSIgor Kudrin unsigned Version;
29a8058c6fSIgor Kudrin dwarf::DwarfFormat Format;
30a8058c6fSIgor Kudrin std::tie(Version, Format, Form, Size) = GetParam();
31a8058c6fSIgor Kudrin auto ExpectedTestPrinter =
32a8058c6fSIgor Kudrin TestAsmPrinter::create("x86_64-pc-linux", Version, Format);
33a8058c6fSIgor Kudrin ASSERT_THAT_EXPECTED(ExpectedTestPrinter, Succeeded());
34a8058c6fSIgor Kudrin TestPrinter = std::move(ExpectedTestPrinter.get());
355bbf1feaSIgor Kudrin if (!TestPrinter)
365bbf1feaSIgor Kudrin GTEST_SKIP();
37a8058c6fSIgor Kudrin }
38a8058c6fSIgor Kudrin
39a8058c6fSIgor Kudrin dwarf::Form Form;
40a8058c6fSIgor Kudrin unsigned Size;
41a8058c6fSIgor Kudrin std::unique_ptr<TestAsmPrinter> TestPrinter;
42a8058c6fSIgor Kudrin };
43a8058c6fSIgor Kudrin
44a8058c6fSIgor Kudrin struct DIEExprFixture : public DIEFixtureBase {
SetUp__anon6d8051950111::DIEExprFixture45a8058c6fSIgor Kudrin void SetUp() override {
46a8058c6fSIgor Kudrin DIEFixtureBase::SetUp();
47a8058c6fSIgor Kudrin if (!TestPrinter)
48a8058c6fSIgor Kudrin return;
49a8058c6fSIgor Kudrin
50a8058c6fSIgor Kudrin Val = MCConstantExpr::create(42, TestPrinter->getCtx());
51a8058c6fSIgor Kudrin }
52a8058c6fSIgor Kudrin
53a8058c6fSIgor Kudrin const MCExpr *Val = nullptr;
54a8058c6fSIgor Kudrin };
55a8058c6fSIgor Kudrin
TEST_P(DIEExprFixture,SizeOf)56a8058c6fSIgor Kudrin TEST_P(DIEExprFixture, SizeOf) {
57a8058c6fSIgor Kudrin DIEExpr Tst(Val);
58*39385d4cSAlexey Lapshin EXPECT_EQ(Size, Tst.sizeOf(TestPrinter->getAP()->getDwarfFormParams(), Form));
59a8058c6fSIgor Kudrin }
60a8058c6fSIgor Kudrin
TEST_P(DIEExprFixture,EmitValue)61a8058c6fSIgor Kudrin TEST_P(DIEExprFixture, EmitValue) {
62a8058c6fSIgor Kudrin DIEExpr Tst(Val);
63a8058c6fSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(Val, Size, _));
64a8058c6fSIgor Kudrin Tst.emitValue(TestPrinter->getAP(), Form);
65a8058c6fSIgor Kudrin }
66a8058c6fSIgor Kudrin
67d4d80a29SBenjamin Kramer INSTANTIATE_TEST_SUITE_P(
68a8058c6fSIgor Kudrin DIETestParams, DIEExprFixture,
69a8058c6fSIgor Kudrin testing::Values(
70a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},
71a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data8, 8u},
72a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},
73a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u},
74a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},
75d4d80a29SBenjamin Kramer DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}));
76a8058c6fSIgor Kudrin
77a8058c6fSIgor Kudrin struct DIELabelFixture : public DIEFixtureBase {
SetUp__anon6d8051950111::DIELabelFixture78a8058c6fSIgor Kudrin void SetUp() override {
79a8058c6fSIgor Kudrin DIEFixtureBase::SetUp();
80a8058c6fSIgor Kudrin if (!TestPrinter)
81a8058c6fSIgor Kudrin return;
82a8058c6fSIgor Kudrin
83a8058c6fSIgor Kudrin Val = TestPrinter->getCtx().createTempSymbol();
84a8058c6fSIgor Kudrin }
85a8058c6fSIgor Kudrin
86a8058c6fSIgor Kudrin const MCSymbol *Val = nullptr;
87a8058c6fSIgor Kudrin };
88a8058c6fSIgor Kudrin
TEST_P(DIELabelFixture,SizeOf)89a8058c6fSIgor Kudrin TEST_P(DIELabelFixture, SizeOf) {
90a8058c6fSIgor Kudrin DIELabel Tst(Val);
91*39385d4cSAlexey Lapshin EXPECT_EQ(Size, Tst.sizeOf(TestPrinter->getAP()->getDwarfFormParams(), Form));
92a8058c6fSIgor Kudrin }
93a8058c6fSIgor Kudrin
TEST_P(DIELabelFixture,EmitValue)94a8058c6fSIgor Kudrin TEST_P(DIELabelFixture, EmitValue) {
95a8058c6fSIgor Kudrin DIELabel Tst(Val);
96a8058c6fSIgor Kudrin
97a8058c6fSIgor Kudrin const MCExpr *Arg0 = nullptr;
98a8058c6fSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, Size, _))
99a8058c6fSIgor Kudrin .WillOnce(SaveArg<0>(&Arg0));
100a8058c6fSIgor Kudrin Tst.emitValue(TestPrinter->getAP(), Form);
101a8058c6fSIgor Kudrin
102a8058c6fSIgor Kudrin const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0);
103a8058c6fSIgor Kudrin ASSERT_NE(ActualArg0, nullptr);
104a8058c6fSIgor Kudrin EXPECT_EQ(&(ActualArg0->getSymbol()), Val);
105a8058c6fSIgor Kudrin }
106a8058c6fSIgor Kudrin
107d4d80a29SBenjamin Kramer INSTANTIATE_TEST_SUITE_P(
108a8058c6fSIgor Kudrin DIETestParams, DIELabelFixture,
109a8058c6fSIgor Kudrin testing::Values(
110a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},
1115dd1c591SIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data8, 8u},
112a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},
113a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_strp, 4u},
114a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_addr, 8u},
115a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u},
1165dd1c591SIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},
117a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u},
118a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_strp, 8u},
119d4d80a29SBenjamin Kramer DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_addr, 8u}));
120a8058c6fSIgor Kudrin
121a8058c6fSIgor Kudrin struct DIEDeltaFixture : public DIEFixtureBase {
SetUp__anon6d8051950111::DIEDeltaFixture122a8058c6fSIgor Kudrin void SetUp() override {
123a8058c6fSIgor Kudrin DIEFixtureBase::SetUp();
124a8058c6fSIgor Kudrin if (!TestPrinter)
125a8058c6fSIgor Kudrin return;
126a8058c6fSIgor Kudrin
127a8058c6fSIgor Kudrin Hi = TestPrinter->getCtx().createTempSymbol();
128a8058c6fSIgor Kudrin Lo = TestPrinter->getCtx().createTempSymbol();
129a8058c6fSIgor Kudrin }
130a8058c6fSIgor Kudrin
131a8058c6fSIgor Kudrin const MCSymbol *Hi = nullptr;
132a8058c6fSIgor Kudrin const MCSymbol *Lo = nullptr;
133a8058c6fSIgor Kudrin };
134a8058c6fSIgor Kudrin
TEST_P(DIEDeltaFixture,SizeOf)135a8058c6fSIgor Kudrin TEST_P(DIEDeltaFixture, SizeOf) {
136a8058c6fSIgor Kudrin DIEDelta Tst(Hi, Lo);
137*39385d4cSAlexey Lapshin EXPECT_EQ(Size, Tst.sizeOf(TestPrinter->getAP()->getDwarfFormParams(), Form));
138a8058c6fSIgor Kudrin }
139a8058c6fSIgor Kudrin
TEST_P(DIEDeltaFixture,EmitValue)140a8058c6fSIgor Kudrin TEST_P(DIEDeltaFixture, EmitValue) {
141a8058c6fSIgor Kudrin DIEDelta Tst(Hi, Lo);
142a8058c6fSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, Lo, Size));
143a8058c6fSIgor Kudrin Tst.emitValue(TestPrinter->getAP(), Form);
144a8058c6fSIgor Kudrin }
145a8058c6fSIgor Kudrin
146d4d80a29SBenjamin Kramer INSTANTIATE_TEST_SUITE_P(
147a8058c6fSIgor Kudrin DIETestParams, DIEDeltaFixture,
148a8058c6fSIgor Kudrin testing::Values(
149a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},
150cae7c1ebSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data8, 8u},
151a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},
152a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u},
153cae7c1ebSIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},
154d4d80a29SBenjamin Kramer DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}));
155a8058c6fSIgor Kudrin
156a8058c6fSIgor Kudrin struct DIELocListFixture : public DIEFixtureBase {
SetUp__anon6d8051950111::DIELocListFixture157a8058c6fSIgor Kudrin void SetUp() override { DIEFixtureBase::SetUp(); }
158a8058c6fSIgor Kudrin };
159a8058c6fSIgor Kudrin
TEST_P(DIELocListFixture,SizeOf)160a8058c6fSIgor Kudrin TEST_P(DIELocListFixture, SizeOf) {
161a8058c6fSIgor Kudrin DIELocList Tst(999);
162*39385d4cSAlexey Lapshin EXPECT_EQ(Size, Tst.sizeOf(TestPrinter->getAP()->getDwarfFormParams(), Form));
163a8058c6fSIgor Kudrin }
164a8058c6fSIgor Kudrin
165d4d80a29SBenjamin Kramer INSTANTIATE_TEST_SUITE_P(
166a8058c6fSIgor Kudrin DIETestParams, DIELocListFixture,
167a8058c6fSIgor Kudrin testing::Values(
168a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_loclistx, 2u},
169a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},
170a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},
171a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_loclistx, 2u},
172a8058c6fSIgor Kudrin DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},
173d4d80a29SBenjamin Kramer DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}));
174a8058c6fSIgor Kudrin
175a8058c6fSIgor Kudrin } // end namespace
176