15ffd83dbSDimitry Andric //===-- ClangASTImporter.cpp ----------------------------------------------===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 95ffd83dbSDimitry Andric #include "lldb/Core/Module.h" 105ffd83dbSDimitry Andric #include "lldb/Utility/LLDBAssert.h" 1181ad6265SDimitry Andric #include "lldb/Utility/LLDBLog.h" 125ffd83dbSDimitry Andric #include "lldb/Utility/Log.h" 13*0fca6ea1SDimitry Andric #include "clang/AST/ASTContext.h" 145ffd83dbSDimitry Andric #include "clang/AST/Decl.h" 155ffd83dbSDimitry Andric #include "clang/AST/DeclCXX.h" 165ffd83dbSDimitry Andric #include "clang/AST/DeclObjC.h" 17*0fca6ea1SDimitry Andric #include "clang/AST/RecordLayout.h" 185ffd83dbSDimitry Andric #include "clang/Sema/Lookup.h" 195ffd83dbSDimitry Andric #include "clang/Sema/Sema.h" 205ffd83dbSDimitry Andric #include "llvm/Support/raw_ostream.h" 215ffd83dbSDimitry Andric 225ffd83dbSDimitry Andric #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h" 235ffd83dbSDimitry Andric #include "Plugins/ExpressionParser/Clang/ClangASTMetadata.h" 245ffd83dbSDimitry Andric #include "Plugins/ExpressionParser/Clang/ClangASTSource.h" 255ffd83dbSDimitry Andric #include "Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h" 265ffd83dbSDimitry Andric #include "Plugins/ExpressionParser/Clang/ClangUtil.h" 275ffd83dbSDimitry Andric #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" 285ffd83dbSDimitry Andric 295ffd83dbSDimitry Andric #include <memory> 30bdd1243dSDimitry Andric #include <optional> 31*0fca6ea1SDimitry Andric #include <type_traits> 325ffd83dbSDimitry Andric 335ffd83dbSDimitry Andric using namespace lldb_private; 345ffd83dbSDimitry Andric using namespace clang; 355ffd83dbSDimitry Andric 365ffd83dbSDimitry Andric CompilerType ClangASTImporter::CopyType(TypeSystemClang &dst_ast, 375ffd83dbSDimitry Andric const CompilerType &src_type) { 385ffd83dbSDimitry Andric clang::ASTContext &dst_clang_ast = dst_ast.getASTContext(); 395ffd83dbSDimitry Andric 40bdd1243dSDimitry Andric auto src_ast = src_type.GetTypeSystem().dyn_cast_or_null<TypeSystemClang>(); 415ffd83dbSDimitry Andric if (!src_ast) 425ffd83dbSDimitry Andric return CompilerType(); 435ffd83dbSDimitry Andric 445ffd83dbSDimitry Andric clang::ASTContext &src_clang_ast = src_ast->getASTContext(); 455ffd83dbSDimitry Andric 465ffd83dbSDimitry Andric clang::QualType src_qual_type = ClangUtil::GetQualType(src_type); 475ffd83dbSDimitry Andric 485ffd83dbSDimitry Andric ImporterDelegateSP delegate_sp(GetDelegate(&dst_clang_ast, &src_clang_ast)); 495ffd83dbSDimitry Andric if (!delegate_sp) 505ffd83dbSDimitry Andric return CompilerType(); 515ffd83dbSDimitry Andric 525ffd83dbSDimitry Andric ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, &dst_clang_ast); 535ffd83dbSDimitry Andric 545ffd83dbSDimitry Andric llvm::Expected<QualType> ret_or_error = delegate_sp->Import(src_qual_type); 555ffd83dbSDimitry Andric if (!ret_or_error) { 5681ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 575ffd83dbSDimitry Andric LLDB_LOG_ERROR(log, ret_or_error.takeError(), 585ffd83dbSDimitry Andric "Couldn't import type: {0}"); 595ffd83dbSDimitry Andric return CompilerType(); 605ffd83dbSDimitry Andric } 615ffd83dbSDimitry Andric 625ffd83dbSDimitry Andric lldb::opaque_compiler_type_t dst_clang_type = ret_or_error->getAsOpaquePtr(); 635ffd83dbSDimitry Andric 645ffd83dbSDimitry Andric if (dst_clang_type) 65bdd1243dSDimitry Andric return CompilerType(dst_ast.weak_from_this(), dst_clang_type); 665ffd83dbSDimitry Andric return CompilerType(); 675ffd83dbSDimitry Andric } 685ffd83dbSDimitry Andric 695ffd83dbSDimitry Andric clang::Decl *ClangASTImporter::CopyDecl(clang::ASTContext *dst_ast, 705ffd83dbSDimitry Andric clang::Decl *decl) { 715ffd83dbSDimitry Andric ImporterDelegateSP delegate_sp; 725ffd83dbSDimitry Andric 735ffd83dbSDimitry Andric clang::ASTContext *src_ast = &decl->getASTContext(); 745ffd83dbSDimitry Andric delegate_sp = GetDelegate(dst_ast, src_ast); 755ffd83dbSDimitry Andric 765ffd83dbSDimitry Andric ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, dst_ast); 775ffd83dbSDimitry Andric 785ffd83dbSDimitry Andric if (!delegate_sp) 795ffd83dbSDimitry Andric return nullptr; 805ffd83dbSDimitry Andric 815ffd83dbSDimitry Andric llvm::Expected<clang::Decl *> result = delegate_sp->Import(decl); 825ffd83dbSDimitry Andric if (!result) { 8381ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 845ffd83dbSDimitry Andric LLDB_LOG_ERROR(log, result.takeError(), "Couldn't import decl: {0}"); 855ffd83dbSDimitry Andric if (log) { 865ffd83dbSDimitry Andric lldb::user_id_t user_id = LLDB_INVALID_UID; 875ffd83dbSDimitry Andric ClangASTMetadata *metadata = GetDeclMetadata(decl); 885ffd83dbSDimitry Andric if (metadata) 895ffd83dbSDimitry Andric user_id = metadata->GetUserID(); 905ffd83dbSDimitry Andric 915ffd83dbSDimitry Andric if (NamedDecl *named_decl = dyn_cast<NamedDecl>(decl)) 925ffd83dbSDimitry Andric LLDB_LOG(log, 935ffd83dbSDimitry Andric " [ClangASTImporter] WARNING: Failed to import a {0} " 945ffd83dbSDimitry Andric "'{1}', metadata {2}", 955ffd83dbSDimitry Andric decl->getDeclKindName(), named_decl->getNameAsString(), 965ffd83dbSDimitry Andric user_id); 975ffd83dbSDimitry Andric else 985ffd83dbSDimitry Andric LLDB_LOG(log, 995ffd83dbSDimitry Andric " [ClangASTImporter] WARNING: Failed to import a {0}, " 1005ffd83dbSDimitry Andric "metadata {1}", 1015ffd83dbSDimitry Andric decl->getDeclKindName(), user_id); 1025ffd83dbSDimitry Andric } 1035ffd83dbSDimitry Andric return nullptr; 1045ffd83dbSDimitry Andric } 1055ffd83dbSDimitry Andric 1065ffd83dbSDimitry Andric return *result; 1075ffd83dbSDimitry Andric } 1085ffd83dbSDimitry Andric 1095ffd83dbSDimitry Andric class DeclContextOverride { 1105ffd83dbSDimitry Andric private: 1115ffd83dbSDimitry Andric struct Backup { 1125ffd83dbSDimitry Andric clang::DeclContext *decl_context; 1135ffd83dbSDimitry Andric clang::DeclContext *lexical_decl_context; 1145ffd83dbSDimitry Andric }; 1155ffd83dbSDimitry Andric 1165ffd83dbSDimitry Andric llvm::DenseMap<clang::Decl *, Backup> m_backups; 1175ffd83dbSDimitry Andric 1185ffd83dbSDimitry Andric void OverrideOne(clang::Decl *decl) { 11906c3fb27SDimitry Andric if (m_backups.contains(decl)) { 1205ffd83dbSDimitry Andric return; 1215ffd83dbSDimitry Andric } 1225ffd83dbSDimitry Andric 1235ffd83dbSDimitry Andric m_backups[decl] = {decl->getDeclContext(), decl->getLexicalDeclContext()}; 1245ffd83dbSDimitry Andric 1255ffd83dbSDimitry Andric decl->setDeclContext(decl->getASTContext().getTranslationUnitDecl()); 1265ffd83dbSDimitry Andric decl->setLexicalDeclContext(decl->getASTContext().getTranslationUnitDecl()); 1275ffd83dbSDimitry Andric } 1285ffd83dbSDimitry Andric 1295ffd83dbSDimitry Andric bool ChainPassesThrough( 1305ffd83dbSDimitry Andric clang::Decl *decl, clang::DeclContext *base, 1315ffd83dbSDimitry Andric clang::DeclContext *(clang::Decl::*contextFromDecl)(), 1325ffd83dbSDimitry Andric clang::DeclContext *(clang::DeclContext::*contextFromContext)()) { 1335ffd83dbSDimitry Andric for (DeclContext *decl_ctx = (decl->*contextFromDecl)(); decl_ctx; 1345ffd83dbSDimitry Andric decl_ctx = (decl_ctx->*contextFromContext)()) { 1355ffd83dbSDimitry Andric if (decl_ctx == base) { 1365ffd83dbSDimitry Andric return true; 1375ffd83dbSDimitry Andric } 1385ffd83dbSDimitry Andric } 1395ffd83dbSDimitry Andric 1405ffd83dbSDimitry Andric return false; 1415ffd83dbSDimitry Andric } 1425ffd83dbSDimitry Andric 1435ffd83dbSDimitry Andric clang::Decl *GetEscapedChild(clang::Decl *decl, 1445ffd83dbSDimitry Andric clang::DeclContext *base = nullptr) { 1455ffd83dbSDimitry Andric if (base) { 1465ffd83dbSDimitry Andric // decl's DeclContext chains must pass through base. 1475ffd83dbSDimitry Andric 1485ffd83dbSDimitry Andric if (!ChainPassesThrough(decl, base, &clang::Decl::getDeclContext, 1495ffd83dbSDimitry Andric &clang::DeclContext::getParent) || 1505ffd83dbSDimitry Andric !ChainPassesThrough(decl, base, &clang::Decl::getLexicalDeclContext, 1515ffd83dbSDimitry Andric &clang::DeclContext::getLexicalParent)) { 1525ffd83dbSDimitry Andric return decl; 1535ffd83dbSDimitry Andric } 1545ffd83dbSDimitry Andric } else { 1555ffd83dbSDimitry Andric base = clang::dyn_cast<clang::DeclContext>(decl); 1565ffd83dbSDimitry Andric 1575ffd83dbSDimitry Andric if (!base) { 1585ffd83dbSDimitry Andric return nullptr; 1595ffd83dbSDimitry Andric } 1605ffd83dbSDimitry Andric } 1615ffd83dbSDimitry Andric 1625ffd83dbSDimitry Andric if (clang::DeclContext *context = 1635ffd83dbSDimitry Andric clang::dyn_cast<clang::DeclContext>(decl)) { 1645ffd83dbSDimitry Andric for (clang::Decl *decl : context->decls()) { 1655ffd83dbSDimitry Andric if (clang::Decl *escaped_child = GetEscapedChild(decl)) { 1665ffd83dbSDimitry Andric return escaped_child; 1675ffd83dbSDimitry Andric } 1685ffd83dbSDimitry Andric } 1695ffd83dbSDimitry Andric } 1705ffd83dbSDimitry Andric 1715ffd83dbSDimitry Andric return nullptr; 1725ffd83dbSDimitry Andric } 1735ffd83dbSDimitry Andric 1745ffd83dbSDimitry Andric void Override(clang::Decl *decl) { 1755ffd83dbSDimitry Andric if (clang::Decl *escaped_child = GetEscapedChild(decl)) { 17681ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 1775ffd83dbSDimitry Andric 1785ffd83dbSDimitry Andric LLDB_LOG(log, 1795ffd83dbSDimitry Andric " [ClangASTImporter] DeclContextOverride couldn't " 1805ffd83dbSDimitry Andric "override ({0}Decl*){1} - its child ({2}Decl*){3} escapes", 1815ffd83dbSDimitry Andric decl->getDeclKindName(), decl, escaped_child->getDeclKindName(), 1825ffd83dbSDimitry Andric escaped_child); 1835ffd83dbSDimitry Andric lldbassert(0 && "Couldn't override!"); 1845ffd83dbSDimitry Andric } 1855ffd83dbSDimitry Andric 1865ffd83dbSDimitry Andric OverrideOne(decl); 1875ffd83dbSDimitry Andric } 1885ffd83dbSDimitry Andric 1895ffd83dbSDimitry Andric public: 190fe6060f1SDimitry Andric DeclContextOverride() = default; 1915ffd83dbSDimitry Andric 1925ffd83dbSDimitry Andric void OverrideAllDeclsFromContainingFunction(clang::Decl *decl) { 1935ffd83dbSDimitry Andric for (DeclContext *decl_context = decl->getLexicalDeclContext(); 1945ffd83dbSDimitry Andric decl_context; decl_context = decl_context->getLexicalParent()) { 1955ffd83dbSDimitry Andric DeclContext *redecl_context = decl_context->getRedeclContext(); 1965ffd83dbSDimitry Andric 1975ffd83dbSDimitry Andric if (llvm::isa<FunctionDecl>(redecl_context) && 1985ffd83dbSDimitry Andric llvm::isa<TranslationUnitDecl>(redecl_context->getLexicalParent())) { 1995ffd83dbSDimitry Andric for (clang::Decl *child_decl : decl_context->decls()) { 2005ffd83dbSDimitry Andric Override(child_decl); 2015ffd83dbSDimitry Andric } 2025ffd83dbSDimitry Andric } 2035ffd83dbSDimitry Andric } 2045ffd83dbSDimitry Andric } 2055ffd83dbSDimitry Andric 2065ffd83dbSDimitry Andric ~DeclContextOverride() { 2075ffd83dbSDimitry Andric for (const std::pair<clang::Decl *, Backup> &backup : m_backups) { 2085ffd83dbSDimitry Andric backup.first->setDeclContext(backup.second.decl_context); 2095ffd83dbSDimitry Andric backup.first->setLexicalDeclContext(backup.second.lexical_decl_context); 2105ffd83dbSDimitry Andric } 2115ffd83dbSDimitry Andric } 2125ffd83dbSDimitry Andric }; 2135ffd83dbSDimitry Andric 2145ffd83dbSDimitry Andric namespace { 2155ffd83dbSDimitry Andric /// Completes all imported TagDecls at the end of the scope. 2165ffd83dbSDimitry Andric /// 2175ffd83dbSDimitry Andric /// While in a CompleteTagDeclsScope, every decl that could be completed will 2185ffd83dbSDimitry Andric /// be completed at the end of the scope (including all Decls that are 2195ffd83dbSDimitry Andric /// imported while completing the original Decls). 2205ffd83dbSDimitry Andric class CompleteTagDeclsScope : public ClangASTImporter::NewDeclListener { 2215ffd83dbSDimitry Andric ClangASTImporter::ImporterDelegateSP m_delegate; 222e8d8bef9SDimitry Andric /// List of declarations in the target context that need to be completed. 223e8d8bef9SDimitry Andric /// Every declaration should only be completed once and therefore should only 224e8d8bef9SDimitry Andric /// be once in this list. 225e8d8bef9SDimitry Andric llvm::SetVector<NamedDecl *> m_decls_to_complete; 226e8d8bef9SDimitry Andric /// Set of declarations that already were successfully completed (not just 227e8d8bef9SDimitry Andric /// added to m_decls_to_complete). 2285ffd83dbSDimitry Andric llvm::SmallPtrSet<NamedDecl *, 32> m_decls_already_completed; 2295ffd83dbSDimitry Andric clang::ASTContext *m_dst_ctx; 2305ffd83dbSDimitry Andric clang::ASTContext *m_src_ctx; 2315ffd83dbSDimitry Andric ClangASTImporter &importer; 2325ffd83dbSDimitry Andric 2335ffd83dbSDimitry Andric public: 2345ffd83dbSDimitry Andric /// Constructs a CompleteTagDeclsScope. 2355ffd83dbSDimitry Andric /// \param importer The ClangASTImporter that we should observe. 2365ffd83dbSDimitry Andric /// \param dst_ctx The ASTContext to which Decls are imported. 2375ffd83dbSDimitry Andric /// \param src_ctx The ASTContext from which Decls are imported. 2385ffd83dbSDimitry Andric explicit CompleteTagDeclsScope(ClangASTImporter &importer, 2395ffd83dbSDimitry Andric clang::ASTContext *dst_ctx, 2405ffd83dbSDimitry Andric clang::ASTContext *src_ctx) 2415ffd83dbSDimitry Andric : m_delegate(importer.GetDelegate(dst_ctx, src_ctx)), m_dst_ctx(dst_ctx), 2425ffd83dbSDimitry Andric m_src_ctx(src_ctx), importer(importer) { 2435ffd83dbSDimitry Andric m_delegate->SetImportListener(this); 2445ffd83dbSDimitry Andric } 2455ffd83dbSDimitry Andric 24681ad6265SDimitry Andric ~CompleteTagDeclsScope() override { 2475ffd83dbSDimitry Andric ClangASTImporter::ASTContextMetadataSP to_context_md = 2485ffd83dbSDimitry Andric importer.GetContextMetadata(m_dst_ctx); 2495ffd83dbSDimitry Andric 2505ffd83dbSDimitry Andric // Complete all decls we collected until now. 2515ffd83dbSDimitry Andric while (!m_decls_to_complete.empty()) { 2525ffd83dbSDimitry Andric NamedDecl *decl = m_decls_to_complete.pop_back_val(); 2535ffd83dbSDimitry Andric m_decls_already_completed.insert(decl); 2545ffd83dbSDimitry Andric 255e8d8bef9SDimitry Andric // The decl that should be completed has to be imported into the target 256e8d8bef9SDimitry Andric // context from some other context. 257e8d8bef9SDimitry Andric assert(to_context_md->hasOrigin(decl)); 2585ffd83dbSDimitry Andric // We should only complete decls coming from the source context. 259e8d8bef9SDimitry Andric assert(to_context_md->getOrigin(decl).ctx == m_src_ctx); 2605ffd83dbSDimitry Andric 261e8d8bef9SDimitry Andric Decl *original_decl = to_context_md->getOrigin(decl).decl; 2625ffd83dbSDimitry Andric 2635ffd83dbSDimitry Andric // Complete the decl now. 2645ffd83dbSDimitry Andric TypeSystemClang::GetCompleteDecl(m_src_ctx, original_decl); 2655ffd83dbSDimitry Andric if (auto *tag_decl = dyn_cast<TagDecl>(decl)) { 2665ffd83dbSDimitry Andric if (auto *original_tag_decl = dyn_cast<TagDecl>(original_decl)) { 2675ffd83dbSDimitry Andric if (original_tag_decl->isCompleteDefinition()) { 2685ffd83dbSDimitry Andric m_delegate->ImportDefinitionTo(tag_decl, original_tag_decl); 2695ffd83dbSDimitry Andric tag_decl->setCompleteDefinition(true); 2705ffd83dbSDimitry Andric } 2715ffd83dbSDimitry Andric } 2725ffd83dbSDimitry Andric 2735ffd83dbSDimitry Andric tag_decl->setHasExternalLexicalStorage(false); 2745ffd83dbSDimitry Andric tag_decl->setHasExternalVisibleStorage(false); 2755ffd83dbSDimitry Andric } else if (auto *container_decl = dyn_cast<ObjCContainerDecl>(decl)) { 2765ffd83dbSDimitry Andric container_decl->setHasExternalLexicalStorage(false); 2775ffd83dbSDimitry Andric container_decl->setHasExternalVisibleStorage(false); 2785ffd83dbSDimitry Andric } 2795ffd83dbSDimitry Andric 280e8d8bef9SDimitry Andric to_context_md->removeOrigin(decl); 2815ffd83dbSDimitry Andric } 2825ffd83dbSDimitry Andric 2835ffd83dbSDimitry Andric // Stop listening to imported decls. We do this after clearing the 2845ffd83dbSDimitry Andric // Decls we needed to import to catch all Decls they might have pulled in. 2855ffd83dbSDimitry Andric m_delegate->RemoveImportListener(); 2865ffd83dbSDimitry Andric } 2875ffd83dbSDimitry Andric 2885ffd83dbSDimitry Andric void NewDeclImported(clang::Decl *from, clang::Decl *to) override { 2895ffd83dbSDimitry Andric // Filter out decls that we can't complete later. 2905ffd83dbSDimitry Andric if (!isa<TagDecl>(to) && !isa<ObjCInterfaceDecl>(to)) 2915ffd83dbSDimitry Andric return; 2925ffd83dbSDimitry Andric RecordDecl *from_record_decl = dyn_cast<RecordDecl>(from); 2935ffd83dbSDimitry Andric // We don't need to complete injected class name decls. 2945ffd83dbSDimitry Andric if (from_record_decl && from_record_decl->isInjectedClassName()) 2955ffd83dbSDimitry Andric return; 2965ffd83dbSDimitry Andric 2975ffd83dbSDimitry Andric NamedDecl *to_named_decl = dyn_cast<NamedDecl>(to); 2985ffd83dbSDimitry Andric // Check if we already completed this type. 2990eae32dcSDimitry Andric if (m_decls_already_completed.contains(to_named_decl)) 3005ffd83dbSDimitry Andric return; 301e8d8bef9SDimitry Andric // Queue this type to be completed. 302e8d8bef9SDimitry Andric m_decls_to_complete.insert(to_named_decl); 3035ffd83dbSDimitry Andric } 3045ffd83dbSDimitry Andric }; 3055ffd83dbSDimitry Andric } // namespace 3065ffd83dbSDimitry Andric 3075ffd83dbSDimitry Andric CompilerType ClangASTImporter::DeportType(TypeSystemClang &dst, 3085ffd83dbSDimitry Andric const CompilerType &src_type) { 30981ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 3105ffd83dbSDimitry Andric 311bdd1243dSDimitry Andric auto src_ctxt = src_type.GetTypeSystem().dyn_cast_or_null<TypeSystemClang>(); 312bdd1243dSDimitry Andric if (!src_ctxt) 313bdd1243dSDimitry Andric return {}; 3145ffd83dbSDimitry Andric 3155ffd83dbSDimitry Andric LLDB_LOG(log, 316*0fca6ea1SDimitry Andric " [ClangASTImporter] DeportType called on ({0}Type*){1:x} " 317*0fca6ea1SDimitry Andric "from (ASTContext*){2:x} to (ASTContext*){3:x}", 3185ffd83dbSDimitry Andric src_type.GetTypeName(), src_type.GetOpaqueQualType(), 3195ffd83dbSDimitry Andric &src_ctxt->getASTContext(), &dst.getASTContext()); 3205ffd83dbSDimitry Andric 3215ffd83dbSDimitry Andric DeclContextOverride decl_context_override; 3225ffd83dbSDimitry Andric 3235ffd83dbSDimitry Andric if (auto *t = ClangUtil::GetQualType(src_type)->getAs<TagType>()) 3245ffd83dbSDimitry Andric decl_context_override.OverrideAllDeclsFromContainingFunction(t->getDecl()); 3255ffd83dbSDimitry Andric 3265ffd83dbSDimitry Andric CompleteTagDeclsScope complete_scope(*this, &dst.getASTContext(), 3275ffd83dbSDimitry Andric &src_ctxt->getASTContext()); 3285ffd83dbSDimitry Andric return CopyType(dst, src_type); 3295ffd83dbSDimitry Andric } 3305ffd83dbSDimitry Andric 3315ffd83dbSDimitry Andric clang::Decl *ClangASTImporter::DeportDecl(clang::ASTContext *dst_ctx, 3325ffd83dbSDimitry Andric clang::Decl *decl) { 33381ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 3345ffd83dbSDimitry Andric 3355ffd83dbSDimitry Andric clang::ASTContext *src_ctx = &decl->getASTContext(); 3365ffd83dbSDimitry Andric LLDB_LOG(log, 337*0fca6ea1SDimitry Andric " [ClangASTImporter] DeportDecl called on ({0}Decl*){1:x} from " 338*0fca6ea1SDimitry Andric "(ASTContext*){2:x} to (ASTContext*){3:x}", 3395ffd83dbSDimitry Andric decl->getDeclKindName(), decl, src_ctx, dst_ctx); 3405ffd83dbSDimitry Andric 3415ffd83dbSDimitry Andric DeclContextOverride decl_context_override; 3425ffd83dbSDimitry Andric 3435ffd83dbSDimitry Andric decl_context_override.OverrideAllDeclsFromContainingFunction(decl); 3445ffd83dbSDimitry Andric 3455ffd83dbSDimitry Andric clang::Decl *result; 3465ffd83dbSDimitry Andric { 3475ffd83dbSDimitry Andric CompleteTagDeclsScope complete_scope(*this, dst_ctx, src_ctx); 3485ffd83dbSDimitry Andric result = CopyDecl(dst_ctx, decl); 3495ffd83dbSDimitry Andric } 3505ffd83dbSDimitry Andric 3515ffd83dbSDimitry Andric if (!result) 3525ffd83dbSDimitry Andric return nullptr; 3535ffd83dbSDimitry Andric 3545ffd83dbSDimitry Andric LLDB_LOG(log, 355*0fca6ea1SDimitry Andric " [ClangASTImporter] DeportDecl deported ({0}Decl*){1:x} to " 356*0fca6ea1SDimitry Andric "({2}Decl*){3:x}", 3575ffd83dbSDimitry Andric decl->getDeclKindName(), decl, result->getDeclKindName(), result); 3585ffd83dbSDimitry Andric 3595ffd83dbSDimitry Andric return result; 3605ffd83dbSDimitry Andric } 3615ffd83dbSDimitry Andric 3625ffd83dbSDimitry Andric bool ClangASTImporter::CanImport(const CompilerType &type) { 3635ffd83dbSDimitry Andric if (!ClangUtil::IsClangType(type)) 3645ffd83dbSDimitry Andric return false; 3655ffd83dbSDimitry Andric 3665ffd83dbSDimitry Andric clang::QualType qual_type( 3675ffd83dbSDimitry Andric ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type))); 3685ffd83dbSDimitry Andric 3695ffd83dbSDimitry Andric const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 3705ffd83dbSDimitry Andric switch (type_class) { 3715ffd83dbSDimitry Andric case clang::Type::Record: { 3725ffd83dbSDimitry Andric const clang::CXXRecordDecl *cxx_record_decl = 3735ffd83dbSDimitry Andric qual_type->getAsCXXRecordDecl(); 3745ffd83dbSDimitry Andric if (cxx_record_decl) { 3755ffd83dbSDimitry Andric if (GetDeclOrigin(cxx_record_decl).Valid()) 3765ffd83dbSDimitry Andric return true; 3775ffd83dbSDimitry Andric } 3785ffd83dbSDimitry Andric } break; 3795ffd83dbSDimitry Andric 3805ffd83dbSDimitry Andric case clang::Type::Enum: { 3815ffd83dbSDimitry Andric clang::EnumDecl *enum_decl = 3825ffd83dbSDimitry Andric llvm::cast<clang::EnumType>(qual_type)->getDecl(); 3835ffd83dbSDimitry Andric if (enum_decl) { 3845ffd83dbSDimitry Andric if (GetDeclOrigin(enum_decl).Valid()) 3855ffd83dbSDimitry Andric return true; 3865ffd83dbSDimitry Andric } 3875ffd83dbSDimitry Andric } break; 3885ffd83dbSDimitry Andric 3895ffd83dbSDimitry Andric case clang::Type::ObjCObject: 3905ffd83dbSDimitry Andric case clang::Type::ObjCInterface: { 3915ffd83dbSDimitry Andric const clang::ObjCObjectType *objc_class_type = 3925ffd83dbSDimitry Andric llvm::dyn_cast<clang::ObjCObjectType>(qual_type); 3935ffd83dbSDimitry Andric if (objc_class_type) { 3945ffd83dbSDimitry Andric clang::ObjCInterfaceDecl *class_interface_decl = 3955ffd83dbSDimitry Andric objc_class_type->getInterface(); 3965ffd83dbSDimitry Andric // We currently can't complete objective C types through the newly added 3975ffd83dbSDimitry Andric // ASTContext because it only supports TagDecl objects right now... 3985ffd83dbSDimitry Andric if (class_interface_decl) { 3995ffd83dbSDimitry Andric if (GetDeclOrigin(class_interface_decl).Valid()) 4005ffd83dbSDimitry Andric return true; 4015ffd83dbSDimitry Andric } 4025ffd83dbSDimitry Andric } 4035ffd83dbSDimitry Andric } break; 4045ffd83dbSDimitry Andric 4055ffd83dbSDimitry Andric case clang::Type::Typedef: 4065ffd83dbSDimitry Andric return CanImport(CompilerType(type.GetTypeSystem(), 4075ffd83dbSDimitry Andric llvm::cast<clang::TypedefType>(qual_type) 4085ffd83dbSDimitry Andric ->getDecl() 4095ffd83dbSDimitry Andric ->getUnderlyingType() 4105ffd83dbSDimitry Andric .getAsOpaquePtr())); 4115ffd83dbSDimitry Andric 4125ffd83dbSDimitry Andric case clang::Type::Auto: 4135ffd83dbSDimitry Andric return CanImport(CompilerType(type.GetTypeSystem(), 4145ffd83dbSDimitry Andric llvm::cast<clang::AutoType>(qual_type) 4155ffd83dbSDimitry Andric ->getDeducedType() 4165ffd83dbSDimitry Andric .getAsOpaquePtr())); 4175ffd83dbSDimitry Andric 4185ffd83dbSDimitry Andric case clang::Type::Elaborated: 4195ffd83dbSDimitry Andric return CanImport(CompilerType(type.GetTypeSystem(), 4205ffd83dbSDimitry Andric llvm::cast<clang::ElaboratedType>(qual_type) 4215ffd83dbSDimitry Andric ->getNamedType() 4225ffd83dbSDimitry Andric .getAsOpaquePtr())); 4235ffd83dbSDimitry Andric 4245ffd83dbSDimitry Andric case clang::Type::Paren: 4255ffd83dbSDimitry Andric return CanImport(CompilerType( 4265ffd83dbSDimitry Andric type.GetTypeSystem(), 4275ffd83dbSDimitry Andric llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr())); 4285ffd83dbSDimitry Andric 4295ffd83dbSDimitry Andric default: 4305ffd83dbSDimitry Andric break; 4315ffd83dbSDimitry Andric } 4325ffd83dbSDimitry Andric 4335ffd83dbSDimitry Andric return false; 4345ffd83dbSDimitry Andric } 4355ffd83dbSDimitry Andric 4365ffd83dbSDimitry Andric bool ClangASTImporter::Import(const CompilerType &type) { 4375ffd83dbSDimitry Andric if (!ClangUtil::IsClangType(type)) 4385ffd83dbSDimitry Andric return false; 4395ffd83dbSDimitry Andric 4405ffd83dbSDimitry Andric clang::QualType qual_type( 4415ffd83dbSDimitry Andric ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type))); 4425ffd83dbSDimitry Andric 4435ffd83dbSDimitry Andric const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 4445ffd83dbSDimitry Andric switch (type_class) { 4455ffd83dbSDimitry Andric case clang::Type::Record: { 4465ffd83dbSDimitry Andric const clang::CXXRecordDecl *cxx_record_decl = 4475ffd83dbSDimitry Andric qual_type->getAsCXXRecordDecl(); 4485ffd83dbSDimitry Andric if (cxx_record_decl) { 4495ffd83dbSDimitry Andric if (GetDeclOrigin(cxx_record_decl).Valid()) 4505ffd83dbSDimitry Andric return CompleteAndFetchChildren(qual_type); 4515ffd83dbSDimitry Andric } 4525ffd83dbSDimitry Andric } break; 4535ffd83dbSDimitry Andric 4545ffd83dbSDimitry Andric case clang::Type::Enum: { 4555ffd83dbSDimitry Andric clang::EnumDecl *enum_decl = 4565ffd83dbSDimitry Andric llvm::cast<clang::EnumType>(qual_type)->getDecl(); 4575ffd83dbSDimitry Andric if (enum_decl) { 4585ffd83dbSDimitry Andric if (GetDeclOrigin(enum_decl).Valid()) 4595ffd83dbSDimitry Andric return CompleteAndFetchChildren(qual_type); 4605ffd83dbSDimitry Andric } 4615ffd83dbSDimitry Andric } break; 4625ffd83dbSDimitry Andric 4635ffd83dbSDimitry Andric case clang::Type::ObjCObject: 4645ffd83dbSDimitry Andric case clang::Type::ObjCInterface: { 4655ffd83dbSDimitry Andric const clang::ObjCObjectType *objc_class_type = 4665ffd83dbSDimitry Andric llvm::dyn_cast<clang::ObjCObjectType>(qual_type); 4675ffd83dbSDimitry Andric if (objc_class_type) { 4685ffd83dbSDimitry Andric clang::ObjCInterfaceDecl *class_interface_decl = 4695ffd83dbSDimitry Andric objc_class_type->getInterface(); 4705ffd83dbSDimitry Andric // We currently can't complete objective C types through the newly added 4715ffd83dbSDimitry Andric // ASTContext because it only supports TagDecl objects right now... 4725ffd83dbSDimitry Andric if (class_interface_decl) { 4735ffd83dbSDimitry Andric if (GetDeclOrigin(class_interface_decl).Valid()) 4745ffd83dbSDimitry Andric return CompleteAndFetchChildren(qual_type); 4755ffd83dbSDimitry Andric } 4765ffd83dbSDimitry Andric } 4775ffd83dbSDimitry Andric } break; 4785ffd83dbSDimitry Andric 4795ffd83dbSDimitry Andric case clang::Type::Typedef: 4805ffd83dbSDimitry Andric return Import(CompilerType(type.GetTypeSystem(), 4815ffd83dbSDimitry Andric llvm::cast<clang::TypedefType>(qual_type) 4825ffd83dbSDimitry Andric ->getDecl() 4835ffd83dbSDimitry Andric ->getUnderlyingType() 4845ffd83dbSDimitry Andric .getAsOpaquePtr())); 4855ffd83dbSDimitry Andric 4865ffd83dbSDimitry Andric case clang::Type::Auto: 4875ffd83dbSDimitry Andric return Import(CompilerType(type.GetTypeSystem(), 4885ffd83dbSDimitry Andric llvm::cast<clang::AutoType>(qual_type) 4895ffd83dbSDimitry Andric ->getDeducedType() 4905ffd83dbSDimitry Andric .getAsOpaquePtr())); 4915ffd83dbSDimitry Andric 4925ffd83dbSDimitry Andric case clang::Type::Elaborated: 4935ffd83dbSDimitry Andric return Import(CompilerType(type.GetTypeSystem(), 4945ffd83dbSDimitry Andric llvm::cast<clang::ElaboratedType>(qual_type) 4955ffd83dbSDimitry Andric ->getNamedType() 4965ffd83dbSDimitry Andric .getAsOpaquePtr())); 4975ffd83dbSDimitry Andric 4985ffd83dbSDimitry Andric case clang::Type::Paren: 4995ffd83dbSDimitry Andric return Import(CompilerType( 5005ffd83dbSDimitry Andric type.GetTypeSystem(), 5015ffd83dbSDimitry Andric llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr())); 5025ffd83dbSDimitry Andric 5035ffd83dbSDimitry Andric default: 5045ffd83dbSDimitry Andric break; 5055ffd83dbSDimitry Andric } 5065ffd83dbSDimitry Andric return false; 5075ffd83dbSDimitry Andric } 5085ffd83dbSDimitry Andric 5095ffd83dbSDimitry Andric bool ClangASTImporter::CompleteType(const CompilerType &compiler_type) { 5105ffd83dbSDimitry Andric if (!CanImport(compiler_type)) 5115ffd83dbSDimitry Andric return false; 5125ffd83dbSDimitry Andric 5135ffd83dbSDimitry Andric if (Import(compiler_type)) { 5145ffd83dbSDimitry Andric TypeSystemClang::CompleteTagDeclarationDefinition(compiler_type); 5155ffd83dbSDimitry Andric return true; 5165ffd83dbSDimitry Andric } 5175ffd83dbSDimitry Andric 5185ffd83dbSDimitry Andric TypeSystemClang::SetHasExternalStorage(compiler_type.GetOpaqueQualType(), 5195ffd83dbSDimitry Andric false); 5205ffd83dbSDimitry Andric return false; 5215ffd83dbSDimitry Andric } 5225ffd83dbSDimitry Andric 523*0fca6ea1SDimitry Andric /// Copy layout information from \ref source_map to the \ref destination_map. 524*0fca6ea1SDimitry Andric /// 525*0fca6ea1SDimitry Andric /// In the process of copying over layout info, we may need to import 526*0fca6ea1SDimitry Andric /// decls from the \ref source_map. This function will use the supplied 527*0fca6ea1SDimitry Andric /// \ref importer to import the necessary decls into \ref dest_ctx. 528*0fca6ea1SDimitry Andric /// 529*0fca6ea1SDimitry Andric /// \param[in,out] dest_ctx Destination ASTContext into which we import 530*0fca6ea1SDimitry Andric /// decls from the \ref source_map. 531*0fca6ea1SDimitry Andric /// \param[out] destination_map A map from decls in \ref dest_ctx to an 532*0fca6ea1SDimitry Andric /// integral offest, which will be copies 533*0fca6ea1SDimitry Andric /// of the decl/offest pairs in \ref source_map 534*0fca6ea1SDimitry Andric /// if successful. 535*0fca6ea1SDimitry Andric /// \param[in] source_map A map from decls to integral offests. These will 536*0fca6ea1SDimitry Andric /// be copied into \ref destination_map. 537*0fca6ea1SDimitry Andric /// \param[in,out] importer Used to import decls into \ref dest_ctx. 538*0fca6ea1SDimitry Andric /// 539*0fca6ea1SDimitry Andric /// \returns On success, will return 'true' and the offsets in \ref 540*0fca6ea1SDimitry Andric /// destination_map 541*0fca6ea1SDimitry Andric /// are usable copies of \ref source_map. 542*0fca6ea1SDimitry Andric template <class D, class O> 543*0fca6ea1SDimitry Andric static bool ImportOffsetMap(clang::ASTContext *dest_ctx, 544*0fca6ea1SDimitry Andric llvm::DenseMap<const D *, O> &destination_map, 545*0fca6ea1SDimitry Andric llvm::DenseMap<const D *, O> &source_map, 546*0fca6ea1SDimitry Andric ClangASTImporter &importer) { 547*0fca6ea1SDimitry Andric // When importing fields into a new record, clang has a hard requirement that 548*0fca6ea1SDimitry Andric // fields be imported in field offset order. Since they are stored in a 549*0fca6ea1SDimitry Andric // DenseMap with a pointer as the key type, this means we cannot simply 550*0fca6ea1SDimitry Andric // iterate over the map, as the order will be non-deterministic. Instead we 551*0fca6ea1SDimitry Andric // have to sort by the offset and then insert in sorted order. 552*0fca6ea1SDimitry Andric typedef llvm::DenseMap<const D *, O> MapType; 553*0fca6ea1SDimitry Andric typedef typename MapType::value_type PairType; 554*0fca6ea1SDimitry Andric std::vector<PairType> sorted_items; 555*0fca6ea1SDimitry Andric sorted_items.reserve(source_map.size()); 556*0fca6ea1SDimitry Andric sorted_items.assign(source_map.begin(), source_map.end()); 557*0fca6ea1SDimitry Andric llvm::sort(sorted_items, llvm::less_second()); 558*0fca6ea1SDimitry Andric 559*0fca6ea1SDimitry Andric for (const auto &item : sorted_items) { 560*0fca6ea1SDimitry Andric DeclFromUser<D> user_decl(const_cast<D *>(item.first)); 561*0fca6ea1SDimitry Andric DeclFromParser<D> parser_decl(user_decl.Import(dest_ctx, importer)); 562*0fca6ea1SDimitry Andric if (parser_decl.IsInvalid()) 563*0fca6ea1SDimitry Andric return false; 564*0fca6ea1SDimitry Andric destination_map.insert( 565*0fca6ea1SDimitry Andric std::pair<const D *, O>(parser_decl.decl, item.second)); 566*0fca6ea1SDimitry Andric } 567*0fca6ea1SDimitry Andric 568*0fca6ea1SDimitry Andric return true; 569*0fca6ea1SDimitry Andric } 570*0fca6ea1SDimitry Andric 571*0fca6ea1SDimitry Andric /// Given a CXXRecordDecl, will calculate and populate \ref base_offsets 572*0fca6ea1SDimitry Andric /// with the integral offsets of any of its (possibly virtual) base classes. 573*0fca6ea1SDimitry Andric /// 574*0fca6ea1SDimitry Andric /// \param[in] record_layout ASTRecordLayout of \ref record. 575*0fca6ea1SDimitry Andric /// \param[in] record The record that we're calculating the base layouts of. 576*0fca6ea1SDimitry Andric /// \param[out] base_offsets Map of base-class decl to integral offset which 577*0fca6ea1SDimitry Andric /// this function will fill in. 578*0fca6ea1SDimitry Andric /// 579*0fca6ea1SDimitry Andric /// \returns On success, will return 'true' and the offsets in \ref base_offsets 580*0fca6ea1SDimitry Andric /// are usable. 581*0fca6ea1SDimitry Andric template <bool IsVirtual> 582*0fca6ea1SDimitry Andric bool ExtractBaseOffsets(const ASTRecordLayout &record_layout, 583*0fca6ea1SDimitry Andric DeclFromUser<const CXXRecordDecl> &record, 584*0fca6ea1SDimitry Andric llvm::DenseMap<const clang::CXXRecordDecl *, 585*0fca6ea1SDimitry Andric clang::CharUnits> &base_offsets) { 586*0fca6ea1SDimitry Andric for (CXXRecordDecl::base_class_const_iterator 587*0fca6ea1SDimitry Andric bi = (IsVirtual ? record->vbases_begin() : record->bases_begin()), 588*0fca6ea1SDimitry Andric be = (IsVirtual ? record->vbases_end() : record->bases_end()); 589*0fca6ea1SDimitry Andric bi != be; ++bi) { 590*0fca6ea1SDimitry Andric if (!IsVirtual && bi->isVirtual()) 591*0fca6ea1SDimitry Andric continue; 592*0fca6ea1SDimitry Andric 593*0fca6ea1SDimitry Andric const clang::Type *origin_base_type = bi->getType().getTypePtr(); 594*0fca6ea1SDimitry Andric const clang::RecordType *origin_base_record_type = 595*0fca6ea1SDimitry Andric origin_base_type->getAs<RecordType>(); 596*0fca6ea1SDimitry Andric 597*0fca6ea1SDimitry Andric if (!origin_base_record_type) 598*0fca6ea1SDimitry Andric return false; 599*0fca6ea1SDimitry Andric 600*0fca6ea1SDimitry Andric DeclFromUser<RecordDecl> origin_base_record( 601*0fca6ea1SDimitry Andric origin_base_record_type->getDecl()); 602*0fca6ea1SDimitry Andric 603*0fca6ea1SDimitry Andric if (origin_base_record.IsInvalid()) 604*0fca6ea1SDimitry Andric return false; 605*0fca6ea1SDimitry Andric 606*0fca6ea1SDimitry Andric DeclFromUser<CXXRecordDecl> origin_base_cxx_record( 607*0fca6ea1SDimitry Andric DynCast<CXXRecordDecl>(origin_base_record)); 608*0fca6ea1SDimitry Andric 609*0fca6ea1SDimitry Andric if (origin_base_cxx_record.IsInvalid()) 610*0fca6ea1SDimitry Andric return false; 611*0fca6ea1SDimitry Andric 612*0fca6ea1SDimitry Andric CharUnits base_offset; 613*0fca6ea1SDimitry Andric 614*0fca6ea1SDimitry Andric if (IsVirtual) 615*0fca6ea1SDimitry Andric base_offset = 616*0fca6ea1SDimitry Andric record_layout.getVBaseClassOffset(origin_base_cxx_record.decl); 617*0fca6ea1SDimitry Andric else 618*0fca6ea1SDimitry Andric base_offset = 619*0fca6ea1SDimitry Andric record_layout.getBaseClassOffset(origin_base_cxx_record.decl); 620*0fca6ea1SDimitry Andric 621*0fca6ea1SDimitry Andric base_offsets.insert(std::pair<const CXXRecordDecl *, CharUnits>( 622*0fca6ea1SDimitry Andric origin_base_cxx_record.decl, base_offset)); 623*0fca6ea1SDimitry Andric } 624*0fca6ea1SDimitry Andric 625*0fca6ea1SDimitry Andric return true; 626*0fca6ea1SDimitry Andric } 627*0fca6ea1SDimitry Andric 628*0fca6ea1SDimitry Andric bool ClangASTImporter::importRecordLayoutFromOrigin( 629*0fca6ea1SDimitry Andric const RecordDecl *record, uint64_t &size, uint64_t &alignment, 630*0fca6ea1SDimitry Andric llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, 631*0fca6ea1SDimitry Andric llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 632*0fca6ea1SDimitry Andric &base_offsets, 633*0fca6ea1SDimitry Andric llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 634*0fca6ea1SDimitry Andric &vbase_offsets) { 635*0fca6ea1SDimitry Andric 636*0fca6ea1SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 637*0fca6ea1SDimitry Andric 638*0fca6ea1SDimitry Andric clang::ASTContext &dest_ctx = record->getASTContext(); 639*0fca6ea1SDimitry Andric LLDB_LOG(log, 640*0fca6ea1SDimitry Andric "LayoutRecordType on (ASTContext*){0:x} '{1}' for (RecordDecl*)" 641*0fca6ea1SDimitry Andric "{2:x} [name = '{3}']", 642*0fca6ea1SDimitry Andric &dest_ctx, 643*0fca6ea1SDimitry Andric TypeSystemClang::GetASTContext(&dest_ctx)->getDisplayName(), record, 644*0fca6ea1SDimitry Andric record->getName()); 645*0fca6ea1SDimitry Andric 646*0fca6ea1SDimitry Andric DeclFromParser<const RecordDecl> parser_record(record); 647*0fca6ea1SDimitry Andric DeclFromUser<const RecordDecl> origin_record(parser_record.GetOrigin(*this)); 648*0fca6ea1SDimitry Andric 649*0fca6ea1SDimitry Andric if (origin_record.IsInvalid()) 650*0fca6ea1SDimitry Andric return false; 651*0fca6ea1SDimitry Andric 652*0fca6ea1SDimitry Andric std::remove_reference_t<decltype(field_offsets)> origin_field_offsets; 653*0fca6ea1SDimitry Andric std::remove_reference_t<decltype(base_offsets)> origin_base_offsets; 654*0fca6ea1SDimitry Andric std::remove_reference_t<decltype(vbase_offsets)> origin_virtual_base_offsets; 655*0fca6ea1SDimitry Andric 656*0fca6ea1SDimitry Andric TypeSystemClang::GetCompleteDecl( 657*0fca6ea1SDimitry Andric &origin_record->getASTContext(), 658*0fca6ea1SDimitry Andric const_cast<RecordDecl *>(origin_record.decl)); 659*0fca6ea1SDimitry Andric 660*0fca6ea1SDimitry Andric clang::RecordDecl *definition = origin_record.decl->getDefinition(); 661*0fca6ea1SDimitry Andric if (!definition || !definition->isCompleteDefinition()) 662*0fca6ea1SDimitry Andric return false; 663*0fca6ea1SDimitry Andric 664*0fca6ea1SDimitry Andric const ASTRecordLayout &record_layout( 665*0fca6ea1SDimitry Andric origin_record->getASTContext().getASTRecordLayout(origin_record.decl)); 666*0fca6ea1SDimitry Andric 667*0fca6ea1SDimitry Andric int field_idx = 0, field_count = record_layout.getFieldCount(); 668*0fca6ea1SDimitry Andric 669*0fca6ea1SDimitry Andric for (RecordDecl::field_iterator fi = origin_record->field_begin(), 670*0fca6ea1SDimitry Andric fe = origin_record->field_end(); 671*0fca6ea1SDimitry Andric fi != fe; ++fi) { 672*0fca6ea1SDimitry Andric if (field_idx >= field_count) 673*0fca6ea1SDimitry Andric return false; // Layout didn't go well. Bail out. 674*0fca6ea1SDimitry Andric 675*0fca6ea1SDimitry Andric uint64_t field_offset = record_layout.getFieldOffset(field_idx); 676*0fca6ea1SDimitry Andric 677*0fca6ea1SDimitry Andric origin_field_offsets.insert( 678*0fca6ea1SDimitry Andric std::pair<const FieldDecl *, uint64_t>(*fi, field_offset)); 679*0fca6ea1SDimitry Andric 680*0fca6ea1SDimitry Andric field_idx++; 681*0fca6ea1SDimitry Andric } 682*0fca6ea1SDimitry Andric 683*0fca6ea1SDimitry Andric DeclFromUser<const CXXRecordDecl> origin_cxx_record( 684*0fca6ea1SDimitry Andric DynCast<const CXXRecordDecl>(origin_record)); 685*0fca6ea1SDimitry Andric 686*0fca6ea1SDimitry Andric if (origin_cxx_record.IsValid()) { 687*0fca6ea1SDimitry Andric if (!ExtractBaseOffsets<false>(record_layout, origin_cxx_record, 688*0fca6ea1SDimitry Andric origin_base_offsets) || 689*0fca6ea1SDimitry Andric !ExtractBaseOffsets<true>(record_layout, origin_cxx_record, 690*0fca6ea1SDimitry Andric origin_virtual_base_offsets)) 691*0fca6ea1SDimitry Andric return false; 692*0fca6ea1SDimitry Andric } 693*0fca6ea1SDimitry Andric 694*0fca6ea1SDimitry Andric if (!ImportOffsetMap(&dest_ctx, field_offsets, origin_field_offsets, *this) || 695*0fca6ea1SDimitry Andric !ImportOffsetMap(&dest_ctx, base_offsets, origin_base_offsets, *this) || 696*0fca6ea1SDimitry Andric !ImportOffsetMap(&dest_ctx, vbase_offsets, origin_virtual_base_offsets, 697*0fca6ea1SDimitry Andric *this)) 698*0fca6ea1SDimitry Andric return false; 699*0fca6ea1SDimitry Andric 700*0fca6ea1SDimitry Andric size = record_layout.getSize().getQuantity() * dest_ctx.getCharWidth(); 701*0fca6ea1SDimitry Andric alignment = 702*0fca6ea1SDimitry Andric record_layout.getAlignment().getQuantity() * dest_ctx.getCharWidth(); 703*0fca6ea1SDimitry Andric 704*0fca6ea1SDimitry Andric if (log) { 705*0fca6ea1SDimitry Andric LLDB_LOG(log, "LRT returned:"); 706*0fca6ea1SDimitry Andric LLDB_LOG(log, "LRT Original = (RecordDecl*){0:x}", 707*0fca6ea1SDimitry Andric static_cast<const void *>(origin_record.decl)); 708*0fca6ea1SDimitry Andric LLDB_LOG(log, "LRT Size = {0}", size); 709*0fca6ea1SDimitry Andric LLDB_LOG(log, "LRT Alignment = {0}", alignment); 710*0fca6ea1SDimitry Andric LLDB_LOG(log, "LRT Fields:"); 711*0fca6ea1SDimitry Andric for (RecordDecl::field_iterator fi = record->field_begin(), 712*0fca6ea1SDimitry Andric fe = record->field_end(); 713*0fca6ea1SDimitry Andric fi != fe; ++fi) { 714*0fca6ea1SDimitry Andric LLDB_LOG( 715*0fca6ea1SDimitry Andric log, 716*0fca6ea1SDimitry Andric "LRT (FieldDecl*){0:x}, Name = '{1}', Type = '{2}', Offset = " 717*0fca6ea1SDimitry Andric "{3} bits", 718*0fca6ea1SDimitry Andric *fi, fi->getName(), fi->getType().getAsString(), field_offsets[*fi]); 719*0fca6ea1SDimitry Andric } 720*0fca6ea1SDimitry Andric DeclFromParser<const CXXRecordDecl> parser_cxx_record = 721*0fca6ea1SDimitry Andric DynCast<const CXXRecordDecl>(parser_record); 722*0fca6ea1SDimitry Andric if (parser_cxx_record.IsValid()) { 723*0fca6ea1SDimitry Andric LLDB_LOG(log, "LRT Bases:"); 724*0fca6ea1SDimitry Andric for (CXXRecordDecl::base_class_const_iterator 725*0fca6ea1SDimitry Andric bi = parser_cxx_record->bases_begin(), 726*0fca6ea1SDimitry Andric be = parser_cxx_record->bases_end(); 727*0fca6ea1SDimitry Andric bi != be; ++bi) { 728*0fca6ea1SDimitry Andric bool is_virtual = bi->isVirtual(); 729*0fca6ea1SDimitry Andric 730*0fca6ea1SDimitry Andric QualType base_type = bi->getType(); 731*0fca6ea1SDimitry Andric const RecordType *base_record_type = base_type->getAs<RecordType>(); 732*0fca6ea1SDimitry Andric DeclFromParser<RecordDecl> base_record(base_record_type->getDecl()); 733*0fca6ea1SDimitry Andric DeclFromParser<CXXRecordDecl> base_cxx_record = 734*0fca6ea1SDimitry Andric DynCast<CXXRecordDecl>(base_record); 735*0fca6ea1SDimitry Andric 736*0fca6ea1SDimitry Andric LLDB_LOG(log, 737*0fca6ea1SDimitry Andric "LRT {0}(CXXRecordDecl*){1:x}, Name = '{2}', Offset = " 738*0fca6ea1SDimitry Andric "{3} chars", 739*0fca6ea1SDimitry Andric (is_virtual ? "Virtual " : ""), base_cxx_record.decl, 740*0fca6ea1SDimitry Andric base_cxx_record.decl->getName(), 741*0fca6ea1SDimitry Andric (is_virtual 742*0fca6ea1SDimitry Andric ? vbase_offsets[base_cxx_record.decl].getQuantity() 743*0fca6ea1SDimitry Andric : base_offsets[base_cxx_record.decl].getQuantity())); 744*0fca6ea1SDimitry Andric } 745*0fca6ea1SDimitry Andric } else { 746*0fca6ea1SDimitry Andric LLDB_LOG(log, "LRD Not a CXXRecord, so no bases"); 747*0fca6ea1SDimitry Andric } 748*0fca6ea1SDimitry Andric } 749*0fca6ea1SDimitry Andric 750*0fca6ea1SDimitry Andric return true; 751*0fca6ea1SDimitry Andric } 752*0fca6ea1SDimitry Andric 7535ffd83dbSDimitry Andric bool ClangASTImporter::LayoutRecordType( 7545ffd83dbSDimitry Andric const clang::RecordDecl *record_decl, uint64_t &bit_size, 7555ffd83dbSDimitry Andric uint64_t &alignment, 7565ffd83dbSDimitry Andric llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, 7575ffd83dbSDimitry Andric llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 7585ffd83dbSDimitry Andric &base_offsets, 7595ffd83dbSDimitry Andric llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 7605ffd83dbSDimitry Andric &vbase_offsets) { 7615ffd83dbSDimitry Andric RecordDeclToLayoutMap::iterator pos = 7625ffd83dbSDimitry Andric m_record_decl_to_layout_map.find(record_decl); 7635ffd83dbSDimitry Andric base_offsets.clear(); 7645ffd83dbSDimitry Andric vbase_offsets.clear(); 7655ffd83dbSDimitry Andric if (pos != m_record_decl_to_layout_map.end()) { 7665ffd83dbSDimitry Andric bit_size = pos->second.bit_size; 7675ffd83dbSDimitry Andric alignment = pos->second.alignment; 7685ffd83dbSDimitry Andric field_offsets.swap(pos->second.field_offsets); 7695ffd83dbSDimitry Andric base_offsets.swap(pos->second.base_offsets); 7705ffd83dbSDimitry Andric vbase_offsets.swap(pos->second.vbase_offsets); 7715ffd83dbSDimitry Andric m_record_decl_to_layout_map.erase(pos); 772*0fca6ea1SDimitry Andric return true; 773*0fca6ea1SDimitry Andric } 774*0fca6ea1SDimitry Andric 775*0fca6ea1SDimitry Andric // It's possible that we calculated the layout in a different 776*0fca6ea1SDimitry Andric // ClangASTImporter instance. Try to import such layout if 777*0fca6ea1SDimitry Andric // our decl has an origin. 778*0fca6ea1SDimitry Andric if (auto origin = GetDeclOrigin(record_decl); origin.Valid()) 779*0fca6ea1SDimitry Andric if (importRecordLayoutFromOrigin(record_decl, bit_size, alignment, 780*0fca6ea1SDimitry Andric field_offsets, base_offsets, 781*0fca6ea1SDimitry Andric vbase_offsets)) 782*0fca6ea1SDimitry Andric return true; 783*0fca6ea1SDimitry Andric 7845ffd83dbSDimitry Andric bit_size = 0; 7855ffd83dbSDimitry Andric alignment = 0; 7865ffd83dbSDimitry Andric field_offsets.clear(); 787*0fca6ea1SDimitry Andric 788*0fca6ea1SDimitry Andric return false; 7895ffd83dbSDimitry Andric } 7905ffd83dbSDimitry Andric 7915ffd83dbSDimitry Andric void ClangASTImporter::SetRecordLayout(clang::RecordDecl *decl, 7925ffd83dbSDimitry Andric const LayoutInfo &layout) { 7935ffd83dbSDimitry Andric m_record_decl_to_layout_map.insert(std::make_pair(decl, layout)); 7945ffd83dbSDimitry Andric } 7955ffd83dbSDimitry Andric 7965ffd83dbSDimitry Andric bool ClangASTImporter::CompleteTagDecl(clang::TagDecl *decl) { 7975ffd83dbSDimitry Andric DeclOrigin decl_origin = GetDeclOrigin(decl); 7985ffd83dbSDimitry Andric 7995ffd83dbSDimitry Andric if (!decl_origin.Valid()) 8005ffd83dbSDimitry Andric return false; 8015ffd83dbSDimitry Andric 8025ffd83dbSDimitry Andric if (!TypeSystemClang::GetCompleteDecl(decl_origin.ctx, decl_origin.decl)) 8035ffd83dbSDimitry Andric return false; 8045ffd83dbSDimitry Andric 8055ffd83dbSDimitry Andric ImporterDelegateSP delegate_sp( 8065ffd83dbSDimitry Andric GetDelegate(&decl->getASTContext(), decl_origin.ctx)); 8075ffd83dbSDimitry Andric 8085ffd83dbSDimitry Andric ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, 8095ffd83dbSDimitry Andric &decl->getASTContext()); 8105ffd83dbSDimitry Andric if (delegate_sp) 8115ffd83dbSDimitry Andric delegate_sp->ImportDefinitionTo(decl, decl_origin.decl); 8125ffd83dbSDimitry Andric 8135ffd83dbSDimitry Andric return true; 8145ffd83dbSDimitry Andric } 8155ffd83dbSDimitry Andric 8165ffd83dbSDimitry Andric bool ClangASTImporter::CompleteTagDeclWithOrigin(clang::TagDecl *decl, 8175ffd83dbSDimitry Andric clang::TagDecl *origin_decl) { 8185ffd83dbSDimitry Andric clang::ASTContext *origin_ast_ctx = &origin_decl->getASTContext(); 8195ffd83dbSDimitry Andric 8205ffd83dbSDimitry Andric if (!TypeSystemClang::GetCompleteDecl(origin_ast_ctx, origin_decl)) 8215ffd83dbSDimitry Andric return false; 8225ffd83dbSDimitry Andric 8235ffd83dbSDimitry Andric ImporterDelegateSP delegate_sp( 8245ffd83dbSDimitry Andric GetDelegate(&decl->getASTContext(), origin_ast_ctx)); 8255ffd83dbSDimitry Andric 8265ffd83dbSDimitry Andric if (delegate_sp) 8275ffd83dbSDimitry Andric delegate_sp->ImportDefinitionTo(decl, origin_decl); 8285ffd83dbSDimitry Andric 8295ffd83dbSDimitry Andric ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 8305ffd83dbSDimitry Andric 831e8d8bef9SDimitry Andric context_md->setOrigin(decl, DeclOrigin(origin_ast_ctx, origin_decl)); 8325ffd83dbSDimitry Andric return true; 8335ffd83dbSDimitry Andric } 8345ffd83dbSDimitry Andric 8355ffd83dbSDimitry Andric bool ClangASTImporter::CompleteObjCInterfaceDecl( 8365ffd83dbSDimitry Andric clang::ObjCInterfaceDecl *interface_decl) { 8375ffd83dbSDimitry Andric DeclOrigin decl_origin = GetDeclOrigin(interface_decl); 8385ffd83dbSDimitry Andric 8395ffd83dbSDimitry Andric if (!decl_origin.Valid()) 8405ffd83dbSDimitry Andric return false; 8415ffd83dbSDimitry Andric 8425ffd83dbSDimitry Andric if (!TypeSystemClang::GetCompleteDecl(decl_origin.ctx, decl_origin.decl)) 8435ffd83dbSDimitry Andric return false; 8445ffd83dbSDimitry Andric 8455ffd83dbSDimitry Andric ImporterDelegateSP delegate_sp( 8465ffd83dbSDimitry Andric GetDelegate(&interface_decl->getASTContext(), decl_origin.ctx)); 8475ffd83dbSDimitry Andric 8485ffd83dbSDimitry Andric if (delegate_sp) 8495ffd83dbSDimitry Andric delegate_sp->ImportDefinitionTo(interface_decl, decl_origin.decl); 8505ffd83dbSDimitry Andric 8515ffd83dbSDimitry Andric if (ObjCInterfaceDecl *super_class = interface_decl->getSuperClass()) 8525ffd83dbSDimitry Andric RequireCompleteType(clang::QualType(super_class->getTypeForDecl(), 0)); 8535ffd83dbSDimitry Andric 8545ffd83dbSDimitry Andric return true; 8555ffd83dbSDimitry Andric } 8565ffd83dbSDimitry Andric 8575ffd83dbSDimitry Andric bool ClangASTImporter::CompleteAndFetchChildren(clang::QualType type) { 8585ffd83dbSDimitry Andric if (!RequireCompleteType(type)) 8595ffd83dbSDimitry Andric return false; 8605ffd83dbSDimitry Andric 86181ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 8625ffd83dbSDimitry Andric 8635ffd83dbSDimitry Andric if (const TagType *tag_type = type->getAs<TagType>()) { 8645ffd83dbSDimitry Andric TagDecl *tag_decl = tag_type->getDecl(); 8655ffd83dbSDimitry Andric 8665ffd83dbSDimitry Andric DeclOrigin decl_origin = GetDeclOrigin(tag_decl); 8675ffd83dbSDimitry Andric 8685ffd83dbSDimitry Andric if (!decl_origin.Valid()) 8695ffd83dbSDimitry Andric return false; 8705ffd83dbSDimitry Andric 8715ffd83dbSDimitry Andric ImporterDelegateSP delegate_sp( 8725ffd83dbSDimitry Andric GetDelegate(&tag_decl->getASTContext(), decl_origin.ctx)); 8735ffd83dbSDimitry Andric 8745ffd83dbSDimitry Andric ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, 8755ffd83dbSDimitry Andric &tag_decl->getASTContext()); 8765ffd83dbSDimitry Andric 8775ffd83dbSDimitry Andric TagDecl *origin_tag_decl = llvm::dyn_cast<TagDecl>(decl_origin.decl); 8785ffd83dbSDimitry Andric 8795ffd83dbSDimitry Andric for (Decl *origin_child_decl : origin_tag_decl->decls()) { 8805ffd83dbSDimitry Andric llvm::Expected<Decl *> imported_or_err = 8815ffd83dbSDimitry Andric delegate_sp->Import(origin_child_decl); 8825ffd83dbSDimitry Andric if (!imported_or_err) { 8835ffd83dbSDimitry Andric LLDB_LOG_ERROR(log, imported_or_err.takeError(), 8845ffd83dbSDimitry Andric "Couldn't import decl: {0}"); 8855ffd83dbSDimitry Andric return false; 8865ffd83dbSDimitry Andric } 8875ffd83dbSDimitry Andric } 8885ffd83dbSDimitry Andric 8895ffd83dbSDimitry Andric if (RecordDecl *record_decl = dyn_cast<RecordDecl>(origin_tag_decl)) 8905ffd83dbSDimitry Andric record_decl->setHasLoadedFieldsFromExternalStorage(true); 8915ffd83dbSDimitry Andric 8925ffd83dbSDimitry Andric return true; 8935ffd83dbSDimitry Andric } 8945ffd83dbSDimitry Andric 8955ffd83dbSDimitry Andric if (const ObjCObjectType *objc_object_type = type->getAs<ObjCObjectType>()) { 8965ffd83dbSDimitry Andric if (ObjCInterfaceDecl *objc_interface_decl = 8975ffd83dbSDimitry Andric objc_object_type->getInterface()) { 8985ffd83dbSDimitry Andric DeclOrigin decl_origin = GetDeclOrigin(objc_interface_decl); 8995ffd83dbSDimitry Andric 9005ffd83dbSDimitry Andric if (!decl_origin.Valid()) 9015ffd83dbSDimitry Andric return false; 9025ffd83dbSDimitry Andric 9035ffd83dbSDimitry Andric ImporterDelegateSP delegate_sp( 9045ffd83dbSDimitry Andric GetDelegate(&objc_interface_decl->getASTContext(), decl_origin.ctx)); 9055ffd83dbSDimitry Andric 9065ffd83dbSDimitry Andric ObjCInterfaceDecl *origin_interface_decl = 9075ffd83dbSDimitry Andric llvm::dyn_cast<ObjCInterfaceDecl>(decl_origin.decl); 9085ffd83dbSDimitry Andric 9095ffd83dbSDimitry Andric for (Decl *origin_child_decl : origin_interface_decl->decls()) { 9105ffd83dbSDimitry Andric llvm::Expected<Decl *> imported_or_err = 9115ffd83dbSDimitry Andric delegate_sp->Import(origin_child_decl); 9125ffd83dbSDimitry Andric if (!imported_or_err) { 9135ffd83dbSDimitry Andric LLDB_LOG_ERROR(log, imported_or_err.takeError(), 9145ffd83dbSDimitry Andric "Couldn't import decl: {0}"); 9155ffd83dbSDimitry Andric return false; 9165ffd83dbSDimitry Andric } 9175ffd83dbSDimitry Andric } 9185ffd83dbSDimitry Andric 9195ffd83dbSDimitry Andric return true; 9205ffd83dbSDimitry Andric } 9215ffd83dbSDimitry Andric return false; 9225ffd83dbSDimitry Andric } 9235ffd83dbSDimitry Andric 9245ffd83dbSDimitry Andric return true; 9255ffd83dbSDimitry Andric } 9265ffd83dbSDimitry Andric 9275ffd83dbSDimitry Andric bool ClangASTImporter::RequireCompleteType(clang::QualType type) { 9285ffd83dbSDimitry Andric if (type.isNull()) 9295ffd83dbSDimitry Andric return false; 9305ffd83dbSDimitry Andric 9315ffd83dbSDimitry Andric if (const TagType *tag_type = type->getAs<TagType>()) { 9325ffd83dbSDimitry Andric TagDecl *tag_decl = tag_type->getDecl(); 9335ffd83dbSDimitry Andric 9345ffd83dbSDimitry Andric if (tag_decl->getDefinition() || tag_decl->isBeingDefined()) 9355ffd83dbSDimitry Andric return true; 9365ffd83dbSDimitry Andric 9375ffd83dbSDimitry Andric return CompleteTagDecl(tag_decl); 9385ffd83dbSDimitry Andric } 9395ffd83dbSDimitry Andric if (const ObjCObjectType *objc_object_type = type->getAs<ObjCObjectType>()) { 9405ffd83dbSDimitry Andric if (ObjCInterfaceDecl *objc_interface_decl = 9415ffd83dbSDimitry Andric objc_object_type->getInterface()) 9425ffd83dbSDimitry Andric return CompleteObjCInterfaceDecl(objc_interface_decl); 9435ffd83dbSDimitry Andric return false; 9445ffd83dbSDimitry Andric } 9455ffd83dbSDimitry Andric if (const ArrayType *array_type = type->getAsArrayTypeUnsafe()) 9465ffd83dbSDimitry Andric return RequireCompleteType(array_type->getElementType()); 9475ffd83dbSDimitry Andric if (const AtomicType *atomic_type = type->getAs<AtomicType>()) 9485ffd83dbSDimitry Andric return RequireCompleteType(atomic_type->getPointeeType()); 9495ffd83dbSDimitry Andric 9505ffd83dbSDimitry Andric return true; 9515ffd83dbSDimitry Andric } 9525ffd83dbSDimitry Andric 9535ffd83dbSDimitry Andric ClangASTMetadata *ClangASTImporter::GetDeclMetadata(const clang::Decl *decl) { 9545ffd83dbSDimitry Andric DeclOrigin decl_origin = GetDeclOrigin(decl); 9555ffd83dbSDimitry Andric 9565ffd83dbSDimitry Andric if (decl_origin.Valid()) { 9575ffd83dbSDimitry Andric TypeSystemClang *ast = TypeSystemClang::GetASTContext(decl_origin.ctx); 9585ffd83dbSDimitry Andric return ast->GetMetadata(decl_origin.decl); 9595ffd83dbSDimitry Andric } 9605ffd83dbSDimitry Andric TypeSystemClang *ast = TypeSystemClang::GetASTContext(&decl->getASTContext()); 9615ffd83dbSDimitry Andric return ast->GetMetadata(decl); 9625ffd83dbSDimitry Andric } 9635ffd83dbSDimitry Andric 9645ffd83dbSDimitry Andric ClangASTImporter::DeclOrigin 9655ffd83dbSDimitry Andric ClangASTImporter::GetDeclOrigin(const clang::Decl *decl) { 9665ffd83dbSDimitry Andric ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 9675ffd83dbSDimitry Andric 968e8d8bef9SDimitry Andric return context_md->getOrigin(decl); 9695ffd83dbSDimitry Andric } 9705ffd83dbSDimitry Andric 9715ffd83dbSDimitry Andric void ClangASTImporter::SetDeclOrigin(const clang::Decl *decl, 9725ffd83dbSDimitry Andric clang::Decl *original_decl) { 9735ffd83dbSDimitry Andric ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 974e8d8bef9SDimitry Andric context_md->setOrigin( 975e8d8bef9SDimitry Andric decl, DeclOrigin(&original_decl->getASTContext(), original_decl)); 9765ffd83dbSDimitry Andric } 9775ffd83dbSDimitry Andric 9785ffd83dbSDimitry Andric void ClangASTImporter::RegisterNamespaceMap(const clang::NamespaceDecl *decl, 9795ffd83dbSDimitry Andric NamespaceMapSP &namespace_map) { 9805ffd83dbSDimitry Andric ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 9815ffd83dbSDimitry Andric 9825ffd83dbSDimitry Andric context_md->m_namespace_maps[decl] = namespace_map; 9835ffd83dbSDimitry Andric } 9845ffd83dbSDimitry Andric 9855ffd83dbSDimitry Andric ClangASTImporter::NamespaceMapSP 9865ffd83dbSDimitry Andric ClangASTImporter::GetNamespaceMap(const clang::NamespaceDecl *decl) { 9875ffd83dbSDimitry Andric ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 9885ffd83dbSDimitry Andric 9895ffd83dbSDimitry Andric NamespaceMetaMap &namespace_maps = context_md->m_namespace_maps; 9905ffd83dbSDimitry Andric 9915ffd83dbSDimitry Andric NamespaceMetaMap::iterator iter = namespace_maps.find(decl); 9925ffd83dbSDimitry Andric 9935ffd83dbSDimitry Andric if (iter != namespace_maps.end()) 9945ffd83dbSDimitry Andric return iter->second; 9955ffd83dbSDimitry Andric return NamespaceMapSP(); 9965ffd83dbSDimitry Andric } 9975ffd83dbSDimitry Andric 9985ffd83dbSDimitry Andric void ClangASTImporter::BuildNamespaceMap(const clang::NamespaceDecl *decl) { 9995ffd83dbSDimitry Andric assert(decl); 10005ffd83dbSDimitry Andric ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 10015ffd83dbSDimitry Andric 10025ffd83dbSDimitry Andric const DeclContext *parent_context = decl->getDeclContext(); 10035ffd83dbSDimitry Andric const NamespaceDecl *parent_namespace = 10045ffd83dbSDimitry Andric dyn_cast<NamespaceDecl>(parent_context); 10055ffd83dbSDimitry Andric NamespaceMapSP parent_map; 10065ffd83dbSDimitry Andric 10075ffd83dbSDimitry Andric if (parent_namespace) 10085ffd83dbSDimitry Andric parent_map = GetNamespaceMap(parent_namespace); 10095ffd83dbSDimitry Andric 10105ffd83dbSDimitry Andric NamespaceMapSP new_map; 10115ffd83dbSDimitry Andric 10125ffd83dbSDimitry Andric new_map = std::make_shared<NamespaceMap>(); 10135ffd83dbSDimitry Andric 10145ffd83dbSDimitry Andric if (context_md->m_map_completer) { 10155ffd83dbSDimitry Andric std::string namespace_string = decl->getDeclName().getAsString(); 10165ffd83dbSDimitry Andric 10175ffd83dbSDimitry Andric context_md->m_map_completer->CompleteNamespaceMap( 10185ffd83dbSDimitry Andric new_map, ConstString(namespace_string.c_str()), parent_map); 10195ffd83dbSDimitry Andric } 10205ffd83dbSDimitry Andric 10215ffd83dbSDimitry Andric context_md->m_namespace_maps[decl] = new_map; 10225ffd83dbSDimitry Andric } 10235ffd83dbSDimitry Andric 10245ffd83dbSDimitry Andric void ClangASTImporter::ForgetDestination(clang::ASTContext *dst_ast) { 102581ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 10265ffd83dbSDimitry Andric 10275ffd83dbSDimitry Andric LLDB_LOG(log, 1028*0fca6ea1SDimitry Andric " [ClangASTImporter] Forgetting destination (ASTContext*){0:x}", 10295ffd83dbSDimitry Andric dst_ast); 10305ffd83dbSDimitry Andric 10315ffd83dbSDimitry Andric m_metadata_map.erase(dst_ast); 10325ffd83dbSDimitry Andric } 10335ffd83dbSDimitry Andric 10345ffd83dbSDimitry Andric void ClangASTImporter::ForgetSource(clang::ASTContext *dst_ast, 10355ffd83dbSDimitry Andric clang::ASTContext *src_ast) { 10365ffd83dbSDimitry Andric ASTContextMetadataSP md = MaybeGetContextMetadata(dst_ast); 10375ffd83dbSDimitry Andric 103881ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 10395ffd83dbSDimitry Andric 10405ffd83dbSDimitry Andric LLDB_LOG(log, 10415ffd83dbSDimitry Andric " [ClangASTImporter] Forgetting source->dest " 1042*0fca6ea1SDimitry Andric "(ASTContext*){0:x}->(ASTContext*){1:x}", 10435ffd83dbSDimitry Andric src_ast, dst_ast); 10445ffd83dbSDimitry Andric 10455ffd83dbSDimitry Andric if (!md) 10465ffd83dbSDimitry Andric return; 10475ffd83dbSDimitry Andric 10485ffd83dbSDimitry Andric md->m_delegates.erase(src_ast); 1049e8d8bef9SDimitry Andric md->removeOriginsWithContext(src_ast); 10505ffd83dbSDimitry Andric } 10515ffd83dbSDimitry Andric 105281ad6265SDimitry Andric ClangASTImporter::MapCompleter::~MapCompleter() = default; 10535ffd83dbSDimitry Andric 10545ffd83dbSDimitry Andric llvm::Expected<Decl *> 10555ffd83dbSDimitry Andric ClangASTImporter::ASTImporterDelegate::ImportImpl(Decl *From) { 10565ffd83dbSDimitry Andric if (m_std_handler) { 1057bdd1243dSDimitry Andric std::optional<Decl *> D = m_std_handler->Import(From); 10585ffd83dbSDimitry Andric if (D) { 10595ffd83dbSDimitry Andric // Make sure we don't use this decl later to map it back to it's original 10605ffd83dbSDimitry Andric // decl. The decl the CxxModuleHandler created has nothing to do with 10615ffd83dbSDimitry Andric // the one from debug info, and linking those two would just cause the 10625ffd83dbSDimitry Andric // ASTImporter to try 'updating' the module decl with the minimal one from 10635ffd83dbSDimitry Andric // the debug info. 10645ffd83dbSDimitry Andric m_decls_to_ignore.insert(*D); 10655ffd83dbSDimitry Andric return *D; 10665ffd83dbSDimitry Andric } 10675ffd83dbSDimitry Andric } 10685ffd83dbSDimitry Andric 10695ffd83dbSDimitry Andric // Check which ASTContext this declaration originally came from. 1070349cc55cSDimitry Andric DeclOrigin origin = m_main.GetDeclOrigin(From); 1071fe6060f1SDimitry Andric 1072fe6060f1SDimitry Andric // Prevent infinite recursion when the origin tracking contains a cycle. 1073fe6060f1SDimitry Andric assert(origin.decl != From && "Origin points to itself?"); 1074fe6060f1SDimitry Andric 10755ffd83dbSDimitry Andric // If it originally came from the target ASTContext then we can just 10765ffd83dbSDimitry Andric // pretend that the original is the one we imported. This can happen for 10775ffd83dbSDimitry Andric // example when inspecting a persistent declaration from the scratch 10785ffd83dbSDimitry Andric // ASTContext (which will provide the declaration when parsing the 10795ffd83dbSDimitry Andric // expression and then we later try to copy the declaration back to the 10805ffd83dbSDimitry Andric // scratch ASTContext to store the result). 10815ffd83dbSDimitry Andric // Without this check we would ask the ASTImporter to import a declaration 10825ffd83dbSDimitry Andric // into the same ASTContext where it came from (which doesn't make a lot of 10835ffd83dbSDimitry Andric // sense). 10845ffd83dbSDimitry Andric if (origin.Valid() && origin.ctx == &getToContext()) { 10855ffd83dbSDimitry Andric RegisterImportedDecl(From, origin.decl); 10865ffd83dbSDimitry Andric return origin.decl; 10875ffd83dbSDimitry Andric } 10885ffd83dbSDimitry Andric 10895ffd83dbSDimitry Andric // This declaration came originally from another ASTContext. Instead of 10905ffd83dbSDimitry Andric // copying our potentially incomplete 'From' Decl we instead go to the 10915ffd83dbSDimitry Andric // original ASTContext and copy the original to the target. This is not 10925ffd83dbSDimitry Andric // only faster than first completing our current decl and then copying it 10935ffd83dbSDimitry Andric // to the target, but it also prevents that indirectly copying the same 10945ffd83dbSDimitry Andric // declaration to the same target requires the ASTImporter to merge all 10955ffd83dbSDimitry Andric // the different decls that appear to come from different ASTContexts (even 10965ffd83dbSDimitry Andric // though all these different source ASTContexts just got a copy from 10975ffd83dbSDimitry Andric // one source AST). 10985ffd83dbSDimitry Andric if (origin.Valid()) { 1099349cc55cSDimitry Andric auto R = m_main.CopyDecl(&getToContext(), origin.decl); 11005ffd83dbSDimitry Andric if (R) { 11015ffd83dbSDimitry Andric RegisterImportedDecl(From, R); 11025ffd83dbSDimitry Andric return R; 11035ffd83dbSDimitry Andric } 11045ffd83dbSDimitry Andric } 11055ffd83dbSDimitry Andric 11065ffd83dbSDimitry Andric // If we have a forcefully completed type, try to find an actual definition 11075ffd83dbSDimitry Andric // for it in other modules. 1108349cc55cSDimitry Andric const ClangASTMetadata *md = m_main.GetDeclMetadata(From); 11095ffd83dbSDimitry Andric auto *td = dyn_cast<TagDecl>(From); 11105ffd83dbSDimitry Andric if (td && md && md->IsForcefullyCompleted()) { 111181ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 11125ffd83dbSDimitry Andric LLDB_LOG(log, 11135ffd83dbSDimitry Andric "[ClangASTImporter] Searching for a complete definition of {0} in " 11145ffd83dbSDimitry Andric "other modules", 11155ffd83dbSDimitry Andric td->getName()); 11165ffd83dbSDimitry Andric Expected<DeclContext *> dc_or_err = ImportContext(td->getDeclContext()); 11175ffd83dbSDimitry Andric if (!dc_or_err) 11185ffd83dbSDimitry Andric return dc_or_err.takeError(); 11195ffd83dbSDimitry Andric Expected<DeclarationName> dn_or_err = Import(td->getDeclName()); 11205ffd83dbSDimitry Andric if (!dn_or_err) 11215ffd83dbSDimitry Andric return dn_or_err.takeError(); 11225ffd83dbSDimitry Andric DeclContext *dc = *dc_or_err; 11235ffd83dbSDimitry Andric DeclContext::lookup_result lr = dc->lookup(*dn_or_err); 1124e8d8bef9SDimitry Andric for (clang::Decl *candidate : lr) { 1125e8d8bef9SDimitry Andric if (candidate->getKind() == From->getKind()) { 1126e8d8bef9SDimitry Andric RegisterImportedDecl(From, candidate); 1127e8d8bef9SDimitry Andric m_decls_to_ignore.insert(candidate); 1128e8d8bef9SDimitry Andric return candidate; 1129e8d8bef9SDimitry Andric } 1130e8d8bef9SDimitry Andric } 11315ffd83dbSDimitry Andric LLDB_LOG(log, "[ClangASTImporter] Complete definition not found"); 11325ffd83dbSDimitry Andric } 11335ffd83dbSDimitry Andric 11345ffd83dbSDimitry Andric return ASTImporter::ImportImpl(From); 11355ffd83dbSDimitry Andric } 11365ffd83dbSDimitry Andric 11375ffd83dbSDimitry Andric void ClangASTImporter::ASTImporterDelegate::ImportDefinitionTo( 11385ffd83dbSDimitry Andric clang::Decl *to, clang::Decl *from) { 11395ffd83dbSDimitry Andric // We might have a forward declaration from a shared library that we 11405ffd83dbSDimitry Andric // gave external lexical storage so that Clang asks us about the full 11415ffd83dbSDimitry Andric // definition when it needs it. In this case the ASTImporter isn't aware 11425ffd83dbSDimitry Andric // that the forward decl from the shared library is the actual import 11435ffd83dbSDimitry Andric // target but would create a second declaration that would then be defined. 11445ffd83dbSDimitry Andric // We want that 'to' is actually complete after this function so let's 11455ffd83dbSDimitry Andric // tell the ASTImporter that 'to' was imported from 'from'. 11465ffd83dbSDimitry Andric MapImported(from, to); 11475ffd83dbSDimitry Andric 114881ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 11495ffd83dbSDimitry Andric 11505ffd83dbSDimitry Andric if (llvm::Error err = ImportDefinition(from)) { 11515ffd83dbSDimitry Andric LLDB_LOG_ERROR(log, std::move(err), 11525ffd83dbSDimitry Andric "[ClangASTImporter] Error during importing definition: {0}"); 11535ffd83dbSDimitry Andric return; 11545ffd83dbSDimitry Andric } 11555ffd83dbSDimitry Andric 11565ffd83dbSDimitry Andric if (clang::TagDecl *to_tag = dyn_cast<clang::TagDecl>(to)) { 11575ffd83dbSDimitry Andric if (clang::TagDecl *from_tag = dyn_cast<clang::TagDecl>(from)) { 11585ffd83dbSDimitry Andric to_tag->setCompleteDefinition(from_tag->isCompleteDefinition()); 11595ffd83dbSDimitry Andric 116081ad6265SDimitry Andric if (Log *log_ast = GetLog(LLDBLog::AST)) { 11615ffd83dbSDimitry Andric std::string name_string; 11625ffd83dbSDimitry Andric if (NamedDecl *from_named_decl = dyn_cast<clang::NamedDecl>(from)) { 11635ffd83dbSDimitry Andric llvm::raw_string_ostream name_stream(name_string); 11645ffd83dbSDimitry Andric from_named_decl->printName(name_stream); 11655ffd83dbSDimitry Andric name_stream.flush(); 11665ffd83dbSDimitry Andric } 1167*0fca6ea1SDimitry Andric LLDB_LOG(log_ast, 1168*0fca6ea1SDimitry Andric "==== [ClangASTImporter][TUDecl: {0:x}] Imported " 1169*0fca6ea1SDimitry Andric "({1}Decl*){2:x}, named {3} (from " 1170*0fca6ea1SDimitry Andric "(Decl*){4:x})", 11715ffd83dbSDimitry Andric static_cast<void *>(to->getTranslationUnitDecl()), 11725ffd83dbSDimitry Andric from->getDeclKindName(), static_cast<void *>(to), name_string, 11735ffd83dbSDimitry Andric static_cast<void *>(from)); 11745ffd83dbSDimitry Andric 11755ffd83dbSDimitry Andric // Log the AST of the TU. 11765ffd83dbSDimitry Andric std::string ast_string; 11775ffd83dbSDimitry Andric llvm::raw_string_ostream ast_stream(ast_string); 11785ffd83dbSDimitry Andric to->getTranslationUnitDecl()->dump(ast_stream); 11795ffd83dbSDimitry Andric LLDB_LOG(log_ast, "{0}", ast_string); 11805ffd83dbSDimitry Andric } 11815ffd83dbSDimitry Andric } 11825ffd83dbSDimitry Andric } 11835ffd83dbSDimitry Andric 11845ffd83dbSDimitry Andric // If we're dealing with an Objective-C class, ensure that the inheritance 11855ffd83dbSDimitry Andric // has been set up correctly. The ASTImporter may not do this correctly if 11865ffd83dbSDimitry Andric // the class was originally sourced from symbols. 11875ffd83dbSDimitry Andric 11885ffd83dbSDimitry Andric if (ObjCInterfaceDecl *to_objc_interface = dyn_cast<ObjCInterfaceDecl>(to)) { 11895ffd83dbSDimitry Andric ObjCInterfaceDecl *to_superclass = to_objc_interface->getSuperClass(); 11905ffd83dbSDimitry Andric 11915ffd83dbSDimitry Andric if (to_superclass) 1192297eecfbSDimitry Andric return; // we're not going to override it if it's set 11935ffd83dbSDimitry Andric 1194297eecfbSDimitry Andric ObjCInterfaceDecl *from_objc_interface = dyn_cast<ObjCInterfaceDecl>(from); 11955ffd83dbSDimitry Andric 11965ffd83dbSDimitry Andric if (!from_objc_interface) 1197297eecfbSDimitry Andric return; 11985ffd83dbSDimitry Andric 11995ffd83dbSDimitry Andric ObjCInterfaceDecl *from_superclass = from_objc_interface->getSuperClass(); 12005ffd83dbSDimitry Andric 12015ffd83dbSDimitry Andric if (!from_superclass) 1202297eecfbSDimitry Andric return; 12035ffd83dbSDimitry Andric 12045ffd83dbSDimitry Andric llvm::Expected<Decl *> imported_from_superclass_decl = 12055ffd83dbSDimitry Andric Import(from_superclass); 12065ffd83dbSDimitry Andric 12075ffd83dbSDimitry Andric if (!imported_from_superclass_decl) { 12085ffd83dbSDimitry Andric LLDB_LOG_ERROR(log, imported_from_superclass_decl.takeError(), 12095ffd83dbSDimitry Andric "Couldn't import decl: {0}"); 1210297eecfbSDimitry Andric return; 12115ffd83dbSDimitry Andric } 12125ffd83dbSDimitry Andric 12135ffd83dbSDimitry Andric ObjCInterfaceDecl *imported_from_superclass = 12145ffd83dbSDimitry Andric dyn_cast<ObjCInterfaceDecl>(*imported_from_superclass_decl); 12155ffd83dbSDimitry Andric 12165ffd83dbSDimitry Andric if (!imported_from_superclass) 1217297eecfbSDimitry Andric return; 12185ffd83dbSDimitry Andric 12195ffd83dbSDimitry Andric if (!to_objc_interface->hasDefinition()) 12205ffd83dbSDimitry Andric to_objc_interface->startDefinition(); 12215ffd83dbSDimitry Andric 12225ffd83dbSDimitry Andric to_objc_interface->setSuperClass(m_source_ctx->getTrivialTypeSourceInfo( 12235ffd83dbSDimitry Andric m_source_ctx->getObjCInterfaceType(imported_from_superclass))); 12245ffd83dbSDimitry Andric } 12255ffd83dbSDimitry Andric } 12265ffd83dbSDimitry Andric 12275ffd83dbSDimitry Andric /// Takes a CXXMethodDecl and completes the return type if necessary. This 12285ffd83dbSDimitry Andric /// is currently only necessary for virtual functions with covariant return 12295ffd83dbSDimitry Andric /// types where Clang's CodeGen expects that the underlying records are already 12305ffd83dbSDimitry Andric /// completed. 12315ffd83dbSDimitry Andric static void MaybeCompleteReturnType(ClangASTImporter &importer, 12325ffd83dbSDimitry Andric CXXMethodDecl *to_method) { 12335ffd83dbSDimitry Andric if (!to_method->isVirtual()) 12345ffd83dbSDimitry Andric return; 12355ffd83dbSDimitry Andric QualType return_type = to_method->getReturnType(); 12365ffd83dbSDimitry Andric if (!return_type->isPointerType() && !return_type->isReferenceType()) 12375ffd83dbSDimitry Andric return; 12385ffd83dbSDimitry Andric 12395ffd83dbSDimitry Andric clang::RecordDecl *rd = return_type->getPointeeType()->getAsRecordDecl(); 12405ffd83dbSDimitry Andric if (!rd) 12415ffd83dbSDimitry Andric return; 12425ffd83dbSDimitry Andric if (rd->getDefinition()) 12435ffd83dbSDimitry Andric return; 12445ffd83dbSDimitry Andric 12455ffd83dbSDimitry Andric importer.CompleteTagDecl(rd); 12465ffd83dbSDimitry Andric } 12475ffd83dbSDimitry Andric 12485ffd83dbSDimitry Andric /// Recreate a module with its parents in \p to_source and return its id. 12495ffd83dbSDimitry Andric static OptionalClangModuleID 12505ffd83dbSDimitry Andric RemapModule(OptionalClangModuleID from_id, 12515ffd83dbSDimitry Andric ClangExternalASTSourceCallbacks &from_source, 12525ffd83dbSDimitry Andric ClangExternalASTSourceCallbacks &to_source) { 12535ffd83dbSDimitry Andric if (!from_id.HasValue()) 12545ffd83dbSDimitry Andric return {}; 12555ffd83dbSDimitry Andric clang::Module *module = from_source.getModule(from_id.GetValue()); 12565ffd83dbSDimitry Andric OptionalClangModuleID parent = RemapModule( 12575ffd83dbSDimitry Andric from_source.GetIDForModule(module->Parent), from_source, to_source); 12585ffd83dbSDimitry Andric TypeSystemClang &to_ts = to_source.GetTypeSystem(); 12595ffd83dbSDimitry Andric return to_ts.GetOrCreateClangModule(module->Name, parent, module->IsFramework, 12605ffd83dbSDimitry Andric module->IsExplicit); 12615ffd83dbSDimitry Andric } 12625ffd83dbSDimitry Andric 12635ffd83dbSDimitry Andric void ClangASTImporter::ASTImporterDelegate::Imported(clang::Decl *from, 12645ffd83dbSDimitry Andric clang::Decl *to) { 126581ad6265SDimitry Andric Log *log = GetLog(LLDBLog::Expressions); 12665ffd83dbSDimitry Andric 12675ffd83dbSDimitry Andric // Some decls shouldn't be tracked here because they were not created by 12685ffd83dbSDimitry Andric // copying 'from' to 'to'. Just exit early for those. 12695ffd83dbSDimitry Andric if (m_decls_to_ignore.count(to)) 12705f757f3fSDimitry Andric return; 12715ffd83dbSDimitry Andric 12725ffd83dbSDimitry Andric // Transfer module ownership information. 12735ffd83dbSDimitry Andric auto *from_source = llvm::dyn_cast_or_null<ClangExternalASTSourceCallbacks>( 12745ffd83dbSDimitry Andric getFromContext().getExternalSource()); 12755ffd83dbSDimitry Andric // Can also be a ClangASTSourceProxy. 12765ffd83dbSDimitry Andric auto *to_source = llvm::dyn_cast_or_null<ClangExternalASTSourceCallbacks>( 12775ffd83dbSDimitry Andric getToContext().getExternalSource()); 12785ffd83dbSDimitry Andric if (from_source && to_source) { 12795ffd83dbSDimitry Andric OptionalClangModuleID from_id(from->getOwningModuleID()); 12805ffd83dbSDimitry Andric OptionalClangModuleID to_id = 12815ffd83dbSDimitry Andric RemapModule(from_id, *from_source, *to_source); 12825ffd83dbSDimitry Andric TypeSystemClang &to_ts = to_source->GetTypeSystem(); 12835ffd83dbSDimitry Andric to_ts.SetOwningModule(to, to_id); 12845ffd83dbSDimitry Andric } 12855ffd83dbSDimitry Andric 12865ffd83dbSDimitry Andric lldb::user_id_t user_id = LLDB_INVALID_UID; 1287349cc55cSDimitry Andric ClangASTMetadata *metadata = m_main.GetDeclMetadata(from); 12885ffd83dbSDimitry Andric if (metadata) 12895ffd83dbSDimitry Andric user_id = metadata->GetUserID(); 12905ffd83dbSDimitry Andric 12915ffd83dbSDimitry Andric if (log) { 12925ffd83dbSDimitry Andric if (NamedDecl *from_named_decl = dyn_cast<clang::NamedDecl>(from)) { 12935ffd83dbSDimitry Andric std::string name_string; 12945ffd83dbSDimitry Andric llvm::raw_string_ostream name_stream(name_string); 12955ffd83dbSDimitry Andric from_named_decl->printName(name_stream); 12965ffd83dbSDimitry Andric name_stream.flush(); 12975ffd83dbSDimitry Andric 1298*0fca6ea1SDimitry Andric LLDB_LOG( 1299*0fca6ea1SDimitry Andric log, 1300*0fca6ea1SDimitry Andric " [ClangASTImporter] Imported ({0}Decl*){1:x}, named {2} (from " 1301*0fca6ea1SDimitry Andric "(Decl*){3:x}), metadata {4}", 13025ffd83dbSDimitry Andric from->getDeclKindName(), to, name_string, from, user_id); 13035ffd83dbSDimitry Andric } else { 13045ffd83dbSDimitry Andric LLDB_LOG(log, 1305*0fca6ea1SDimitry Andric " [ClangASTImporter] Imported ({0}Decl*){1:x} (from " 1306*0fca6ea1SDimitry Andric "(Decl*){2:x}), metadata {3}", 13075ffd83dbSDimitry Andric from->getDeclKindName(), to, from, user_id); 13085ffd83dbSDimitry Andric } 13095ffd83dbSDimitry Andric } 13105ffd83dbSDimitry Andric 13115ffd83dbSDimitry Andric ASTContextMetadataSP to_context_md = 1312349cc55cSDimitry Andric m_main.GetContextMetadata(&to->getASTContext()); 13135ffd83dbSDimitry Andric ASTContextMetadataSP from_context_md = 1314349cc55cSDimitry Andric m_main.MaybeGetContextMetadata(m_source_ctx); 13155ffd83dbSDimitry Andric 13165ffd83dbSDimitry Andric if (from_context_md) { 1317e8d8bef9SDimitry Andric DeclOrigin origin = from_context_md->getOrigin(from); 13185ffd83dbSDimitry Andric 1319e8d8bef9SDimitry Andric if (origin.Valid()) { 1320fe6060f1SDimitry Andric if (origin.ctx != &to->getASTContext()) { 1321e8d8bef9SDimitry Andric if (!to_context_md->hasOrigin(to) || user_id != LLDB_INVALID_UID) 1322e8d8bef9SDimitry Andric to_context_md->setOrigin(to, origin); 13235ffd83dbSDimitry Andric 13245ffd83dbSDimitry Andric LLDB_LOG(log, 13255ffd83dbSDimitry Andric " [ClangASTImporter] Propagated origin " 1326*0fca6ea1SDimitry Andric "(Decl*){0:x}/(ASTContext*){1:x} from (ASTContext*){2:x} to " 1327*0fca6ea1SDimitry Andric "(ASTContext*){3:x}", 1328e8d8bef9SDimitry Andric origin.decl, origin.ctx, &from->getASTContext(), 1329e8d8bef9SDimitry Andric &to->getASTContext()); 1330fe6060f1SDimitry Andric } 13315ffd83dbSDimitry Andric } else { 13325ffd83dbSDimitry Andric if (m_new_decl_listener) 13335ffd83dbSDimitry Andric m_new_decl_listener->NewDeclImported(from, to); 13345ffd83dbSDimitry Andric 1335e8d8bef9SDimitry Andric if (!to_context_md->hasOrigin(to) || user_id != LLDB_INVALID_UID) 1336e8d8bef9SDimitry Andric to_context_md->setOrigin(to, DeclOrigin(m_source_ctx, from)); 13375ffd83dbSDimitry Andric 13385ffd83dbSDimitry Andric LLDB_LOG(log, 13395ffd83dbSDimitry Andric " [ClangASTImporter] Decl has no origin information in " 1340*0fca6ea1SDimitry Andric "(ASTContext*){0:x}", 13415ffd83dbSDimitry Andric &from->getASTContext()); 13425ffd83dbSDimitry Andric } 13435ffd83dbSDimitry Andric 13445ffd83dbSDimitry Andric if (auto *to_namespace = dyn_cast<clang::NamespaceDecl>(to)) { 13455ffd83dbSDimitry Andric auto *from_namespace = cast<clang::NamespaceDecl>(from); 13465ffd83dbSDimitry Andric 13475ffd83dbSDimitry Andric NamespaceMetaMap &namespace_maps = from_context_md->m_namespace_maps; 13485ffd83dbSDimitry Andric 13495ffd83dbSDimitry Andric NamespaceMetaMap::iterator namespace_map_iter = 13505ffd83dbSDimitry Andric namespace_maps.find(from_namespace); 13515ffd83dbSDimitry Andric 13525ffd83dbSDimitry Andric if (namespace_map_iter != namespace_maps.end()) 13535ffd83dbSDimitry Andric to_context_md->m_namespace_maps[to_namespace] = 13545ffd83dbSDimitry Andric namespace_map_iter->second; 13555ffd83dbSDimitry Andric } 13565ffd83dbSDimitry Andric } else { 1357e8d8bef9SDimitry Andric to_context_md->setOrigin(to, DeclOrigin(m_source_ctx, from)); 13585ffd83dbSDimitry Andric 13595ffd83dbSDimitry Andric LLDB_LOG(log, 13605ffd83dbSDimitry Andric " [ClangASTImporter] Sourced origin " 1361*0fca6ea1SDimitry Andric "(Decl*){0:x}/(ASTContext*){1:x} into (ASTContext*){2:x}", 13625ffd83dbSDimitry Andric from, m_source_ctx, &to->getASTContext()); 13635ffd83dbSDimitry Andric } 13645ffd83dbSDimitry Andric 13655ffd83dbSDimitry Andric if (auto *to_tag_decl = dyn_cast<TagDecl>(to)) { 13665ffd83dbSDimitry Andric to_tag_decl->setHasExternalLexicalStorage(); 13675ffd83dbSDimitry Andric to_tag_decl->getPrimaryContext()->setMustBuildLookupTable(); 13685ffd83dbSDimitry Andric auto from_tag_decl = cast<TagDecl>(from); 13695ffd83dbSDimitry Andric 13705ffd83dbSDimitry Andric LLDB_LOG( 13715ffd83dbSDimitry Andric log, 13725ffd83dbSDimitry Andric " [ClangASTImporter] To is a TagDecl - attributes {0}{1} [{2}->{3}]", 13735ffd83dbSDimitry Andric (to_tag_decl->hasExternalLexicalStorage() ? " Lexical" : ""), 13745ffd83dbSDimitry Andric (to_tag_decl->hasExternalVisibleStorage() ? " Visible" : ""), 13755ffd83dbSDimitry Andric (from_tag_decl->isCompleteDefinition() ? "complete" : "incomplete"), 13765ffd83dbSDimitry Andric (to_tag_decl->isCompleteDefinition() ? "complete" : "incomplete")); 13775ffd83dbSDimitry Andric } 13785ffd83dbSDimitry Andric 13795ffd83dbSDimitry Andric if (auto *to_namespace_decl = dyn_cast<NamespaceDecl>(to)) { 1380349cc55cSDimitry Andric m_main.BuildNamespaceMap(to_namespace_decl); 13815ffd83dbSDimitry Andric to_namespace_decl->setHasExternalVisibleStorage(); 13825ffd83dbSDimitry Andric } 13835ffd83dbSDimitry Andric 13845ffd83dbSDimitry Andric if (auto *to_container_decl = dyn_cast<ObjCContainerDecl>(to)) { 13855ffd83dbSDimitry Andric to_container_decl->setHasExternalLexicalStorage(); 13865ffd83dbSDimitry Andric to_container_decl->setHasExternalVisibleStorage(); 13875ffd83dbSDimitry Andric 13885ffd83dbSDimitry Andric if (log) { 13895ffd83dbSDimitry Andric if (ObjCInterfaceDecl *to_interface_decl = 13905ffd83dbSDimitry Andric llvm::dyn_cast<ObjCInterfaceDecl>(to_container_decl)) { 13915ffd83dbSDimitry Andric LLDB_LOG( 13925ffd83dbSDimitry Andric log, 13935ffd83dbSDimitry Andric " [ClangASTImporter] To is an ObjCInterfaceDecl - attributes " 13945ffd83dbSDimitry Andric "{0}{1}{2}", 13955ffd83dbSDimitry Andric (to_interface_decl->hasExternalLexicalStorage() ? " Lexical" : ""), 13965ffd83dbSDimitry Andric (to_interface_decl->hasExternalVisibleStorage() ? " Visible" : ""), 13975ffd83dbSDimitry Andric (to_interface_decl->hasDefinition() ? " HasDefinition" : "")); 13985ffd83dbSDimitry Andric } else { 13995ffd83dbSDimitry Andric LLDB_LOG( 14005ffd83dbSDimitry Andric log, " [ClangASTImporter] To is an {0}Decl - attributes {1}{2}", 14015ffd83dbSDimitry Andric ((Decl *)to_container_decl)->getDeclKindName(), 14025ffd83dbSDimitry Andric (to_container_decl->hasExternalLexicalStorage() ? " Lexical" : ""), 14035ffd83dbSDimitry Andric (to_container_decl->hasExternalVisibleStorage() ? " Visible" : "")); 14045ffd83dbSDimitry Andric } 14055ffd83dbSDimitry Andric } 14065ffd83dbSDimitry Andric } 14075ffd83dbSDimitry Andric 14085ffd83dbSDimitry Andric if (clang::CXXMethodDecl *to_method = dyn_cast<CXXMethodDecl>(to)) 1409349cc55cSDimitry Andric MaybeCompleteReturnType(m_main, to_method); 14105ffd83dbSDimitry Andric } 14115ffd83dbSDimitry Andric 14125ffd83dbSDimitry Andric clang::Decl * 14135ffd83dbSDimitry Andric ClangASTImporter::ASTImporterDelegate::GetOriginalDecl(clang::Decl *To) { 1414349cc55cSDimitry Andric return m_main.GetDeclOrigin(To).decl; 14155ffd83dbSDimitry Andric } 1416