Mercurial > hg > CbC > CbC_llvm
diff llvm/unittests/CodeGen/DIETest.cpp @ 221:79ff65ed7e25
LLVM12 Original
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 15 Jun 2021 19:15:29 +0900 |
parents | |
children | c4bab56944e8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/llvm/unittests/CodeGen/DIETest.cpp Tue Jun 15 19:15:29 2021 +0900 @@ -0,0 +1,174 @@ +//===- llvm/unittest/CodeGen/DIETest.cpp ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/CodeGen/DIE.h" +#include "TestAsmPrinter.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCExpr.h" +#include "llvm/Testing/Support/Error.h" + +using namespace llvm; +using testing::_; +using testing::SaveArg; + +namespace { + +using DIETestParams = + std::tuple<unsigned, dwarf::DwarfFormat, dwarf::Form, unsigned>; + +class DIEFixtureBase : public testing::TestWithParam<DIETestParams> { +protected: + void SetUp() override { + unsigned Version; + dwarf::DwarfFormat Format; + std::tie(Version, Format, Form, Size) = GetParam(); + auto ExpectedTestPrinter = + TestAsmPrinter::create("x86_64-pc-linux", Version, Format); + ASSERT_THAT_EXPECTED(ExpectedTestPrinter, Succeeded()); + TestPrinter = std::move(ExpectedTestPrinter.get()); + if (!TestPrinter) + GTEST_SKIP(); + } + + dwarf::Form Form; + unsigned Size; + std::unique_ptr<TestAsmPrinter> TestPrinter; +}; + +struct DIEExprFixture : public DIEFixtureBase { + void SetUp() override { + DIEFixtureBase::SetUp(); + if (!TestPrinter) + return; + + Val = MCConstantExpr::create(42, TestPrinter->getCtx()); + } + + const MCExpr *Val = nullptr; +}; + +TEST_P(DIEExprFixture, SizeOf) { + DIEExpr Tst(Val); + EXPECT_EQ(Size, Tst.SizeOf(TestPrinter->getAP(), Form)); +} + +TEST_P(DIEExprFixture, EmitValue) { + DIEExpr Tst(Val); + EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(Val, Size, _)); + Tst.emitValue(TestPrinter->getAP(), Form); +} + +INSTANTIATE_TEST_SUITE_P( + DIETestParams, DIEExprFixture, + testing::Values( + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data8, 8u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u})); + +struct DIELabelFixture : public DIEFixtureBase { + void SetUp() override { + DIEFixtureBase::SetUp(); + if (!TestPrinter) + return; + + Val = TestPrinter->getCtx().createTempSymbol(); + } + + const MCSymbol *Val = nullptr; +}; + +TEST_P(DIELabelFixture, SizeOf) { + DIELabel Tst(Val); + EXPECT_EQ(Size, Tst.SizeOf(TestPrinter->getAP(), Form)); +} + +TEST_P(DIELabelFixture, EmitValue) { + DIELabel Tst(Val); + + const MCExpr *Arg0 = nullptr; + EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, Size, _)) + .WillOnce(SaveArg<0>(&Arg0)); + Tst.emitValue(TestPrinter->getAP(), Form); + + const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0); + ASSERT_NE(ActualArg0, nullptr); + EXPECT_EQ(&(ActualArg0->getSymbol()), Val); +} + +INSTANTIATE_TEST_SUITE_P( + DIETestParams, DIELabelFixture, + testing::Values( + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data8, 8u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_strp, 4u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_addr, 8u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_strp, 8u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_addr, 8u})); + +struct DIEDeltaFixture : public DIEFixtureBase { + void SetUp() override { + DIEFixtureBase::SetUp(); + if (!TestPrinter) + return; + + Hi = TestPrinter->getCtx().createTempSymbol(); + Lo = TestPrinter->getCtx().createTempSymbol(); + } + + const MCSymbol *Hi = nullptr; + const MCSymbol *Lo = nullptr; +}; + +TEST_P(DIEDeltaFixture, SizeOf) { + DIEDelta Tst(Hi, Lo); + EXPECT_EQ(Size, Tst.SizeOf(TestPrinter->getAP(), Form)); +} + +TEST_P(DIEDeltaFixture, EmitValue) { + DIEDelta Tst(Hi, Lo); + EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, Lo, Size)); + Tst.emitValue(TestPrinter->getAP(), Form); +} + +INSTANTIATE_TEST_SUITE_P( + DIETestParams, DIEDeltaFixture, + testing::Values( + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data8, 8u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u})); + +struct DIELocListFixture : public DIEFixtureBase { + void SetUp() override { DIEFixtureBase::SetUp(); } +}; + +TEST_P(DIELocListFixture, SizeOf) { + DIELocList Tst(999); + EXPECT_EQ(Size, Tst.SizeOf(TestPrinter->getAP(), Form)); +} + +INSTANTIATE_TEST_SUITE_P( + DIETestParams, DIELocListFixture, + testing::Values( + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_loclistx, 2u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u}, + DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_loclistx, 2u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u}, + DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u})); + +} // end namespace