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