diff options
Diffstat (limited to 'source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp')
-rw-r--r-- | source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index f9cec2415382..5fc83f06157c 100644 --- a/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -1558,7 +1558,7 @@ ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id) std::string ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const { - size_t pos = symbol_name.find("@"); + size_t pos = symbol_name.find('@'); return symbol_name.substr(0, pos).str(); } @@ -1795,7 +1795,16 @@ ObjectFileELF::ParseSymbols (Symtab *symtab, static ConstString bss_section_name(".bss"); static ConstString opd_section_name(".opd"); // For ppc64 - //StreamFile strm(stdout, false); + // On Android the oatdata and the oatexec symbols in system@framework@boot.oat covers the full + // .text section what causes issues with displaying unusable symbol name to the user and very + // slow unwinding speed because the instruction emulation based unwind plans try to emulate all + // instructions in these symbols. Don't add these symbols to the symbol list as they have no + // use for the debugger and they are causing a lot of trouble. + // Filtering can't be restricted to Android because this special object file don't contain the + // note section specifying the environment to Android but the custom extension and file name + // makes it highly unlikely that this will collide with anything else. + bool skip_oatdata_oatexec = m_file.GetFilename() == ConstString("system@framework@boot.oat"); + unsigned i; for (i = 0; i < num_symbols; ++i) { @@ -1809,7 +1818,10 @@ ObjectFileELF::ParseSymbols (Symtab *symtab, (symbol_name == NULL || symbol_name[0] == '\0')) continue; - //symbol.Dump (&strm, i, &strtab_data, section_list); + // Skipping oatdata and oatexec sections if it is requested. See details above the + // definition of skip_oatdata_oatexec for the reasons. + if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 || ::strcmp(symbol_name, "oatexec") == 0)) + continue; SectionSP symbol_section_sp; SymbolType symbol_type = eSymbolTypeInvalid; @@ -2031,8 +2043,9 @@ ObjectFileELF::ParseSymbols (Symtab *symtab, if (! mangled_name.empty()) mangled.SetMangledName( ConstString((mangled_name + suffix).str()) ); - llvm::StringRef demangled_name = mangled.GetDemangledName().GetStringRef(); - if (! demangled_name.empty()) + ConstString demangled = mangled.GetDemangledName(lldb::eLanguageTypeUnknown); + llvm::StringRef demangled_name = demangled.GetStringRef(); + if (!demangled_name.empty()) mangled.SetDemangledName( ConstString((demangled_name + suffix).str()) ); } |