[Lldb-commits] [lldb] [lldb] Avoid force loading symbols in statistics collection (PR #136236)
David Peixotto via lldb-commits
lldb-commits at lists.llvm.org
Mon Apr 21 11:23:54 PDT 2025
================
@@ -761,3 +761,77 @@ TEST_F(SymtabTest, TestSymtabCreatedOnDemand) {
Symtab *cached_module_symtab = module_sp->GetSymtab(/*can_create=*/false);
ASSERT_EQ(module_symtab, cached_module_symtab);
}
+
+TEST_F(SymtabTest, TestSymbolTableCreatedOnDemand) {
+ const char *yamldata = R"(
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_386
+DWARF:
+ debug_abbrev:
+ - Table:
+ - Code: 0x00000001
+ Tag: DW_TAG_compile_unit
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_addr_base
+ Form: DW_FORM_sec_offset
+ debug_info:
+ - Version: 5
+ AddrSize: 4
+ UnitType: DW_UT_compile
+ Entries:
+ - AbbrCode: 0x00000001
+ Values:
+ - Value: 0x8 # Offset of the first Address past the header
+ - AbbrCode: 0x0
+ debug_addr:
+ - Version: 5
+ AddressSize: 4
+ Entries:
+ - Address: 0x1234
+ - Address: 0x5678
+ debug_line:
+ - Length: 42
+ Version: 2
+ PrologueLength: 36
+ MinInstLength: 1
+ DefaultIsStmt: 1
+ LineBase: 251
+ LineRange: 14
+ OpcodeBase: 13
+ StandardOpcodeLengths: [ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 ]
+ IncludeDirs:
+ - '/tmp'
+ Files:
+ - Name: main.cpp
+ DirIdx: 1
+ ModTime: 0
+ Length: 0
+)";
+ llvm::Expected<TestFile> file = TestFile::fromYaml(yamldata);
+ EXPECT_THAT_EXPECTED(file, llvm::Succeeded());
+ auto module_sp = std::make_shared<Module>(file->moduleSpec());
+
+ SymbolFile *symbol_file = module_sp->GetSymbolFile();
+ // At this point, the symbol table is not created. This is because the above
+ // yaml data contains the necessary sections in order for
+ // SymbolFileDWARF::CalculateAbilities() to identify all abilities, saving it
+ // from calling SymbolFileDWARFDebugMap::CalculateAbilities(), which
+ // eventually loads the symbol table, which we don't want.
+
+ // The symbol table should not be created if asked not to.
+ Symtab *symtab = symbol_file->GetSymtab(/*can_create=*/false);
+ ASSERT_EQ(symtab, nullptr);
+
+ // But it should be created on demand.
+ symtab = symbol_file->GetSymtab(/*can_create=*/true);
+ ASSERT_NE(symtab, nullptr);
+
+ // And we should be able to get it again once it has been created.
+ symtab = symbol_file->GetSymtab(/*can_create=*/false);
----------------
dmpots wrote:
The symtab returned from the first call with `can_create=true` should be the same as the one from the second call with `can_create=false`, right? Would be good to assert they are the same here.
https://github.com/llvm/llvm-project/pull/136236
More information about the lldb-commits
mailing list