Testcase fixes with the new symbol lookup code for
Objective-C, making symbol lookups for various raw
Objective-C symbols work correctly. The IR interpreter
makes these lookups because Clang has emitted raw
symbol references for ivars and classes.
Also improved performance in SymbolFiles, caching the
result of asking for SymbolFile abilities.
llvm-svn: 145758
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 @@
}
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
virtual
~SymbolFileSymtab();
- virtual uint32_t GetAbilities ();
+ virtual uint32_t CalculateAbilities ();
//------------------------------------------------------------------
// Compile Unit function calls
@@ -119,12 +119,14 @@
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;