[Lldb-commits] [lldb] f6913e7 - [lldb][NFC] Document and encapsulate OriginMap in ASTContextMetadata

Raphael Isemann via lldb-commits lldb-commits at lists.llvm.org
Thu Aug 6 08:37:53 PDT 2020


Author: Raphael Isemann
Date: 2020-08-06T17:37:29+02:00
New Revision: f6913e74400aa932b3edc7cc765495247799fcb0

URL: https://github.com/llvm/llvm-project/commit/f6913e74400aa932b3edc7cc765495247799fcb0
DIFF: https://github.com/llvm/llvm-project/commit/f6913e74400aa932b3edc7cc765495247799fcb0.diff

LOG: [lldb][NFC] Document and encapsulate OriginMap in ASTContextMetadata

Just adds the respective accessor functions to ASTContextMetadata instead
of directly exposing the OriginMap to the whole world.

Added: 
    

Modified: 
    lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp
    lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.h

Removed: 
    


################################################################################
diff  --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp
index ac16738933ac..6d8773779a69 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.cpp
@@ -245,9 +245,9 @@ class CompleteTagDeclsScope : public ClangASTImporter::NewDeclListener {
       m_decls_already_completed.insert(decl);
 
       // We should only complete decls coming from the source context.
-      assert(to_context_md->m_origins[decl].ctx == m_src_ctx);
+      assert(to_context_md->getOrigin(decl).ctx == m_src_ctx);
 
-      Decl *original_decl = to_context_md->m_origins[decl].decl;
+      Decl *original_decl = to_context_md->getOrigin(decl).decl;
 
       // Complete the decl now.
       TypeSystemClang::GetCompleteDecl(m_src_ctx, original_decl);
@@ -266,7 +266,7 @@ class CompleteTagDeclsScope : public ClangASTImporter::NewDeclListener {
         container_decl->setHasExternalVisibleStorage(false);
       }
 
-      to_context_md->m_origins.erase(decl);
+      to_context_md->removeOrigin(decl);
     }
 
     // Stop listening to imported decls. We do this after clearing the
@@ -581,10 +581,7 @@ bool ClangASTImporter::CompleteTagDeclWithOrigin(clang::TagDecl *decl,
 
   ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
 
-  OriginMap &origins = context_md->m_origins;
-
-  origins[decl] = DeclOrigin(origin_ast_ctx, origin_decl);
-
+  context_md->setOrigin(decl, DeclOrigin(origin_ast_ctx, origin_decl));
   return true;
 }
 
@@ -721,29 +718,14 @@ ClangASTImporter::DeclOrigin
 ClangASTImporter::GetDeclOrigin(const clang::Decl *decl) {
   ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
 
-  OriginMap &origins = context_md->m_origins;
-
-  OriginMap::iterator iter = origins.find(decl);
-
-  if (iter != origins.end())
-    return iter->second;
-  return DeclOrigin();
+  return context_md->getOrigin(decl);
 }
 
 void ClangASTImporter::SetDeclOrigin(const clang::Decl *decl,
                                      clang::Decl *original_decl) {
   ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext());
