1*c1ccf078SCarlos Alberto Enciso //===- llvm/unittest/DebugInfo/LogicalView/DWARFReaderTest.cpp ------------===//
2*c1ccf078SCarlos Alberto Enciso //
3*c1ccf078SCarlos Alberto Enciso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*c1ccf078SCarlos Alberto Enciso // See https://llvm.org/LICENSE.txt for license information.
5*c1ccf078SCarlos Alberto Enciso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*c1ccf078SCarlos Alberto Enciso //
7*c1ccf078SCarlos Alberto Enciso //===----------------------------------------------------------------------===//
8*c1ccf078SCarlos Alberto Enciso
9*c1ccf078SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVCompare.h"
10*c1ccf078SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVLine.h"
11*c1ccf078SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVScope.h"
12*c1ccf078SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVSymbol.h"
13*c1ccf078SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVType.h"
14*c1ccf078SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/LVReaderHandler.h"
15*c1ccf078SCarlos Alberto Enciso #include "llvm/MC/TargetRegistry.h"
16*c1ccf078SCarlos Alberto Enciso #include "llvm/Support/COM.h"
17*c1ccf078SCarlos Alberto Enciso #include "llvm/Support/InitLLVM.h"
18*c1ccf078SCarlos Alberto Enciso #include "llvm/Support/ScopedPrinter.h"
19*c1ccf078SCarlos Alberto Enciso #include "llvm/Support/TargetSelect.h"
20*c1ccf078SCarlos Alberto Enciso #include "llvm/Support/ToolOutputFile.h"
21*c1ccf078SCarlos Alberto Enciso #include "llvm/Testing/Support/Error.h"
22*c1ccf078SCarlos Alberto Enciso
23*c1ccf078SCarlos Alberto Enciso #include "gtest/gtest.h"
24*c1ccf078SCarlos Alberto Enciso
25*c1ccf078SCarlos Alberto Enciso using namespace llvm;
26*c1ccf078SCarlos Alberto Enciso using namespace llvm::logicalview;
27*c1ccf078SCarlos Alberto Enciso
28*c1ccf078SCarlos Alberto Enciso extern const char *TestMainArgv0;
29*c1ccf078SCarlos Alberto Enciso
30*c1ccf078SCarlos Alberto Enciso namespace {
31*c1ccf078SCarlos Alberto Enciso
32*c1ccf078SCarlos Alberto Enciso const char *DwarfClang = "test-dwarf-clang.o";
33*c1ccf078SCarlos Alberto Enciso const char *DwarfGcc = "test-dwarf-gcc.o";
34*c1ccf078SCarlos Alberto Enciso
35*c1ccf078SCarlos Alberto Enciso // Helper function to get the first compile unit.
getFirstCompileUnit(LVScopeRoot * Root)36*c1ccf078SCarlos Alberto Enciso LVScopeCompileUnit *getFirstCompileUnit(LVScopeRoot *Root) {
37*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Root, nullptr);
38*c1ccf078SCarlos Alberto Enciso const LVScopes *CompileUnits = Root->getScopes();
39*c1ccf078SCarlos Alberto Enciso EXPECT_NE(CompileUnits, nullptr);
40*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(CompileUnits->size(), 1u);
41*c1ccf078SCarlos Alberto Enciso
42*c1ccf078SCarlos Alberto Enciso LVScopes::const_iterator Iter = CompileUnits->begin();
43*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Iter, nullptr);
44*c1ccf078SCarlos Alberto Enciso LVScopeCompileUnit *CompileUnit = static_cast<LVScopeCompileUnit *>(*Iter);
45*c1ccf078SCarlos Alberto Enciso EXPECT_NE(CompileUnit, nullptr);
46*c1ccf078SCarlos Alberto Enciso return CompileUnit;
47*c1ccf078SCarlos Alberto Enciso }
48*c1ccf078SCarlos Alberto Enciso
49*c1ccf078SCarlos Alberto Enciso // Helper function to create a reader.
createReader(LVReaderHandler & ReaderHandler,SmallString<128> & InputsDir,StringRef Filename)50*c1ccf078SCarlos Alberto Enciso std::unique_ptr<LVReader> createReader(LVReaderHandler &ReaderHandler,
51*c1ccf078SCarlos Alberto Enciso SmallString<128> &InputsDir,
52*c1ccf078SCarlos Alberto Enciso StringRef Filename) {
53*c1ccf078SCarlos Alberto Enciso SmallString<128> ObjectName(InputsDir);
54*c1ccf078SCarlos Alberto Enciso llvm::sys::path::append(ObjectName, Filename);
55*c1ccf078SCarlos Alberto Enciso
56*c1ccf078SCarlos Alberto Enciso Expected<std::unique_ptr<LVReader>> ReaderOrErr =
57*c1ccf078SCarlos Alberto Enciso ReaderHandler.createReader(std::string(ObjectName));
58*c1ccf078SCarlos Alberto Enciso EXPECT_THAT_EXPECTED(ReaderOrErr, Succeeded());
59*c1ccf078SCarlos Alberto Enciso std::unique_ptr<LVReader> Reader = std::move(*ReaderOrErr);
60*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Reader, nullptr);
61*c1ccf078SCarlos Alberto Enciso return Reader;
62*c1ccf078SCarlos Alberto Enciso }
63*c1ccf078SCarlos Alberto Enciso
64*c1ccf078SCarlos Alberto Enciso // Check the logical elements basic properties.
checkElementProperties(LVReader * Reader)65*c1ccf078SCarlos Alberto Enciso void checkElementProperties(LVReader *Reader) {
66*c1ccf078SCarlos Alberto Enciso LVScopeRoot *Root = Reader->getScopesRoot();
67*c1ccf078SCarlos Alberto Enciso LVScopeCompileUnit *CompileUnit = getFirstCompileUnit(Root);
68*c1ccf078SCarlos Alberto Enciso
69*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Root->getFileFormatName(), "elf64-x86-64");
70*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Root->getName(), DwarfClang);
71*c1ccf078SCarlos Alberto Enciso
72*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(CompileUnit->getBaseAddress(), 0u);
73*c1ccf078SCarlos Alberto Enciso EXPECT_TRUE(CompileUnit->getProducer().starts_with("clang"));
74*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(CompileUnit->getName(), "test.cpp");
75*c1ccf078SCarlos Alberto Enciso
76*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(CompileUnit->lineCount(), 0u);
77*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(CompileUnit->scopeCount(), 1u);
78*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(CompileUnit->symbolCount(), 0u);
79*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(CompileUnit->typeCount(), 7u);
80*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(CompileUnit->rangeCount(), 1u);
81*c1ccf078SCarlos Alberto Enciso
82*c1ccf078SCarlos Alberto Enciso const LVLocations *Ranges = CompileUnit->getRanges();
83*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Ranges, nullptr);
84*c1ccf078SCarlos Alberto Enciso ASSERT_EQ(Ranges->size(), 1u);
85*c1ccf078SCarlos Alberto Enciso LVLocations::const_iterator IterLocation = Ranges->begin();
86*c1ccf078SCarlos Alberto Enciso LVLocation *Location = (*IterLocation);
87*c1ccf078SCarlos Alberto Enciso EXPECT_STREQ(Location->getIntervalInfo().c_str(),
88*c1ccf078SCarlos Alberto Enciso "{Range} Lines 2:9 [0x0000000000:0x000000003a]");
89*c1ccf078SCarlos Alberto Enciso
90*c1ccf078SCarlos Alberto Enciso LVRange RangeList;
91*c1ccf078SCarlos Alberto Enciso CompileUnit->getRanges(RangeList);
92*c1ccf078SCarlos Alberto Enciso
93*c1ccf078SCarlos Alberto Enciso const LVRangeEntries &RangeEntries = RangeList.getEntries();
94*c1ccf078SCarlos Alberto Enciso ASSERT_EQ(RangeEntries.size(), 2u);
95*c1ccf078SCarlos Alberto Enciso LVRangeEntries::const_iterator IterRanges = RangeEntries.cbegin();
96*c1ccf078SCarlos Alberto Enciso LVRangeEntry RangeEntry = *IterRanges;
97*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.lower(), 0u);
98*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.upper(), 0x3au);
99*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
100*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.scope()->getName(), "test.cpp");
101*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.scope()->getOffset(), 0x0bu);
102*c1ccf078SCarlos Alberto Enciso
103*c1ccf078SCarlos Alberto Enciso ++IterRanges;
104*c1ccf078SCarlos Alberto Enciso RangeEntry = *IterRanges;
105*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.lower(), 0x1cu);
106*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.upper(), 0x2fu);
107*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
108*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.scope()->getName(), "foo::?");
109*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(RangeEntry.scope()->getOffset(), 0x71u);
110*c1ccf078SCarlos Alberto Enciso
111*c1ccf078SCarlos Alberto Enciso const LVPublicNames &PublicNames = CompileUnit->getPublicNames();
112*c1ccf078SCarlos Alberto Enciso ASSERT_EQ(PublicNames.size(), 1u);
113*c1ccf078SCarlos Alberto Enciso LVPublicNames::const_iterator IterNames = PublicNames.cbegin();
114*c1ccf078SCarlos Alberto Enciso LVScope *Function = (*IterNames).first;
115*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Function->getName(), "foo");
116*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Function->getLineNumber(), 2u);
117*c1ccf078SCarlos Alberto Enciso LVNameInfo NameInfo = (*IterNames).second;
118*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(NameInfo.first, 0u);
119*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(NameInfo.second, 0x3au);
120*c1ccf078SCarlos Alberto Enciso
121*c1ccf078SCarlos Alberto Enciso // Lines (debug and assembler) for 'foo'.
122*c1ccf078SCarlos Alberto Enciso const LVLines *Lines = Function->getLines();
123*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Lines, nullptr);
124*c1ccf078SCarlos Alberto Enciso ASSERT_EQ(Lines->size(), 0x12u);
125*c1ccf078SCarlos Alberto Enciso }
126*c1ccf078SCarlos Alberto Enciso
127*c1ccf078SCarlos Alberto Enciso // Check the logical elements selection.
checkElementSelection(LVReader * Reader)128*c1ccf078SCarlos Alberto Enciso void checkElementSelection(LVReader *Reader) {
129*c1ccf078SCarlos Alberto Enciso LVScopeRoot *Root = Reader->getScopesRoot();
130*c1ccf078SCarlos Alberto Enciso LVScopeCompileUnit *CompileUnit = getFirstCompileUnit(Root);
131*c1ccf078SCarlos Alberto Enciso
132*c1ccf078SCarlos Alberto Enciso // Get the matched elements.
133*c1ccf078SCarlos Alberto Enciso LVElements MatchedElements = CompileUnit->getMatchedElements();
134*c1ccf078SCarlos Alberto Enciso std::map<LVOffset, LVElement *> MapElements;
135*c1ccf078SCarlos Alberto Enciso for (LVElement *Element : MatchedElements)
136*c1ccf078SCarlos Alberto Enciso MapElements[Element->getOffset()] = Element;
137*c1ccf078SCarlos Alberto Enciso ASSERT_EQ(MapElements.size(), 0xeu);
138*c1ccf078SCarlos Alberto Enciso
139*c1ccf078SCarlos Alberto Enciso LVElement *Element = MapElements[0x000000004b]; // 'foo'
140*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
141*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Element->getName().find("foo"), StringRef::npos);
142*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getIsScope(), 1);
143*c1ccf078SCarlos Alberto Enciso
144*c1ccf078SCarlos Alberto Enciso Element = MapElements[0x00000000c0]; // 'CONSTANT'
145*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
146*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Element->getName().find("CONSTANT"), StringRef::npos);
147*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getIsSymbol(), 1);
148*c1ccf078SCarlos Alberto Enciso
149*c1ccf078SCarlos Alberto Enciso Element = MapElements[0x000000002d]; // 'INTPTR'
150*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
151*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Element->getName().find("INTPTR"), StringRef::npos);
152*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getIsType(), 1);
153*c1ccf078SCarlos Alberto Enciso
154*c1ccf078SCarlos Alberto Enciso Element = MapElements[0x00000000af]; // 'INTEGER'
155*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
156*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Element->getName().find("INTEGER"), StringRef::npos);
157*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getIsType(), 1);
158*c1ccf078SCarlos Alberto Enciso
159*c1ccf078SCarlos Alberto Enciso Element = MapElements[0x000000000f]; // 'movl %edx, %eax'
160*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
161*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Element->getName().find("movl"), StringRef::npos);
162*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getIsLine(), 1);
163*c1ccf078SCarlos Alberto Enciso
164*c1ccf078SCarlos Alberto Enciso // Get the parents for the matched elements.
165*c1ccf078SCarlos Alberto Enciso LVScopes MatchedScopes = CompileUnit->getMatchedScopes();
166*c1ccf078SCarlos Alberto Enciso std::set<LVOffset> SetScopes;
167*c1ccf078SCarlos Alberto Enciso for (LVScope *Scope : MatchedScopes)
168*c1ccf078SCarlos Alberto Enciso SetScopes.insert(Scope->getOffset());
169*c1ccf078SCarlos Alberto Enciso std::set<LVOffset>::iterator Iter;
170*c1ccf078SCarlos Alberto Enciso ASSERT_EQ(SetScopes.size(), 3u);
171*c1ccf078SCarlos Alberto Enciso
172*c1ccf078SCarlos Alberto Enciso Iter = SetScopes.find(0x000000000b); // CompileUnit <- 'foo'
173*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Iter, SetScopes.end());
174*c1ccf078SCarlos Alberto Enciso Iter = SetScopes.find(0x000000009e); // Function <- 'movl %edx, %eax'
175*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Iter, SetScopes.end());
176*c1ccf078SCarlos Alberto Enciso Iter = SetScopes.find(0x000000009e); // LexicalScope <- 'INTEGER'
177*c1ccf078SCarlos Alberto Enciso EXPECT_NE(Iter, SetScopes.end());
178*c1ccf078SCarlos Alberto Enciso }
179*c1ccf078SCarlos Alberto Enciso
180*c1ccf078SCarlos Alberto Enciso // Check the logical elements comparison.
checkElementComparison(LVReader * Reference,LVReader * Target)181*c1ccf078SCarlos Alberto Enciso void checkElementComparison(LVReader *Reference, LVReader *Target) {
182*c1ccf078SCarlos Alberto Enciso LVCompare Compare(nulls());
183*c1ccf078SCarlos Alberto Enciso Error Err = Compare.execute(Reference, Target);
184*c1ccf078SCarlos Alberto Enciso ASSERT_THAT_ERROR(std::move(Err), Succeeded());
185*c1ccf078SCarlos Alberto Enciso
186*c1ccf078SCarlos Alberto Enciso // Get comparison table.
187*c1ccf078SCarlos Alberto Enciso LVPassTable PassTable = Compare.getPassTable();
188*c1ccf078SCarlos Alberto Enciso ASSERT_EQ(PassTable.size(), 5u);
189*c1ccf078SCarlos Alberto Enciso
190*c1ccf078SCarlos Alberto Enciso LVReader *Reader;
191*c1ccf078SCarlos Alberto Enciso LVElement *Element;
192*c1ccf078SCarlos Alberto Enciso LVComparePass Pass;
193*c1ccf078SCarlos Alberto Enciso
194*c1ccf078SCarlos Alberto Enciso // Reference: Missing Variable 'CONSTANT'
195*c1ccf078SCarlos Alberto Enciso std::tie(Reader, Element, Pass) = PassTable[0];
196*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Reader, nullptr);
197*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
198*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Reader, Reference);
199*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLevel(), 4u);
200*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLineNumber(), 5u);
201*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getName(), "CONSTANT");
202*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Pass, LVComparePass::Missing);
203*c1ccf078SCarlos Alberto Enciso
204*c1ccf078SCarlos Alberto Enciso // Reference: Missing TypeDefinition 'INTEGER'
205*c1ccf078SCarlos Alberto Enciso std::tie(Reader, Element, Pass) = PassTable[1];
206*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Reader, nullptr);
207*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
208*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Reader, Reference);
209*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLevel(), 3u);
210*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLineNumber(), 4u);
211*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getName(), "INTEGER");
212*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Pass, LVComparePass::Missing);
213*c1ccf078SCarlos Alberto Enciso
214*c1ccf078SCarlos Alberto Enciso // Reference: Missing DebugLine
215*c1ccf078SCarlos Alberto Enciso std::tie(Reader, Element, Pass) = PassTable[2];
216*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Reader, nullptr);
217*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
218*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Reader, Reference);
219*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLevel(), 3u);
220*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLineNumber(), 8u);
221*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getName(), "");
222*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Pass, LVComparePass::Missing);
223*c1ccf078SCarlos Alberto Enciso
224*c1ccf078SCarlos Alberto Enciso // Target: Added Variable 'CONSTANT'
225*c1ccf078SCarlos Alberto Enciso std::tie(Reader, Element, Pass) = PassTable[3];
226*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Reader, nullptr);
227*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
228*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Reader, Target);
229*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLevel(), 4u);
230*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLineNumber(), 5u);
231*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getName(), "CONSTANT");
232*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Pass, LVComparePass::Added);
233*c1ccf078SCarlos Alberto Enciso
234*c1ccf078SCarlos Alberto Enciso // Target: Added TypeDefinition 'INTEGER'
235*c1ccf078SCarlos Alberto Enciso std::tie(Reader, Element, Pass) = PassTable[4];
236*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Reader, nullptr);
237*c1ccf078SCarlos Alberto Enciso ASSERT_NE(Element, nullptr);
238*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Reader, Target);
239*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLevel(), 4u);
240*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getLineNumber(), 4u);
241*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Element->getName(), "INTEGER");
242*c1ccf078SCarlos Alberto Enciso EXPECT_EQ(Pass, LVComparePass::Added);
243*c1ccf078SCarlos Alberto Enciso }
244*c1ccf078SCarlos Alberto Enciso
245*c1ccf078SCarlos Alberto Enciso // Logical elements properties.
elementProperties(SmallString<128> & InputsDir)246*c1ccf078SCarlos Alberto Enciso void elementProperties(SmallString<128> &InputsDir) {
247*c1ccf078SCarlos Alberto Enciso // Reader options.
248*c1ccf078SCarlos Alberto Enciso LVOptions ReaderOptions;
249*c1ccf078SCarlos Alberto Enciso ReaderOptions.setAttributeOffset();
250*c1ccf078SCarlos Alberto Enciso ReaderOptions.setAttributeFormat();
251*c1ccf078SCarlos Alberto Enciso ReaderOptions.setAttributeFilename();
252*c1ccf078SCarlos Alberto Enciso ReaderOptions.setAttributeProducer();
253*c1ccf078SCarlos Alberto Enciso ReaderOptions.setAttributePublics();
254*c1ccf078SCarlos Alberto Enciso ReaderOptions.setAttributeRange();
255*c1ccf078SCarlos Alberto Enciso ReaderOptions.setAttributeLocation();
256*c1ccf078SCarlos Alberto Enciso ReaderOptions.setPrintAll();
257*c1ccf078SCarlos Alberto Enciso ReaderOptions.resolveDependencies();
258*c1ccf078SCarlos Alberto Enciso
259*c1ccf078SCarlos Alberto Enciso std::vector<std::string> Objects;
260*c1ccf078SCarlos Alberto Enciso ScopedPrinter W(outs());
261*c1ccf078SCarlos Alberto Enciso LVReaderHandler ReaderHandler(Objects, W, ReaderOptions);
262*c1ccf078SCarlos Alberto Enciso
263*c1ccf078SCarlos Alberto Enciso // Check logical elements properties.
264*c1ccf078SCarlos Alberto Enciso std::unique_ptr<LVReader> Reader =
265*c1ccf078SCarlos Alberto Enciso createReader(ReaderHandler, InputsDir, DwarfClang);
266*c1ccf078SCarlos Alberto Enciso checkElementProperties(Reader.get());
267*c1ccf078SCarlos Alberto Enciso }
268*c1ccf078SCarlos Alberto Enciso
269*c1ccf078SCarlos Alberto Enciso // Logical elements selection.
elementSelection(SmallString<128> & InputsDir)270*c1ccf078SCarlos Alberto Enciso void elementSelection(SmallString<128> &InputsDir) {
271*c1ccf078SCarlos Alberto Enciso // Reader options.
272*c1ccf078SCarlos Alberto Enciso LVOptions ReaderOptions;
273*c1ccf078SCarlos Alberto Enciso ReaderOptions.setAttributeOffset();
274*c1ccf078SCarlos Alberto Enciso ReaderOptions.setPrintAll();
275*c1ccf078SCarlos Alberto Enciso
276*c1ccf078SCarlos Alberto Enciso ReaderOptions.setSelectIgnoreCase();
277*c1ccf078SCarlos Alberto Enciso ReaderOptions.setSelectUseRegex();
278*c1ccf078SCarlos Alberto Enciso
279*c1ccf078SCarlos Alberto Enciso ReaderOptions.setReportList(); // Matched elements.
280*c1ccf078SCarlos Alberto Enciso ReaderOptions.setReportView(); // Parents for matched elements.
281*c1ccf078SCarlos Alberto Enciso
282*c1ccf078SCarlos Alberto Enciso // Add patterns.
283*c1ccf078SCarlos Alberto Enciso ReaderOptions.Select.Generic.insert("foo");
284*c1ccf078SCarlos Alberto Enciso ReaderOptions.Select.Generic.insert("movl[ \t]?%");
285*c1ccf078SCarlos Alberto Enciso ReaderOptions.Select.Generic.insert("INT[a-z]*");
286*c1ccf078SCarlos Alberto Enciso ReaderOptions.Select.Generic.insert("CONSTANT");
287*c1ccf078SCarlos Alberto Enciso
288*c1ccf078SCarlos Alberto Enciso ReaderOptions.resolveDependencies();
289*c1ccf078SCarlos Alberto Enciso
290*c1ccf078SCarlos Alberto Enciso std::vector<std::string> Objects;
291*c1ccf078SCarlos Alberto Enciso ScopedPrinter W(outs());
292*c1ccf078SCarlos Alberto Enciso LVReaderHandler ReaderHandler(Objects, W, ReaderOptions);
293*c1ccf078SCarlos Alberto Enciso
294*c1ccf078SCarlos Alberto Enciso // Check logical elements selection.
295*c1ccf078SCarlos Alberto Enciso std::unique_ptr<LVReader> Reader =
296*c1ccf078SCarlos Alberto Enciso createReader(ReaderHandler, InputsDir, DwarfGcc);
297*c1ccf078SCarlos Alberto Enciso checkElementSelection(Reader.get());
298*c1ccf078SCarlos Alberto Enciso }
299*c1ccf078SCarlos Alberto Enciso
300*c1ccf078SCarlos Alberto Enciso // Compare logical elements.
compareElements(SmallString<128> & InputsDir)301*c1ccf078SCarlos Alberto Enciso void compareElements(SmallString<128> &InputsDir) {
302*c1ccf078SCarlos Alberto Enciso // Reader options.
303*c1ccf078SCarlos Alberto Enciso LVOptions ReaderOptions;
304*c1ccf078SCarlos Alberto Enciso ReaderOptions.setAttributeOffset();
305*c1ccf078SCarlos Alberto Enciso ReaderOptions.setPrintLines();
306*c1ccf078SCarlos Alberto Enciso ReaderOptions.setPrintSymbols();
307*c1ccf078SCarlos Alberto Enciso ReaderOptions.setPrintTypes();
308*c1ccf078SCarlos Alberto Enciso ReaderOptions.setCompareLines();
309*c1ccf078SCarlos Alberto Enciso ReaderOptions.setCompareSymbols();
310*c1ccf078SCarlos Alberto Enciso ReaderOptions.setCompareTypes();
311*c1ccf078SCarlos Alberto Enciso
312*c1ccf078SCarlos Alberto Enciso ReaderOptions.resolveDependencies();
313*c1ccf078SCarlos Alberto Enciso
314*c1ccf078SCarlos Alberto Enciso std::vector<std::string> Objects;
315*c1ccf078SCarlos Alberto Enciso ScopedPrinter W(outs());
316*c1ccf078SCarlos Alberto Enciso LVReaderHandler ReaderHandler(Objects, W, ReaderOptions);
317*c1ccf078SCarlos Alberto Enciso
318*c1ccf078SCarlos Alberto Enciso // Check logical comparison.
319*c1ccf078SCarlos Alberto Enciso std::unique_ptr<LVReader> Reference =
320*c1ccf078SCarlos Alberto Enciso createReader(ReaderHandler, InputsDir, DwarfClang);
321*c1ccf078SCarlos Alberto Enciso std::unique_ptr<LVReader> Target =
322*c1ccf078SCarlos Alberto Enciso createReader(ReaderHandler, InputsDir, DwarfGcc);
323*c1ccf078SCarlos Alberto Enciso checkElementComparison(Reference.get(), Target.get());
324*c1ccf078SCarlos Alberto Enciso }
325*c1ccf078SCarlos Alberto Enciso
TEST(LogicalViewTest,DWARFReader)326*c1ccf078SCarlos Alberto Enciso TEST(LogicalViewTest, DWARFReader) {
327*c1ccf078SCarlos Alberto Enciso // Initialize targets and assembly printers/parsers.
328*c1ccf078SCarlos Alberto Enciso llvm::InitializeAllTargetInfos();
329*c1ccf078SCarlos Alberto Enciso llvm::InitializeAllTargetMCs();
330*c1ccf078SCarlos Alberto Enciso InitializeAllDisassemblers();
331*c1ccf078SCarlos Alberto Enciso
332*c1ccf078SCarlos Alberto Enciso llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded);
333*c1ccf078SCarlos Alberto Enciso
334*c1ccf078SCarlos Alberto Enciso // This test requires a x86-registered-target.
335*c1ccf078SCarlos Alberto Enciso Triple TT;
336*c1ccf078SCarlos Alberto Enciso TT.setArch(Triple::x86_64);
337*c1ccf078SCarlos Alberto Enciso TT.setVendor(Triple::UnknownVendor);
338*c1ccf078SCarlos Alberto Enciso TT.setOS(Triple::UnknownOS);
339*c1ccf078SCarlos Alberto Enciso
340*c1ccf078SCarlos Alberto Enciso std::string TargetLookupError;
341*c1ccf078SCarlos Alberto Enciso if (!TargetRegistry::lookupTarget(std::string(TT.str()), TargetLookupError))
342*c1ccf078SCarlos Alberto Enciso GTEST_SKIP();
343*c1ccf078SCarlos Alberto Enciso
344*c1ccf078SCarlos Alberto Enciso SmallString<128> InputsDir = unittest::getInputFileDirectory(TestMainArgv0);
345*c1ccf078SCarlos Alberto Enciso
346*c1ccf078SCarlos Alberto Enciso // Logical elements general properties and selection.
347*c1ccf078SCarlos Alberto Enciso elementProperties(InputsDir);
348*c1ccf078SCarlos Alberto Enciso elementSelection(InputsDir);
349*c1ccf078SCarlos Alberto Enciso
350*c1ccf078SCarlos Alberto Enciso // Compare logical elements.
351*c1ccf078SCarlos Alberto Enciso compareElements(InputsDir);
352*c1ccf078SCarlos Alberto Enciso }
353*c1ccf078SCarlos Alberto Enciso
354*c1ccf078SCarlos Alberto Enciso } // namespace
355