1 //===- NativeSymbolReuseTest.cpp ------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/DebugInfo/PDB/PDB.h" 10 11 #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h" 12 #include "llvm/DebugInfo/PDB/IPDBLineNumber.h" 13 #include "llvm/DebugInfo/PDB/IPDBSession.h" 14 #include "llvm/DebugInfo/PDB/Native/NativeSession.h" 15 #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" 16 #include "llvm/DebugInfo/PDB/PDBSymbolExe.h" 17 #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h" 18 #include "llvm/Support/Path.h" 19 20 #include "llvm/Testing/Support/Error.h" 21 #include "llvm/Testing/Support/SupportHelpers.h" 22 23 #include "gtest/gtest.h" 24 25 using namespace llvm; 26 using namespace llvm::pdb; 27 28 extern const char *TestMainArgv0; 29 30 TEST(NativeSymbolReuseTest, GlobalSymbolReuse) { 31 SmallString<128> InputsDir = unittest::getInputFileDirectory(TestMainArgv0); 32 llvm::sys::path::append(InputsDir, "empty.pdb"); 33 34 std::unique_ptr<IPDBSession> S; 35 Error E = pdb::loadDataForPDB(PDB_ReaderType::Native, InputsDir, S); 36 37 ASSERT_THAT_ERROR(std::move(E), Succeeded()); 38 39 SymIndexId GlobalId; 40 { 41 auto GS1 = S->getGlobalScope(); 42 auto GS2 = S->getGlobalScope(); 43 44 GlobalId = GS1->getSymIndexId(); 45 SymIndexId Id2 = GS1->getSymIndexId(); 46 EXPECT_EQ(GlobalId, Id2); 47 } 48 49 { 50 auto GS3 = S->getGlobalScope(); 51 52 SymIndexId Id3 = GS3->getSymIndexId(); 53 EXPECT_EQ(GlobalId, Id3); 54 } 55 } 56 57 TEST(NativeSymbolReuseTest, CompilandSymbolReuse) { 58 SmallString<128> InputsDir = unittest::getInputFileDirectory(TestMainArgv0); 59 llvm::sys::path::append(InputsDir, "empty.pdb"); 60 61 std::unique_ptr<IPDBSession> S; 62 Error E = pdb::loadDataForPDB(PDB_ReaderType::Native, InputsDir, S); 63 64 ASSERT_THAT_ERROR(std::move(E), Succeeded()); 65 66 auto GS = S->getGlobalScope(); 67 68 std::vector<SymIndexId> CompilandIds; 69 { 70 auto Compilands = GS->findAllChildren<PDBSymbolCompiland>(); 71 ASSERT_NE(nullptr, Compilands); 72 ASSERT_EQ(2U, Compilands->getChildCount()); 73 std::vector<SymIndexId> Ids2; 74 75 // First try resetting the enumerator, then try destroying the enumerator 76 // and constructing another one. 77 while (auto Compiland = Compilands->getNext()) 78 CompilandIds.push_back(Compiland->getSymIndexId()); 79 Compilands->reset(); 80 while (auto Compiland = Compilands->getNext()) 81 Ids2.push_back(Compiland->getSymIndexId()); 82 83 EXPECT_EQ(CompilandIds, Ids2); 84 } 85 86 { 87 auto Compilands = GS->findAllChildren<PDBSymbolCompiland>(); 88 ASSERT_NE(nullptr, Compilands); 89 ASSERT_EQ(2U, Compilands->getChildCount()); 90 91 std::vector<SymIndexId> Ids3; 92 while (auto Compiland = Compilands->getNext()) 93 Ids3.push_back(Compiland->getSymIndexId()); 94 95 EXPECT_EQ(CompilandIds, Ids3); 96 } 97 } 98 99 TEST(NativeSymbolReuseTest, CompilandSymbolReuseBackwards) { 100 SmallString<128> InputsDir = unittest::getInputFileDirectory(TestMainArgv0); 101 llvm::sys::path::append(InputsDir, "empty.pdb"); 102 103 std::unique_ptr<IPDBSession> S; 104 Error E = pdb::loadDataForPDB(PDB_ReaderType::Native, InputsDir, S); 105 106 ASSERT_THAT_ERROR(std::move(E), Succeeded()); 107 108 auto GS = S->getGlobalScope(); 109 110 // This time do the first iteration backwards, and make sure that when you 111 // then iterate them forwards, the IDs come out in reverse. 112 std::vector<SymIndexId> CompilandIds; 113 { 114 auto Compilands = GS->findAllChildren<PDBSymbolCompiland>(); 115 ASSERT_NE(nullptr, Compilands); 116 ASSERT_EQ(2U, Compilands->getChildCount()); 117 118 std::vector<SymIndexId> Ids2; 119 120 for (int I = Compilands->getChildCount() - 1; I >= 0; --I) { 121 auto Compiland = Compilands->getChildAtIndex(I); 122 CompilandIds.push_back(Compiland->getSymIndexId()); 123 } 124 125 while (auto Compiland = Compilands->getNext()) 126 Ids2.push_back(Compiland->getSymIndexId()); 127 128 auto ReversedIter = llvm::reverse(Ids2); 129 std::vector<SymIndexId> Reversed{ReversedIter.begin(), ReversedIter.end()}; 130 EXPECT_EQ(CompilandIds, Reversed); 131 } 132 } 133