diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -145,16 +145,24 @@ static bool GetCompleteDecl(clang::ASTContext *ast, clang::Decl *decl); - void SetMetadataAsUserID(const void *object, lldb::user_id_t user_id); + void SetMetadataAsUserID(const clang::Decl *decl, lldb::user_id_t user_id); + void SetMetadataAsUserID(const clang::Type *type, lldb::user_id_t user_id); - void SetMetadata(const void *object, ClangASTMetadata &meta_data); + void SetMetadata(const clang::Decl *object, ClangASTMetadata &meta_data); + void SetMetadata(const clang::Type *object, ClangASTMetadata &meta_data); + ClangASTMetadata *GetMetadata(const clang::Decl *object) { + return GetMetadata(getASTContext(), object); + } + + static ClangASTMetadata *GetMetadata(clang::ASTContext *ast, + const clang::Decl *object); - ClangASTMetadata *GetMetadata(const void *object) { + ClangASTMetadata *GetMetadata(const clang::Type *object) { return GetMetadata(getASTContext(), object); } static ClangASTMetadata *GetMetadata(clang::ASTContext *ast, - const void *object); + const clang::Type *object); // Basic Types CompilerType GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding, @@ -487,7 +495,7 @@ DeclContextGetAsNamespaceDecl(const CompilerDeclContext &dc); static ClangASTMetadata *DeclContextGetMetaData(const CompilerDeclContext &dc, - const void *object); + const clang::Decl *object); static clang::ASTContext * DeclContextGetClangASTContext(const CompilerDeclContext &dc); diff --git a/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h b/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h --- a/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h +++ b/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h @@ -126,15 +126,26 @@ ClangExternalASTSourceCommon(); ~ClangExternalASTSourceCommon() override; - ClangASTMetadata *GetMetadata(const void *object); - void SetMetadata(const void *object, ClangASTMetadata &metadata); + ClangASTMetadata *GetMetadata(const clang::Decl *object); + void SetMetadata(const clang::Decl *object, + const ClangASTMetadata &metadata) { + m_decl_metadata[object] = metadata; + } + + ClangASTMetadata *GetMetadata(const clang::Type *object); + void SetMetadata(const clang::Type *object, + const ClangASTMetadata &metadata) { + m_type_metadata[object] = metadata; + } static ClangExternalASTSourceCommon *Lookup(clang::ExternalASTSource *source); private: - typedef llvm::DenseMap MetadataMap; + typedef llvm::DenseMap DeclMetadataMap; + typedef llvm::DenseMap TypeMetadataMap; - MetadataMap m_metadata; + DeclMetadataMap m_decl_metadata; + TypeMetadataMap m_type_metadata; }; } // namespace lldb_private diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -1336,7 +1336,8 @@ dwarf->GetUID(type_die), Type::eEncodingIsUID, &attrs.decl, clang_type, Type::ResolveState::Full); type_sp->SetEncodingType(element_type); - m_ast.SetMetadataAsUserID(clang_type.GetOpaqueQualType(), die.GetID()); + const clang::Type *type = ClangUtil::GetQualType(clang_type).getTypePtr(); + m_ast.SetMetadataAsUserID(type, die.GetID()); return type_sp; } diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -2398,14 +2398,31 @@ } } -void ClangASTContext::SetMetadataAsUserID(const void *object, +void ClangASTContext::SetMetadataAsUserID(const clang::Decl *decl, user_id_t user_id) { ClangASTMetadata meta_data; meta_data.SetUserID(user_id); - SetMetadata(object, meta_data); + SetMetadata(decl, meta_data); } -void ClangASTContext::SetMetadata(const void *object, +void ClangASTContext::SetMetadataAsUserID(const clang::Type *type, + user_id_t user_id) { + ClangASTMetadata meta_data; + meta_data.SetUserID(user_id); + SetMetadata(type, meta_data); +} + +void ClangASTContext::SetMetadata(const clang::Decl *object, + ClangASTMetadata &metadata) { + ClangExternalASTSourceCommon *external_source = + ClangExternalASTSourceCommon::Lookup( + getASTContext()->getExternalSource()); + + if (external_source) + external_source->SetMetadata(object, metadata); +} + +void ClangASTContext::SetMetadata(const clang::Type *object, ClangASTMetadata &metadata) { ClangExternalASTSourceCommon *external_source = ClangExternalASTSourceCommon::Lookup( @@ -2416,14 +2433,23 @@ } ClangASTMetadata *ClangASTContext::GetMetadata(clang::ASTContext *ast, - const void *object) { + const clang::Decl *object) { ClangExternalASTSourceCommon *external_source = ClangExternalASTSourceCommon::Lookup(ast->getExternalSource()); if (external_source) return external_source->GetMetadata(object); - else - return nullptr; + return nullptr; +} + +ClangASTMetadata *ClangASTContext::GetMetadata(clang::ASTContext *ast, + const clang::Type *object) { + ClangExternalASTSourceCommon *external_source = + ClangExternalASTSourceCommon::Lookup(ast->getExternalSource()); + + if (external_source) + return external_source->GetMetadata(object); + return nullptr; } bool ClangASTContext::SetTagTypeKind(clang::QualType tag_qual_type, @@ -5096,7 +5122,7 @@ clang::QualType qual_type, const ExecutionContext *exe_ctx) { if (qual_type->isIncompleteArrayType()) - if (auto *metadata = ast.GetMetadata(qual_type.getAsOpaquePtr())) + if (auto *metadata = ast.GetMetadata(qual_type.getTypePtr())) return sym_file->GetDynamicArrayInfoForUID(metadata->GetUserID(), exe_ctx); return llvm::None; @@ -8856,8 +8882,11 @@ void ClangASTContext::DumpTypeDescription(lldb::opaque_compiler_type_t type) { StreamFile s(stdout, false); DumpTypeDescription(type, &s); + + CompilerType ct(this, type); + const clang::Type *clang_type = ClangUtil::GetQualType(ct).getTypePtr(); ClangASTMetadata *metadata = - ClangASTContext::GetMetadata(getASTContext(), type); + ClangASTContext::GetMetadata(getASTContext(), clang_type); if (metadata) { metadata->Dump(&s); } @@ -9485,7 +9514,7 @@ ClangASTMetadata * ClangASTContext::DeclContextGetMetaData(const CompilerDeclContext &dc, - const void *object) { + const Decl *object) { clang::ASTContext *ast = DeclContextGetClangASTContext(dc); if (ast) return ClangASTContext::GetMetadata(ast, object); diff --git a/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp b/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp --- a/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp +++ b/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp @@ -52,17 +52,19 @@ } ClangASTMetadata * -ClangExternalASTSourceCommon::GetMetadata(const void *object) { - auto It = m_metadata.find(object); - if (It != m_metadata.end()) +ClangExternalASTSourceCommon::GetMetadata(const clang::Decl *object) { + auto It = m_decl_metadata.find(object); + if (It != m_decl_metadata.end()) return &It->second; - else - return nullptr; + return nullptr; } -void ClangExternalASTSourceCommon::SetMetadata(const void *object, - ClangASTMetadata &metadata) { - m_metadata[object] = metadata; +ClangASTMetadata * +ClangExternalASTSourceCommon::GetMetadata(const clang::Type *object) { + auto It = m_type_metadata.find(object); + if (It != m_type_metadata.end()) + return &It->second; + return nullptr; } void ClangASTMetadata::Dump(Stream *s) {