diff options
Diffstat (limited to 'lldb/unittests/SymbolFile/PDB')
8 files changed, 104 insertions, 0 deletions
diff --git a/lldb/unittests/SymbolFile/PDB/CMakeLists.txt b/lldb/unittests/SymbolFile/PDB/CMakeLists.txt index dd7e2248aed..b9dada09b91 100644 --- a/lldb/unittests/SymbolFile/PDB/CMakeLists.txt +++ b/lldb/unittests/SymbolFile/PDB/CMakeLists.txt @@ -17,6 +17,10 @@ add_lldb_unittest(SymbolFilePDBTests set(test_inputs test-pdb.exe test-pdb.pdb + test-pdb-function-level-linking.exe + test-pdb-function-level-linking.pdb + test-pdb-splitted-function.exe + test-pdb-splitted-function.pdb test-pdb-types.exe test-pdb-types.pdb) diff --git a/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-function-level-linking.cpp b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-function-level-linking.cpp new file mode 100644 index 00000000000..e1d5aabb357 --- /dev/null +++ b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-function-level-linking.cpp @@ -0,0 +1,17 @@ +// Compile with "cl /c /ZI /sdl /EHsc /MTd /permissive- +// test-pdb-function-level-linking.cpp" +// Link with "link /debug:full test-pdb-function-level-linking.obj" + +#include <memory> +#include <string> + +std::string foo() +{ + return "Hello!"; +} + +int main() +{ + auto x = foo(); + return 0; +} diff --git a/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-function-level-linking.exe b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-function-level-linking.exe new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-function-level-linking.exe diff --git a/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-function-level-linking.pdb b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-function-level-linking.pdb new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-function-level-linking.pdb diff --git a/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-splitted-function.cpp b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-splitted-function.cpp new file mode 100644 index 00000000000..5155b8cdb6c --- /dev/null +++ b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-splitted-function.cpp @@ -0,0 +1,27 @@ +// Compile with "cl /c /Zi /GL /O2 /EHsc /MTd test-pdb-splitted-function.cpp" +// Link with "link /debug:full /LTCG /GENPROFILE +// test-pdb-splitted-function.obj" +// Run several times +// Link with "link /debug:full /LTCG /USEPROFILE +// test-pdb-splitted-function.obj" + +#include <cmath> +#include <iostream> + +int main() +{ + auto b = false; + for (auto i = 1; i <= 1024; i++) + { + if (b) + { + std::cout << "Unreachable code" << std::endl; + auto x = std::sin(i); + return x; + } + + b = (i % 2 + (i - 1) % 2) != 1; + } + + return 0; +} diff --git a/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-splitted-function.exe b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-splitted-function.exe new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-splitted-function.exe diff --git a/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-splitted-function.pdb b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-splitted-function.pdb new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/lldb/unittests/SymbolFile/PDB/Inputs/test-pdb-splitted-function.pdb diff --git a/lldb/unittests/SymbolFile/PDB/SymbolFilePDBTests.cpp b/lldb/unittests/SymbolFile/PDB/SymbolFilePDBTests.cpp index 1e867b172ee..9b93ab0f0c7 100644 --- a/lldb/unittests/SymbolFile/PDB/SymbolFilePDBTests.cpp +++ b/lldb/unittests/SymbolFile/PDB/SymbolFilePDBTests.cpp @@ -56,6 +56,10 @@ public: SymbolFilePDB::Initialize(); m_pdb_test_exe = GetInputFilePath("test-pdb.exe"); + m_function_level_linking_test_exe = + GetInputFilePath("test-pdb-function-level-linking.exe"); + m_splitted_function_test_exe = + GetInputFilePath("test-pdb-splitted-function.exe"); m_types_test_exe = GetInputFilePath("test-pdb-types.exe"); } @@ -73,6 +77,8 @@ public: protected: std::string m_pdb_test_exe; + std::string m_function_level_linking_test_exe; + std::string m_splitted_function_test_exe; std::string m_types_test_exe; bool FileSpecMatchesAsBaseOrFull(const FileSpec &left, @@ -354,6 +360,56 @@ TEST_F(SymbolFilePDBTests, TestLineTablesMatchSpecific) { VerifyLineEntry(module, sc, header1, *lt, 9, 0x401090); } +void TestLineTableConsistency(llvm::StringRef exe_path, llvm::StringRef source_name) +{ + // All line entries of compile unit's line table must be consistent + // even if compiled sources are not continuous in the binary file. + FileSpec fspec(exe_path, false); + ArchSpec aspec("i686-pc-windows"); + lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec); + SymbolVendor *plugin = module->GetSymbolVendor(); + SymbolFile *symfile = plugin->GetSymbolFile(); + FileSpec source_file(source_name, false); + uint32_t scope = lldb::eSymbolContextCompUnit | lldb::eSymbolContextLineEntry; + SymbolContextList sc_list; + uint32_t count = + symfile->ResolveSymbolContext(source_file, 0, true, scope, sc_list); + EXPECT_EQ(1u, count); + + SymbolContext sc; + EXPECT_TRUE(sc_list.GetContextAtIndex(0, sc)); + + LineTable *lt = sc.comp_unit->GetLineTable(); + EXPECT_NE(nullptr, lt); + + count = lt->GetSize(); + EXPECT_LT(0u, count); + + LineEntry le; + EXPECT_TRUE(lt->GetLineEntryAtIndex(0, le)); + for (int i = 1; i < count; i++) + { + lldb::addr_t curr_end = + le.range.GetBaseAddress().GetFileAddress() + le.range.GetByteSize(); + + EXPECT_TRUE(lt->GetLineEntryAtIndex(i, le)); + + EXPECT_LE(curr_end, le.range.GetBaseAddress().GetFileAddress()); + } +} + +TEST_F(SymbolFilePDBTests, TestFunctionLevelLinking) { + TestLineTableConsistency( + m_function_level_linking_test_exe, + "test-pdb-function-level-linking.cpp"); +} + +TEST_F(SymbolFilePDBTests, TestSplittedFunction) { + TestLineTableConsistency( + m_splitted_function_test_exe, + "test-pdb-splitted-function.cpp"); +} + TEST_F(SymbolFilePDBTests, TestSimpleClassTypes) { FileSpec fspec(m_types_test_exe.c_str(), false); ArchSpec aspec("i686-pc-windows"); |

