aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Symbol/SymbolFile.h20
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp6
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp2
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h2
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp2
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h2
-rw-r--r--lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp27
-rw-r--r--lldb/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h6
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;