1380e746bSIgor Kudrin //===- llvm/unittest/CodeGen/AsmPrinterDwarfTest.cpp ----------------------===// 2380e746bSIgor Kudrin // 3380e746bSIgor Kudrin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4380e746bSIgor Kudrin // See https://llvm.org/LICENSE.txt for license information. 5380e746bSIgor Kudrin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6380e746bSIgor Kudrin // 7380e746bSIgor Kudrin //===----------------------------------------------------------------------===// 8380e746bSIgor Kudrin 9380e746bSIgor Kudrin #include "TestAsmPrinter.h" 10380e746bSIgor Kudrin #include "llvm/CodeGen/AsmPrinter.h" 11380e746bSIgor Kudrin #include "llvm/MC/MCContext.h" 12380e746bSIgor Kudrin #include "llvm/MC/MCSectionELF.h" 13380e746bSIgor Kudrin #include "llvm/Testing/Support/Error.h" 14380e746bSIgor Kudrin 15380e746bSIgor Kudrin using namespace llvm; 16380e746bSIgor Kudrin using testing::_; 17*c3c501f5SIgor Kudrin using testing::InSequence; 18380e746bSIgor Kudrin using testing::SaveArg; 19380e746bSIgor Kudrin 20380e746bSIgor Kudrin namespace { 21380e746bSIgor Kudrin 22380e746bSIgor Kudrin class AsmPrinterFixtureBase : public testing::Test { 23380e746bSIgor Kudrin void setupTestPrinter(const std::string &TripleStr, unsigned DwarfVersion, 24380e746bSIgor Kudrin dwarf::DwarfFormat DwarfFormat) { 25380e746bSIgor Kudrin auto ExpectedTestPrinter = 26380e746bSIgor Kudrin TestAsmPrinter::create(TripleStr, DwarfVersion, DwarfFormat); 27380e746bSIgor Kudrin ASSERT_THAT_EXPECTED(ExpectedTestPrinter, Succeeded()); 28380e746bSIgor Kudrin TestPrinter = std::move(ExpectedTestPrinter.get()); 29380e746bSIgor Kudrin } 30380e746bSIgor Kudrin 31380e746bSIgor Kudrin protected: 32380e746bSIgor Kudrin bool init(const std::string &TripleStr, unsigned DwarfVersion, 33380e746bSIgor Kudrin dwarf::DwarfFormat DwarfFormat) { 34380e746bSIgor Kudrin setupTestPrinter(TripleStr, DwarfVersion, DwarfFormat); 35380e746bSIgor Kudrin return TestPrinter != nullptr; 36380e746bSIgor Kudrin } 37380e746bSIgor Kudrin 38380e746bSIgor Kudrin std::unique_ptr<TestAsmPrinter> TestPrinter; 39380e746bSIgor Kudrin }; 40380e746bSIgor Kudrin 41380e746bSIgor Kudrin class AsmPrinterEmitDwarfSymbolReferenceTest : public AsmPrinterFixtureBase { 42380e746bSIgor Kudrin protected: 43380e746bSIgor Kudrin bool init(const std::string &TripleStr, unsigned DwarfVersion, 44380e746bSIgor Kudrin dwarf::DwarfFormat DwarfFormat) { 45380e746bSIgor Kudrin if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat)) 46380e746bSIgor Kudrin return false; 47380e746bSIgor Kudrin 48380e746bSIgor Kudrin // Create a symbol which will be emitted in the tests and associate it 49380e746bSIgor Kudrin // with a section because that is required in some code paths. 50380e746bSIgor Kudrin 51380e746bSIgor Kudrin Val = TestPrinter->getCtx().createTempSymbol(); 52380e746bSIgor Kudrin Sec = TestPrinter->getCtx().getELFSection(".tst", ELF::SHT_PROGBITS, 0); 53380e746bSIgor Kudrin SecBeginSymbol = Sec->getBeginSymbol(); 54380e746bSIgor Kudrin TestPrinter->getMS().SwitchSection(Sec); 55380e746bSIgor Kudrin TestPrinter->getMS().emitLabel(Val); 56380e746bSIgor Kudrin return true; 57380e746bSIgor Kudrin } 58380e746bSIgor Kudrin 59380e746bSIgor Kudrin MCSymbol *Val = nullptr; 60380e746bSIgor Kudrin MCSection *Sec = nullptr; 61380e746bSIgor Kudrin MCSymbol *SecBeginSymbol = nullptr; 62380e746bSIgor Kudrin }; 63380e746bSIgor Kudrin 64380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, COFF) { 65380e746bSIgor Kudrin if (!init("x86_64-pc-windows", /*DwarfVersion=*/4, dwarf::DWARF32)) 66380e746bSIgor Kudrin return; 67380e746bSIgor Kudrin 68380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), EmitCOFFSecRel32(Val, 0)); 69380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfSymbolReference(Val, false); 70380e746bSIgor Kudrin } 71380e746bSIgor Kudrin 72380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, COFFForceOffset) { 73380e746bSIgor Kudrin if (!init("x86_64-pc-windows", /*DwarfVersion=*/4, dwarf::DWARF32)) 74380e746bSIgor Kudrin return; 75380e746bSIgor Kudrin 76380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), 77380e746bSIgor Kudrin emitAbsoluteSymbolDiff(Val, SecBeginSymbol, 4)); 78380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfSymbolReference(Val, true); 79380e746bSIgor Kudrin } 80380e746bSIgor Kudrin 81380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, ELFDWARF32) { 82380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 83380e746bSIgor Kudrin return; 84380e746bSIgor Kudrin 85380e746bSIgor Kudrin const MCExpr *Arg0 = nullptr; 86380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 4, _)) 87380e746bSIgor Kudrin .WillOnce(SaveArg<0>(&Arg0)); 88380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfSymbolReference(Val, false); 89380e746bSIgor Kudrin 90380e746bSIgor Kudrin const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0); 91380e746bSIgor Kudrin ASSERT_NE(ActualArg0, nullptr); 92380e746bSIgor Kudrin EXPECT_EQ(&(ActualArg0->getSymbol()), Val); 93380e746bSIgor Kudrin } 94380e746bSIgor Kudrin 95380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, ELFDWARF32ForceOffset) { 96380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 97380e746bSIgor Kudrin return; 98380e746bSIgor Kudrin 99380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), 100380e746bSIgor Kudrin emitAbsoluteSymbolDiff(Val, SecBeginSymbol, 4)); 101380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfSymbolReference(Val, true); 102380e746bSIgor Kudrin } 103380e746bSIgor Kudrin 104380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, ELFDWARF64) { 105380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 106380e746bSIgor Kudrin return; 107380e746bSIgor Kudrin 108380e746bSIgor Kudrin const MCExpr *Arg0 = nullptr; 109380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 8, _)) 110380e746bSIgor Kudrin .WillOnce(SaveArg<0>(&Arg0)); 111380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfSymbolReference(Val, false); 112380e746bSIgor Kudrin 113380e746bSIgor Kudrin const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0); 114380e746bSIgor Kudrin ASSERT_NE(ActualArg0, nullptr); 115380e746bSIgor Kudrin EXPECT_EQ(&(ActualArg0->getSymbol()), Val); 116380e746bSIgor Kudrin } 117380e746bSIgor Kudrin 118380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, ELFDWARF64ForceOffset) { 119380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 120380e746bSIgor Kudrin return; 121380e746bSIgor Kudrin 122380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), 123380e746bSIgor Kudrin emitAbsoluteSymbolDiff(Val, SecBeginSymbol, 8)); 124380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfSymbolReference(Val, true); 125380e746bSIgor Kudrin } 126380e746bSIgor Kudrin 127380e746bSIgor Kudrin class AsmPrinterEmitDwarfStringOffsetTest : public AsmPrinterFixtureBase { 128380e746bSIgor Kudrin protected: 129380e746bSIgor Kudrin bool init(const std::string &TripleStr, unsigned DwarfVersion, 130380e746bSIgor Kudrin dwarf::DwarfFormat DwarfFormat) { 131380e746bSIgor Kudrin if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat)) 132380e746bSIgor Kudrin return false; 133380e746bSIgor Kudrin 134380e746bSIgor Kudrin Val.Index = DwarfStringPoolEntry::NotIndexed; 135380e746bSIgor Kudrin Val.Symbol = TestPrinter->getCtx().createTempSymbol(); 136380e746bSIgor Kudrin Val.Offset = 42; 137380e746bSIgor Kudrin return true; 138380e746bSIgor Kudrin } 139380e746bSIgor Kudrin 140380e746bSIgor Kudrin DwarfStringPoolEntry Val; 141380e746bSIgor Kudrin }; 142380e746bSIgor Kudrin 143380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfStringOffsetTest, DWARF32) { 144380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 145380e746bSIgor Kudrin return; 146380e746bSIgor Kudrin 147380e746bSIgor Kudrin const MCExpr *Arg0 = nullptr; 148380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 4, _)) 149380e746bSIgor Kudrin .WillOnce(SaveArg<0>(&Arg0)); 150380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfStringOffset(Val); 151380e746bSIgor Kudrin 152380e746bSIgor Kudrin const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0); 153380e746bSIgor Kudrin ASSERT_NE(ActualArg0, nullptr); 154380e746bSIgor Kudrin EXPECT_EQ(&(ActualArg0->getSymbol()), Val.Symbol); 155380e746bSIgor Kudrin } 156380e746bSIgor Kudrin 157380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfStringOffsetTest, 158380e746bSIgor Kudrin DWARF32NoRelocationsAcrossSections) { 159380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 160380e746bSIgor Kudrin return; 161380e746bSIgor Kudrin 162380e746bSIgor Kudrin TestPrinter->setDwarfUsesRelocationsAcrossSections(false); 163380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val.Offset, 4)); 164380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfStringOffset(Val); 165380e746bSIgor Kudrin } 166380e746bSIgor Kudrin 167380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfStringOffsetTest, DWARF64) { 168380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 169380e746bSIgor Kudrin return; 170380e746bSIgor Kudrin 171380e746bSIgor Kudrin const MCExpr *Arg0 = nullptr; 172380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 8, _)) 173380e746bSIgor Kudrin .WillOnce(SaveArg<0>(&Arg0)); 174380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfStringOffset(Val); 175380e746bSIgor Kudrin 176380e746bSIgor Kudrin const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0); 177380e746bSIgor Kudrin ASSERT_NE(ActualArg0, nullptr); 178380e746bSIgor Kudrin EXPECT_EQ(&(ActualArg0->getSymbol()), Val.Symbol); 179380e746bSIgor Kudrin } 180380e746bSIgor Kudrin 181380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfStringOffsetTest, 182380e746bSIgor Kudrin DWARF64NoRelocationsAcrossSections) { 183380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 184380e746bSIgor Kudrin return; 185380e746bSIgor Kudrin 186380e746bSIgor Kudrin TestPrinter->setDwarfUsesRelocationsAcrossSections(false); 187380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val.Offset, 8)); 188380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfStringOffset(Val); 189380e746bSIgor Kudrin } 190380e746bSIgor Kudrin 191380e746bSIgor Kudrin class AsmPrinterEmitDwarfOffsetTest : public AsmPrinterFixtureBase { 192380e746bSIgor Kudrin protected: 193380e746bSIgor Kudrin bool init(const std::string &TripleStr, unsigned DwarfVersion, 194380e746bSIgor Kudrin dwarf::DwarfFormat DwarfFormat) { 195380e746bSIgor Kudrin if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat)) 196380e746bSIgor Kudrin return false; 197380e746bSIgor Kudrin 198380e746bSIgor Kudrin Label = TestPrinter->getCtx().createTempSymbol(); 199380e746bSIgor Kudrin return true; 200380e746bSIgor Kudrin } 201380e746bSIgor Kudrin 202380e746bSIgor Kudrin MCSymbol *Label = nullptr; 203380e746bSIgor Kudrin uint64_t Offset = 42; 204380e746bSIgor Kudrin }; 205380e746bSIgor Kudrin 206380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfOffsetTest, DWARF32) { 207380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 208380e746bSIgor Kudrin return; 209380e746bSIgor Kudrin 210380e746bSIgor Kudrin const MCExpr *Arg0 = nullptr; 211380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 4, _)) 212380e746bSIgor Kudrin .WillOnce(SaveArg<0>(&Arg0)); 213380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfOffset(Label, Offset); 214380e746bSIgor Kudrin 215380e746bSIgor Kudrin const MCBinaryExpr *ActualArg0 = dyn_cast_or_null<MCBinaryExpr>(Arg0); 216380e746bSIgor Kudrin ASSERT_NE(ActualArg0, nullptr); 217380e746bSIgor Kudrin EXPECT_EQ(ActualArg0->getOpcode(), MCBinaryExpr::Add); 218380e746bSIgor Kudrin 219380e746bSIgor Kudrin const MCSymbolRefExpr *ActualLHS = 220380e746bSIgor Kudrin dyn_cast_or_null<MCSymbolRefExpr>(ActualArg0->getLHS()); 221380e746bSIgor Kudrin ASSERT_NE(ActualLHS, nullptr); 222380e746bSIgor Kudrin EXPECT_EQ(&(ActualLHS->getSymbol()), Label); 223380e746bSIgor Kudrin 224380e746bSIgor Kudrin const MCConstantExpr *ActualRHS = 225380e746bSIgor Kudrin dyn_cast_or_null<MCConstantExpr>(ActualArg0->getRHS()); 226380e746bSIgor Kudrin ASSERT_NE(ActualRHS, nullptr); 227380e746bSIgor Kudrin EXPECT_EQ(static_cast<uint64_t>(ActualRHS->getValue()), Offset); 228380e746bSIgor Kudrin } 229380e746bSIgor Kudrin 230380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfOffsetTest, DWARF64) { 231380e746bSIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 232380e746bSIgor Kudrin return; 233380e746bSIgor Kudrin 234380e746bSIgor Kudrin const MCExpr *Arg0 = nullptr; 235380e746bSIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 8, _)) 236380e746bSIgor Kudrin .WillOnce(SaveArg<0>(&Arg0)); 237380e746bSIgor Kudrin TestPrinter->getAP()->emitDwarfOffset(Label, Offset); 238380e746bSIgor Kudrin 239380e746bSIgor Kudrin const MCBinaryExpr *ActualArg0 = dyn_cast_or_null<MCBinaryExpr>(Arg0); 240380e746bSIgor Kudrin ASSERT_NE(ActualArg0, nullptr); 241380e746bSIgor Kudrin EXPECT_EQ(ActualArg0->getOpcode(), MCBinaryExpr::Add); 242380e746bSIgor Kudrin 243380e746bSIgor Kudrin const MCSymbolRefExpr *ActualLHS = 244380e746bSIgor Kudrin dyn_cast_or_null<MCSymbolRefExpr>(ActualArg0->getLHS()); 245380e746bSIgor Kudrin ASSERT_NE(ActualLHS, nullptr); 246380e746bSIgor Kudrin EXPECT_EQ(&(ActualLHS->getSymbol()), Label); 247380e746bSIgor Kudrin 248380e746bSIgor Kudrin const MCConstantExpr *ActualRHS = 249380e746bSIgor Kudrin dyn_cast_or_null<MCConstantExpr>(ActualArg0->getRHS()); 250380e746bSIgor Kudrin ASSERT_NE(ActualRHS, nullptr); 251380e746bSIgor Kudrin EXPECT_EQ(static_cast<uint64_t>(ActualRHS->getValue()), Offset); 252380e746bSIgor Kudrin } 253380e746bSIgor Kudrin 254*c3c501f5SIgor Kudrin class AsmPrinterEmitDwarfLengthOrOffsetTest : public AsmPrinterFixtureBase { 255*c3c501f5SIgor Kudrin protected: 256*c3c501f5SIgor Kudrin uint64_t Val = 42; 257*c3c501f5SIgor Kudrin }; 258*c3c501f5SIgor Kudrin 259*c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfLengthOrOffsetTest, DWARF32) { 260*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 261*c3c501f5SIgor Kudrin return; 262*c3c501f5SIgor Kudrin 263*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 4)); 264*c3c501f5SIgor Kudrin TestPrinter->getAP()->emitDwarfLengthOrOffset(Val); 265*c3c501f5SIgor Kudrin } 266*c3c501f5SIgor Kudrin 267*c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfLengthOrOffsetTest, DWARF64) { 268*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 269*c3c501f5SIgor Kudrin return; 270*c3c501f5SIgor Kudrin 271*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 8)); 272*c3c501f5SIgor Kudrin TestPrinter->getAP()->emitDwarfLengthOrOffset(Val); 273*c3c501f5SIgor Kudrin } 274*c3c501f5SIgor Kudrin 275*c3c501f5SIgor Kudrin class AsmPrinterGetUnitLengthFieldByteSizeTest : public AsmPrinterFixtureBase { 276*c3c501f5SIgor Kudrin }; 277*c3c501f5SIgor Kudrin 278*c3c501f5SIgor Kudrin TEST_F(AsmPrinterGetUnitLengthFieldByteSizeTest, DWARF32) { 279*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 280*c3c501f5SIgor Kudrin return; 281*c3c501f5SIgor Kudrin 282*c3c501f5SIgor Kudrin EXPECT_EQ(TestPrinter->getAP()->getUnitLengthFieldByteSize(), 4u); 283*c3c501f5SIgor Kudrin } 284*c3c501f5SIgor Kudrin 285*c3c501f5SIgor Kudrin TEST_F(AsmPrinterGetUnitLengthFieldByteSizeTest, DWARF64) { 286*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 287*c3c501f5SIgor Kudrin return; 288*c3c501f5SIgor Kudrin 289*c3c501f5SIgor Kudrin EXPECT_EQ(TestPrinter->getAP()->getUnitLengthFieldByteSize(), 12u); 290*c3c501f5SIgor Kudrin } 291*c3c501f5SIgor Kudrin 292*c3c501f5SIgor Kudrin class AsmPrinterMaybeEmitDwarf64MarkTest : public AsmPrinterFixtureBase {}; 293*c3c501f5SIgor Kudrin 294*c3c501f5SIgor Kudrin TEST_F(AsmPrinterMaybeEmitDwarf64MarkTest, DWARF32) { 295*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 296*c3c501f5SIgor Kudrin return; 297*c3c501f5SIgor Kudrin 298*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(_, _)).Times(0); 299*c3c501f5SIgor Kudrin TestPrinter->getAP()->maybeEmitDwarf64Mark(); 300*c3c501f5SIgor Kudrin } 301*c3c501f5SIgor Kudrin 302*c3c501f5SIgor Kudrin TEST_F(AsmPrinterMaybeEmitDwarf64MarkTest, DWARF64) { 303*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 304*c3c501f5SIgor Kudrin return; 305*c3c501f5SIgor Kudrin 306*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4)); 307*c3c501f5SIgor Kudrin TestPrinter->getAP()->maybeEmitDwarf64Mark(); 308*c3c501f5SIgor Kudrin } 309*c3c501f5SIgor Kudrin 310*c3c501f5SIgor Kudrin class AsmPrinterEmitDwarfUnitLengthAsIntTest : public AsmPrinterFixtureBase { 311*c3c501f5SIgor Kudrin protected: 312*c3c501f5SIgor Kudrin uint64_t Val = 42; 313*c3c501f5SIgor Kudrin }; 314*c3c501f5SIgor Kudrin 315*c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfUnitLengthAsIntTest, DWARF32) { 316*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 317*c3c501f5SIgor Kudrin return; 318*c3c501f5SIgor Kudrin 319*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 4)); 320*c3c501f5SIgor Kudrin TestPrinter->getAP()->emitDwarfUnitLength(Val, ""); 321*c3c501f5SIgor Kudrin } 322*c3c501f5SIgor Kudrin 323*c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfUnitLengthAsIntTest, DWARF64) { 324*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 325*c3c501f5SIgor Kudrin return; 326*c3c501f5SIgor Kudrin 327*c3c501f5SIgor Kudrin InSequence S; 328*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4)); 329*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 8)); 330*c3c501f5SIgor Kudrin 331*c3c501f5SIgor Kudrin TestPrinter->getAP()->emitDwarfUnitLength(Val, ""); 332*c3c501f5SIgor Kudrin } 333*c3c501f5SIgor Kudrin 334*c3c501f5SIgor Kudrin class AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest 335*c3c501f5SIgor Kudrin : public AsmPrinterFixtureBase { 336*c3c501f5SIgor Kudrin protected: 337*c3c501f5SIgor Kudrin bool init(const std::string &TripleStr, unsigned DwarfVersion, 338*c3c501f5SIgor Kudrin dwarf::DwarfFormat DwarfFormat) { 339*c3c501f5SIgor Kudrin if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat)) 340*c3c501f5SIgor Kudrin return false; 341*c3c501f5SIgor Kudrin 342*c3c501f5SIgor Kudrin Hi = TestPrinter->getCtx().createTempSymbol(); 343*c3c501f5SIgor Kudrin Lo = TestPrinter->getCtx().createTempSymbol(); 344*c3c501f5SIgor Kudrin return true; 345*c3c501f5SIgor Kudrin } 346*c3c501f5SIgor Kudrin 347*c3c501f5SIgor Kudrin MCSymbol *Hi = nullptr; 348*c3c501f5SIgor Kudrin MCSymbol *Lo = nullptr; 349*c3c501f5SIgor Kudrin }; 350*c3c501f5SIgor Kudrin 351*c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest, DWARF32) { 352*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32)) 353*c3c501f5SIgor Kudrin return; 354*c3c501f5SIgor Kudrin 355*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, Lo, 4)); 356*c3c501f5SIgor Kudrin TestPrinter->getAP()->emitDwarfUnitLength(Hi, Lo, ""); 357*c3c501f5SIgor Kudrin } 358*c3c501f5SIgor Kudrin 359*c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest, DWARF64) { 360*c3c501f5SIgor Kudrin if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64)) 361*c3c501f5SIgor Kudrin return; 362*c3c501f5SIgor Kudrin 363*c3c501f5SIgor Kudrin InSequence S; 364*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4)); 365*c3c501f5SIgor Kudrin EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, Lo, 8)); 366*c3c501f5SIgor Kudrin 367*c3c501f5SIgor Kudrin TestPrinter->getAP()->emitDwarfUnitLength(Hi, Lo, ""); 368*c3c501f5SIgor Kudrin } 369*c3c501f5SIgor Kudrin 370380e746bSIgor Kudrin } // end namespace 371