summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Symbol/Type.h4
-rw-r--r--lldb/include/lldb/Symbol/TypeList.h8
-rw-r--r--lldb/include/lldb/lldb-forward-rtti.h2
-rw-r--r--lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp2
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp73
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h3
-rw-r--r--lldb/source/Symbol/TypeList.cpp20
-rw-r--r--lldb/source/Target/ObjCLanguageRuntime.cpp2
8 files changed, 50 insertions, 64 deletions
diff --git a/lldb/include/lldb/Symbol/Type.h b/lldb/include/lldb/Symbol/Type.h
index d228164776a..3bbf2261895 100644
--- a/lldb/include/lldb/Symbol/Type.h
+++ b/lldb/include/lldb/Symbol/Type.h
@@ -20,7 +20,9 @@
namespace lldb_private {
-class Type : public UserID
+class Type :
+ public ReferenceCountedBaseVirtual<Type>,
+ public UserID
{
public:
typedef enum EncodingDataTypeTag
diff --git a/lldb/include/lldb/Symbol/TypeList.h b/lldb/include/lldb/Symbol/TypeList.h
index 7fdaef739f0..3ed3471a996 100644
--- a/lldb/include/lldb/Symbol/TypeList.h
+++ b/lldb/include/lldb/Symbol/TypeList.h
@@ -33,17 +33,17 @@ public:
void
Dump(Stream *s, bool show_context);
- lldb::TypeSP
- FindType(lldb::user_id_t uid);
+// lldb::TypeSP
+// FindType(lldb::user_id_t uid);
TypeList
FindTypes(const ConstString &name);
void
- Insert (lldb::TypeSP& type);
+ Insert (const lldb::TypeSP& type);
bool
- InsertUnique (lldb::TypeSP& type);
+ InsertUnique (const lldb::TypeSP& type);
uint32_t
GetSize() const;
diff --git a/lldb/include/lldb/lldb-forward-rtti.h b/lldb/include/lldb/lldb-forward-rtti.h
index 1cbb5915e19..37b757ed9cf 100644
--- a/lldb/include/lldb/lldb-forward-rtti.h
+++ b/lldb/include/lldb/lldb-forward-rtti.h
@@ -75,7 +75,7 @@ namespace lldb {
typedef IntrusiveSharedPtr<lldb_private::Thread>::Type ThreadSP;
typedef SharedPtr<lldb_private::ThreadPlan>::Type ThreadPlanSP;
typedef SharedPtr<lldb_private::ThreadPlanTracer>::Type ThreadPlanTracerSP;
- typedef SharedPtr<lldb_private::Type>::Type TypeSP;
+ typedef IntrusiveSharedPtr<lldb_private::Type>::Type TypeSP;
typedef SharedPtr<lldb_private::TypeImpl>::Type TypeImplSP;
typedef SharedPtr<lldb_private::FuncUnwinders>::Type FuncUnwindersSP;
typedef SharedPtr<lldb_private::UserSettingsController>::Type UserSettingsControllerSP;
diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
index 28c6f4b0228..818306054e5 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
@@ -296,7 +296,7 @@ AppleObjCRuntimeV2::GetDynamicTypeAndAddress (ValueObject &in_value,
if (!class_type_or_name.IsEmpty())
{
- if (class_type_or_name.GetTypeSP() != NULL)
+ if (class_type_or_name.GetTypeSP())
return true;
else
return false;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 881192761bc..bd68518933f 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -496,7 +496,7 @@ SymbolFileDWARF::get_apple_types_data()
const DataExtractor&
SymbolFileDWARF::get_apple_namespaces_data()
{
- return GetCachedSectionData (flagsGotDebugTypesData, eSectionTypeDWARFAppleNamespaces, m_data_apple_namespaces);
+ return GetCachedSectionData (flagsGotDebugNamespacesData, eSectionTypeDWARFAppleNamespaces, m_data_apple_namespaces);
}
@@ -1435,12 +1435,6 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type
const DWARFDebugInfoEntry* die = m_forward_decl_clang_type_to_die.lookup (clang_type_no_qualifiers);
if (die == NULL)
{
-// if (m_debug_map_symfile)
-// {
-// Type *type = m_die_to_type[die];
-// if (type && type->GetSymbolFile() != this)
-// return type->GetClangType();
-// }
// We have already resolved this type...
return clang_type;
}
@@ -1451,6 +1445,10 @@ SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type
m_forward_decl_clang_type_to_die.erase (clang_type_no_qualifiers);
+ // Disable external storage for this type so we don't get anymore
+ // clang::ExternalASTSource queries for this type.
+ ClangASTContext::SetHasExternalStorage (clang_type, false);
+
DWARFDebugInfo* debug_info = DebugInfo();
DWARFCompileUnit *curr_cu = debug_info->GetCompileUnitContainingDIE (die->GetOffset()).get();
@@ -2764,17 +2762,9 @@ SymbolFileDWARF::FindTypes(const SymbolContext& sc, const ConstString &name, con
if (matching_type)
{
// We found a type pointer, now find the shared pointer form our type list
- TypeSP type_sp (GetTypeList()->FindType(matching_type->GetID()));
- if (type_sp)
- {
- types.InsertUnique (type_sp);
- if (types.GetSize() >= max_matches)
- break;
- }
- else
- {
- ReportError ("error: can't find shared pointer for type 0x%8.8x.\n", matching_type->GetID());
- }
+ types.InsertUnique (TypeSP (matching_type));
+ if (types.GetSize() >= max_matches)
+ break;
}
}
return types.GetSize() - initial_types_size;
@@ -2865,9 +2855,7 @@ SymbolFileDWARF::FindTypes(std::vector<dw_offset_t> die_offsets, uint32_t max_ma
if (matching_type)
{
// We found a type pointer, now find the shared pointer form our type list
- TypeSP type_sp (GetTypeList()->FindType(matching_type->GetID()));
- assert (type_sp.get() != NULL);
- types.InsertUnique (type_sp);
+ types.InsertUnique (TypeSP (matching_type));
++num_matches;
if (num_matches >= max_matches)
break;
@@ -3274,7 +3262,7 @@ SymbolFileDWARF::GetTypeForDIE (DWARFCompileUnit *curr_cu, const DWARFDebugInfoE
else if (type_ptr != DIE_IS_BEING_PARSED)
{
// Grab the existing type from the master types lists
- type_sp = GetTypeList()->FindType(type_ptr->GetID());
+ type_sp = type_ptr;
}
}
@@ -3549,11 +3537,7 @@ SymbolFileDWARF::FindDefinitionTypeForDIE (DWARFCompileUnit* cu,
type_cu->GetOffset());
m_die_to_type[die] = resolved_type;
- type_sp = GetTypeList()->FindType(resolved_type->GetID());
- if (!type_sp)
- {
- DEBUG_PRINTF("unable to resolve type '%s' from DIE 0x%8.8x\n", type_name.GetCString(), die->GetOffset());
- }
+ type_sp = resolved_type;
break;
}
}
@@ -4014,16 +3998,6 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
clang_type,
Type::eResolveStateForward));
-#if LEAVE_ENUMS_FORWARD_DECLARED
- // Leave this as a forward declaration until we need
- // to know the details of the type. lldb_private::Type
- // will automatically call the SymbolFile virtual function
- // "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition(Type *)"
- // When the definition needs to be defined.
- m_forward_decl_die_to_clang_type[die] = clang_type;
- m_forward_decl_clang_type_to_die[ClangASTType::RemoveFastQualifiers (clang_type)] = die;
- ClangASTContext::SetHasExternalStorage (clang_type, true);
-#else
ast.StartTagDeclarationDefinition (clang_type);
if (die->HasChildren())
{
@@ -4031,7 +4005,6 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
ParseChildEnumerators(cu_sc, clang_type, type_sp->GetByteSize(), dwarf_cu, die);
}
ast.CompleteTagDeclarationDefinition (clang_type);
-#endif
}
}
break;
@@ -4355,7 +4328,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
type_ptr = m_die_to_type[die];
if (type_ptr)
{
- type_sp = type_list->FindType(type_ptr->GetID());
+ type_sp = type_ptr;
break;
}
}
@@ -4578,7 +4551,7 @@ SymbolFileDWARF::ParseType (const SymbolContext& sc, DWARFCompileUnit* dwarf_cu,
}
else if (type_ptr != DIE_IS_BEING_PARSED)
{
- type_sp = type_list->FindType(type_ptr->GetID());
+ type_sp = type_ptr;
}
}
return type_sp;
@@ -5242,11 +5215,21 @@ SymbolFileDWARF::SearchDeclContext (const clang::DeclContext *decl_context,
void
SymbolFileDWARF::FindExternalVisibleDeclsByName (void *baton,
- const clang::DeclContext *DC,
- clang::DeclarationName Name,
+ const clang::DeclContext *decl_context,
+ clang::DeclarationName decl_name,
llvm::SmallVectorImpl <clang::NamedDecl *> *results)
{
- SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton;
-
- symbol_file_dwarf->SearchDeclContext (DC, Name.getAsString().c_str(), results);
+
+ switch (decl_context->getDeclKind())
+ {
+ case clang::Decl::Namespace:
+ case clang::Decl::TranslationUnit:
+ {
+ SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton;
+ symbol_file_dwarf->SearchDeclContext (decl_context, decl_name.getAsString().c_str(), results);
+ }
+ break;
+ default:
+ break;
+ }
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 13b9c512b06..15f3147f1b0 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -251,7 +251,8 @@ protected:
flagsGotDebugRangesData = (1 << 9),
flagsGotDebugStrData = (1 << 10),
flagsGotDebugNamesData = (1 << 11),
- flagsGotDebugTypesData = (1 << 12)
+ flagsGotDebugTypesData = (1 << 12),
+ flagsGotDebugNamespacesData = (1 << 13)
};
bool NamespaceDeclMatchesThisSymbolFile (const lldb_private::ClangNamespaceDecl *namespace_decl);
diff --git a/lldb/source/Symbol/TypeList.cpp b/lldb/source/Symbol/TypeList.cpp
index 41d256da381..b6ddb42bd49 100644
--- a/lldb/source/Symbol/TypeList.cpp
+++ b/lldb/source/Symbol/TypeList.cpp
@@ -51,7 +51,7 @@ TypeList::~TypeList()
}
void
-TypeList::Insert (TypeSP& type_sp)
+TypeList::Insert (const TypeSP& type_sp)
{
// Just push each type on the back for now. We will worry about uniquing later
if (type_sp)
@@ -60,7 +60,7 @@ TypeList::Insert (TypeSP& type_sp)
bool
-TypeList::InsertUnique (TypeSP& type_sp)
+TypeList::InsertUnique (const TypeSP& type_sp)
{
if (type_sp)
{
@@ -80,14 +80,14 @@ TypeList::InsertUnique (TypeSP& type_sp)
//----------------------------------------------------------------------
// Find a base type by its unique ID.
//----------------------------------------------------------------------
-TypeSP
-TypeList::FindType(lldb::user_id_t uid)
-{
- iterator pos = m_types.find(uid);
- if (pos != m_types.end())
- return pos->second;
- return TypeSP();
-}
+//TypeSP
+//TypeList::FindType(lldb::user_id_t uid)
+//{
+// iterator pos = m_types.find(uid);
+// if (pos != m_types.end())
+// return pos->second;
+// return TypeSP();
+//}
//----------------------------------------------------------------------
// Find a type by name.
diff --git a/lldb/source/Target/ObjCLanguageRuntime.cpp b/lldb/source/Target/ObjCLanguageRuntime.cpp
index 359dac57ca3..42e707cdd8e 100644
--- a/lldb/source/Target/ObjCLanguageRuntime.cpp
+++ b/lldb/source/Target/ObjCLanguageRuntime.cpp
@@ -63,7 +63,7 @@ ObjCLanguageRuntime::AddToClassNameCache (lldb::addr_t class_addr, const char *n
TypeAndOrName class_type_or_name;
- if (type_sp != NULL)
+ if (type_sp)
class_type_or_name.SetTypeSP (type_sp);
else if (name && *name != '\0')
class_type_or_name.SetName (name);
OpenPOWER on IntegriCloud