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