xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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