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