180814287SRaphael Isemann //===-- PythonDataObjectsTests.cpp ----------------------------------------===//
274e08ca0SZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
674e08ca0SZachary Turner //
774e08ca0SZachary Turner //===----------------------------------------------------------------------===//
874e08ca0SZachary Turner
974e08ca0SZachary Turner #include "gtest/gtest.h"
1074e08ca0SZachary Turner
1174e08ca0SZachary Turner #include "llvm/ADT/STLExtras.h"
1242dff790SZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolData.h"
1342dff790SZachary Turner #include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
1474e08ca0SZachary Turner #include "llvm/Support/FileSystem.h"
1574e08ca0SZachary Turner #include "llvm/Support/Path.h"
163a3ca963SPavel Labath #include "llvm/Testing/Support/Error.h"
1774e08ca0SZachary Turner
187ed3e22fSPavel Labath #include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h"
197ed3e22fSPavel Labath #include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
207ed3e22fSPavel Labath #include "Plugins/SymbolFile/PDB/SymbolFilePDB.h"
218be30215SAlex Langford #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
222da1b597SPavel Labath #include "TestingSupport/TestUtilities.h"
2374e08ca0SZachary Turner #include "lldb/Core/Address.h"
2474e08ca0SZachary Turner #include "lldb/Core/Module.h"
2574e08ca0SZachary Turner #include "lldb/Core/ModuleSpec.h"
2646376966SJonas Devlieghere #include "lldb/Host/FileSystem.h"
2774e08ca0SZachary Turner #include "lldb/Host/HostInfo.h"
2874e08ca0SZachary Turner #include "lldb/Symbol/CompileUnit.h"
2974e08ca0SZachary Turner #include "lldb/Symbol/LineTable.h"
306db975b7SPavel Labath #include "lldb/Symbol/TypeMap.h"
312da1b597SPavel Labath #include "lldb/Utility/ArchSpec.h"
325713a05bSZachary Turner #include "lldb/Utility/FileSpec.h"
3374e08ca0SZachary Turner
348b98f12aSMartin Storsjo #if defined(_WIN32)
3542dff790SZachary Turner #include "lldb/Host/windows/windows.h"
3674e08ca0SZachary Turner #include <objbase.h>
3774e08ca0SZachary Turner #endif
3874e08ca0SZachary Turner
3942dff790SZachary Turner #include <algorithm>
4042dff790SZachary Turner
4174e08ca0SZachary Turner using namespace lldb_private;
4274e08ca0SZachary Turner
43b9c1b51eSKate Stone class SymbolFilePDBTests : public testing::Test {
4474e08ca0SZachary Turner public:
SetUp()45b9c1b51eSKate Stone void SetUp() override {
4642dff790SZachary Turner // Initialize and TearDown the plugin every time, so we get a brand new
4742dff790SZachary Turner // AST every time so that modifications to the AST from each test don't
4842dff790SZachary Turner // leak into the next test.
498b98f12aSMartin Storsjo #if defined(_WIN32)
5074e08ca0SZachary Turner ::CoInitializeEx(nullptr, COINIT_MULTITHREADED);
5174e08ca0SZachary Turner #endif
5274e08ca0SZachary Turner
5346376966SJonas Devlieghere FileSystem::Initialize();
5442dff790SZachary Turner HostInfo::Initialize();
5574e08ca0SZachary Turner ObjectFilePECOFF::Initialize();
5674e08ca0SZachary Turner SymbolFileDWARF::Initialize();
576e3b0cc2SRaphael Isemann TypeSystemClang::Initialize();
5874e08ca0SZachary Turner SymbolFilePDB::Initialize();
5974e08ca0SZachary Turner
60ef9fc29dSPavel Labath m_pdb_test_exe = GetInputFilePath("test-pdb.exe");
61ef9fc29dSPavel Labath m_types_test_exe = GetInputFilePath("test-pdb-types.exe");
6274e08ca0SZachary Turner }
6374e08ca0SZachary Turner
TearDown()64b9c1b51eSKate Stone void TearDown() override {
6542dff790SZachary Turner SymbolFilePDB::Terminate();
666e3b0cc2SRaphael Isemann TypeSystemClang::Initialize();
6742dff790SZachary Turner SymbolFileDWARF::Terminate();
6842dff790SZachary Turner ObjectFilePECOFF::Terminate();
6942dff790SZachary Turner HostInfo::Terminate();
7046376966SJonas Devlieghere FileSystem::Terminate();
7142dff790SZachary Turner
728b98f12aSMartin Storsjo #if defined(_WIN32)
7374e08ca0SZachary Turner ::CoUninitialize();
7474e08ca0SZachary Turner #endif
7574e08ca0SZachary Turner }
7674e08ca0SZachary Turner
7774e08ca0SZachary Turner protected:
787ed3e22fSPavel Labath std::string m_pdb_test_exe;
797ed3e22fSPavel Labath std::string m_types_test_exe;
8074e08ca0SZachary Turner
FileSpecMatchesAsBaseOrFull(const FileSpec & left,const FileSpec & right) const81b9c1b51eSKate Stone bool FileSpecMatchesAsBaseOrFull(const FileSpec &left,
82b9c1b51eSKate Stone const FileSpec &right) const {
8374e08ca0SZachary Turner // If the filenames don't match, the paths can't be equal
8474e08ca0SZachary Turner if (!left.FileEquals(right))
8574e08ca0SZachary Turner return false;
8674e08ca0SZachary Turner // If BOTH have a directory, also compare the directories.
8774e08ca0SZachary Turner if (left.GetDirectory() && right.GetDirectory())
8874e08ca0SZachary Turner return left.DirectoryEquals(right);
8974e08ca0SZachary Turner
9074e08ca0SZachary Turner // If one has a directory but not the other, they match.
9174e08ca0SZachary Turner return true;
9274e08ca0SZachary Turner }
9374e08ca0SZachary Turner
VerifyLineEntry(lldb::ModuleSP module,const SymbolContext & sc,const FileSpec & spec,LineTable & lt,uint32_t line,lldb::addr_t addr)94b9c1b51eSKate Stone void VerifyLineEntry(lldb::ModuleSP module, const SymbolContext &sc,
95b9c1b51eSKate Stone const FileSpec &spec, LineTable <, uint32_t line,
96b9c1b51eSKate Stone lldb::addr_t addr) {
9774e08ca0SZachary Turner LineEntry entry;
9874e08ca0SZachary Turner Address address;
9974e08ca0SZachary Turner EXPECT_TRUE(module->ResolveFileAddress(addr, address));
10074e08ca0SZachary Turner
10174e08ca0SZachary Turner EXPECT_TRUE(lt.FindLineEntryByAddress(address, entry));
10274e08ca0SZachary Turner EXPECT_EQ(line, entry.line);
10374e08ca0SZachary Turner EXPECT_EQ(address, entry.range.GetBaseAddress());
10474e08ca0SZachary Turner
10574e08ca0SZachary Turner EXPECT_TRUE(FileSpecMatchesAsBaseOrFull(spec, entry.file));
10674e08ca0SZachary Turner }
10774e08ca0SZachary Turner
ContainsCompileUnit(const SymbolContextList & sc_list,const FileSpec & spec) const108b9c1b51eSKate Stone bool ContainsCompileUnit(const SymbolContextList &sc_list,
109b9c1b51eSKate Stone const FileSpec &spec) const {
110b9c1b51eSKate Stone for (size_t i = 0; i < sc_list.GetSize(); ++i) {
11174e08ca0SZachary Turner const SymbolContext &sc = sc_list[i];
112656a8123SPavel Labath if (FileSpecMatchesAsBaseOrFull(sc.comp_unit->GetPrimaryFile(), spec))
11374e08ca0SZachary Turner return true;
11474e08ca0SZachary Turner }
11574e08ca0SZachary Turner return false;
11674e08ca0SZachary Turner }
11742dff790SZachary Turner
GetGlobalConstantInteger(llvm::pdb::IPDBSession & session,llvm::StringRef var) const1180a51bfb8SPavel Labath uint64_t GetGlobalConstantInteger(llvm::pdb::IPDBSession &session,
119b9c1b51eSKate Stone llvm::StringRef var) const {
12042dff790SZachary Turner auto global = session.getGlobalScope();
121d86bc2afSPavel Labath auto results =
122b9c1b51eSKate Stone global->findChildren(llvm::pdb::PDB_SymType::Data, var,
123b9c1b51eSKate Stone llvm::pdb::PDB_NameSearchFlags::NS_Default);
12442dff790SZachary Turner uint32_t count = results->getChildCount();
12542dff790SZachary Turner if (count == 0)
12642dff790SZachary Turner return -1;
12742dff790SZachary Turner
12842dff790SZachary Turner auto item = results->getChildAtIndex(0);
129d86bc2afSPavel Labath auto symbol = llvm::dyn_cast<llvm::pdb::PDBSymbolData>(item.get());
13042dff790SZachary Turner if (!symbol)
13142dff790SZachary Turner return -1;
132d86bc2afSPavel Labath llvm::pdb::Variant value = symbol->getValue();
133b9c1b51eSKate Stone switch (value.Type) {
134d86bc2afSPavel Labath case llvm::pdb::PDB_VariantType::Int16:
13542dff790SZachary Turner return value.Value.Int16;
136d86bc2afSPavel Labath case llvm::pdb::PDB_VariantType::Int32:
13742dff790SZachary Turner return value.Value.Int32;
138d86bc2afSPavel Labath case llvm::pdb::PDB_VariantType::UInt16:
13942dff790SZachary Turner return value.Value.UInt16;
140d86bc2afSPavel Labath case llvm::pdb::PDB_VariantType::UInt32:
14142dff790SZachary Turner return value.Value.UInt32;
14242dff790SZachary Turner default:
14342dff790SZachary Turner return 0;
14442dff790SZachary Turner }
14542dff790SZachary Turner }
14674e08ca0SZachary Turner };
14774e08ca0SZachary Turner
TEST_F(SymbolFilePDBTests,TestAbilitiesForPDB)14895e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestAbilitiesForPDB) {
14974e08ca0SZachary Turner // Test that when we have PDB debug info, SymbolFilePDB is used.
150513472a7SZachary Turner FileSpec fspec(m_pdb_test_exe);
15174e08ca0SZachary Turner ArchSpec aspec("i686-pc-windows");
15274e08ca0SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
15374e08ca0SZachary Turner
154959e6034SPavel Labath SymbolFile *symfile = module->GetSymbolFile();
15574e08ca0SZachary Turner EXPECT_NE(nullptr, symfile);
156*49481b53SPavel Labath EXPECT_EQ(symfile->GetPluginName(), SymbolFilePDB::GetPluginNameStatic());
15774e08ca0SZachary Turner
1581f8552abSAaron Smith uint32_t expected_abilities = SymbolFile::kAllAbilities;
15974e08ca0SZachary Turner EXPECT_EQ(expected_abilities, symfile->CalculateAbilities());
16074e08ca0SZachary Turner }
16174e08ca0SZachary Turner
TEST_F(SymbolFilePDBTests,TestResolveSymbolContextBasename)16295e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestResolveSymbolContextBasename) {
163b9c1b51eSKate Stone // Test that attempting to call ResolveSymbolContext with only a basename
164b9c1b51eSKate Stone // finds all full paths
16574e08ca0SZachary Turner // with the same basename
166513472a7SZachary Turner FileSpec fspec(m_pdb_test_exe);
16774e08ca0SZachary Turner ArchSpec aspec("i686-pc-windows");
16874e08ca0SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
16974e08ca0SZachary Turner
170959e6034SPavel Labath SymbolFile *symfile = module->GetSymbolFile();
17174e08ca0SZachary Turner
172513472a7SZachary Turner FileSpec header_spec("test-pdb.cpp");
17374e08ca0SZachary Turner SymbolContextList sc_list;
17430fcdf0bSMed Ismail Bennani SourceLocationSpec location_spec(header_spec, /*line=*/0);
175b9c1b51eSKate Stone uint32_t result_count = symfile->ResolveSymbolContext(
17630fcdf0bSMed Ismail Bennani location_spec, lldb::eSymbolContextCompUnit, sc_list);
177d81b2ccbSPavel Labath EXPECT_EQ(1u, result_count);
17874e08ca0SZachary Turner EXPECT_TRUE(ContainsCompileUnit(sc_list, header_spec));
17974e08ca0SZachary Turner }
18074e08ca0SZachary Turner
TEST_F(SymbolFilePDBTests,TestResolveSymbolContextFullPath)18195e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestResolveSymbolContextFullPath) {
182b9c1b51eSKate Stone // Test that attempting to call ResolveSymbolContext with a full path only
183b9c1b51eSKate Stone // finds the one source
18474e08ca0SZachary Turner // file that matches the full path.
185513472a7SZachary Turner FileSpec fspec(m_pdb_test_exe);
18674e08ca0SZachary Turner ArchSpec aspec("i686-pc-windows");
18774e08ca0SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
18874e08ca0SZachary Turner
189959e6034SPavel Labath SymbolFile *symfile = module->GetSymbolFile();
19074e08ca0SZachary Turner
191b9c1b51eSKate Stone FileSpec header_spec(
192513472a7SZachary Turner R"spec(D:\src\llvm\tools\lldb\unittests\SymbolFile\PDB\Inputs\test-pdb.cpp)spec");
19374e08ca0SZachary Turner SymbolContextList sc_list;
19430fcdf0bSMed Ismail Bennani SourceLocationSpec location_spec(header_spec, /*line=*/0);
195b9c1b51eSKate Stone uint32_t result_count = symfile->ResolveSymbolContext(
19630fcdf0bSMed Ismail Bennani location_spec, lldb::eSymbolContextCompUnit, sc_list);
197d81b2ccbSPavel Labath EXPECT_GE(1u, result_count);
19874e08ca0SZachary Turner EXPECT_TRUE(ContainsCompileUnit(sc_list, header_spec));
19974e08ca0SZachary Turner }
20074e08ca0SZachary Turner
TEST_F(SymbolFilePDBTests,TestLookupOfHeaderFileWithInlines)20180ed0fd6SAaron Smith TEST_F(SymbolFilePDBTests, TestLookupOfHeaderFileWithInlines) {
202b9c1b51eSKate Stone // Test that when looking up a header file via ResolveSymbolContext (i.e. a
203b9c1b51eSKate Stone // file that was not by itself
204b9c1b51eSKate Stone // compiled, but only contributes to the combined code of other source files),
205b9c1b51eSKate Stone // a SymbolContext is returned
20674e08ca0SZachary Turner // for each compiland which has line contributions from the requested header.
207513472a7SZachary Turner FileSpec fspec(m_pdb_test_exe);
20874e08ca0SZachary Turner ArchSpec aspec("i686-pc-windows");
20974e08ca0SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
21074e08ca0SZachary Turner
211959e6034SPavel Labath SymbolFile *symfile = module->GetSymbolFile();
21274e08ca0SZachary Turner
213513472a7SZachary Turner FileSpec header_specs[] = {FileSpec("test-pdb.h"),
214513472a7SZachary Turner FileSpec("test-pdb-nested.h")};
215513472a7SZachary Turner FileSpec main_cpp_spec("test-pdb.cpp");
216513472a7SZachary Turner FileSpec alt_cpp_spec("test-pdb-alt.cpp");
217b9c1b51eSKate Stone for (const auto &hspec : header_specs) {
21874e08ca0SZachary Turner SymbolContextList sc_list;
21930fcdf0bSMed Ismail Bennani SourceLocationSpec location_spec(hspec, /*line=*/0, /*column=*/llvm::None,
22030fcdf0bSMed Ismail Bennani /*check_inlines=*/true);
221b9c1b51eSKate Stone uint32_t result_count = symfile->ResolveSymbolContext(
22230fcdf0bSMed Ismail Bennani location_spec, lldb::eSymbolContextCompUnit, sc_list);
223d81b2ccbSPavel Labath EXPECT_EQ(2u, result_count);
22474e08ca0SZachary Turner EXPECT_TRUE(ContainsCompileUnit(sc_list, main_cpp_spec));
22574e08ca0SZachary Turner EXPECT_TRUE(ContainsCompileUnit(sc_list, alt_cpp_spec));
22674e08ca0SZachary Turner }
22774e08ca0SZachary Turner }
22874e08ca0SZachary Turner
TEST_F(SymbolFilePDBTests,TestLookupOfHeaderFileWithNoInlines)22995e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestLookupOfHeaderFileWithNoInlines) {
230b9c1b51eSKate Stone // Test that when looking up a header file via ResolveSymbolContext (i.e. a
231b9c1b51eSKate Stone // file that was not by itself
232b9c1b51eSKate Stone // compiled, but only contributes to the combined code of other source files),
233b9c1b51eSKate Stone // that if check_inlines
23474e08ca0SZachary Turner // is false, no SymbolContexts are returned.
235513472a7SZachary Turner FileSpec fspec(m_pdb_test_exe);
23674e08ca0SZachary Turner ArchSpec aspec("i686-pc-windows");
23774e08ca0SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
23874e08ca0SZachary Turner
239959e6034SPavel Labath SymbolFile *symfile = module->GetSymbolFile();
24074e08ca0SZachary Turner
241513472a7SZachary Turner FileSpec header_specs[] = {FileSpec("test-pdb.h"),
242513472a7SZachary Turner FileSpec("test-pdb-nested.h")};
243b9c1b51eSKate Stone for (const auto &hspec : header_specs) {
24474e08ca0SZachary Turner SymbolContextList sc_list;
24530fcdf0bSMed Ismail Bennani SourceLocationSpec location_spec(hspec, /*line=*/0);
246b9c1b51eSKate Stone uint32_t result_count = symfile->ResolveSymbolContext(
24730fcdf0bSMed Ismail Bennani location_spec, lldb::eSymbolContextCompUnit, sc_list);
248d81b2ccbSPavel Labath EXPECT_EQ(0u, result_count);
24974e08ca0SZachary Turner }
25074e08ca0SZachary Turner }
25174e08ca0SZachary Turner
TEST_F(SymbolFilePDBTests,TestLineTablesMatchAll)25295e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestLineTablesMatchAll) {
253b9c1b51eSKate Stone // Test that when calling ResolveSymbolContext with a line number of 0, all
254b9c1b51eSKate Stone // line entries from
25574e08ca0SZachary Turner // the specified files are returned.
256513472a7SZachary Turner FileSpec fspec(m_pdb_test_exe);
25774e08ca0SZachary Turner ArchSpec aspec("i686-pc-windows");
25874e08ca0SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
25974e08ca0SZachary Turner
260959e6034SPavel Labath SymbolFile *symfile = module->GetSymbolFile();
26174e08ca0SZachary Turner
262513472a7SZachary Turner FileSpec source_file("test-pdb.cpp");
263513472a7SZachary Turner FileSpec header1("test-pdb.h");
264513472a7SZachary Turner FileSpec header2("test-pdb-nested.h");
26574e08ca0SZachary Turner uint32_t cus = symfile->GetNumCompileUnits();
266d81b2ccbSPavel Labath EXPECT_EQ(2u, cus);
26774e08ca0SZachary Turner
26874e08ca0SZachary Turner SymbolContextList sc_list;
269da169c40SAleksandr Urakov lldb::SymbolContextItem scope =
270da169c40SAleksandr Urakov lldb::eSymbolContextCompUnit | lldb::eSymbolContextLineEntry;
27174e08ca0SZachary Turner
27230fcdf0bSMed Ismail Bennani SourceLocationSpec location_spec(
27330fcdf0bSMed Ismail Bennani source_file, /*line=*/0, /*column=*/llvm::None, /*check_inlines=*/true);
27430fcdf0bSMed Ismail Bennani uint32_t count = symfile->ResolveSymbolContext(location_spec, scope, sc_list);
275d81b2ccbSPavel Labath EXPECT_EQ(1u, count);
27674e08ca0SZachary Turner SymbolContext sc;
27774e08ca0SZachary Turner EXPECT_TRUE(sc_list.GetContextAtIndex(0, sc));
27874e08ca0SZachary Turner
27974e08ca0SZachary Turner LineTable *lt = sc.comp_unit->GetLineTable();
28074e08ca0SZachary Turner EXPECT_NE(nullptr, lt);
28174e08ca0SZachary Turner count = lt->GetSize();
28274e08ca0SZachary Turner // We expect one extra entry for termination (per function)
283d81b2ccbSPavel Labath EXPECT_EQ(16u, count);
28474e08ca0SZachary Turner
28574e08ca0SZachary Turner VerifyLineEntry(module, sc, source_file, *lt, 7, 0x401040);
28674e08ca0SZachary Turner VerifyLineEntry(module, sc, source_file, *lt, 8, 0x401043);
28774e08ca0SZachary Turner VerifyLineEntry(module, sc, source_file, *lt, 9, 0x401045);
28874e08ca0SZachary Turner
28974e08ca0SZachary Turner VerifyLineEntry(module, sc, source_file, *lt, 13, 0x401050);
29074e08ca0SZachary Turner VerifyLineEntry(module, sc, source_file, *lt, 14, 0x401054);
29174e08ca0SZachary Turner VerifyLineEntry(module, sc, source_file, *lt, 15, 0x401070);
29274e08ca0SZachary Turner
29374e08ca0SZachary Turner VerifyLineEntry(module, sc, header1, *lt, 9, 0x401090);
29474e08ca0SZachary Turner VerifyLineEntry(module, sc, header1, *lt, 10, 0x401093);
29574e08ca0SZachary Turner VerifyLineEntry(module, sc, header1, *lt, 11, 0x4010a2);
29674e08ca0SZachary Turner
29774e08ca0SZachary Turner VerifyLineEntry(module, sc, header2, *lt, 5, 0x401080);
29874e08ca0SZachary Turner VerifyLineEntry(module, sc, header2, *lt, 6, 0x401083);
29974e08ca0SZachary Turner VerifyLineEntry(module, sc, header2, *lt, 7, 0x401089);
30074e08ca0SZachary Turner }
30174e08ca0SZachary Turner
TEST_F(SymbolFilePDBTests,TestLineTablesMatchSpecific)30295e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestLineTablesMatchSpecific) {
303b9c1b51eSKate Stone // Test that when calling ResolveSymbolContext with a specific line number,
304b9c1b51eSKate Stone // only line entries
30574e08ca0SZachary Turner // which match the requested line are returned.
306513472a7SZachary Turner FileSpec fspec(m_pdb_test_exe);
30774e08ca0SZachary Turner ArchSpec aspec("i686-pc-windows");
30874e08ca0SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
30974e08ca0SZachary Turner
310959e6034SPavel Labath SymbolFile *symfile = module->GetSymbolFile();
31174e08ca0SZachary Turner
312513472a7SZachary Turner FileSpec source_file("test-pdb.cpp");
313513472a7SZachary Turner FileSpec header1("test-pdb.h");
314513472a7SZachary Turner FileSpec header2("test-pdb-nested.h");
31574e08ca0SZachary Turner uint32_t cus = symfile->GetNumCompileUnits();
316d81b2ccbSPavel Labath EXPECT_EQ(2u, cus);
31774e08ca0SZachary Turner
31874e08ca0SZachary Turner SymbolContextList sc_list;
319da169c40SAleksandr Urakov lldb::SymbolContextItem scope =
320da169c40SAleksandr Urakov lldb::eSymbolContextCompUnit | lldb::eSymbolContextLineEntry;
32174e08ca0SZachary Turner
32274e08ca0SZachary Turner // First test with line 7, and verify that only line 7 entries are added.
32330fcdf0bSMed Ismail Bennani SourceLocationSpec location_spec(
32430fcdf0bSMed Ismail Bennani source_file, /*line=*/7, /*column=*/llvm::None, /*check_inlines=*/true);
32530fcdf0bSMed Ismail Bennani uint32_t count = symfile->ResolveSymbolContext(location_spec, scope, sc_list);
326d81b2ccbSPavel Labath EXPECT_EQ(1u, count);
32774e08ca0SZachary Turner SymbolContext sc;
32874e08ca0SZachary Turner EXPECT_TRUE(sc_list.GetContextAtIndex(0, sc));
32974e08ca0SZachary Turner
33074e08ca0SZachary Turner LineTable *lt = sc.comp_unit->GetLineTable();
33174e08ca0SZachary Turner EXPECT_NE(nullptr, lt);
33274e08ca0SZachary Turner count = lt->GetSize();
33374e08ca0SZachary Turner // We expect one extra entry for termination
334d81b2ccbSPavel Labath EXPECT_EQ(3u, count);
33574e08ca0SZachary Turner
33674e08ca0SZachary Turner VerifyLineEntry(module, sc, source_file, *lt, 7, 0x401040);
33774e08ca0SZachary Turner VerifyLineEntry(module, sc, header2, *lt, 7, 0x401089);
33874e08ca0SZachary Turner
33974e08ca0SZachary Turner sc_list.Clear();
34074e08ca0SZachary Turner // Then test with line 9, and verify that only line 9 entries are added.
34130fcdf0bSMed Ismail Bennani location_spec = SourceLocationSpec(
34230fcdf0bSMed Ismail Bennani source_file, /*line=*/9, /*column=*/llvm::None, /*check_inlines=*/true);
343d5069dacSMed Ismail Bennani count = symfile->ResolveSymbolContext(location_spec, scope, sc_list);
344d81b2ccbSPavel Labath EXPECT_EQ(1u, count);
34574e08ca0SZachary Turner EXPECT_TRUE(sc_list.GetContextAtIndex(0, sc));
34674e08ca0SZachary Turner
34774e08ca0SZachary Turner lt = sc.comp_unit->GetLineTable();
34874e08ca0SZachary Turner EXPECT_NE(nullptr, lt);
34974e08ca0SZachary Turner count = lt->GetSize();
35074e08ca0SZachary Turner // We expect one extra entry for termination
351d81b2ccbSPavel Labath EXPECT_EQ(3u, count);
35274e08ca0SZachary Turner
35374e08ca0SZachary Turner VerifyLineEntry(module, sc, source_file, *lt, 9, 0x401045);
35474e08ca0SZachary Turner VerifyLineEntry(module, sc, header1, *lt, 9, 0x401090);
35574e08ca0SZachary Turner }
35642dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestSimpleClassTypes)35795e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestSimpleClassTypes) {
358513472a7SZachary Turner FileSpec fspec(m_types_test_exe);
35942dff790SZachary Turner ArchSpec aspec("i686-pc-windows");
36042dff790SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
36142dff790SZachary Turner
362b9c1b51eSKate Stone SymbolFilePDB *symfile =
363959e6034SPavel Labath static_cast<SymbolFilePDB *>(module->GetSymbolFile());
3640a51bfb8SPavel Labath llvm::pdb::IPDBSession &session = symfile->GetPDBSession();
36542dff790SZachary Turner llvm::DenseSet<SymbolFile *> searched_files;
36642dff790SZachary Turner TypeMap results;
3677d138123SRaphael Isemann symfile->FindTypes(ConstString("Class"), CompilerDeclContext(), 0,
3687d138123SRaphael Isemann searched_files, results);
3692f13da3eSPavel Labath EXPECT_EQ(1u, results.GetSize());
37042dff790SZachary Turner lldb::TypeSP udt_type = results.GetTypeAtIndex(0);
37142dff790SZachary Turner EXPECT_EQ(ConstString("Class"), udt_type->GetName());
37242dff790SZachary Turner CompilerType compiler_type = udt_type->GetForwardCompilerType();
3736e3b0cc2SRaphael Isemann EXPECT_TRUE(TypeSystemClang::IsClassType(compiler_type.GetOpaqueQualType()));
374b69c3169SJustin Bogner EXPECT_EQ(GetGlobalConstantInteger(session, "sizeof_Class"),
3756dbd4775SAdrian Prantl udt_type->GetByteSize(nullptr));
37642dff790SZachary Turner }
37742dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestNestedClassTypes)37895e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestNestedClassTypes) {
379513472a7SZachary Turner FileSpec fspec(m_types_test_exe);
38042dff790SZachary Turner ArchSpec aspec("i686-pc-windows");
38142dff790SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
38242dff790SZachary Turner
383b9c1b51eSKate Stone SymbolFilePDB *symfile =
384959e6034SPavel Labath static_cast<SymbolFilePDB *>(module->GetSymbolFile());
3850a51bfb8SPavel Labath llvm::pdb::IPDBSession &session = symfile->GetPDBSession();
38642dff790SZachary Turner llvm::DenseSet<SymbolFile *> searched_files;
38742dff790SZachary Turner TypeMap results;
38835725c98SAleksandr Urakov
389c1210c7eSAlex Langford auto clang_ast_ctx_or_err =
390c1210c7eSAlex Langford symfile->GetTypeSystemForLanguage(lldb::eLanguageTypeC_plus_plus);
391c1210c7eSAlex Langford ASSERT_THAT_EXPECTED(clang_ast_ctx_or_err, llvm::Succeeded());
392c1210c7eSAlex Langford
393c1210c7eSAlex Langford auto clang_ast_ctx =
3946e3b0cc2SRaphael Isemann llvm::dyn_cast_or_null<TypeSystemClang>(&clang_ast_ctx_or_err.get());
39535725c98SAleksandr Urakov EXPECT_NE(nullptr, clang_ast_ctx);
39635725c98SAleksandr Urakov
3977d138123SRaphael Isemann symfile->FindTypes(ConstString("Class"), CompilerDeclContext(), 0,
3987d138123SRaphael Isemann searched_files, results);
3992f13da3eSPavel Labath EXPECT_EQ(1u, results.GetSize());
40035725c98SAleksandr Urakov
40135725c98SAleksandr Urakov auto Class = results.GetTypeAtIndex(0);
40235725c98SAleksandr Urakov EXPECT_TRUE(Class);
40335725c98SAleksandr Urakov EXPECT_TRUE(Class->IsValidType());
40435725c98SAleksandr Urakov
40535725c98SAleksandr Urakov auto ClassCompilerType = Class->GetFullCompilerType();
40635725c98SAleksandr Urakov EXPECT_TRUE(ClassCompilerType.IsValid());
40735725c98SAleksandr Urakov
40835725c98SAleksandr Urakov auto ClassDeclCtx = clang_ast_ctx->GetDeclContextForType(ClassCompilerType);
40935725c98SAleksandr Urakov EXPECT_NE(nullptr, ClassDeclCtx);
41035725c98SAleksandr Urakov
41135725c98SAleksandr Urakov // There are two symbols for nested classes: one belonging to enclosing class
41235725c98SAleksandr Urakov // and one is global. We process correctly this case and create the same
41335725c98SAleksandr Urakov // compiler type for both, but `FindTypes` may return more than one type
41435725c98SAleksandr Urakov // (with the same compiler type) because the symbols have different IDs.
415e2385e08SAdrian Prantl
416e2385e08SAdrian Prantl TypeMap more_results;
41735725c98SAleksandr Urakov auto ClassCompilerDeclCtx = CompilerDeclContext(clang_ast_ctx, ClassDeclCtx);
4187d138123SRaphael Isemann symfile->FindTypes(ConstString("NestedClass"), ClassCompilerDeclCtx, 0,
419e2385e08SAdrian Prantl searched_files, more_results);
420e2385e08SAdrian Prantl EXPECT_LE(1u, more_results.GetSize());
42135725c98SAleksandr Urakov
422e2385e08SAdrian Prantl lldb::TypeSP udt_type = more_results.GetTypeAtIndex(0);
42335725c98SAleksandr Urakov EXPECT_EQ(ConstString("NestedClass"), udt_type->GetName());
42435725c98SAleksandr Urakov
42542dff790SZachary Turner CompilerType compiler_type = udt_type->GetForwardCompilerType();
4266e3b0cc2SRaphael Isemann EXPECT_TRUE(TypeSystemClang::IsClassType(compiler_type.GetOpaqueQualType()));
42735725c98SAleksandr Urakov
428b69c3169SJustin Bogner EXPECT_EQ(GetGlobalConstantInteger(session, "sizeof_NestedClass"),
4296dbd4775SAdrian Prantl udt_type->GetByteSize(nullptr));
43042dff790SZachary Turner }
43142dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestClassInNamespace)43295e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestClassInNamespace) {
433513472a7SZachary Turner FileSpec fspec(m_types_test_exe);
43442dff790SZachary Turner ArchSpec aspec("i686-pc-windows");
43542dff790SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
43642dff790SZachary Turner
437b9c1b51eSKate Stone SymbolFilePDB *symfile =
438959e6034SPavel Labath static_cast<SymbolFilePDB *>(module->GetSymbolFile());
4390a51bfb8SPavel Labath llvm::pdb::IPDBSession &session = symfile->GetPDBSession();
44042dff790SZachary Turner llvm::DenseSet<SymbolFile *> searched_files;
44142dff790SZachary Turner TypeMap results;
44235725c98SAleksandr Urakov
443c1210c7eSAlex Langford auto clang_ast_ctx_or_err =
444c1210c7eSAlex Langford symfile->GetTypeSystemForLanguage(lldb::eLanguageTypeC_plus_plus);
445c1210c7eSAlex Langford ASSERT_THAT_EXPECTED(clang_ast_ctx_or_err, llvm::Succeeded());
446c1210c7eSAlex Langford
447c1210c7eSAlex Langford auto clang_ast_ctx =
4486e3b0cc2SRaphael Isemann llvm::dyn_cast_or_null<TypeSystemClang>(&clang_ast_ctx_or_err.get());
44935725c98SAleksandr Urakov EXPECT_NE(nullptr, clang_ast_ctx);
45035725c98SAleksandr Urakov
451ceb433adSRaphael Isemann clang::ASTContext &ast_ctx = clang_ast_ctx->getASTContext();
45235725c98SAleksandr Urakov
453ceb433adSRaphael Isemann auto tu = ast_ctx.getTranslationUnitDecl();
45435725c98SAleksandr Urakov EXPECT_NE(nullptr, tu);
45535725c98SAleksandr Urakov
45635725c98SAleksandr Urakov symfile->ParseDeclsForContext(CompilerDeclContext(
45735725c98SAleksandr Urakov clang_ast_ctx, static_cast<clang::DeclContext *>(tu)));
45835725c98SAleksandr Urakov
4593f0661b5SRaphael Isemann auto ns_namespace = symfile->FindNamespace(ConstString("NS"), CompilerDeclContext());
46035725c98SAleksandr Urakov EXPECT_TRUE(ns_namespace.IsValid());
46135725c98SAleksandr Urakov
4627d138123SRaphael Isemann symfile->FindTypes(ConstString("NSClass"), ns_namespace, 0, searched_files,
463bf9d84c0SAdrian Prantl results);
4642f13da3eSPavel Labath EXPECT_EQ(1u, results.GetSize());
46535725c98SAleksandr Urakov
46642dff790SZachary Turner lldb::TypeSP udt_type = results.GetTypeAtIndex(0);
46735725c98SAleksandr Urakov EXPECT_EQ(ConstString("NSClass"), udt_type->GetName());
46835725c98SAleksandr Urakov
46942dff790SZachary Turner CompilerType compiler_type = udt_type->GetForwardCompilerType();
4706e3b0cc2SRaphael Isemann EXPECT_TRUE(TypeSystemClang::IsClassType(compiler_type.GetOpaqueQualType()));
47135725c98SAleksandr Urakov
472b9c1b51eSKate Stone EXPECT_EQ(GetGlobalConstantInteger(session, "sizeof_NSClass"),
4736dbd4775SAdrian Prantl udt_type->GetByteSize(nullptr));
47442dff790SZachary Turner }
47542dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestEnumTypes)47695e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestEnumTypes) {
477513472a7SZachary Turner FileSpec fspec(m_types_test_exe);
47842dff790SZachary Turner ArchSpec aspec("i686-pc-windows");
47942dff790SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
48042dff790SZachary Turner
481b9c1b51eSKate Stone SymbolFilePDB *symfile =
482959e6034SPavel Labath static_cast<SymbolFilePDB *>(module->GetSymbolFile());
4830a51bfb8SPavel Labath llvm::pdb::IPDBSession &session = symfile->GetPDBSession();
48442dff790SZachary Turner llvm::DenseSet<SymbolFile *> searched_files;
48542dff790SZachary Turner const char *EnumsToCheck[] = {"Enum", "ShortEnum"};
486b9c1b51eSKate Stone for (auto Enum : EnumsToCheck) {
48742dff790SZachary Turner TypeMap results;
4887d138123SRaphael Isemann symfile->FindTypes(ConstString(Enum), CompilerDeclContext(), 0,
4897d138123SRaphael Isemann searched_files, results);
4902f13da3eSPavel Labath EXPECT_EQ(1u, results.GetSize());
49142dff790SZachary Turner lldb::TypeSP enum_type = results.GetTypeAtIndex(0);
49242dff790SZachary Turner EXPECT_EQ(ConstString(Enum), enum_type->GetName());
49342dff790SZachary Turner CompilerType compiler_type = enum_type->GetFullCompilerType();
4946e3b0cc2SRaphael Isemann EXPECT_TRUE(TypeSystemClang::IsEnumType(compiler_type.GetOpaqueQualType()));
4956e3b0cc2SRaphael Isemann clang::EnumDecl *enum_decl = TypeSystemClang::GetAsEnumDecl(compiler_type);
49642dff790SZachary Turner EXPECT_NE(nullptr, enum_decl);
497b9c1b51eSKate Stone EXPECT_EQ(2, std::distance(enum_decl->enumerator_begin(),
498b9c1b51eSKate Stone enum_decl->enumerator_end()));
49942dff790SZachary Turner
50042dff790SZachary Turner std::string sizeof_var = "sizeof_";
50142dff790SZachary Turner sizeof_var.append(Enum);
502771ef6d4SMalcolm Parsons EXPECT_EQ(GetGlobalConstantInteger(session, sizeof_var),
5036dbd4775SAdrian Prantl enum_type->GetByteSize(nullptr));
50442dff790SZachary Turner }
50542dff790SZachary Turner }
50642dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestArrayTypes)50795e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestArrayTypes) {
508b9c1b51eSKate Stone // In order to get this test working, we need to support lookup by symbol
509b9c1b51eSKate Stone // name. Because array
510b9c1b51eSKate Stone // types themselves do not have names, only the symbols have names (i.e. the
511b9c1b51eSKate Stone // name of the array).
51242dff790SZachary Turner }
51342dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestFunctionTypes)51495e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestFunctionTypes) {
515b9c1b51eSKate Stone // In order to get this test working, we need to support lookup by symbol
516b9c1b51eSKate Stone // name. Because array
517b9c1b51eSKate Stone // types themselves do not have names, only the symbols have names (i.e. the
518b9c1b51eSKate Stone // name of the array).
51942dff790SZachary Turner }
52042dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestTypedefs)52195e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestTypedefs) {
522513472a7SZachary Turner FileSpec fspec(m_types_test_exe);
52342dff790SZachary Turner ArchSpec aspec("i686-pc-windows");
52442dff790SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
52542dff790SZachary Turner
526b9c1b51eSKate Stone SymbolFilePDB *symfile =
527959e6034SPavel Labath static_cast<SymbolFilePDB *>(module->GetSymbolFile());
5280a51bfb8SPavel Labath llvm::pdb::IPDBSession &session = symfile->GetPDBSession();
52942dff790SZachary Turner llvm::DenseSet<SymbolFile *> searched_files;
53042dff790SZachary Turner TypeMap results;
53142dff790SZachary Turner
53280ed0fd6SAaron Smith const char *TypedefsToCheck[] = {"ClassTypedef", "NSClassTypedef",
53380ed0fd6SAaron Smith "FuncPointerTypedef",
53480ed0fd6SAaron Smith "VariadicFuncPointerTypedef"};
535b9c1b51eSKate Stone for (auto Typedef : TypedefsToCheck) {
53642dff790SZachary Turner TypeMap results;
5377d138123SRaphael Isemann symfile->FindTypes(ConstString(Typedef), CompilerDeclContext(), 0,
5387d138123SRaphael Isemann searched_files, results);
5392f13da3eSPavel Labath EXPECT_EQ(1u, results.GetSize());
54042dff790SZachary Turner lldb::TypeSP typedef_type = results.GetTypeAtIndex(0);
54142dff790SZachary Turner EXPECT_EQ(ConstString(Typedef), typedef_type->GetName());
54242dff790SZachary Turner CompilerType compiler_type = typedef_type->GetFullCompilerType();
5436e3b0cc2SRaphael Isemann TypeSystemClang *clang_type_system =
5446e3b0cc2SRaphael Isemann llvm::dyn_cast_or_null<TypeSystemClang>(compiler_type.GetTypeSystem());
545b9c1b51eSKate Stone EXPECT_TRUE(
546b9c1b51eSKate Stone clang_type_system->IsTypedefType(compiler_type.GetOpaqueQualType()));
54742dff790SZachary Turner
54842dff790SZachary Turner std::string sizeof_var = "sizeof_";
54942dff790SZachary Turner sizeof_var.append(Typedef);
550771ef6d4SMalcolm Parsons EXPECT_EQ(GetGlobalConstantInteger(session, sizeof_var),
5516dbd4775SAdrian Prantl typedef_type->GetByteSize(nullptr));
55242dff790SZachary Turner }
55342dff790SZachary Turner }
55442dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestRegexNameMatch)55595e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestRegexNameMatch) {
556513472a7SZachary Turner FileSpec fspec(m_types_test_exe);
55742dff790SZachary Turner ArchSpec aspec("i686-pc-windows");
55842dff790SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
55942dff790SZachary Turner
560b9c1b51eSKate Stone SymbolFilePDB *symfile =
561959e6034SPavel Labath static_cast<SymbolFilePDB *>(module->GetSymbolFile());
56242dff790SZachary Turner TypeMap results;
563364cbfe9SAaron Smith
564364cbfe9SAaron Smith symfile->FindTypesByRegex(RegularExpression(".*"), 0, results);
565364cbfe9SAaron Smith EXPECT_GT(results.GetSize(), 1u);
56686e9434dSAaron Smith
56786e9434dSAaron Smith // We expect no exception thrown if the given regex can't be compiled
56886e9434dSAaron Smith results.Clear();
569364cbfe9SAaron Smith symfile->FindTypesByRegex(RegularExpression("**"), 0, results);
570364cbfe9SAaron Smith EXPECT_EQ(0u, results.GetSize());
57142dff790SZachary Turner }
57242dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestMaxMatches)57395e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestMaxMatches) {
574513472a7SZachary Turner FileSpec fspec(m_types_test_exe);
57542dff790SZachary Turner ArchSpec aspec("i686-pc-windows");
57642dff790SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
57742dff790SZachary Turner
578b9c1b51eSKate Stone SymbolFilePDB *symfile =
579959e6034SPavel Labath static_cast<SymbolFilePDB *>(module->GetSymbolFile());
58042dff790SZachary Turner llvm::DenseSet<SymbolFile *> searched_files;
58142dff790SZachary Turner TypeMap results;
582364cbfe9SAaron Smith const ConstString name("ClassTypedef");
5837d138123SRaphael Isemann symfile->FindTypes(name, CompilerDeclContext(), 0, searched_files, results);
584e2385e08SAdrian Prantl // Try to limit ourselves from 1 to 10 results, otherwise we could
585e2385e08SAdrian Prantl // be doing this thousands of times. The idea is just to make sure
586e2385e08SAdrian Prantl // that for a variety of values, the number of limited results
587e2385e08SAdrian Prantl // always comes out to the number we are expecting.
588b0ccef14SAdrian Prantl uint32_t num_results = results.GetSize();
589e2385e08SAdrian Prantl uint32_t iterations = std::min(num_results, 10u);
590b9c1b51eSKate Stone for (uint32_t i = 1; i <= iterations; ++i) {
591e2385e08SAdrian Prantl TypeMap more_results;
5927d138123SRaphael Isemann symfile->FindTypes(name, CompilerDeclContext(), i, searched_files,
5937d138123SRaphael Isemann more_results);
594e2385e08SAdrian Prantl uint32_t num_limited_results = more_results.GetSize();
59542dff790SZachary Turner EXPECT_EQ(i, num_limited_results);
59642dff790SZachary Turner }
59742dff790SZachary Turner }
59842dff790SZachary Turner
TEST_F(SymbolFilePDBTests,TestNullName)59995e26292SMichal Gorny TEST_F(SymbolFilePDBTests, TestNullName) {
600513472a7SZachary Turner FileSpec fspec(m_types_test_exe);
60142dff790SZachary Turner ArchSpec aspec("i686-pc-windows");
60242dff790SZachary Turner lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
60342dff790SZachary Turner
604b9c1b51eSKate Stone SymbolFilePDB *symfile =
605959e6034SPavel Labath static_cast<SymbolFilePDB *>(module->GetSymbolFile());
60642dff790SZachary Turner llvm::DenseSet<SymbolFile *> searched_files;
60742dff790SZachary Turner TypeMap results;
6087d138123SRaphael Isemann symfile->FindTypes(ConstString(), CompilerDeclContext(), 0, searched_files,
6097d138123SRaphael Isemann results);
6102f13da3eSPavel Labath EXPECT_EQ(0u, results.GetSize());
61142dff790SZachary Turner }
6128cfb12b9SAleksandr Urakov
TEST_F(SymbolFilePDBTests,TestFindSymbolsWithNameAndType)6138cfb12b9SAleksandr Urakov TEST_F(SymbolFilePDBTests, TestFindSymbolsWithNameAndType) {
6148cfb12b9SAleksandr Urakov FileSpec fspec(m_pdb_test_exe.c_str());
6158cfb12b9SAleksandr Urakov ArchSpec aspec("i686-pc-windows");
6168cfb12b9SAleksandr Urakov lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
6178cfb12b9SAleksandr Urakov
6188cfb12b9SAleksandr Urakov SymbolContextList sc_list;
6198cfb12b9SAleksandr Urakov module->FindSymbolsWithNameAndType(ConstString("?foo@@YAHH@Z"),
6203ebbda0fSAdrian Prantl lldb::eSymbolTypeAny, sc_list);
6218cfb12b9SAleksandr Urakov EXPECT_EQ(1u, sc_list.GetSize());
6228cfb12b9SAleksandr Urakov
6238cfb12b9SAleksandr Urakov SymbolContext sc;
6248cfb12b9SAleksandr Urakov EXPECT_TRUE(sc_list.GetContextAtIndex(0, sc));
6258cfb12b9SAleksandr Urakov EXPECT_STREQ("int foo(int)",
6268cfb12b9SAleksandr Urakov sc.GetFunctionName(Mangled::ePreferDemangled).AsCString());
6278cfb12b9SAleksandr Urakov }
628