xref: /llvm-project/llvm/unittests/DebugInfo/LogicalView/CodeViewReaderTest.cpp (revision 37e48e4a7360a6faf1b157e843160d9e65223890)
1e7950fceSCarlos Alberto Enciso //===- llvm/unittest/DebugInfo/LogicalView/CodeViewReaderTest.cpp ---------===//
2e7950fceSCarlos Alberto Enciso //
3e7950fceSCarlos Alberto Enciso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e7950fceSCarlos Alberto Enciso // See https://llvm.org/LICENSE.txt for license information.
5e7950fceSCarlos Alberto Enciso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e7950fceSCarlos Alberto Enciso //
7e7950fceSCarlos Alberto Enciso //===----------------------------------------------------------------------===//
8e7950fceSCarlos Alberto Enciso 
9e7950fceSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVCompare.h"
10e7950fceSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVLine.h"
11e7950fceSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVScope.h"
12e7950fceSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVSymbol.h"
13e7950fceSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVType.h"
14e7950fceSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/LVReaderHandler.h"
15e7950fceSCarlos Alberto Enciso #include "llvm/MC/TargetRegistry.h"
16e7950fceSCarlos Alberto Enciso #include "llvm/Support/COM.h"
17e7950fceSCarlos Alberto Enciso #include "llvm/Support/InitLLVM.h"
18e7950fceSCarlos Alberto Enciso #include "llvm/Support/ScopedPrinter.h"
19e7950fceSCarlos Alberto Enciso #include "llvm/Support/TargetSelect.h"
20e7950fceSCarlos Alberto Enciso #include "llvm/Support/ToolOutputFile.h"
21e7950fceSCarlos Alberto Enciso #include "llvm/Testing/Support/Error.h"
22e7950fceSCarlos Alberto Enciso 
23e7950fceSCarlos Alberto Enciso #include "gtest/gtest.h"
24e7950fceSCarlos Alberto Enciso 
25e7950fceSCarlos Alberto Enciso using namespace llvm;
26e7950fceSCarlos Alberto Enciso using namespace llvm::logicalview;
27e7950fceSCarlos Alberto Enciso 
28e7950fceSCarlos Alberto Enciso extern const char *TestMainArgv0;
29e7950fceSCarlos Alberto Enciso 
30e7950fceSCarlos Alberto Enciso namespace {
31e7950fceSCarlos Alberto Enciso 
32e7950fceSCarlos Alberto Enciso const char *CodeViewClang = "test-codeview-clang.o";
33e7950fceSCarlos Alberto Enciso const char *CodeViewMsvc = "test-codeview-msvc.o";
34*37e48e4aSaurelien35 const char *CodeViewMsvcLib = "test-codeview-msvc.lib";
35*37e48e4aSaurelien35 const char *CodeViewMsvcLibContentName =
36*37e48e4aSaurelien35     "test-codeview-msvc.lib(test-codeview-msvc.o)";
37e7950fceSCarlos Alberto Enciso const char *CodeViewPdbMsvc = "test-codeview-pdb-msvc.o";
38e7950fceSCarlos Alberto Enciso 
39e7950fceSCarlos Alberto Enciso // Helper function to get the first scope child from the given parent.
40e7950fceSCarlos Alberto Enciso LVScope *getFirstScopeChild(LVScope *Parent) {
41e7950fceSCarlos Alberto Enciso   EXPECT_NE(Parent, nullptr);
42e7950fceSCarlos Alberto Enciso   const LVScopes *Scopes = Parent->getScopes();
43e7950fceSCarlos Alberto Enciso   EXPECT_NE(Scopes, nullptr);
44e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Scopes->size(), 1u);
45e7950fceSCarlos Alberto Enciso 
46e7950fceSCarlos Alberto Enciso   LVScopes::const_iterator Iter = Scopes->begin();
47e7950fceSCarlos Alberto Enciso   LVScope *Child = *Iter;
48e7950fceSCarlos Alberto Enciso   EXPECT_NE(Child, nullptr);
49e7950fceSCarlos Alberto Enciso   return Child;
50e7950fceSCarlos Alberto Enciso }
51e7950fceSCarlos Alberto Enciso 
52e7950fceSCarlos Alberto Enciso // Helper function to create a reader.
53e7950fceSCarlos Alberto Enciso std::unique_ptr<LVReader> createReader(LVReaderHandler &ReaderHandler,
54e7950fceSCarlos Alberto Enciso                                        SmallString<128> &InputsDir,
55e7950fceSCarlos Alberto Enciso                                        StringRef Filename) {
56e7950fceSCarlos Alberto Enciso   SmallString<128> ObjectName(InputsDir);
57e7950fceSCarlos Alberto Enciso   llvm::sys::path::append(ObjectName, Filename);
58e7950fceSCarlos Alberto Enciso 
59e7950fceSCarlos Alberto Enciso   Expected<std::unique_ptr<LVReader>> ReaderOrErr =
60e7950fceSCarlos Alberto Enciso       ReaderHandler.createReader(std::string(ObjectName));
61e7950fceSCarlos Alberto Enciso   EXPECT_THAT_EXPECTED(ReaderOrErr, Succeeded());
62e7950fceSCarlos Alberto Enciso   std::unique_ptr<LVReader> Reader = std::move(*ReaderOrErr);
63e7950fceSCarlos Alberto Enciso   EXPECT_NE(Reader, nullptr);
64e7950fceSCarlos Alberto Enciso   return Reader;
65e7950fceSCarlos Alberto Enciso }
66e7950fceSCarlos Alberto Enciso 
67e7950fceSCarlos Alberto Enciso // Check the logical elements basic properties (Clang - Codeview).
68e7950fceSCarlos Alberto Enciso void checkElementPropertiesClangCodeview(LVReader *Reader) {
69e7950fceSCarlos Alberto Enciso   LVScopeRoot *Root = Reader->getScopesRoot();
70e7950fceSCarlos Alberto Enciso   LVScopeCompileUnit *CompileUnit =
71e7950fceSCarlos Alberto Enciso       static_cast<LVScopeCompileUnit *>(getFirstScopeChild(Root));
72e7950fceSCarlos Alberto Enciso   LVScopeFunction *Function =
73e7950fceSCarlos Alberto Enciso       static_cast<LVScopeFunction *>(getFirstScopeChild(CompileUnit));
74e7950fceSCarlos Alberto Enciso 
75e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Root->getFileFormatName(), "COFF-x86-64");
76e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Root->getName(), CodeViewClang);
77e7950fceSCarlos Alberto Enciso 
78e7950fceSCarlos Alberto Enciso   EXPECT_EQ(CompileUnit->getBaseAddress(), 0u);
795c9d82deSKazu Hirata   EXPECT_TRUE(CompileUnit->getProducer().starts_with("clang"));
80e7950fceSCarlos Alberto Enciso   EXPECT_EQ(CompileUnit->getName(), "test.cpp");
81e7950fceSCarlos Alberto Enciso 
82e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->lineCount(), 16u);
83e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->scopeCount(), 1u);
84e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->symbolCount(), 3u);
85e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->typeCount(), 1u);
86e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->rangeCount(), 1u);
87e7950fceSCarlos Alberto Enciso 
88e7950fceSCarlos Alberto Enciso   const LVLocations *Ranges = Function->getRanges();
89e7950fceSCarlos Alberto Enciso   ASSERT_NE(Ranges, nullptr);
90e7950fceSCarlos Alberto Enciso   ASSERT_EQ(Ranges->size(), 1u);
91e7950fceSCarlos Alberto Enciso   LVLocations::const_iterator IterLocation = Ranges->begin();
92e7950fceSCarlos Alberto Enciso   LVLocation *Location = (*IterLocation);
93e7950fceSCarlos Alberto Enciso   EXPECT_STREQ(Location->getIntervalInfo().c_str(),
94e7950fceSCarlos Alberto Enciso                "{Range} Lines 2:9 [0x0000000000:0x0000000046]");
95e7950fceSCarlos Alberto Enciso 
96e7950fceSCarlos Alberto Enciso   LVRange RangeList;
97e7950fceSCarlos Alberto Enciso   Function->getRanges(RangeList);
98e7950fceSCarlos Alberto Enciso 
99e7950fceSCarlos Alberto Enciso   const LVRangeEntries &RangeEntries = RangeList.getEntries();
100e7950fceSCarlos Alberto Enciso   ASSERT_EQ(RangeEntries.size(), 2u);
101e7950fceSCarlos Alberto Enciso   LVRangeEntries::const_iterator IterRanges = RangeEntries.cbegin();
102e7950fceSCarlos Alberto Enciso   LVRangeEntry RangeEntry = *IterRanges;
103e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.lower(), 0u);
104e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.upper(), 0x46u);
105e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
106e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getName(), "foo");
107e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getOffset(), 0u);
108e7950fceSCarlos Alberto Enciso 
109e7950fceSCarlos Alberto Enciso   ++IterRanges;
110e7950fceSCarlos Alberto Enciso   RangeEntry = *IterRanges;
111e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.lower(), 0x21u);
112e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.upper(), 0x35u);
113e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
114e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getName(), "foo::?");
115e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getOffset(), 0u);
116e7950fceSCarlos Alberto Enciso 
117e7950fceSCarlos Alberto Enciso   const LVPublicNames &PublicNames = CompileUnit->getPublicNames();
118e7950fceSCarlos Alberto Enciso   ASSERT_EQ(PublicNames.size(), 1u);
119e7950fceSCarlos Alberto Enciso   LVPublicNames::const_iterator IterNames = PublicNames.cbegin();
120e7950fceSCarlos Alberto Enciso   LVScope *Foo = (*IterNames).first;
121e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Foo->getName(), "foo");
122e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Foo->getLineNumber(), 0u);
123e7950fceSCarlos Alberto Enciso   LVNameInfo NameInfo = (*IterNames).second;
124e7950fceSCarlos Alberto Enciso   EXPECT_EQ(NameInfo.first, 0u);
125e7950fceSCarlos Alberto Enciso   EXPECT_EQ(NameInfo.second, 0x46u);
126e7950fceSCarlos Alberto Enciso 
127e7950fceSCarlos Alberto Enciso   // Lines (debug and assembler) for 'foo'.
128e7950fceSCarlos Alberto Enciso   const LVLines *Lines = Foo->getLines();
129e7950fceSCarlos Alberto Enciso   ASSERT_NE(Lines, nullptr);
130e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Lines->size(), 0x10u);
131e7950fceSCarlos Alberto Enciso }
132e7950fceSCarlos Alberto Enciso 
133e7950fceSCarlos Alberto Enciso // Check the logical elements basic properties (MSVC - Codeview).
134e7950fceSCarlos Alberto Enciso void checkElementPropertiesMsvcCodeview(LVReader *Reader) {
135e7950fceSCarlos Alberto Enciso   LVScopeRoot *Root = Reader->getScopesRoot();
136e7950fceSCarlos Alberto Enciso   LVScopeCompileUnit *CompileUnit =
137e7950fceSCarlos Alberto Enciso       static_cast<LVScopeCompileUnit *>(getFirstScopeChild(Root));
138e7950fceSCarlos Alberto Enciso   LVScopeFunction *Function =
139e7950fceSCarlos Alberto Enciso       static_cast<LVScopeFunction *>(getFirstScopeChild(CompileUnit));
140e7950fceSCarlos Alberto Enciso 
141e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Root->getFileFormatName(), "COFF-x86-64");
142e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Root->getName(), CodeViewMsvc);
143e7950fceSCarlos Alberto Enciso 
144e7950fceSCarlos Alberto Enciso   EXPECT_EQ(CompileUnit->getBaseAddress(), 0u);
1455c9d82deSKazu Hirata   EXPECT_TRUE(CompileUnit->getProducer().starts_with("Microsoft"));
146e7950fceSCarlos Alberto Enciso   EXPECT_EQ(CompileUnit->getName(), "test.cpp");
147e7950fceSCarlos Alberto Enciso 
148e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->lineCount(), 14u);
149e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->scopeCount(), 1u);
150e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->symbolCount(), 3u);
151e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->typeCount(), 0u);
152e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->rangeCount(), 1u);
153e7950fceSCarlos Alberto Enciso 
154e7950fceSCarlos Alberto Enciso   const LVLocations *Ranges = Function->getRanges();
155e7950fceSCarlos Alberto Enciso   ASSERT_NE(Ranges, nullptr);
156e7950fceSCarlos Alberto Enciso   ASSERT_EQ(Ranges->size(), 1u);
157e7950fceSCarlos Alberto Enciso   LVLocations::const_iterator IterLocation = Ranges->begin();
158e7950fceSCarlos Alberto Enciso   LVLocation *Location = (*IterLocation);
159e7950fceSCarlos Alberto Enciso   EXPECT_STREQ(Location->getIntervalInfo().c_str(),
160e7950fceSCarlos Alberto Enciso                "{Range} Lines 2:9 [0x0000000000:0x0000000031]");
161e7950fceSCarlos Alberto Enciso 
162e7950fceSCarlos Alberto Enciso   LVRange RangeList;
163e7950fceSCarlos Alberto Enciso   Function->getRanges(RangeList);
164e7950fceSCarlos Alberto Enciso 
165e7950fceSCarlos Alberto Enciso   const LVRangeEntries &RangeEntries = RangeList.getEntries();
166e7950fceSCarlos Alberto Enciso   ASSERT_EQ(RangeEntries.size(), 2u);
167e7950fceSCarlos Alberto Enciso   LVRangeEntries::const_iterator IterRanges = RangeEntries.cbegin();
168e7950fceSCarlos Alberto Enciso   LVRangeEntry RangeEntry = *IterRanges;
169e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.lower(), 0u);
170e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.upper(), 0x31u);
171e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
172e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getName(), "foo");
173e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getOffset(), 0u);
174e7950fceSCarlos Alberto Enciso 
175e7950fceSCarlos Alberto Enciso   ++IterRanges;
176e7950fceSCarlos Alberto Enciso   RangeEntry = *IterRanges;
177e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.lower(), 0x1bu);
178e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.upper(), 0x28u);
179e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
180e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getName(), "foo::?");
181e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getOffset(), 0u);
182e7950fceSCarlos Alberto Enciso 
183e7950fceSCarlos Alberto Enciso   const LVPublicNames &PublicNames = CompileUnit->getPublicNames();
184e7950fceSCarlos Alberto Enciso   ASSERT_EQ(PublicNames.size(), 1u);
185e7950fceSCarlos Alberto Enciso   LVPublicNames::const_iterator IterNames = PublicNames.cbegin();
186e7950fceSCarlos Alberto Enciso   LVScope *Foo = (*IterNames).first;
187e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Foo->getName(), "foo");
188e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Foo->getLineNumber(), 0u);
189e7950fceSCarlos Alberto Enciso   LVNameInfo NameInfo = (*IterNames).second;
190e7950fceSCarlos Alberto Enciso   EXPECT_EQ(NameInfo.first, 0u);
191e7950fceSCarlos Alberto Enciso   EXPECT_EQ(NameInfo.second, 0x31u);
192e7950fceSCarlos Alberto Enciso 
193e7950fceSCarlos Alberto Enciso   // Lines (debug and assembler) for 'foo'.
194e7950fceSCarlos Alberto Enciso   const LVLines *Lines = Foo->getLines();
195e7950fceSCarlos Alberto Enciso   ASSERT_NE(Lines, nullptr);
196e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Lines->size(), 0x0eu);
197e7950fceSCarlos Alberto Enciso }
198e7950fceSCarlos Alberto Enciso 
199*37e48e4aSaurelien35 // Check the logical elements basic properties (MSVC library - Codeview).
200*37e48e4aSaurelien35 void checkElementPropertiesMsvcLibraryCodeview(LVReader *Reader) {
201*37e48e4aSaurelien35   LVScopeRoot *Root = Reader->getScopesRoot();
202*37e48e4aSaurelien35   LVScopeCompileUnit *CompileUnit =
203*37e48e4aSaurelien35       static_cast<LVScopeCompileUnit *>(getFirstScopeChild(Root));
204*37e48e4aSaurelien35   LVScopeFunction *Function =
205*37e48e4aSaurelien35       static_cast<LVScopeFunction *>(getFirstScopeChild(CompileUnit));
206*37e48e4aSaurelien35 
207*37e48e4aSaurelien35   EXPECT_EQ(Root->getFileFormatName(), "COFF-x86-64");
208*37e48e4aSaurelien35   EXPECT_EQ(Root->getName(), CodeViewMsvcLibContentName);
209*37e48e4aSaurelien35 
210*37e48e4aSaurelien35   EXPECT_EQ(CompileUnit->getBaseAddress(), 0u);
211*37e48e4aSaurelien35   EXPECT_TRUE(CompileUnit->getProducer().starts_with("Microsoft"));
212*37e48e4aSaurelien35   EXPECT_EQ(CompileUnit->getName(), "test.cpp");
213*37e48e4aSaurelien35 
214*37e48e4aSaurelien35   EXPECT_EQ(Function->lineCount(), 14u);
215*37e48e4aSaurelien35   EXPECT_EQ(Function->scopeCount(), 1u);
216*37e48e4aSaurelien35   EXPECT_EQ(Function->symbolCount(), 3u);
217*37e48e4aSaurelien35   EXPECT_EQ(Function->typeCount(), 0u);
218*37e48e4aSaurelien35   EXPECT_EQ(Function->rangeCount(), 1u);
219*37e48e4aSaurelien35 
220*37e48e4aSaurelien35   const LVLocations *Ranges = Function->getRanges();
221*37e48e4aSaurelien35   ASSERT_NE(Ranges, nullptr);
222*37e48e4aSaurelien35   ASSERT_EQ(Ranges->size(), 1u);
223*37e48e4aSaurelien35   LVLocations::const_iterator IterLocation = Ranges->begin();
224*37e48e4aSaurelien35   LVLocation *Location = (*IterLocation);
225*37e48e4aSaurelien35   EXPECT_STREQ(Location->getIntervalInfo().c_str(),
226*37e48e4aSaurelien35                "{Range} Lines 2:9 [0x0000000000:0x0000000031]");
227*37e48e4aSaurelien35 
228*37e48e4aSaurelien35   LVRange RangeList;
229*37e48e4aSaurelien35   Function->getRanges(RangeList);
230*37e48e4aSaurelien35 
231*37e48e4aSaurelien35   const LVRangeEntries &RangeEntries = RangeList.getEntries();
232*37e48e4aSaurelien35   ASSERT_EQ(RangeEntries.size(), 2u);
233*37e48e4aSaurelien35   LVRangeEntries::const_iterator IterRanges = RangeEntries.cbegin();
234*37e48e4aSaurelien35   LVRangeEntry RangeEntry = *IterRanges;
235*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.lower(), 0u);
236*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.upper(), 0x31u);
237*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
238*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.scope()->getName(), "foo");
239*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.scope()->getOffset(), 0u);
240*37e48e4aSaurelien35 
241*37e48e4aSaurelien35   ++IterRanges;
242*37e48e4aSaurelien35   RangeEntry = *IterRanges;
243*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.lower(), 0x1bu);
244*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.upper(), 0x28u);
245*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
246*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.scope()->getName(), "foo::?");
247*37e48e4aSaurelien35   EXPECT_EQ(RangeEntry.scope()->getOffset(), 0u);
248*37e48e4aSaurelien35 
249*37e48e4aSaurelien35   const LVPublicNames &PublicNames = CompileUnit->getPublicNames();
250*37e48e4aSaurelien35   ASSERT_EQ(PublicNames.size(), 1u);
251*37e48e4aSaurelien35   LVPublicNames::const_iterator IterNames = PublicNames.cbegin();
252*37e48e4aSaurelien35   LVScope *Foo = (*IterNames).first;
253*37e48e4aSaurelien35   EXPECT_EQ(Foo->getName(), "foo");
254*37e48e4aSaurelien35   EXPECT_EQ(Foo->getLineNumber(), 0u);
255*37e48e4aSaurelien35   LVNameInfo NameInfo = (*IterNames).second;
256*37e48e4aSaurelien35   EXPECT_EQ(NameInfo.first, 0u);
257*37e48e4aSaurelien35   EXPECT_EQ(NameInfo.second, 0x31u);
258*37e48e4aSaurelien35 
259*37e48e4aSaurelien35   // Lines (debug and assembler) for 'foo'.
260*37e48e4aSaurelien35   const LVLines *Lines = Foo->getLines();
261*37e48e4aSaurelien35   ASSERT_NE(Lines, nullptr);
262*37e48e4aSaurelien35   EXPECT_EQ(Lines->size(), 0x0eu);
263*37e48e4aSaurelien35 }
264*37e48e4aSaurelien35 
265e7950fceSCarlos Alberto Enciso // Check the logical elements basic properties (MSVC - PDB).
266e7950fceSCarlos Alberto Enciso void checkElementPropertiesMsvcCodeviewPdb(LVReader *Reader) {
267e7950fceSCarlos Alberto Enciso   LVScopeRoot *Root = Reader->getScopesRoot();
268e7950fceSCarlos Alberto Enciso   LVScopeCompileUnit *CompileUnit =
269e7950fceSCarlos Alberto Enciso       static_cast<LVScopeCompileUnit *>(getFirstScopeChild(Root));
270e7950fceSCarlos Alberto Enciso   LVScopeFunction *Function =
271e7950fceSCarlos Alberto Enciso       static_cast<LVScopeFunction *>(getFirstScopeChild(CompileUnit));
272e7950fceSCarlos Alberto Enciso 
273e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Root->getFileFormatName(), "COFF-x86-64");
274e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Root->getName(), CodeViewPdbMsvc);
275e7950fceSCarlos Alberto Enciso 
276e7950fceSCarlos Alberto Enciso   EXPECT_EQ(CompileUnit->getBaseAddress(), 0u);
2775c9d82deSKazu Hirata   EXPECT_TRUE(CompileUnit->getProducer().starts_with("Microsoft"));
278e7950fceSCarlos Alberto Enciso   EXPECT_EQ(CompileUnit->getName(), "test.cpp");
279e7950fceSCarlos Alberto Enciso 
280e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->lineCount(), 14u);
281e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->scopeCount(), 1u);
282e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->symbolCount(), 3u);
283e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->typeCount(), 0u);
284e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Function->rangeCount(), 1u);
285e7950fceSCarlos Alberto Enciso 
286e7950fceSCarlos Alberto Enciso   const LVLocations *Ranges = Function->getRanges();
287e7950fceSCarlos Alberto Enciso   ASSERT_NE(Ranges, nullptr);
288e7950fceSCarlos Alberto Enciso   ASSERT_EQ(Ranges->size(), 1u);
289e7950fceSCarlos Alberto Enciso   LVLocations::const_iterator IterLocation = Ranges->begin();
290e7950fceSCarlos Alberto Enciso   LVLocation *Location = (*IterLocation);
291e7950fceSCarlos Alberto Enciso   EXPECT_STREQ(Location->getIntervalInfo().c_str(),
292e7950fceSCarlos Alberto Enciso                "{Range} Lines 2:9 [0x0000000000:0x0000000031]");
293e7950fceSCarlos Alberto Enciso 
294e7950fceSCarlos Alberto Enciso   LVRange RangeList;
295e7950fceSCarlos Alberto Enciso   Function->getRanges(RangeList);
296e7950fceSCarlos Alberto Enciso 
297e7950fceSCarlos Alberto Enciso   const LVRangeEntries &RangeEntries = RangeList.getEntries();
298e7950fceSCarlos Alberto Enciso   ASSERT_EQ(RangeEntries.size(), 2u);
299e7950fceSCarlos Alberto Enciso   LVRangeEntries::const_iterator IterRanges = RangeEntries.cbegin();
300e7950fceSCarlos Alberto Enciso   LVRangeEntry RangeEntry = *IterRanges;
301e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.lower(), 0u);
302e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.upper(), 0x31u);
303e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
304e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getName(), "foo");
305e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getOffset(), 0u);
306e7950fceSCarlos Alberto Enciso 
307e7950fceSCarlos Alberto Enciso   ++IterRanges;
308e7950fceSCarlos Alberto Enciso   RangeEntry = *IterRanges;
309e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.lower(), 0x1bu);
310e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.upper(), 0x28u);
311e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getLineNumber(), 0u);
312e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getName(), "foo::?");
313e7950fceSCarlos Alberto Enciso   EXPECT_EQ(RangeEntry.scope()->getOffset(), 0u);
314e7950fceSCarlos Alberto Enciso 
315e7950fceSCarlos Alberto Enciso   const LVPublicNames &PublicNames = CompileUnit->getPublicNames();
316e7950fceSCarlos Alberto Enciso   ASSERT_EQ(PublicNames.size(), 1u);
317e7950fceSCarlos Alberto Enciso   LVPublicNames::const_iterator IterNames = PublicNames.cbegin();
318e7950fceSCarlos Alberto Enciso   LVScope *Foo = (*IterNames).first;
319e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Foo->getName(), "foo");
320e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Foo->getLineNumber(), 0u);
321e7950fceSCarlos Alberto Enciso   LVNameInfo NameInfo = (*IterNames).second;
322e7950fceSCarlos Alberto Enciso   EXPECT_EQ(NameInfo.first, 0u);
323e7950fceSCarlos Alberto Enciso   EXPECT_EQ(NameInfo.second, 0x31u);
324e7950fceSCarlos Alberto Enciso 
325e7950fceSCarlos Alberto Enciso   // Lines (debug and assembler) for 'foo'.
326e7950fceSCarlos Alberto Enciso   const LVLines *Lines = Foo->getLines();
327e7950fceSCarlos Alberto Enciso   ASSERT_NE(Lines, nullptr);
328e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Lines->size(), 0x0eu);
329e7950fceSCarlos Alberto Enciso }
330e7950fceSCarlos Alberto Enciso 
331e7950fceSCarlos Alberto Enciso struct SelectionInfo {
332e7950fceSCarlos Alberto Enciso   const char *Name;
333e7950fceSCarlos Alberto Enciso   LVElementGetFunction Function;
334e7950fceSCarlos Alberto Enciso };
335e7950fceSCarlos Alberto Enciso 
336e7950fceSCarlos Alberto Enciso // Check the logical elements selection.
337e7950fceSCarlos Alberto Enciso void checkElementSelection(LVReader *Reader, std::vector<SelectionInfo> &Data,
338e7950fceSCarlos Alberto Enciso                            size_t Size) {
339e7950fceSCarlos Alberto Enciso   LVScopeRoot *Root = Reader->getScopesRoot();
340e7950fceSCarlos Alberto Enciso   LVScopeCompileUnit *CompileUnit =
341e7950fceSCarlos Alberto Enciso       static_cast<LVScopeCompileUnit *>(getFirstScopeChild(Root));
342e7950fceSCarlos Alberto Enciso 
343e7950fceSCarlos Alberto Enciso   // Get the matched elements.
344e7950fceSCarlos Alberto Enciso   LVElements MatchedElements = CompileUnit->getMatchedElements();
345e7950fceSCarlos Alberto Enciso   std::map<StringRef, LVElement *> MapElements;
346e7950fceSCarlos Alberto Enciso   for (LVElement *Element : MatchedElements)
347e7950fceSCarlos Alberto Enciso     MapElements[Element->getName()] = Element;
348e7950fceSCarlos Alberto Enciso   ASSERT_EQ(MapElements.size(), Size);
349e7950fceSCarlos Alberto Enciso 
350e7950fceSCarlos Alberto Enciso   std::map<StringRef, LVElement *>::iterator Iter = MapElements.begin();
351e7950fceSCarlos Alberto Enciso   for (const SelectionInfo &Entry : Data) {
352e7950fceSCarlos Alberto Enciso     // Get matched element.
353e7950fceSCarlos Alberto Enciso     EXPECT_NE(Iter, MapElements.end());
354e7950fceSCarlos Alberto Enciso     LVElement *Element = Iter->second;
355e7950fceSCarlos Alberto Enciso     ASSERT_NE(Element, nullptr);
356e7950fceSCarlos Alberto Enciso     EXPECT_NE(Element->getName().find(Entry.Name), StringRef::npos);
357e7950fceSCarlos Alberto Enciso     EXPECT_EQ((Element->*Entry.Function)(), 1u);
358e7950fceSCarlos Alberto Enciso     ++Iter;
359e7950fceSCarlos Alberto Enciso   }
360e7950fceSCarlos Alberto Enciso 
361e7950fceSCarlos Alberto Enciso   // Get the parents for the matched elements.
362e7950fceSCarlos Alberto Enciso   LVScopes MatchedScopes = CompileUnit->getMatchedScopes();
363e7950fceSCarlos Alberto Enciso   std::set<StringRef> SetScopes;
364e7950fceSCarlos Alberto Enciso   for (LVScope *Scope : MatchedScopes)
365e7950fceSCarlos Alberto Enciso     SetScopes.insert(Scope->getName());
366e7950fceSCarlos Alberto Enciso   ASSERT_EQ(SetScopes.size(), 3u);
367e7950fceSCarlos Alberto Enciso 
368e7950fceSCarlos Alberto Enciso   // Parents of selected elements.
369e7950fceSCarlos Alberto Enciso   std::set<StringRef>::iterator IterScope;
370e7950fceSCarlos Alberto Enciso   IterScope = SetScopes.find("foo");
371e7950fceSCarlos Alberto Enciso   EXPECT_NE(IterScope, SetScopes.end());
372e7950fceSCarlos Alberto Enciso   IterScope = SetScopes.find("foo::?");
373e7950fceSCarlos Alberto Enciso   EXPECT_NE(IterScope, SetScopes.end());
374e7950fceSCarlos Alberto Enciso   IterScope = SetScopes.find("test.cpp");
375e7950fceSCarlos Alberto Enciso   EXPECT_NE(IterScope, SetScopes.end());
376e7950fceSCarlos Alberto Enciso }
377e7950fceSCarlos Alberto Enciso 
378e7950fceSCarlos Alberto Enciso // Check the logical elements comparison.
379e7950fceSCarlos Alberto Enciso void checkElementComparison(LVReader *Reference, LVReader *Target) {
380e7950fceSCarlos Alberto Enciso   LVCompare Compare(nulls());
381e7950fceSCarlos Alberto Enciso   Error Err = Compare.execute(Reference, Target);
382e7950fceSCarlos Alberto Enciso   ASSERT_THAT_ERROR(std::move(Err), Succeeded());
383e7950fceSCarlos Alberto Enciso 
384e7950fceSCarlos Alberto Enciso   // Get comparison table.
385e7950fceSCarlos Alberto Enciso   LVPassTable PassTable = Compare.getPassTable();
386e7950fceSCarlos Alberto Enciso   ASSERT_EQ(PassTable.size(), 2u);
387e7950fceSCarlos Alberto Enciso 
388e7950fceSCarlos Alberto Enciso   LVReader *Reader;
389e7950fceSCarlos Alberto Enciso   LVElement *Element;
390e7950fceSCarlos Alberto Enciso   LVComparePass Pass;
391e7950fceSCarlos Alberto Enciso 
392e7950fceSCarlos Alberto Enciso   // Reference: Missing TypeDefinition 'INTEGER'
393e7950fceSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[0];
394e7950fceSCarlos Alberto Enciso   ASSERT_NE(Reader, nullptr);
395e7950fceSCarlos Alberto Enciso   ASSERT_NE(Element, nullptr);
396e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Reader, Reference);
397e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Element->getLevel(), 3u);
398e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Element->getLineNumber(), 0u);
399e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Element->getName(), "INTEGER");
400e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Missing);
401e7950fceSCarlos Alberto Enciso 
402e7950fceSCarlos Alberto Enciso   // Target: Added TypeDefinition 'INTEGER'
403e7950fceSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[1];
404e7950fceSCarlos Alberto Enciso   ASSERT_NE(Reader, nullptr);
405e7950fceSCarlos Alberto Enciso   ASSERT_NE(Element, nullptr);
406e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Reader, Target);
407e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Element->getLevel(), 4u);
408e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Element->getLineNumber(), 0u);
409e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Element->getName(), "INTEGER");
410e7950fceSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Added);
411e7950fceSCarlos Alberto Enciso }
412e7950fceSCarlos Alberto Enciso 
413e7950fceSCarlos Alberto Enciso // Logical elements properties.
414e7950fceSCarlos Alberto Enciso void elementProperties(SmallString<128> &InputsDir) {
415e7950fceSCarlos Alberto Enciso   // Reader options.
416e7950fceSCarlos Alberto Enciso   LVOptions ReaderOptions;
417e7950fceSCarlos Alberto Enciso   ReaderOptions.setAttributeOffset();
418e7950fceSCarlos Alberto Enciso   ReaderOptions.setAttributeFormat();
419e7950fceSCarlos Alberto Enciso   ReaderOptions.setAttributeFilename();
420e7950fceSCarlos Alberto Enciso   ReaderOptions.setAttributeProducer();
421e7950fceSCarlos Alberto Enciso   ReaderOptions.setAttributePublics();
422e7950fceSCarlos Alberto Enciso   ReaderOptions.setAttributeRange();
423e7950fceSCarlos Alberto Enciso   ReaderOptions.setAttributeLocation();
424e7950fceSCarlos Alberto Enciso   ReaderOptions.setPrintAll();
425e7950fceSCarlos Alberto Enciso   ReaderOptions.resolveDependencies();
426e7950fceSCarlos Alberto Enciso 
427e7950fceSCarlos Alberto Enciso   std::vector<std::string> Objects;
428e7950fceSCarlos Alberto Enciso   ScopedPrinter W(outs());
429e7950fceSCarlos Alberto Enciso   LVReaderHandler ReaderHandler(Objects, W, ReaderOptions);
430e7950fceSCarlos Alberto Enciso 
431e7950fceSCarlos Alberto Enciso   // Check logical elements properties.
432e7950fceSCarlos Alberto Enciso   {
433e7950fceSCarlos Alberto Enciso     std::unique_ptr<LVReader> Reader =
434e7950fceSCarlos Alberto Enciso         createReader(ReaderHandler, InputsDir, CodeViewClang);
435e7950fceSCarlos Alberto Enciso     checkElementPropertiesClangCodeview(Reader.get());
436e7950fceSCarlos Alberto Enciso   }
437e7950fceSCarlos Alberto Enciso   {
438e7950fceSCarlos Alberto Enciso     std::unique_ptr<LVReader> Reader =
439e7950fceSCarlos Alberto Enciso         createReader(ReaderHandler, InputsDir, CodeViewMsvc);
440e7950fceSCarlos Alberto Enciso     checkElementPropertiesMsvcCodeview(Reader.get());
441e7950fceSCarlos Alberto Enciso   }
442e7950fceSCarlos Alberto Enciso   {
443e7950fceSCarlos Alberto Enciso     std::unique_ptr<LVReader> Reader =
444*37e48e4aSaurelien35         createReader(ReaderHandler, InputsDir, CodeViewMsvcLib);
445*37e48e4aSaurelien35     checkElementPropertiesMsvcLibraryCodeview(Reader.get());
446*37e48e4aSaurelien35   }
447*37e48e4aSaurelien35   {
448*37e48e4aSaurelien35     std::unique_ptr<LVReader> Reader =
449e7950fceSCarlos Alberto Enciso         createReader(ReaderHandler, InputsDir, CodeViewPdbMsvc);
450e7950fceSCarlos Alberto Enciso     checkElementPropertiesMsvcCodeviewPdb(Reader.get());
451e7950fceSCarlos Alberto Enciso   }
452e7950fceSCarlos Alberto Enciso }
453e7950fceSCarlos Alberto Enciso 
454e7950fceSCarlos Alberto Enciso // Logical elements selection.
455e7950fceSCarlos Alberto Enciso void elementSelection(SmallString<128> &InputsDir) {
456e7950fceSCarlos Alberto Enciso   // Reader options.
457e7950fceSCarlos Alberto Enciso   LVOptions ReaderOptions;
458e7950fceSCarlos Alberto Enciso   ReaderOptions.setAttributeOffset();
459e7950fceSCarlos Alberto Enciso   ReaderOptions.setPrintAll();
460e7950fceSCarlos Alberto Enciso 
461e7950fceSCarlos Alberto Enciso   ReaderOptions.setSelectIgnoreCase();
462e7950fceSCarlos Alberto Enciso   ReaderOptions.setSelectUseRegex();
463e7950fceSCarlos Alberto Enciso 
464e7950fceSCarlos Alberto Enciso   ReaderOptions.setReportList(); // Matched elements.
465e7950fceSCarlos Alberto Enciso   ReaderOptions.setReportView(); // Parents for matched elements.
466e7950fceSCarlos Alberto Enciso 
467e7950fceSCarlos Alberto Enciso   // Add patterns.
468e7950fceSCarlos Alberto Enciso   ReaderOptions.Select.Generic.insert("foo");
469e7950fceSCarlos Alberto Enciso   ReaderOptions.Select.Generic.insert("movl[ \t]?%");
470e7950fceSCarlos Alberto Enciso   ReaderOptions.Select.Generic.insert("INT[a-z]*");
471e7950fceSCarlos Alberto Enciso   ReaderOptions.Select.Generic.insert("CONSTANT");
472e7950fceSCarlos Alberto Enciso 
473e7950fceSCarlos Alberto Enciso   ReaderOptions.resolveDependencies();
474e7950fceSCarlos Alberto Enciso 
475e7950fceSCarlos Alberto Enciso   std::vector<std::string> Objects;
476e7950fceSCarlos Alberto Enciso   ScopedPrinter W(outs());
477e7950fceSCarlos Alberto Enciso   LVReaderHandler ReaderHandler(Objects, W, ReaderOptions);
478e7950fceSCarlos Alberto Enciso 
479e7950fceSCarlos Alberto Enciso   // Check logical elements selection.
480e7950fceSCarlos Alberto Enciso   {
481e7950fceSCarlos Alberto Enciso     std::vector<SelectionInfo> DataClang = {
482e7950fceSCarlos Alberto Enciso         {"* const int", &LVElement::getIsType},
483e7950fceSCarlos Alberto Enciso         {"CONSTANT", &LVElement::getIsSymbol},
484e7950fceSCarlos Alberto Enciso         {"INTEGER", &LVElement::getIsType},
485e7950fceSCarlos Alberto Enciso         {"INTPTR", &LVElement::getIsType},
486e7950fceSCarlos Alberto Enciso         {"ParamPtr", &LVElement::getIsSymbol},
487e7950fceSCarlos Alberto Enciso         {"const int", &LVElement::getIsType},
488e7950fceSCarlos Alberto Enciso         {"foo", &LVElement::getIsScope},
489e7950fceSCarlos Alberto Enciso         {"foo::?", &LVElement::getIsScope},
490e7950fceSCarlos Alberto Enciso         {"int", &LVElement::getIsType},
491e7950fceSCarlos Alberto Enciso         {"movl", &LVElement::getIsLine},
492e7950fceSCarlos Alberto Enciso         {"movl", &LVElement::getIsLine}};
493e7950fceSCarlos Alberto Enciso     std::unique_ptr<LVReader> Reader =
494e7950fceSCarlos Alberto Enciso         createReader(ReaderHandler, InputsDir, CodeViewClang);
495e7950fceSCarlos Alberto Enciso     checkElementSelection(Reader.get(), DataClang, DataClang.size());
496e7950fceSCarlos Alberto Enciso   }
497e7950fceSCarlos Alberto Enciso   {
498e7950fceSCarlos Alberto Enciso     std::vector<SelectionInfo> DataMsvc = {
499e7950fceSCarlos Alberto Enciso         {"* const int", &LVElement::getIsType},
500e7950fceSCarlos Alberto Enciso         {"CONSTANT", &LVElement::getIsSymbol},
501e7950fceSCarlos Alberto Enciso         {"INTEGER", &LVElement::getIsType},
502e7950fceSCarlos Alberto Enciso         {"INTPTR", &LVElement::getIsType},
503e7950fceSCarlos Alberto Enciso         {"ParamPtr", &LVElement::getIsSymbol},
504e7950fceSCarlos Alberto Enciso         {"const int", &LVElement::getIsType},
505e7950fceSCarlos Alberto Enciso         {"foo", &LVElement::getIsScope},
506e7950fceSCarlos Alberto Enciso         {"foo::?", &LVElement::getIsScope},
507e7950fceSCarlos Alberto Enciso         {"int", &LVElement::getIsType},
508e7950fceSCarlos Alberto Enciso         {"movl", &LVElement::getIsLine}};
509e7950fceSCarlos Alberto Enciso     std::unique_ptr<LVReader> Reader =
510e7950fceSCarlos Alberto Enciso         createReader(ReaderHandler, InputsDir, CodeViewMsvc);
511e7950fceSCarlos Alberto Enciso     checkElementSelection(Reader.get(), DataMsvc, DataMsvc.size());
512e7950fceSCarlos Alberto Enciso   }
513e7950fceSCarlos Alberto Enciso }
514e7950fceSCarlos Alberto Enciso 
515e7950fceSCarlos Alberto Enciso // Compare logical elements.
516e7950fceSCarlos Alberto Enciso void compareElements(SmallString<128> &InputsDir) {
517e7950fceSCarlos Alberto Enciso   // Reader options.
518e7950fceSCarlos Alberto Enciso   LVOptions ReaderOptions;
519e7950fceSCarlos Alberto Enciso   ReaderOptions.setAttributeOffset();
520e7950fceSCarlos Alberto Enciso   ReaderOptions.setPrintLines();
521e7950fceSCarlos Alberto Enciso   ReaderOptions.setPrintSymbols();
522e7950fceSCarlos Alberto Enciso   ReaderOptions.setPrintTypes();
523e7950fceSCarlos Alberto Enciso   ReaderOptions.setCompareLines();
524e7950fceSCarlos Alberto Enciso   ReaderOptions.setCompareSymbols();
525e7950fceSCarlos Alberto Enciso   ReaderOptions.setCompareTypes();
526e7950fceSCarlos Alberto Enciso 
527e7950fceSCarlos Alberto Enciso   ReaderOptions.resolveDependencies();
528e7950fceSCarlos Alberto Enciso 
529e7950fceSCarlos Alberto Enciso   std::vector<std::string> Objects;
530e7950fceSCarlos Alberto Enciso   ScopedPrinter W(outs());
531e7950fceSCarlos Alberto Enciso   LVReaderHandler ReaderHandler(Objects, W, ReaderOptions);
532e7950fceSCarlos Alberto Enciso 
533e7950fceSCarlos Alberto Enciso   // Check logical comparison.
534e7950fceSCarlos Alberto Enciso   std::unique_ptr<LVReader> Reference =
535e7950fceSCarlos Alberto Enciso       createReader(ReaderHandler, InputsDir, CodeViewClang);
536e7950fceSCarlos Alberto Enciso   std::unique_ptr<LVReader> Target =
537e7950fceSCarlos Alberto Enciso       createReader(ReaderHandler, InputsDir, CodeViewMsvc);
538e7950fceSCarlos Alberto Enciso   checkElementComparison(Reference.get(), Target.get());
539e7950fceSCarlos Alberto Enciso }
540e7950fceSCarlos Alberto Enciso 
541e7950fceSCarlos Alberto Enciso TEST(LogicalViewTest, CodeViewReader) {
542e7950fceSCarlos Alberto Enciso   // Initialize targets and assembly printers/parsers.
543e7950fceSCarlos Alberto Enciso   llvm::InitializeAllTargetInfos();
544e7950fceSCarlos Alberto Enciso   llvm::InitializeAllTargetMCs();
545e7950fceSCarlos Alberto Enciso   InitializeAllDisassemblers();
546e7950fceSCarlos Alberto Enciso 
547e7950fceSCarlos Alberto Enciso   llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded);
548e7950fceSCarlos Alberto Enciso 
549e7950fceSCarlos Alberto Enciso   // This test requires a x86-registered-target.
550e7950fceSCarlos Alberto Enciso   Triple TT;
551e7950fceSCarlos Alberto Enciso   TT.setArch(Triple::x86_64);
552e7950fceSCarlos Alberto Enciso   TT.setVendor(Triple::UnknownVendor);
553e7950fceSCarlos Alberto Enciso   TT.setOS(Triple::UnknownOS);
554e7950fceSCarlos Alberto Enciso 
555e7950fceSCarlos Alberto Enciso   std::string TargetLookupError;
556e7950fceSCarlos Alberto Enciso   if (!TargetRegistry::lookupTarget(std::string(TT.str()), TargetLookupError))
557e7950fceSCarlos Alberto Enciso     return;
558e7950fceSCarlos Alberto Enciso 
559e7950fceSCarlos Alberto Enciso   SmallString<128> InputsDir = unittest::getInputFileDirectory(TestMainArgv0);
560e7950fceSCarlos Alberto Enciso 
561e7950fceSCarlos Alberto Enciso   // Logical elements general properties and selection.
562e7950fceSCarlos Alberto Enciso   elementProperties(InputsDir);
563e7950fceSCarlos Alberto Enciso   elementSelection(InputsDir);
564e7950fceSCarlos Alberto Enciso 
565e7950fceSCarlos Alberto Enciso   // Compare logical elements.
566e7950fceSCarlos Alberto Enciso   compareElements(InputsDir);
567e7950fceSCarlos Alberto Enciso }
568e7950fceSCarlos Alberto Enciso 
569e7950fceSCarlos Alberto Enciso } // namespace
570