xref: /llvm-project/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp (revision f6b0555a433cea1d32a6904c120516cd94b8f3db)
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"
10ef736a1cSserge-sans-paille #include "llvm/BinaryFormat/ELF.h"
11380e746bSIgor Kudrin #include "llvm/CodeGen/AsmPrinter.h"
12117b53aeSAlexis Engelke #include "llvm/CodeGen/AsmPrinterHandler.h"
13117b53aeSAlexis Engelke #include "llvm/CodeGen/DebugHandlerBase.h"
14a0ad066cSJameson Nash #include "llvm/CodeGen/MachineModuleInfo.h"
15a0ad066cSJameson Nash #include "llvm/IR/LegacyPassManager.h"
16a0ad066cSJameson Nash #include "llvm/IR/Module.h"
17a0ad066cSJameson Nash #include "llvm/IR/PassManager.h"
18380e746bSIgor Kudrin #include "llvm/MC/MCContext.h"
19380e746bSIgor Kudrin #include "llvm/MC/MCSectionELF.h"
20a0ad066cSJameson Nash #include "llvm/Target/TargetMachine.h"
21380e746bSIgor Kudrin #include "llvm/Testing/Support/Error.h"
22380e746bSIgor Kudrin 
23380e746bSIgor Kudrin using namespace llvm;
24380e746bSIgor Kudrin using testing::_;
25a560d219SZero Omega using testing::DoAll;
26c3c501f5SIgor Kudrin using testing::InSequence;
27380e746bSIgor Kudrin using testing::SaveArg;
28380e746bSIgor Kudrin 
29380e746bSIgor Kudrin namespace {
30380e746bSIgor Kudrin 
31380e746bSIgor Kudrin class AsmPrinterFixtureBase : public testing::Test {
32380e746bSIgor Kudrin   void setupTestPrinter(const std::string &TripleStr, unsigned DwarfVersion,
33380e746bSIgor Kudrin                         dwarf::DwarfFormat DwarfFormat) {
34380e746bSIgor Kudrin     auto ExpectedTestPrinter =
35380e746bSIgor Kudrin         TestAsmPrinter::create(TripleStr, DwarfVersion, DwarfFormat);
36380e746bSIgor Kudrin     ASSERT_THAT_EXPECTED(ExpectedTestPrinter, Succeeded());
37380e746bSIgor Kudrin     TestPrinter = std::move(ExpectedTestPrinter.get());
38380e746bSIgor Kudrin   }
39380e746bSIgor Kudrin 
40380e746bSIgor Kudrin protected:
41380e746bSIgor Kudrin   bool init(const std::string &TripleStr, unsigned DwarfVersion,
42380e746bSIgor Kudrin             dwarf::DwarfFormat DwarfFormat) {
43380e746bSIgor Kudrin     setupTestPrinter(TripleStr, DwarfVersion, DwarfFormat);
44380e746bSIgor Kudrin     return TestPrinter != nullptr;
45380e746bSIgor Kudrin   }
46380e746bSIgor Kudrin 
47380e746bSIgor Kudrin   std::unique_ptr<TestAsmPrinter> TestPrinter;
48380e746bSIgor Kudrin };
49380e746bSIgor Kudrin 
50380e746bSIgor Kudrin class AsmPrinterEmitDwarfSymbolReferenceTest : public AsmPrinterFixtureBase {
51380e746bSIgor Kudrin protected:
52380e746bSIgor Kudrin   bool init(const std::string &TripleStr, unsigned DwarfVersion,
53380e746bSIgor Kudrin             dwarf::DwarfFormat DwarfFormat) {
54380e746bSIgor Kudrin     if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat))
55380e746bSIgor Kudrin       return false;
56380e746bSIgor Kudrin 
57d39bc36bSChen Zheng     // AsmPrinter::emitDwarfSymbolReference(Label, true) gets the associated
58d39bc36bSChen Zheng     // section from `Label` to find its BeginSymbol.
59d39bc36bSChen Zheng     // Prepare the test symbol `Val` accordingly.
60380e746bSIgor Kudrin 
61380e746bSIgor Kudrin     Val = TestPrinter->getCtx().createTempSymbol();
62d39bc36bSChen Zheng     MCSection *Sec =
63d39bc36bSChen Zheng         TestPrinter->getCtx().getELFSection(".tst", ELF::SHT_PROGBITS, 0);
64380e746bSIgor Kudrin     SecBeginSymbol = Sec->getBeginSymbol();
65adf4142fSFangrui Song     TestPrinter->getMS().switchSection(Sec);
66d39bc36bSChen Zheng     Val->setFragment(&Sec->getDummyFragment());
67d39bc36bSChen Zheng 
68380e746bSIgor Kudrin     return true;
69380e746bSIgor Kudrin   }
70380e746bSIgor Kudrin 
71380e746bSIgor Kudrin   MCSymbol *Val = nullptr;
72380e746bSIgor Kudrin   MCSymbol *SecBeginSymbol = nullptr;
73380e746bSIgor Kudrin };
74380e746bSIgor Kudrin 
75380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, COFF) {
76380e746bSIgor Kudrin   if (!init("x86_64-pc-windows", /*DwarfVersion=*/4, dwarf::DWARF32))
775bbf1feaSIgor Kudrin     GTEST_SKIP();
78380e746bSIgor Kudrin 
799ee15bbaSFangrui Song   EXPECT_CALL(TestPrinter->getMS(), emitCOFFSecRel32(Val, 0));
80380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfSymbolReference(Val, false);
81380e746bSIgor Kudrin }
82380e746bSIgor Kudrin 
83380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, COFFForceOffset) {
84380e746bSIgor Kudrin   if (!init("x86_64-pc-windows", /*DwarfVersion=*/4, dwarf::DWARF32))
855bbf1feaSIgor Kudrin     GTEST_SKIP();
86380e746bSIgor Kudrin 
87380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(),
88380e746bSIgor Kudrin               emitAbsoluteSymbolDiff(Val, SecBeginSymbol, 4));
89380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfSymbolReference(Val, true);
90380e746bSIgor Kudrin }
91380e746bSIgor Kudrin 
92380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, ELFDWARF32) {
93380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
945bbf1feaSIgor Kudrin     GTEST_SKIP();
95380e746bSIgor Kudrin 
96380e746bSIgor Kudrin   const MCExpr *Arg0 = nullptr;
97380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 4, _))
98380e746bSIgor Kudrin       .WillOnce(SaveArg<0>(&Arg0));
99380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfSymbolReference(Val, false);
100380e746bSIgor Kudrin 
101380e746bSIgor Kudrin   const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0);
102380e746bSIgor Kudrin   ASSERT_NE(ActualArg0, nullptr);
103380e746bSIgor Kudrin   EXPECT_EQ(&(ActualArg0->getSymbol()), Val);
104380e746bSIgor Kudrin }
105380e746bSIgor Kudrin 
106380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, ELFDWARF32ForceOffset) {
107380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
1085bbf1feaSIgor Kudrin     GTEST_SKIP();
109380e746bSIgor Kudrin 
110380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(),
111380e746bSIgor Kudrin               emitAbsoluteSymbolDiff(Val, SecBeginSymbol, 4));
112380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfSymbolReference(Val, true);
113380e746bSIgor Kudrin }
114380e746bSIgor Kudrin 
115380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, ELFDWARF64) {
116380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
1175bbf1feaSIgor Kudrin     GTEST_SKIP();
118380e746bSIgor Kudrin 
119380e746bSIgor Kudrin   const MCExpr *Arg0 = nullptr;
120380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 8, _))
121380e746bSIgor Kudrin       .WillOnce(SaveArg<0>(&Arg0));
122380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfSymbolReference(Val, false);
123380e746bSIgor Kudrin 
124380e746bSIgor Kudrin   const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0);
125380e746bSIgor Kudrin   ASSERT_NE(ActualArg0, nullptr);
126380e746bSIgor Kudrin   EXPECT_EQ(&(ActualArg0->getSymbol()), Val);
127380e746bSIgor Kudrin }
128380e746bSIgor Kudrin 
129380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfSymbolReferenceTest, ELFDWARF64ForceOffset) {
130380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
1315bbf1feaSIgor Kudrin     GTEST_SKIP();
132380e746bSIgor Kudrin 
133380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(),
134380e746bSIgor Kudrin               emitAbsoluteSymbolDiff(Val, SecBeginSymbol, 8));
135380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfSymbolReference(Val, true);
136380e746bSIgor Kudrin }
137380e746bSIgor Kudrin 
138380e746bSIgor Kudrin class AsmPrinterEmitDwarfStringOffsetTest : public AsmPrinterFixtureBase {
139380e746bSIgor Kudrin protected:
140380e746bSIgor Kudrin   bool init(const std::string &TripleStr, unsigned DwarfVersion,
141380e746bSIgor Kudrin             dwarf::DwarfFormat DwarfFormat) {
142380e746bSIgor Kudrin     if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat))
143380e746bSIgor Kudrin       return false;
144380e746bSIgor Kudrin 
145380e746bSIgor Kudrin     Val.Index = DwarfStringPoolEntry::NotIndexed;
146380e746bSIgor Kudrin     Val.Symbol = TestPrinter->getCtx().createTempSymbol();
147380e746bSIgor Kudrin     Val.Offset = 42;
148380e746bSIgor Kudrin     return true;
149380e746bSIgor Kudrin   }
150380e746bSIgor Kudrin 
151380e746bSIgor Kudrin   DwarfStringPoolEntry Val;
152380e746bSIgor Kudrin };
153380e746bSIgor Kudrin 
154380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfStringOffsetTest, DWARF32) {
155380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
1565bbf1feaSIgor Kudrin     GTEST_SKIP();
157380e746bSIgor Kudrin 
158380e746bSIgor Kudrin   const MCExpr *Arg0 = nullptr;
159380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 4, _))
160380e746bSIgor Kudrin       .WillOnce(SaveArg<0>(&Arg0));
161380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfStringOffset(Val);
162380e746bSIgor Kudrin 
163380e746bSIgor Kudrin   const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0);
164380e746bSIgor Kudrin   ASSERT_NE(ActualArg0, nullptr);
165380e746bSIgor Kudrin   EXPECT_EQ(&(ActualArg0->getSymbol()), Val.Symbol);
166380e746bSIgor Kudrin }
167380e746bSIgor Kudrin 
168380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfStringOffsetTest,
169380e746bSIgor Kudrin        DWARF32NoRelocationsAcrossSections) {
170380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
1715bbf1feaSIgor Kudrin     GTEST_SKIP();
172380e746bSIgor Kudrin 
173380e746bSIgor Kudrin   TestPrinter->setDwarfUsesRelocationsAcrossSections(false);
174380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val.Offset, 4));
175380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfStringOffset(Val);
176380e746bSIgor Kudrin }
177380e746bSIgor Kudrin 
178380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfStringOffsetTest, DWARF64) {
179380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
1805bbf1feaSIgor Kudrin     GTEST_SKIP();
181380e746bSIgor Kudrin 
182380e746bSIgor Kudrin   const MCExpr *Arg0 = nullptr;
183380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 8, _))
184380e746bSIgor Kudrin       .WillOnce(SaveArg<0>(&Arg0));
185380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfStringOffset(Val);
186380e746bSIgor Kudrin 
187380e746bSIgor Kudrin   const MCSymbolRefExpr *ActualArg0 = dyn_cast_or_null<MCSymbolRefExpr>(Arg0);
188380e746bSIgor Kudrin   ASSERT_NE(ActualArg0, nullptr);
189380e746bSIgor Kudrin   EXPECT_EQ(&(ActualArg0->getSymbol()), Val.Symbol);
190380e746bSIgor Kudrin }
191380e746bSIgor Kudrin 
192380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfStringOffsetTest,
193380e746bSIgor Kudrin        DWARF64NoRelocationsAcrossSections) {
194380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
1955bbf1feaSIgor Kudrin     GTEST_SKIP();
196380e746bSIgor Kudrin 
197380e746bSIgor Kudrin   TestPrinter->setDwarfUsesRelocationsAcrossSections(false);
198380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val.Offset, 8));
199380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfStringOffset(Val);
200380e746bSIgor Kudrin }
201380e746bSIgor Kudrin 
202380e746bSIgor Kudrin class AsmPrinterEmitDwarfOffsetTest : public AsmPrinterFixtureBase {
203380e746bSIgor Kudrin protected:
204380e746bSIgor Kudrin   bool init(const std::string &TripleStr, unsigned DwarfVersion,
205380e746bSIgor Kudrin             dwarf::DwarfFormat DwarfFormat) {
206380e746bSIgor Kudrin     if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat))
207380e746bSIgor Kudrin       return false;
208380e746bSIgor Kudrin 
209380e746bSIgor Kudrin     Label = TestPrinter->getCtx().createTempSymbol();
210380e746bSIgor Kudrin     return true;
211380e746bSIgor Kudrin   }
212380e746bSIgor Kudrin 
213380e746bSIgor Kudrin   MCSymbol *Label = nullptr;
214380e746bSIgor Kudrin   uint64_t Offset = 42;
215380e746bSIgor Kudrin };
216380e746bSIgor Kudrin 
217380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfOffsetTest, DWARF32) {
218380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
2195bbf1feaSIgor Kudrin     GTEST_SKIP();
220380e746bSIgor Kudrin 
221380e746bSIgor Kudrin   const MCExpr *Arg0 = nullptr;
222380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 4, _))
223380e746bSIgor Kudrin       .WillOnce(SaveArg<0>(&Arg0));
224380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfOffset(Label, Offset);
225380e746bSIgor Kudrin 
226380e746bSIgor Kudrin   const MCBinaryExpr *ActualArg0 = dyn_cast_or_null<MCBinaryExpr>(Arg0);
227380e746bSIgor Kudrin   ASSERT_NE(ActualArg0, nullptr);
228380e746bSIgor Kudrin   EXPECT_EQ(ActualArg0->getOpcode(), MCBinaryExpr::Add);
229380e746bSIgor Kudrin 
230380e746bSIgor Kudrin   const MCSymbolRefExpr *ActualLHS =
231380e746bSIgor Kudrin       dyn_cast_or_null<MCSymbolRefExpr>(ActualArg0->getLHS());
232380e746bSIgor Kudrin   ASSERT_NE(ActualLHS, nullptr);
233380e746bSIgor Kudrin   EXPECT_EQ(&(ActualLHS->getSymbol()), Label);
234380e746bSIgor Kudrin 
235380e746bSIgor Kudrin   const MCConstantExpr *ActualRHS =
236380e746bSIgor Kudrin       dyn_cast_or_null<MCConstantExpr>(ActualArg0->getRHS());
237380e746bSIgor Kudrin   ASSERT_NE(ActualRHS, nullptr);
238380e746bSIgor Kudrin   EXPECT_EQ(static_cast<uint64_t>(ActualRHS->getValue()), Offset);
239380e746bSIgor Kudrin }
240380e746bSIgor Kudrin 
241380e746bSIgor Kudrin TEST_F(AsmPrinterEmitDwarfOffsetTest, DWARF64) {
242380e746bSIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
2435bbf1feaSIgor Kudrin     GTEST_SKIP();
244380e746bSIgor Kudrin 
245380e746bSIgor Kudrin   const MCExpr *Arg0 = nullptr;
246380e746bSIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitValueImpl(_, 8, _))
247380e746bSIgor Kudrin       .WillOnce(SaveArg<0>(&Arg0));
248380e746bSIgor Kudrin   TestPrinter->getAP()->emitDwarfOffset(Label, Offset);
249380e746bSIgor Kudrin 
250380e746bSIgor Kudrin   const MCBinaryExpr *ActualArg0 = dyn_cast_or_null<MCBinaryExpr>(Arg0);
251380e746bSIgor Kudrin   ASSERT_NE(ActualArg0, nullptr);
252380e746bSIgor Kudrin   EXPECT_EQ(ActualArg0->getOpcode(), MCBinaryExpr::Add);
253380e746bSIgor Kudrin 
254380e746bSIgor Kudrin   const MCSymbolRefExpr *ActualLHS =
255380e746bSIgor Kudrin       dyn_cast_or_null<MCSymbolRefExpr>(ActualArg0->getLHS());
256380e746bSIgor Kudrin   ASSERT_NE(ActualLHS, nullptr);
257380e746bSIgor Kudrin   EXPECT_EQ(&(ActualLHS->getSymbol()), Label);
258380e746bSIgor Kudrin 
259380e746bSIgor Kudrin   const MCConstantExpr *ActualRHS =
260380e746bSIgor Kudrin       dyn_cast_or_null<MCConstantExpr>(ActualArg0->getRHS());
261380e746bSIgor Kudrin   ASSERT_NE(ActualRHS, nullptr);
262380e746bSIgor Kudrin   EXPECT_EQ(static_cast<uint64_t>(ActualRHS->getValue()), Offset);
263380e746bSIgor Kudrin }
264380e746bSIgor Kudrin 
265c3c501f5SIgor Kudrin class AsmPrinterEmitDwarfLengthOrOffsetTest : public AsmPrinterFixtureBase {
266c3c501f5SIgor Kudrin protected:
267c3c501f5SIgor Kudrin   uint64_t Val = 42;
268c3c501f5SIgor Kudrin };
269c3c501f5SIgor Kudrin 
270c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfLengthOrOffsetTest, DWARF32) {
271c3c501f5SIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
2725bbf1feaSIgor Kudrin     GTEST_SKIP();
273c3c501f5SIgor Kudrin 
274c3c501f5SIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 4));
275c3c501f5SIgor Kudrin   TestPrinter->getAP()->emitDwarfLengthOrOffset(Val);
276c3c501f5SIgor Kudrin }
277c3c501f5SIgor Kudrin 
278c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfLengthOrOffsetTest, DWARF64) {
279c3c501f5SIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
2805bbf1feaSIgor Kudrin     GTEST_SKIP();
281c3c501f5SIgor Kudrin 
282c3c501f5SIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 8));
283c3c501f5SIgor Kudrin   TestPrinter->getAP()->emitDwarfLengthOrOffset(Val);
284c3c501f5SIgor Kudrin }
285c3c501f5SIgor Kudrin 
286c3c501f5SIgor Kudrin class AsmPrinterGetUnitLengthFieldByteSizeTest : public AsmPrinterFixtureBase {
287c3c501f5SIgor Kudrin };
288c3c501f5SIgor Kudrin 
289c3c501f5SIgor Kudrin TEST_F(AsmPrinterGetUnitLengthFieldByteSizeTest, DWARF32) {
290c3c501f5SIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
2915bbf1feaSIgor Kudrin     GTEST_SKIP();
292c3c501f5SIgor Kudrin 
293c3c501f5SIgor Kudrin   EXPECT_EQ(TestPrinter->getAP()->getUnitLengthFieldByteSize(), 4u);
294c3c501f5SIgor Kudrin }
295c3c501f5SIgor Kudrin 
296c3c501f5SIgor Kudrin TEST_F(AsmPrinterGetUnitLengthFieldByteSizeTest, DWARF64) {
297c3c501f5SIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
2985bbf1feaSIgor Kudrin     GTEST_SKIP();
299c3c501f5SIgor Kudrin 
300c3c501f5SIgor Kudrin   EXPECT_EQ(TestPrinter->getAP()->getUnitLengthFieldByteSize(), 12u);
301c3c501f5SIgor Kudrin }
302c3c501f5SIgor Kudrin 
303c3c501f5SIgor Kudrin class AsmPrinterEmitDwarfUnitLengthAsIntTest : public AsmPrinterFixtureBase {
304c3c501f5SIgor Kudrin protected:
305c3c501f5SIgor Kudrin   uint64_t Val = 42;
306c3c501f5SIgor Kudrin };
307c3c501f5SIgor Kudrin 
308c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfUnitLengthAsIntTest, DWARF32) {
309c3c501f5SIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
3105bbf1feaSIgor Kudrin     GTEST_SKIP();
311c3c501f5SIgor Kudrin 
312c3c501f5SIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 4));
313c3c501f5SIgor Kudrin   TestPrinter->getAP()->emitDwarfUnitLength(Val, "");
314c3c501f5SIgor Kudrin }
315c3c501f5SIgor Kudrin 
316c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfUnitLengthAsIntTest, DWARF64) {
317c3c501f5SIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
3185bbf1feaSIgor Kudrin     GTEST_SKIP();
319c3c501f5SIgor Kudrin 
320c3c501f5SIgor Kudrin   InSequence S;
321c3c501f5SIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4));
322c3c501f5SIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 8));
323c3c501f5SIgor Kudrin 
324c3c501f5SIgor Kudrin   TestPrinter->getAP()->emitDwarfUnitLength(Val, "");
325c3c501f5SIgor Kudrin }
326c3c501f5SIgor Kudrin 
327c3c501f5SIgor Kudrin class AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest
328c3c501f5SIgor Kudrin     : public AsmPrinterFixtureBase {
329c3c501f5SIgor Kudrin protected:
330c3c501f5SIgor Kudrin   bool init(const std::string &TripleStr, unsigned DwarfVersion,
331c3c501f5SIgor Kudrin             dwarf::DwarfFormat DwarfFormat) {
332c3c501f5SIgor Kudrin     if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat))
333c3c501f5SIgor Kudrin       return false;
334c3c501f5SIgor Kudrin 
335c3c501f5SIgor Kudrin     return true;
336c3c501f5SIgor Kudrin   }
337c3c501f5SIgor Kudrin };
338c3c501f5SIgor Kudrin 
339c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest, DWARF32) {
340c3c501f5SIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
3415bbf1feaSIgor Kudrin     GTEST_SKIP();
342c3c501f5SIgor Kudrin 
343d39bc36bSChen Zheng   InSequence S;
344d39bc36bSChen Zheng   const MCSymbol *Hi = nullptr;
345d39bc36bSChen Zheng   const MCSymbol *Lo = nullptr;
346d39bc36bSChen Zheng   EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(_, _, 4))
347d39bc36bSChen Zheng       .WillOnce(DoAll(SaveArg<0>(&Hi), SaveArg<1>(&Lo)));
348d39bc36bSChen Zheng   MCSymbol *LTmp = nullptr;
349d39bc36bSChen Zheng   EXPECT_CALL(TestPrinter->getMS(), emitLabel(_, _))
350d39bc36bSChen Zheng       .WillOnce(SaveArg<0>(&LTmp));
351d39bc36bSChen Zheng 
352d39bc36bSChen Zheng   MCSymbol *HTmp = TestPrinter->getAP()->emitDwarfUnitLength("", "");
353d39bc36bSChen Zheng   EXPECT_NE(Lo, nullptr);
354d39bc36bSChen Zheng   EXPECT_EQ(Lo, LTmp);
355d39bc36bSChen Zheng   EXPECT_NE(Hi, nullptr);
356d39bc36bSChen Zheng   EXPECT_EQ(Hi, HTmp);
357c3c501f5SIgor Kudrin }
358c3c501f5SIgor Kudrin 
359c3c501f5SIgor Kudrin TEST_F(AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest, DWARF64) {
360c3c501f5SIgor Kudrin   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
3615bbf1feaSIgor Kudrin     GTEST_SKIP();
362c3c501f5SIgor Kudrin 
363c3c501f5SIgor Kudrin   InSequence S;
364d39bc36bSChen Zheng   const MCSymbol *Hi = nullptr;
365d39bc36bSChen Zheng   const MCSymbol *Lo = nullptr;
366c3c501f5SIgor Kudrin   EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4));
367d39bc36bSChen Zheng   EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(_, _, 8))
368d39bc36bSChen Zheng       .WillOnce(DoAll(SaveArg<0>(&Hi), SaveArg<1>(&Lo)));
369d39bc36bSChen Zheng   MCSymbol *LTmp = nullptr;
370d39bc36bSChen Zheng   EXPECT_CALL(TestPrinter->getMS(), emitLabel(_, _))
371d39bc36bSChen Zheng       .WillOnce(SaveArg<0>(&LTmp));
372c3c501f5SIgor Kudrin 
373d39bc36bSChen Zheng   MCSymbol *HTmp = TestPrinter->getAP()->emitDwarfUnitLength("", "");
374d39bc36bSChen Zheng   EXPECT_NE(Lo, nullptr);
375d39bc36bSChen Zheng   EXPECT_EQ(Lo, LTmp);
376d39bc36bSChen Zheng   EXPECT_NE(Hi, nullptr);
377d39bc36bSChen Zheng   EXPECT_EQ(Hi, HTmp);
378c3c501f5SIgor Kudrin }
379c3c501f5SIgor Kudrin 
380a0ad066cSJameson Nash class AsmPrinterHandlerTest : public AsmPrinterFixtureBase {
381a0ad066cSJameson Nash   class TestHandler : public AsmPrinterHandler {
382a0ad066cSJameson Nash     AsmPrinterHandlerTest &Test;
383a0ad066cSJameson Nash 
384a0ad066cSJameson Nash   public:
385a0ad066cSJameson Nash     TestHandler(AsmPrinterHandlerTest &Test) : Test(Test) {}
386a0ad066cSJameson Nash     virtual ~TestHandler() {}
387*f6b0555aSJameson Nash     virtual void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override {}
388a0ad066cSJameson Nash     virtual void beginModule(Module *M) override { Test.BeginCount++; }
389a0ad066cSJameson Nash     virtual void endModule() override { Test.EndCount++; }
390a0ad066cSJameson Nash     virtual void beginFunction(const MachineFunction *MF) override {}
391a0ad066cSJameson Nash     virtual void endFunction(const MachineFunction *MF) override {}
392*f6b0555aSJameson Nash     virtual void beginInstruction(const MachineInstr *MI) override {}
393*f6b0555aSJameson Nash     virtual void endInstruction() override {}
394a0ad066cSJameson Nash   };
395a0ad066cSJameson Nash 
396a0ad066cSJameson Nash protected:
397a0ad066cSJameson Nash   bool init(const std::string &TripleStr, unsigned DwarfVersion,
398a0ad066cSJameson Nash             dwarf::DwarfFormat DwarfFormat) {
399a0ad066cSJameson Nash     if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat))
400a0ad066cSJameson Nash       return false;
401a0ad066cSJameson Nash 
402a0ad066cSJameson Nash     auto *AP = TestPrinter->getAP();
40380ffec78SAlexis Engelke     AP->addAsmPrinterHandler(std::make_unique<TestHandler>(*this));
404bb3f5e1fSMatin Raayai     TargetMachine *TM = &AP->TM;
405a0ad066cSJameson Nash     legacy::PassManager PM;
406bb3f5e1fSMatin Raayai     PM.add(new MachineModuleInfoWrapperPass(TM));
407a0ad066cSJameson Nash     PM.add(TestPrinter->releaseAP()); // Takes ownership of destroying AP
408a0ad066cSJameson Nash     LLVMContext Context;
409a0ad066cSJameson Nash     std::unique_ptr<Module> M(new Module("TestModule", Context));
410bb3f5e1fSMatin Raayai     M->setDataLayout(TM->createDataLayout());
411a0ad066cSJameson Nash     PM.run(*M);
412a0ad066cSJameson Nash     // Now check that we can run it twice.
41380ffec78SAlexis Engelke     AP->addAsmPrinterHandler(std::make_unique<TestHandler>(*this));
414a0ad066cSJameson Nash     PM.run(*M);
415a0ad066cSJameson Nash     return true;
416a0ad066cSJameson Nash   }
417a0ad066cSJameson Nash 
418a0ad066cSJameson Nash   int BeginCount = 0;
419a0ad066cSJameson Nash   int EndCount = 0;
420a0ad066cSJameson Nash };
421a0ad066cSJameson Nash 
422a0ad066cSJameson Nash TEST_F(AsmPrinterHandlerTest, Basic) {
423a0ad066cSJameson Nash   if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
4245bbf1feaSIgor Kudrin     GTEST_SKIP();
425a0ad066cSJameson Nash 
426a0ad066cSJameson Nash   ASSERT_EQ(BeginCount, 3);
427a0ad066cSJameson Nash   ASSERT_EQ(EndCount, 3);
428a0ad066cSJameson Nash }
429a0ad066cSJameson Nash 
430380e746bSIgor Kudrin } // end namespace
431