xref: /llvm-project/llvm/unittests/CodeGen/DIETest.cpp (revision 39385d4cd1c6e70f9b7c9cadb35e57efbdf2ecbc)
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