xref: /llvm-project/llvm/unittests/DebugInfo/PDB/NativeSymbolReuseTest.cpp (revision eb4c8608115c1c9af0fc8cb5b1e9f2bc960014ef)
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