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
TEST(NativeSymbolReuseTest,GlobalSymbolReuse)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
TEST(NativeSymbolReuseTest,CompilandSymbolReuse)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
TEST(NativeSymbolReuseTest,CompilandSymbolReuseBackwards)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