[Lldb-commits] [PATCH] D40869: Optimize fake ELF section lookup while parsing symbols in ObjectFileELF

Alex Langford via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Dec 5 16:01:33 PST 2017


xiaobai created this revision.
Herald added a subscriber: emaste.

I recently ran into a shared object that had a reasonably large number
of absolute symbols. Parsing all the symbols in the shared object took an
unusually long amount of time, so I looked into it and found that when we
created fake sections for these symbols, we would add them to the module's
section list without inserting it into the cache (`section_name_to_section`).
While this works, in some cases we perform a lookup of the section in that cache
almost right after we create it and put in the module section list.
Given I had a large amount of symbols that triggered this code path, performance
was abysmal. This change greatly improved performance there.


https://reviews.llvm.org/D40869

Files:
  source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp


Index: source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
===================================================================
--- source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -294,7 +294,7 @@
   uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown;
   uint32_t fileclass = header.e_ident[EI_CLASS];
 
-  // If there aren't any elf flags available (e.g core elf file) then return default 
+  // If there aren't any elf flags available (e.g core elf file) then return default
   // 32 or 64 bit arch (without any architecture revision) based on object file's class.
   if (header.e_type == ET_CORE) {
     switch (fileclass) {
@@ -1446,7 +1446,7 @@
           // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing
           // for some cases (e.g. compile with -nostdlib)
           // Hence set OS to Linux
-          arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 
+          arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
       }
     }
 
@@ -1550,7 +1550,7 @@
     const uint32_t sub_type = subTypeFromElfHeader(header);
     arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type,
                               header.e_ident[EI_OSABI]);
-    
+
     // Validate if it is ok to remove GetOsFromOSABI.
     // Note, that now the OS is determined based on EI_OSABI flag and
     // the info extracted from ELF notes (see RefineModuleDetailsFromNote).
@@ -2361,6 +2361,8 @@
 
       module_section_list->AddSection(symbol_section_sp);
       section_list->AddSection(symbol_section_sp);
+      section_name_to_section.emplace(fake_section_name.GetCString(),
+                                      symbol_section_sp);
     }
 
     if (symbol_section_sp &&


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40869.125643.patch
Type: text/x-patch
Size: 1756 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20171206/71517a82/attachment.bin>


More information about the lldb-commits mailing list