-
-  OriginMap &origins = context_md->m_origins;
-
-  OriginMap::iterator iter = origins.find(decl);
-
-  if (iter != origins.end()) {
-    iter->second.decl = original_decl;
-    iter->second.ctx = &original_decl->getASTContext();
-    return;
-  }
-  origins[decl] = DeclOrigin(&original_decl->getASTContext(), original_decl);
+  context_md->setOrigin(
+      decl, DeclOrigin(&original_decl->getASTContext(), original_decl));
 }
 
 void ClangASTImporter::RegisterNamespaceMap(const clang::NamespaceDecl *decl,
@@ -817,14 +799,7 @@ void ClangASTImporter::ForgetSource(clang::ASTContext *dst_ast,
     return;
 
   md->m_delegates.erase(src_ast);
-
-  for (OriginMap::iterator iter = md->m_origins.begin();
-       iter != md->m_origins.end();) {
-    if (iter->second.ctx == src_ast)
-      md->m_origins.erase(iter++);
-    else
-      ++iter;
-  }
+  md->removeOriginsWithContext(src_ast);
 }
 
 ClangASTImporter::MapCompleter::~MapCompleter() { return; }
@@ -1100,37 +1075,31 @@ void ClangASTImporter::ASTImporterDelegate::Imported(clang::Decl *from,
       m_master.MaybeGetContextMetadata(m_source_ctx);
 
   if (from_context_md) {
-    OriginMap &origins = from_context_md->m_origins;
+    DeclOrigin origin = from_context_md->getOrigin(from);
 
-    OriginMap::iterator origin_iter = origins.find(from);
-
-    if (origin_iter != origins.end()) {
-      if (to_context_md->m_origins.find(to) == to_context_md->m_origins.end() ||
-          user_id != LLDB_INVALID_UID) {
-        if (origin_iter->second.ctx != &to->getASTContext())
-          to_context_md->m_origins[to] = origin_iter->second;
-      }
+    if (origin.Valid()) {
+      if (!to_context_md->hasOrigin(to) || user_id != LLDB_INVALID_UID)
+        if (origin.ctx != &to->getASTContext())
+          to_context_md->setOrigin(to, origin);
 
       ImporterDelegateSP direct_completer =
-          m_master.GetDelegate(&to->getASTContext(), origin_iter->second.ctx);
+          m_master.GetDelegate(&to->getASTContext(), origin.ctx);
 
       if (direct_completer.get() != this)
-        direct_completer->ASTImporter::Imported(origin_iter->second.decl, to);
+        direct_completer->ASTImporter::Imported(origin.decl, to);
 
       LLDB_LOG(log,
                "    [ClangASTImporter] Propagated origin "
                "(Decl*){0}/(ASTContext*){1} from (ASTContext*){2} to "
                "(ASTContext*){3}",
-               origin_iter->second.decl, origin_iter->second.ctx,
-               &from->getASTContext(), &to->getASTContext());
+               origin.decl, origin.ctx, &from->getASTContext(),
+               &to->getASTContext());
     } else {
       if (m_new_decl_listener)
         m_new_decl_listener->NewDeclImported(from, to);
 
-      if (to_context_md->m_origins.find(to) == to_context_md->m_origins.end() ||
-          user_id != LLDB_INVALID_UID) {
-        to_context_md->m_origins[to] = DeclOrigin(m_source_ctx, from);
-      }
+      if (!to_context_md->hasOrigin(to) || user_id != LLDB_INVALID_UID)
+        to_context_md->setOrigin(to, DeclOrigin(m_source_ctx, from));
 
       LLDB_LOG(log,
                "    [ClangASTImporter] Decl has no origin information in "
@@ -1151,7 +1120,7 @@ void ClangASTImporter::ASTImporterDelegate::Imported(clang::Decl *from,
             namespace_map_iter->second;
     }
   } else {
-    to_context_md->m_origins[to] = DeclOrigin(m_source_ctx, from);
+    to_context_md->setOrigin(to, DeclOrigin(m_source_ctx, from));
 
     LLDB_LOG(log,
              "    [ClangASTImporter] Sourced origin "

diff  --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.h
index 6ceec774914b..b8c751479d4b 100644
--- a/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.h
+++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangASTImporter.h
@@ -166,8 +166,6 @@ class ClangASTImporter {
     clang::Decl *decl;
   };
 
-  typedef llvm::DenseMap<const clang::Decl *, DeclOrigin> OriginMap;
-
   /// Listener interface used by the ASTImporterDelegate to inform other code
   /// about decls that have been imported the first time.
   struct NewDeclListener {
@@ -259,17 +257,61 @@ class ClangASTImporter {
   typedef llvm::DenseMap<const clang::NamespaceDecl *, NamespaceMapSP>
       NamespaceMetaMap;
 
-  struct ASTContextMetadata {
-    ASTContextMetadata(clang::ASTContext *dst_ctx)
-        : m_dst_ctx(dst_ctx), m_delegates(), m_origins(), m_namespace_maps(),
-          m_map_completer(nullptr) {}
+  class ASTContextMetadata {
+    typedef llvm::DenseMap<const clang::Decl *, DeclOrigin> OriginMap;
+
+  public:
+    ASTContextMetadata(clang::ASTContext *dst_ctx) : m_dst_ctx(dst_ctx) {}
 
     clang::ASTContext *m_dst_ctx;
     DelegateMap m_delegates;
-    OriginMap m_origins;
 
     NamespaceMetaMap m_namespace_maps;
-    MapCompleter *m_map_completer;
+    MapCompleter *m_map_completer = nullptr;
+
+    /// Sets the DeclOrigin for the given Decl and overwrites any existing
+    /// DeclOrigin.
+    void setOrigin(const clang::Decl *decl, DeclOrigin origin) {
+      m_origins[decl] = origin;
+    }
+
+    /// Removes any tracked DeclOrigin for the given decl.
+    void removeOrigin(const clang::Decl *decl) { m_origins.erase(decl); }
+
+    /// Remove all DeclOrigin entries that point to the given ASTContext.
+    /// Useful when an ASTContext is about to be deleted and all the dangling
+    /// pointers to it need to be removed.
+    void removeOriginsWithContext(clang::ASTContext *ctx) {
+      for (OriginMap::iterator iter = m_origins.begin();
+           iter != m_origins.end();) {
+        if (iter->second.ctx == ctx)
+          m_origins.erase(iter++);
+        else
+          ++iter;
+      }
+    }
+
+    /// Returns the DeclOrigin for the given Decl or an invalid DeclOrigin
+    /// instance if there no known DeclOrigin for the given Decl.
+    DeclOrigin getOrigin(const clang::Decl *decl) const {
+      auto iter = m_origins.find(decl);
+      if (iter == m_origins.end())
+        return DeclOrigin();
+      return iter->second;
+    }
+
+    /// Returns true there is a known DeclOrigin for the given Decl.
+    bool hasOrigin(const clang::Decl *decl) const {
+      return getOrigin(decl).Valid();
+    }
+
+  private:
+    /// Maps declarations to the ASTContext/Decl from which they were imported
+    /// from. If a declaration is from an ASTContext which has been deleted
+    /// since the declaration was imported or the declaration wasn't created by
+    /// the ASTImporter, then it doesn't have a DeclOrigin and will not be
+    /// tracked here.
+    OriginMap m_origins;
   };
 
   typedef std::shared_ptr<ASTContextMetadata> ASTContextMetadataSP;


        


More information about the lldb-commits mailing list