diff options
8 files changed, 37 insertions, 30 deletions
diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index 776cf3a..998dda6 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -48,7 +48,9 @@ public: // Constructors and Destructors //------------------------------------------------------------------ SymbolFile(ObjectFile* obj_file) : - m_obj_file(obj_file) + m_obj_file(obj_file), + m_abilities(0), + m_calculated_abilities(false) { } @@ -86,7 +88,18 @@ public: /// enumeration. Any bits that are set represent an ability that /// this symbol plug-in can parse from the object file. ///------------------------------------------------------------------ - virtual uint32_t GetAbilities () = 0; + uint32_t GetAbilities () + { + if (!m_calculated_abilities) + { + m_abilities = CalculateAbilities(); + m_calculated_abilities = true; + } + + return m_abilities; + } + + virtual uint32_t CalculateAbilities() = 0; //------------------------------------------------------------------ /// Initialize the SymbolFile object. @@ -144,7 +157,8 @@ public: void ReportError (const char *format, ...) __attribute__ ((format (printf, 2, 3))); protected: ObjectFile* m_obj_file; // The object file that symbols can be extracted from. - + uint32_t m_abilities; + bool m_calculated_abilities; private: DISALLOW_COPY_AND_ASSIGN (SymbolFile); }; diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index c662f01..60b94cd 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -1271,19 +1271,19 @@ ObjectFileMachO::ParseSymtab (bool minimize) static const llvm::StringRef g_objc_v2_prefix_ivar ("_OBJC_IVAR_$_"); if (symbol_name_ref.startswith(g_objc_v2_prefix_class)) { - symbol_name_non_abi_mangled = symbol_name; + symbol_name_non_abi_mangled = symbol_name + 1; symbol_name = symbol_name + g_objc_v2_prefix_class.size(); type = eSymbolTypeObjCClass; } else if (symbol_name_ref.startswith(g_objc_v2_prefix_metaclass)) { - symbol_name_non_abi_mangled = symbol_name; + symbol_name_non_abi_mangled = symbol_name + 1; symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size(); type = eSymbolTypeObjCMetaClass; } else if (symbol_name_ref.startswith(g_objc_v2_prefix_ivar)) { - symbol_name_non_abi_mangled = symbol_name; + symbol_name_non_abi_mangled = symbol_name + 1; symbol_name = symbol_name + g_objc_v2_prefix_ivar.size(); type = eSymbolTypeObjCIVar; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index fd82da5..4f2c3d9 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -307,7 +307,7 @@ SymbolFileDWARF::SupportedVersion(uint16_t version) } uint32_t -SymbolFileDWARF::GetAbilities () +SymbolFileDWARF::CalculateAbilities () { uint32_t abilities = 0; if (m_obj_file != NULL) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index cc4cf55..56d6bf7 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -84,7 +84,7 @@ public: SymbolFileDWARF(lldb_private::ObjectFile* ofile); virtual ~SymbolFileDWARF(); - virtual uint32_t GetAbilities (); + virtual uint32_t CalculateAbilities (); virtual void InitializeObject(); //------------------------------------------------------------------ diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index c09b166..e8212c2 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -419,7 +419,7 @@ SymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit } uint32_t -SymbolFileDWARFDebugMap::GetAbilities () +SymbolFileDWARFDebugMap::CalculateAbilities () { // In order to get the abilities of this plug-in, we look at the list of // N_OSO entries (object files) from the symbol table and make sure that diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index ec7dae4..9614d29 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -48,7 +48,7 @@ public: SymbolFileDWARFDebugMap (lldb_private::ObjectFile* ofile); virtual ~ SymbolFileDWARFDebugMap (); - virtual uint32_t GetAbilities (); + virtual uint32_t CalculateAbilities (); virtual void InitializeObject(); diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp index a44d092..5c7d8ed 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp @@ -83,19 +83,11 @@ SymbolFileSymtab::GetClangASTContext () bool SymbolFileSymtab::HasObjCSymbols () { - if (m_has_objc_symbols == eLazyBoolCalculate) - { - if (m_obj_file->GetSectionList()->FindSectionByName(ConstString("__objc_data"))) - m_has_objc_symbols = eLazyBoolYes; - else - m_has_objc_symbols = eLazyBoolNo; - } - - return m_has_objc_symbols == eLazyBoolYes; + return (m_abilities & RuntimeTypes) != 0; } uint32_t -SymbolFileSymtab::GetAbilities () +SymbolFileSymtab::CalculateAbilities () { uint32_t abilities = 0; if (m_obj_file) @@ -136,8 +128,11 @@ SymbolFileSymtab::GetAbilities () abilities |= GlobalVariables; } - if (HasObjCSymbols()) + symtab->AppendSymbolIndexesWithType(eSymbolTypeObjCClass, m_objc_class_indexes); + + if (!m_objc_class_indexes.empty()) { + symtab->SortSymbolIndexesByValue(m_objc_class_indexes, true); abilities |= RuntimeTypes; } } @@ -403,14 +398,10 @@ SymbolFileSymtab::FindTypes (const lldb_private::SymbolContext& sc, const lldb_p types.Insert(iter->second); return 1; } - - std::string symbol_name("OBJC_CLASS_$_"); - symbol_name.append(name.AsCString()); - ConstString symbol_const_string(symbol_name.c_str()); - + std::vector<uint32_t> indices; - - if (m_obj_file->GetSymtab()->FindAllSymbolsWithNameAndType(symbol_const_string, lldb::eSymbolTypeRuntime, indices) == 0) + /*const ConstString &name, SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& symbol_indexes*/ + if (m_obj_file->GetSymtab()->FindAllSymbolsWithNameAndType(name, lldb::eSymbolTypeAny, Symtab::eDebugNo, Symtab::eVisibilityAny, m_objc_class_indexes) == 0) return 0; const bool isForwardDecl = false; diff --git a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h index a913014..a932f4d 100644 --- a/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h +++ b/lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h @@ -42,7 +42,7 @@ public: virtual ~SymbolFileSymtab(); - virtual uint32_t GetAbilities (); + virtual uint32_t CalculateAbilities (); //------------------------------------------------------------------ // Compile Unit function calls @@ -119,12 +119,14 @@ public: GetPluginVersion(); protected: - lldb_private::LazyBool m_has_objc_symbols; std::vector<uint32_t> m_source_indexes; std::vector<uint32_t> m_func_indexes; std::vector<uint32_t> m_code_indexes; std::vector<uint32_t> m_data_indexes; std::vector<uint32_t> m_addr_indexes; // Anything that needs to go into an search by address + std::vector<uint32_t> m_objc_class_indexes; + + lldb_private::LazyBool m_has_objc_symbols; typedef std::map<lldb_private::ConstString, lldb::TypeSP> TypeMap; |
