https://github.com/speednoisemovement created 
https://github.com/llvm/llvm-project/pull/175840

This changes `PdbAstBuilder` to a language-neutral abstract interface and moves 
all of its functionality to the `PdbAstBuilderClang` derived class.

All Clang-specific methods with external callers are now public methods on 
`PdbAstBuilderClang` and `TypeSystemClang` and `UdtRecordCompleter` use this 
type directly.

Did my best to clean up includes and unused methods.

RFC for context:
https://discourse.llvm.org/t/rfc-lldb-make-pdbastbuilder-language-agnostic/89117

>From 5bbd7aaaca07dd0bba4940c03c2bda8589500b02 Mon Sep 17 00:00:00 2001
From: Leonard Grey <[email protected]>
Date: Mon, 12 Jan 2026 20:16:43 -0500
Subject: [PATCH] [LLDB][NativePDB] Introduce PdbAstBuilderClang

This changes `PdbAstBuilder` to a language-neutral abstract interface
and moves all of its functionality to the `PdbAstBuilderClang` derived
class.

All Clang-specific methods with external callers are now public methods
on `PdbAstBuilderClang` and `TypeSystemClang` and `UdtRecordCompleter`
use this type directly.

Did my best to clean up includes and unused methods.

RFC for context:
https://discourse.llvm.org/t/rfc-lldb-make-pdbastbuilder-language-agnostic/89117
---
 .../SymbolFile/NativePDB/CMakeLists.txt       |   2 +-
 .../SymbolFile/NativePDB/PdbAstBuilder.h      | 170 +++-------------
 ...bAstBuilder.cpp => PdbAstBuilderClang.cpp} | 110 +++++------
 .../SymbolFile/NativePDB/PdbAstBuilderClang.h | 182 ++++++++++++++++++
 .../NativePDB/UdtRecordCompleter.cpp          |   4 +-
 .../SymbolFile/NativePDB/UdtRecordCompleter.h |   7 +-
 .../TypeSystem/Clang/TypeSystemClang.cpp      |   5 +-
 .../TypeSystem/Clang/TypeSystemClang.h        |   8 +-
 .../Plugins/SymbolFile/NativePDB/BUILD.gn     |   2 +-
 9 files changed, 277 insertions(+), 213 deletions(-)
 rename lldb/source/Plugins/SymbolFile/NativePDB/{PdbAstBuilder.cpp => 
PdbAstBuilderClang.cpp} (92%)
 create mode 100644 
lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.h

diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/CMakeLists.txt 
b/lldb/source/Plugins/SymbolFile/NativePDB/CMakeLists.txt
index 21756bb26c855..b13c112ce2927 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/CMakeLists.txt
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/CMakeLists.txt
@@ -2,7 +2,7 @@ add_lldb_library(lldbPluginSymbolFileNativePDB
   CodeViewRegisterMapping.cpp
   CompileUnitIndex.cpp
   DWARFLocationExpression.cpp
-  PdbAstBuilder.cpp
+  PdbAstBuilderClang.cpp
   PdbFPOProgramToDWARFExpression.cpp
   PdbIndex.cpp
   PdbSymUid.cpp
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h 
b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h
index d94de860576b5..c6038e77d6d0e 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h
@@ -9,170 +9,46 @@
 #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDER_H
 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDER_H
 
-#include "llvm/ADT/DenseMap.h"
+#include "lldb/Symbol/CompilerDecl.h"
+#include "lldb/Symbol/CompilerDeclContext.h"
+#include "lldb/Symbol/CompilerType.h"
+#include "lldb/lldb-types.h"
 #include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Threading.h"
 
-#include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
-
-#include "PdbIndex.h"
 #include "PdbSymUid.h"
 #include <optional>
 
-namespace clang {
-class TagDecl;
-class DeclContext;
-class Decl;
-class QualType;
-class FunctionDecl;
-class NamespaceDecl;
-} // namespace clang
-
-namespace llvm {
-namespace codeview {
-class ProcSym;
-}
-} // namespace llvm
-
 namespace lldb_private {
-class ClangASTImporter;
-class ObjectFile;
+class Stream;
 
 namespace npdb {
-class PdbIndex;
-struct VariableInfo;
-
-struct DeclStatus {
-  DeclStatus() = default;
-  DeclStatus(lldb::user_id_t uid, bool resolved)
-      : uid(uid), resolved(resolved) {}
-  lldb::user_id_t uid = 0;
-  bool resolved = false;
-};
 
 class PdbAstBuilder {
 public:
-  // Constructors and Destructors
-  PdbAstBuilder(TypeSystemClang &clang);
-
-  lldb_private::CompilerDeclContext GetTranslationUnitDecl();
-
-  std::optional<lldb_private::CompilerDecl>
-  GetOrCreateDeclForUid(PdbSymUid uid);
-  lldb_private::CompilerDeclContext GetOrCreateDeclContextForUid(PdbSymUid 
uid);
-  clang::DeclContext *GetOrCreateClangDeclContextForUid(PdbSymUid uid);
-  lldb_private::CompilerDeclContext GetParentDeclContext(PdbSymUid uid);
-  clang::DeclContext *GetParentClangDeclContext(PdbSymUid uid);
-
-  void EnsureFunction(PdbCompilandSymId func_id);
-  void EnsureInlinedFunction(PdbCompilandSymId inlinesite_id);
-  void EnsureBlock(PdbCompilandSymId block_id);
-  void EnsureVariable(PdbCompilandSymId scope_id, PdbCompilandSymId var_id);
-  void EnsureVariable(PdbGlobalSymId var_id);
-  CompilerType GetOrCreateTypedefType(PdbGlobalSymId id);
-  void ParseDeclsForContext(lldb_private::CompilerDeclContext context);
-
-  clang::QualType GetBasicType(lldb::BasicType type);
-  clang::QualType GetOrCreateClangType(PdbTypeSymId type);
-  CompilerType GetOrCreateType(PdbTypeSymId type);
-
-  bool CompleteTagDecl(clang::TagDecl &tag);
-  bool CompleteType(CompilerType ct);
-
-  CompilerDecl ToCompilerDecl(clang::Decl *decl);
-  CompilerType ToCompilerType(clang::QualType qt);
-  CompilerDeclContext ToCompilerDeclContext(clang::DeclContext *context);
-  clang::QualType FromCompilerType(CompilerType ct);
-  clang::Decl *FromCompilerDecl(CompilerDecl decl);
-  clang::DeclContext *FromCompilerDeclContext(CompilerDeclContext context);
-
-  TypeSystemClang &clang() { return m_clang; }
-  ClangASTImporter &GetClangASTImporter() { return m_importer; }
-
-  void Dump(Stream &stream, llvm::StringRef filter, bool show_color);
-
-  lldb_private::CompilerDeclContext
-  FindNamespaceDecl(lldb_private::CompilerDeclContext parent_ctx,
-                    llvm::StringRef name);
-
-private:
-  clang::Decl *TryGetDecl(PdbSymUid uid) const;
-
-  clang::FunctionDecl *GetOrCreateFunctionDecl(PdbCompilandSymId func_id);
-  clang::FunctionDecl *
-  GetOrCreateInlinedFunctionDecl(PdbCompilandSymId inlinesite_id);
-  clang::BlockDecl *GetOrCreateBlockDecl(PdbCompilandSymId block_id);
-  clang::VarDecl *GetOrCreateVariableDecl(PdbCompilandSymId scope_id,
-                                          PdbCompilandSymId var_id);
-  clang::VarDecl *GetOrCreateVariableDecl(PdbGlobalSymId var_id);
-
-  using TypeIndex = llvm::codeview::TypeIndex;
-
-  clang::QualType
-  CreatePointerType(const llvm::codeview::PointerRecord &pointer);
-  clang::QualType
-  CreateModifierType(const llvm::codeview::ModifierRecord &modifier);
-  clang::QualType CreateArrayType(const llvm::codeview::ArrayRecord &array);
-  clang::QualType CreateRecordType(PdbTypeSymId id,
-                                   const llvm::codeview::TagRecord &record);
-  clang::QualType CreateEnumType(PdbTypeSymId id,
-                                 const llvm::codeview::EnumRecord &record);
-  clang::QualType
-  CreateFunctionType(TypeIndex args_type_idx, TypeIndex return_type_idx,
-                     llvm::codeview::CallingConvention calling_convention);
-  clang::QualType CreateType(PdbTypeSymId type);
-
-  void CreateFunctionParameters(PdbCompilandSymId func_id,
-                                clang::FunctionDecl &function_decl,
-                                uint32_t param_count);
-  clang::Decl *GetOrCreateSymbolForId(PdbCompilandSymId id);
-  clang::VarDecl *CreateVariableDecl(PdbSymUid uid,
-                                     llvm::codeview::CVSymbol sym,
-                                     clang::DeclContext &scope);
-  clang::NamespaceDecl *GetOrCreateNamespaceDecl(const char *name,
-                                                 clang::DeclContext &context);
-  clang::FunctionDecl *CreateFunctionDeclFromId(PdbTypeSymId func_tid,
-                                                PdbCompilandSymId func_sid);
-  clang::FunctionDecl *
-  CreateFunctionDecl(PdbCompilandSymId func_id, llvm::StringRef func_name,
-                     TypeIndex func_ti, CompilerType func_ct,
-                     uint32_t param_count, clang::StorageClass func_storage,
-                     bool is_inline, clang::DeclContext *parent);
-  void ParseNamespace(clang::DeclContext &parent);
-  void ParseAllTypes();
-  void ParseAllFunctionsAndNonLocalVars();
-  void ParseDeclsForSimpleContext(clang::DeclContext &context);
-  void ParseBlockChildren(PdbCompilandSymId block_id);
-
-  std::pair<clang::DeclContext *, std::string>
-  CreateDeclInfoForType(const llvm::codeview::TagRecord &record, TypeIndex ti);
-  std::pair<clang::DeclContext *, std::string>
-  CreateDeclInfoForUndecoratedName(llvm::StringRef uname);
-  clang::QualType CreateSimpleType(TypeIndex ti);
+  virtual ~PdbAstBuilder() = default;
 
-  TypeSystemClang &m_clang;
+  virtual std::optional<CompilerDecl> GetOrCreateDeclForUid(PdbSymUid uid) = 0;
+  virtual CompilerDeclContext GetOrCreateDeclContextForUid(PdbSymUid uid) = 0;
+  virtual CompilerDeclContext GetParentDeclContext(PdbSymUid uid) = 0;
 
-  ClangASTImporter m_importer;
-  llvm::once_flag m_parse_functions_and_non_local_vars;
-  llvm::once_flag m_parse_all_types;
-  llvm::DenseMap<clang::Decl *, DeclStatus> m_decl_to_status;
-  llvm::DenseMap<lldb::user_id_t, clang::Decl *> m_uid_to_decl;
-  llvm::DenseMap<lldb::user_id_t, clang::QualType> m_uid_to_type;
+  virtual void EnsureFunction(PdbCompilandSymId func_id) = 0;
+  virtual void EnsureInlinedFunction(PdbCompilandSymId inlinesite_id) = 0;
+  virtual void EnsureBlock(PdbCompilandSymId block_id) = 0;
+  virtual void EnsureVariable(PdbCompilandSymId scope_id,
+                              PdbCompilandSymId var_id) = 0;
+  virtual void EnsureVariable(PdbGlobalSymId var_id) = 0;
 
-  // From class/struct's opaque_compiler_type_t to a set containing the pairs 
of
-  // method's name and CompilerType.
-  llvm::DenseMap<lldb::opaque_compiler_type_t,
-                 llvm::SmallSet<std::pair<llvm::StringRef, CompilerType>, 8>>
-      m_cxx_record_map;
+  virtual CompilerType GetOrCreateType(PdbTypeSymId type) = 0;
+  virtual CompilerType GetOrCreateTypedefType(PdbGlobalSymId id) = 0;
+  virtual bool CompleteType(CompilerType ct) = 0;
 
-  using NamespaceSet = llvm::DenseSet<clang::NamespaceDecl *>;
+  virtual void ParseDeclsForContext(CompilerDeclContext context) = 0;
 
-  // These namespaces are fully parsed
-  NamespaceSet m_parsed_namespaces;
+  virtual CompilerDeclContext
+  FindNamespaceDecl(CompilerDeclContext parent_ctx, llvm::StringRef name) = 0;
 
-  // We know about these namespaces, but they might not be completely parsed 
yet
-  NamespaceSet m_known_namespaces;
-  llvm::DenseMap<clang::DeclContext *, NamespaceSet> m_parent_to_namespaces;
+  virtual void Dump(Stream &stream, llvm::StringRef filter,
+                    bool show_color) = 0;
 };
 
 } // namespace npdb
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp 
b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.cpp
similarity index 92%
rename from lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
rename to lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.cpp
index 61f09dff3c7e5..5d768789e69b4 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.cpp
@@ -1,4 +1,4 @@
-#include "PdbAstBuilder.h"
+#include "PdbAstBuilderClang.h"
 
 #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
 #include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
@@ -161,14 +161,14 @@ static bool IsAnonymousNamespaceName(llvm::StringRef 
name) {
   return name == "`anonymous namespace'" || name == "`anonymous-namespace'";
 }
 
-PdbAstBuilder::PdbAstBuilder(TypeSystemClang &clang) : m_clang(clang) {}
+PdbAstBuilderClang::PdbAstBuilderClang(TypeSystemClang &clang) : 
m_clang(clang) {}
 
-lldb_private::CompilerDeclContext PdbAstBuilder::GetTranslationUnitDecl() {
+lldb_private::CompilerDeclContext PdbAstBuilderClang::GetTranslationUnitDecl() 
{
   return ToCompilerDeclContext(m_clang.GetTranslationUnitDecl());
 }
 
 std::pair<clang::DeclContext *, std::string>
-PdbAstBuilder::CreateDeclInfoForType(const TagRecord &record, TypeIndex ti) {
+PdbAstBuilderClang::CreateDeclInfoForType(const TagRecord &record, TypeIndex 
ti) {
   SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
       m_clang.GetSymbolFile()->GetBackingSymbolFile());
   // FIXME: Move this to GetDeclContextContainingUID.
@@ -240,7 +240,7 @@ static bool isLocalVariableType(SymbolKind K) {
   return false;
 }
 
-clang::Decl *PdbAstBuilder::GetOrCreateSymbolForId(PdbCompilandSymId id) {
+clang::Decl *PdbAstBuilderClang::GetOrCreateSymbolForId(PdbCompilandSymId id) {
   SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
       m_clang.GetSymbolFile()->GetBackingSymbolFile());
   PdbIndex &index = pdb->GetIndex();
@@ -276,7 +276,7 @@ clang::Decl 
*PdbAstBuilder::GetOrCreateSymbolForId(PdbCompilandSymId id) {
 }
 
 std::optional<CompilerDecl>
-PdbAstBuilder::GetOrCreateDeclForUid(PdbSymUid uid) {
+PdbAstBuilderClang::GetOrCreateDeclForUid(PdbSymUid uid) {
   if (clang::Decl *result = TryGetDecl(uid))
     return ToCompilerDecl(result);
 
@@ -306,7 +306,7 @@ PdbAstBuilder::GetOrCreateDeclForUid(PdbSymUid uid) {
 }
 
 clang::DeclContext *
-PdbAstBuilder::GetOrCreateClangDeclContextForUid(PdbSymUid uid) {
+PdbAstBuilderClang::GetOrCreateClangDeclContextForUid(PdbSymUid uid) {
   if (uid.kind() == PdbSymUidKind::CompilandSym) {
     if (uid.asCompilandSym().offset == 0)
       return FromCompilerDeclContext(GetTranslationUnitDecl());
@@ -321,12 +321,12 @@ 
PdbAstBuilder::GetOrCreateClangDeclContextForUid(PdbSymUid uid) {
   return clang::Decl::castToDeclContext(decl);
 }
 
-CompilerDeclContext PdbAstBuilder::GetOrCreateDeclContextForUid(PdbSymUid uid) 
{
+CompilerDeclContext PdbAstBuilderClang::GetOrCreateDeclContextForUid(PdbSymUid 
uid) {
   return ToCompilerDeclContext(GetOrCreateClangDeclContextForUid(uid));
 }
 
 std::pair<clang::DeclContext *, std::string>
-PdbAstBuilder::CreateDeclInfoForUndecoratedName(llvm::StringRef name) {
+PdbAstBuilderClang::CreateDeclInfoForUndecoratedName(llvm::StringRef name) {
   SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
       m_clang.GetSymbolFile()->GetBackingSymbolFile());
   PdbIndex &index = pdb->GetIndex();
@@ -362,7 +362,7 @@ 
PdbAstBuilder::CreateDeclInfoForUndecoratedName(llvm::StringRef name) {
   return {context, std::string(uname)};
 }
 
-clang::DeclContext *PdbAstBuilder::GetParentClangDeclContext(PdbSymUid uid) {
+clang::DeclContext *PdbAstBuilderClang::GetParentClangDeclContext(PdbSymUid 
uid) {
   // We must do this *without* calling GetOrCreate on the current uid, as
   // that would be an infinite recursion.
   SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
@@ -425,11 +425,11 @@ clang::DeclContext 
*PdbAstBuilder::GetParentClangDeclContext(PdbSymUid uid) {
   return FromCompilerDeclContext(GetTranslationUnitDecl());
 }
 
-CompilerDeclContext PdbAstBuilder::GetParentDeclContext(PdbSymUid uid) {
+CompilerDeclContext PdbAstBuilderClang::GetParentDeclContext(PdbSymUid uid) {
   return ToCompilerDeclContext(GetParentClangDeclContext(uid));
 }
 
-bool PdbAstBuilder::CompleteType(CompilerType ct) {
+bool PdbAstBuilderClang::CompleteType(CompilerType ct) {
   if (GetClangASTImporter().CanImport(ct))
     return GetClangASTImporter().CompleteType(ct);
 
@@ -447,7 +447,7 @@ bool PdbAstBuilder::CompleteType(CompilerType ct) {
   return CompleteTagDecl(*tag);
 }
 
-bool PdbAstBuilder::CompleteTagDecl(clang::TagDecl &tag) {
+bool PdbAstBuilderClang::CompleteTagDecl(clang::TagDecl &tag) {
   // If this is not in our map, it's an error.
   auto status_iter = m_decl_to_status.find(&tag);
   lldbassert(status_iter != m_decl_to_status.end());
@@ -507,7 +507,7 @@ bool PdbAstBuilder::CompleteTagDecl(clang::TagDecl &tag) {
   return true;
 }
 
-clang::QualType PdbAstBuilder::CreateSimpleType(TypeIndex ti) {
+clang::QualType PdbAstBuilderClang::CreateSimpleType(TypeIndex ti) {
   if (ti == TypeIndex::NullptrT())
     return GetBasicType(lldb::eBasicTypeNullPtr);
 
@@ -528,7 +528,7 @@ clang::QualType PdbAstBuilder::CreateSimpleType(TypeIndex 
ti) {
   return GetBasicType(bt);
 }
 
-clang::QualType PdbAstBuilder::CreatePointerType(const PointerRecord &pointer) 
{
+clang::QualType PdbAstBuilderClang::CreatePointerType(const PointerRecord 
&pointer) {
   clang::QualType pointee_type = GetOrCreateClangType(pointer.ReferentType);
 
   // This can happen for pointers to LF_VTSHAPE records, which we shouldn't
@@ -601,7 +601,7 @@ clang::QualType PdbAstBuilder::CreatePointerType(const 
PointerRecord &pointer) {
 }
 
 clang::QualType
-PdbAstBuilder::CreateModifierType(const ModifierRecord &modifier) {
+PdbAstBuilderClang::CreateModifierType(const ModifierRecord &modifier) {
   clang::QualType unmodified_type = 
GetOrCreateClangType(modifier.ModifiedType);
   if (unmodified_type.isNull())
     return {};
@@ -614,7 +614,7 @@ PdbAstBuilder::CreateModifierType(const ModifierRecord 
&modifier) {
   return unmodified_type;
 }
 
-clang::QualType PdbAstBuilder::CreateRecordType(PdbTypeSymId id,
+clang::QualType PdbAstBuilderClang::CreateRecordType(PdbTypeSymId id,
                                                 const TagRecord &record) {
   clang::DeclContext *context = nullptr;
   std::string uname;
@@ -649,7 +649,7 @@ clang::QualType 
PdbAstBuilder::CreateRecordType(PdbTypeSymId id,
   return result;
 }
 
-clang::Decl *PdbAstBuilder::TryGetDecl(PdbSymUid uid) const {
+clang::Decl *PdbAstBuilderClang::TryGetDecl(PdbSymUid uid) const {
   auto iter = m_uid_to_decl.find(toOpaqueUid(uid));
   if (iter != m_uid_to_decl.end())
     return iter->second;
@@ -657,7 +657,7 @@ clang::Decl *PdbAstBuilder::TryGetDecl(PdbSymUid uid) const 
{
 }
 
 clang::NamespaceDecl *
-PdbAstBuilder::GetOrCreateNamespaceDecl(const char *name,
+PdbAstBuilderClang::GetOrCreateNamespaceDecl(const char *name,
                                         clang::DeclContext &context) {
   clang::NamespaceDecl *ns = m_clang.GetUniqueNamespaceDeclaration(
       IsAnonymousNamespaceName(name) ? nullptr : name, &context,
@@ -668,7 +668,7 @@ PdbAstBuilder::GetOrCreateNamespaceDecl(const char *name,
 }
 
 clang::BlockDecl *
-PdbAstBuilder::GetOrCreateBlockDecl(PdbCompilandSymId block_id) {
+PdbAstBuilderClang::GetOrCreateBlockDecl(PdbCompilandSymId block_id) {
   if (clang::Decl *decl = TryGetDecl(block_id))
     return llvm::dyn_cast<clang::BlockDecl>(decl);
 
@@ -686,7 +686,7 @@ PdbAstBuilder::GetOrCreateBlockDecl(PdbCompilandSymId 
block_id) {
   return block_decl;
 }
 
-clang::VarDecl *PdbAstBuilder::CreateVariableDecl(PdbSymUid uid, CVSymbol sym,
+clang::VarDecl *PdbAstBuilderClang::CreateVariableDecl(PdbSymUid uid, CVSymbol 
sym,
                                                   clang::DeclContext &scope) {
   VariableInfo var_info = GetVariableNameInfo(sym);
   clang::QualType qt = GetOrCreateClangType(var_info.type);
@@ -705,7 +705,7 @@ clang::VarDecl *PdbAstBuilder::CreateVariableDecl(PdbSymUid 
uid, CVSymbol sym,
 }
 
 clang::VarDecl *
-PdbAstBuilder::GetOrCreateVariableDecl(PdbCompilandSymId scope_id,
+PdbAstBuilderClang::GetOrCreateVariableDecl(PdbCompilandSymId scope_id,
                                        PdbCompilandSymId var_id) {
   if (clang::Decl *decl = TryGetDecl(var_id))
     return llvm::dyn_cast<clang::VarDecl>(decl);
@@ -721,7 +721,7 @@ PdbAstBuilder::GetOrCreateVariableDecl(PdbCompilandSymId 
scope_id,
   return CreateVariableDecl(PdbSymUid(var_id), sym, *scope);
 }
 
-clang::VarDecl *PdbAstBuilder::GetOrCreateVariableDecl(PdbGlobalSymId var_id) {
+clang::VarDecl *PdbAstBuilderClang::GetOrCreateVariableDecl(PdbGlobalSymId 
var_id) {
   if (clang::Decl *decl = TryGetDecl(var_id))
     return llvm::dyn_cast<clang::VarDecl>(decl);
 
@@ -733,7 +733,7 @@ clang::VarDecl 
*PdbAstBuilder::GetOrCreateVariableDecl(PdbGlobalSymId var_id) {
   return CreateVariableDecl(PdbSymUid(var_id), sym, *context);
 }
 
-CompilerType PdbAstBuilder::GetOrCreateTypedefType(PdbGlobalSymId id) {
+CompilerType PdbAstBuilderClang::GetOrCreateTypedefType(PdbGlobalSymId id) {
   if (clang::Decl *decl = TryGetDecl(id)) {
     if (auto *tnd = llvm::dyn_cast<clang::TypedefNameDecl>(decl))
       return ToCompilerType(m_clang.getASTContext().getTypeDeclType(tnd));
@@ -765,12 +765,12 @@ CompilerType 
PdbAstBuilder::GetOrCreateTypedefType(PdbGlobalSymId id) {
   return ct;
 }
 
-clang::QualType PdbAstBuilder::GetBasicType(lldb::BasicType type) {
+clang::QualType PdbAstBuilderClang::GetBasicType(lldb::BasicType type) {
   CompilerType ct = m_clang.GetBasicType(type);
   return clang::QualType::getFromOpaquePtr(ct.GetOpaqueQualType());
 }
 
-clang::QualType PdbAstBuilder::CreateType(PdbTypeSymId type) {
+clang::QualType PdbAstBuilderClang::CreateType(PdbTypeSymId type) {
   if (type.index.isSimple())
     return CreateSimpleType(type.index);
 
@@ -824,7 +824,7 @@ clang::QualType PdbAstBuilder::CreateType(PdbTypeSymId 
type) {
   return {};
 }
 
-clang::QualType PdbAstBuilder::GetOrCreateClangType(PdbTypeSymId type) {
+clang::QualType PdbAstBuilderClang::GetOrCreateClangType(PdbTypeSymId type) {
   if (type.index.isNoneType())
     return {};
 
@@ -867,7 +867,7 @@ clang::QualType 
PdbAstBuilder::GetOrCreateClangType(PdbTypeSymId type) {
   return qt;
 }
 
-CompilerType PdbAstBuilder::GetOrCreateType(PdbTypeSymId type) {
+CompilerType PdbAstBuilderClang::GetOrCreateType(PdbTypeSymId type) {
   clang::QualType qt = GetOrCreateClangType(type);
   if (qt.isNull())
     return {};
@@ -875,7 +875,7 @@ CompilerType PdbAstBuilder::GetOrCreateType(PdbTypeSymId 
type) {
 }
 
 clang::FunctionDecl *
-PdbAstBuilder::CreateFunctionDecl(PdbCompilandSymId func_id,
+PdbAstBuilderClang::CreateFunctionDecl(PdbCompilandSymId func_id,
                                   llvm::StringRef func_name, TypeIndex func_ti,
                                   CompilerType func_ct, uint32_t param_count,
                                   clang::StorageClass func_storage,
@@ -950,7 +950,7 @@ PdbAstBuilder::CreateFunctionDecl(PdbCompilandSymId func_id,
 }
 
 clang::FunctionDecl *
-PdbAstBuilder::GetOrCreateInlinedFunctionDecl(PdbCompilandSymId inlinesite_id) 
{
+PdbAstBuilderClang::GetOrCreateInlinedFunctionDecl(PdbCompilandSymId 
inlinesite_id) {
   SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
       m_clang.GetSymbolFile()->GetBackingSymbolFile());
   PdbIndex &index = pdb->GetIndex();
@@ -989,7 +989,7 @@ 
PdbAstBuilder::GetOrCreateInlinedFunctionDecl(PdbCompilandSymId inlinesite_id) {
 }
 
 clang::FunctionDecl *
-PdbAstBuilder::CreateFunctionDeclFromId(PdbTypeSymId func_tid,
+PdbAstBuilderClang::CreateFunctionDeclFromId(PdbTypeSymId func_tid,
                                         PdbCompilandSymId func_sid) {
   lldbassert(func_tid.is_ipi);
   SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
@@ -1041,7 +1041,7 @@ PdbAstBuilder::CreateFunctionDeclFromId(PdbTypeSymId 
func_tid,
 }
 
 clang::FunctionDecl *
-PdbAstBuilder::GetOrCreateFunctionDecl(PdbCompilandSymId func_id) {
+PdbAstBuilderClang::GetOrCreateFunctionDecl(PdbCompilandSymId func_id) {
   if (clang::Decl *decl = TryGetDecl(func_id))
     return llvm::dyn_cast<clang::FunctionDecl>(decl);
 
@@ -1095,28 +1095,28 @@ 
PdbAstBuilder::GetOrCreateFunctionDecl(PdbCompilandSymId func_id) {
   return function_decl;
 }
 
-void PdbAstBuilder::EnsureFunction(PdbCompilandSymId func_id) {
+void PdbAstBuilderClang::EnsureFunction(PdbCompilandSymId func_id) {
   GetOrCreateFunctionDecl(func_id);
 }
 
-void PdbAstBuilder::EnsureInlinedFunction(PdbCompilandSymId inlinesite_id) {
+void PdbAstBuilderClang::EnsureInlinedFunction(PdbCompilandSymId 
inlinesite_id) {
   GetOrCreateInlinedFunctionDecl(inlinesite_id);
 }
 
-void PdbAstBuilder::EnsureBlock(PdbCompilandSymId block_id) {
+void PdbAstBuilderClang::EnsureBlock(PdbCompilandSymId block_id) {
   GetOrCreateBlockDecl(block_id);
 }
 
-void PdbAstBuilder::EnsureVariable(PdbCompilandSymId scope_id,
+void PdbAstBuilderClang::EnsureVariable(PdbCompilandSymId scope_id,
                                    PdbCompilandSymId var_id) {
   GetOrCreateVariableDecl(scope_id, var_id);
 }
 
-void PdbAstBuilder::EnsureVariable(PdbGlobalSymId var_id) {
+void PdbAstBuilderClang::EnsureVariable(PdbGlobalSymId var_id) {
   GetOrCreateVariableDecl(var_id);
 }
 
-void PdbAstBuilder::CreateFunctionParameters(PdbCompilandSymId func_id,
+void PdbAstBuilderClang::CreateFunctionParameters(PdbCompilandSymId func_id,
                                              clang::FunctionDecl 
&function_decl,
                                              uint32_t param_count) {
   SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
@@ -1191,7 +1191,7 @@ void 
PdbAstBuilder::CreateFunctionParameters(PdbCompilandSymId func_id,
     function_decl.setParams(params);
 }
 
-clang::QualType PdbAstBuilder::CreateEnumType(PdbTypeSymId id,
+clang::QualType PdbAstBuilderClang::CreateEnumType(PdbTypeSymId id,
                                               const EnumRecord &er) {
   clang::DeclContext *decl_context = nullptr;
   std::string uname;
@@ -1214,7 +1214,7 @@ clang::QualType 
PdbAstBuilder::CreateEnumType(PdbTypeSymId id,
   return clang::QualType::getFromOpaquePtr(enum_ct.GetOpaqueQualType());
 }
 
-clang::QualType PdbAstBuilder::CreateArrayType(const ArrayRecord &ar) {
+clang::QualType PdbAstBuilderClang::CreateArrayType(const ArrayRecord &ar) {
   clang::QualType element_type = GetOrCreateClangType(ar.ElementType);
   TypeSystemClang::RequireCompleteType(ToCompilerType(element_type));
 
@@ -1231,7 +1231,7 @@ clang::QualType PdbAstBuilder::CreateArrayType(const 
ArrayRecord &ar) {
   return clang::QualType::getFromOpaquePtr(array_ct.GetOpaqueQualType());
 }
 
-clang::QualType PdbAstBuilder::CreateFunctionType(
+clang::QualType PdbAstBuilderClang::CreateFunctionType(
     TypeIndex args_type_idx, TypeIndex return_type_idx,
     llvm::codeview::CallingConvention calling_convention) {
   SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
@@ -1287,7 +1287,7 @@ static bool isBlockDecl(clang::DeclContext &context) {
   return llvm::isa<clang::BlockDecl>(&context);
 }
 
-void PdbAstBuilder::ParseNamespace(clang::DeclContext &context) {
+void PdbAstBuilderClang::ParseNamespace(clang::DeclContext &context) {
   clang::NamespaceDecl *ns = llvm::dyn_cast<clang::NamespaceDecl>(&context);
   if (m_parsed_namespaces.contains(ns))
     return;
@@ -1326,7 +1326,7 @@ void PdbAstBuilder::ParseNamespace(clang::DeclContext 
&context) {
   m_parsed_namespaces.insert(ns);
 }
 
-void PdbAstBuilder::ParseAllTypes() {
+void PdbAstBuilderClang::ParseAllTypes() {
   llvm::call_once(m_parse_all_types, [this]() {
     SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
         m_clang.GetSymbolFile()->GetBackingSymbolFile());
@@ -1344,7 +1344,7 @@ void PdbAstBuilder::ParseAllTypes() {
   });
 }
 
-void PdbAstBuilder::ParseAllFunctionsAndNonLocalVars() {
+void PdbAstBuilderClang::ParseAllFunctionsAndNonLocalVars() {
   llvm::call_once(m_parse_functions_and_non_local_vars, [this]() {
     SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
         m_clang.GetSymbolFile()->GetBackingSymbolFile());
@@ -1405,7 +1405,7 @@ static CVSymbolArray skipFunctionParameters(clang::Decl 
&decl,
   return result;
 }
 
-void PdbAstBuilder::ParseBlockChildren(PdbCompilandSymId block_id) {
+void PdbAstBuilderClang::ParseBlockChildren(PdbCompilandSymId block_id) {
   SymbolFileNativePDB *pdb = static_cast<SymbolFileNativePDB *>(
       m_clang.GetSymbolFile()->GetBackingSymbolFile());
   PdbIndex &index = pdb->GetIndex();
@@ -1436,7 +1436,7 @@ void PdbAstBuilder::ParseBlockChildren(PdbCompilandSymId 
block_id) {
   }
 }
 
-void PdbAstBuilder::ParseDeclsForSimpleContext(clang::DeclContext &context) {
+void PdbAstBuilderClang::ParseDeclsForSimpleContext(clang::DeclContext 
&context) {
 
   clang::Decl *decl = clang::Decl::castFromDeclContext(&context);
   lldbassert(decl);
@@ -1455,7 +1455,7 @@ void 
PdbAstBuilder::ParseDeclsForSimpleContext(clang::DeclContext &context) {
   }
 }
 
-void PdbAstBuilder::ParseDeclsForContext(CompilerDeclContext context) {
+void PdbAstBuilderClang::ParseDeclsForContext(CompilerDeclContext context) {
   clang::DeclContext *dc = FromCompilerDeclContext(context);
   if (!dc)
     return;
@@ -1483,39 +1483,39 @@ void 
PdbAstBuilder::ParseDeclsForContext(CompilerDeclContext context) {
   }
 }
 
-CompilerDecl PdbAstBuilder::ToCompilerDecl(clang::Decl *decl) {
+CompilerDecl PdbAstBuilderClang::ToCompilerDecl(clang::Decl *decl) {
   return m_clang.GetCompilerDecl(decl);
 }
 
-CompilerType PdbAstBuilder::ToCompilerType(clang::QualType qt) {
+CompilerType PdbAstBuilderClang::ToCompilerType(clang::QualType qt) {
   return m_clang.GetType(qt);
 }
 
-clang::QualType PdbAstBuilder::FromCompilerType(CompilerType ct) {
+clang::QualType PdbAstBuilderClang::FromCompilerType(CompilerType ct) {
   return ClangUtil::GetQualType(ct);
 }
 
 CompilerDeclContext
-PdbAstBuilder::ToCompilerDeclContext(clang::DeclContext *context) {
+PdbAstBuilderClang::ToCompilerDeclContext(clang::DeclContext *context) {
   return m_clang.CreateDeclContext(context);
 }
 
-clang::Decl * PdbAstBuilder::FromCompilerDecl(CompilerDecl decl) {
+clang::Decl * PdbAstBuilderClang::FromCompilerDecl(CompilerDecl decl) {
   return ClangUtil::GetDecl(decl);
 }
 
 clang::DeclContext *
-PdbAstBuilder::FromCompilerDeclContext(CompilerDeclContext context) {
+PdbAstBuilderClang::FromCompilerDeclContext(CompilerDeclContext context) {
   return static_cast<clang::DeclContext *>(context.GetOpaqueDeclContext());
 }
 
-void PdbAstBuilder::Dump(Stream &stream, llvm::StringRef filter,
+void PdbAstBuilderClang::Dump(Stream &stream, llvm::StringRef filter,
                          bool show_color) {
   m_clang.Dump(stream.AsRawOstream(), filter, show_color);
 }
 
 CompilerDeclContext
-PdbAstBuilder::FindNamespaceDecl(CompilerDeclContext parent_ctx,
+PdbAstBuilderClang::FindNamespaceDecl(CompilerDeclContext parent_ctx,
                                  llvm::StringRef name) {
   clang::DeclContext *parent = FromCompilerDeclContext(parent_ctx);
   NamespaceSet *set;
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.h 
b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.h
new file mode 100644
index 0000000000000..23e4cb86ea31a
--- /dev/null
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.h
@@ -0,0 +1,182 @@
+//===-- PdbAstBuilderClang.h ------------------------------------*- C++ 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDERCLANG_H
+#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDERCLANG_H
+
+#include "PdbAstBuilder.h"
+
+#include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/DebugInfo/CodeView/CVRecord.h"
+#include "llvm/Support/Threading.h"
+
+namespace clang {
+class TagDecl;
+class DeclContext;
+class Decl;
+class QualType;
+class FunctionDecl;
+class NamespaceDecl;
+class BlockDecl;
+class VarDecl;
+} // namespace clang
+
+namespace llvm {
+namespace codeview {
+class PointerRecord;
+class ModifierRecord;
+class ArrayRecord;
+class TagRecord;
+class EnumRecord;
+enum class CallingConvention : uint8_t;
+} // namespace codeview
+} // namespace llvm
+
+namespace lldb_private {
+namespace npdb {
+
+struct DeclStatus {
+  DeclStatus() = default;
+  DeclStatus(lldb::user_id_t uid, bool resolved)
+      : uid(uid), resolved(resolved) {}
+  lldb::user_id_t uid = 0;
+  bool resolved = false;
+};
+
+class PdbAstBuilderClang : public PdbAstBuilder {
+public:
+  PdbAstBuilderClang(TypeSystemClang &clang);
+
+  std::optional<CompilerDecl> GetOrCreateDeclForUid(PdbSymUid uid) override;
+  CompilerDeclContext GetOrCreateDeclContextForUid(PdbSymUid uid) override;
+  CompilerDeclContext GetParentDeclContext(PdbSymUid uid) override;
+
+  void EnsureFunction(PdbCompilandSymId func_id) override;
+  void EnsureInlinedFunction(PdbCompilandSymId inlinesite_id) override;
+  void EnsureBlock(PdbCompilandSymId block_id) override;
+  void EnsureVariable(PdbCompilandSymId scope_id,
+                      PdbCompilandSymId var_id) override;
+  void EnsureVariable(PdbGlobalSymId var_id) override;
+
+  CompilerType GetOrCreateType(PdbTypeSymId type) override;
+  CompilerType GetOrCreateTypedefType(PdbGlobalSymId id) override;
+  bool CompleteType(CompilerType ct) override;
+
+  void ParseDeclsForContext(CompilerDeclContext context) override;
+
+  CompilerDeclContext FindNamespaceDecl(CompilerDeclContext parent_ctx,
+                                        llvm::StringRef name) override;
+
+  void Dump(Stream &stream, llvm::StringRef filter, bool show_color) override;
+
+  // Clang-specific
+  clang::QualType GetBasicType(lldb::BasicType type);
+  clang::QualType GetOrCreateClangType(PdbTypeSymId type);
+  clang::DeclContext *GetOrCreateClangDeclContextForUid(PdbSymUid uid);
+
+  CompilerDecl ToCompilerDecl(clang::Decl *decl);
+  CompilerType ToCompilerType(clang::QualType qt);
+  CompilerDeclContext ToCompilerDeclContext(clang::DeclContext *context);
+  clang::QualType FromCompilerType(CompilerType ct);
+  clang::Decl *FromCompilerDecl(CompilerDecl decl);
+  clang::DeclContext *FromCompilerDeclContext(CompilerDeclContext context);
+
+  bool CompleteTagDecl(clang::TagDecl &tag);
+
+  TypeSystemClang &clang() { return m_clang; }
+  ClangASTImporter &GetClangASTImporter() { return m_importer; }
+
+private:
+  CompilerDeclContext GetTranslationUnitDecl();
+  clang::DeclContext *GetParentClangDeclContext(PdbSymUid uid);
+
+  clang::Decl *TryGetDecl(PdbSymUid uid) const;
+
+  clang::FunctionDecl *GetOrCreateFunctionDecl(PdbCompilandSymId func_id);
+  clang::FunctionDecl *
+  GetOrCreateInlinedFunctionDecl(PdbCompilandSymId inlinesite_id);
+  clang::BlockDecl *GetOrCreateBlockDecl(PdbCompilandSymId block_id);
+  clang::VarDecl *GetOrCreateVariableDecl(PdbCompilandSymId scope_id,
+                                          PdbCompilandSymId var_id);
+  clang::VarDecl *GetOrCreateVariableDecl(PdbGlobalSymId var_id);
+
+  using TypeIndex = llvm::codeview::TypeIndex;
+
+  clang::QualType
+  CreatePointerType(const llvm::codeview::PointerRecord &pointer);
+  clang::QualType
+  CreateModifierType(const llvm::codeview::ModifierRecord &modifier);
+  clang::QualType CreateArrayType(const llvm::codeview::ArrayRecord &array);
+  clang::QualType CreateRecordType(PdbTypeSymId id,
+                                   const llvm::codeview::TagRecord &record);
+  clang::QualType CreateEnumType(PdbTypeSymId id,
+                                 const llvm::codeview::EnumRecord &record);
+  clang::QualType
+  CreateFunctionType(TypeIndex args_type_idx, TypeIndex return_type_idx,
+                     llvm::codeview::CallingConvention calling_convention);
+  clang::QualType CreateType(PdbTypeSymId type);
+
+  void CreateFunctionParameters(PdbCompilandSymId func_id,
+                                clang::FunctionDecl &function_decl,
+                                uint32_t param_count);
+  clang::Decl *GetOrCreateSymbolForId(PdbCompilandSymId id);
+  clang::VarDecl *CreateVariableDecl(PdbSymUid uid,
+                                     llvm::codeview::CVSymbol sym,
+                                     clang::DeclContext &scope);
+  clang::NamespaceDecl *GetOrCreateNamespaceDecl(const char *name,
+                                                 clang::DeclContext &context);
+  clang::FunctionDecl *CreateFunctionDeclFromId(PdbTypeSymId func_tid,
+                                                PdbCompilandSymId func_sid);
+  clang::FunctionDecl *
+  CreateFunctionDecl(PdbCompilandSymId func_id, llvm::StringRef func_name,
+                     TypeIndex func_ti, CompilerType func_ct,
+                     uint32_t param_count, clang::StorageClass func_storage,
+                     bool is_inline, clang::DeclContext *parent);
+  void ParseNamespace(clang::DeclContext &parent);
+  void ParseAllTypes();
+  void ParseAllFunctionsAndNonLocalVars();
+  void ParseDeclsForSimpleContext(clang::DeclContext &context);
+  void ParseBlockChildren(PdbCompilandSymId block_id);
+
+  std::pair<clang::DeclContext *, std::string>
+  CreateDeclInfoForType(const llvm::codeview::TagRecord &record, TypeIndex ti);
+  std::pair<clang::DeclContext *, std::string>
+  CreateDeclInfoForUndecoratedName(llvm::StringRef uname);
+  clang::QualType CreateSimpleType(TypeIndex ti);
+
+  TypeSystemClang &m_clang;
+
+  ClangASTImporter m_importer;
+  llvm::once_flag m_parse_functions_and_non_local_vars;
+  llvm::once_flag m_parse_all_types;
+  llvm::DenseMap<clang::Decl *, DeclStatus> m_decl_to_status;
+  llvm::DenseMap<lldb::user_id_t, clang::Decl *> m_uid_to_decl;
+  llvm::DenseMap<lldb::user_id_t, clang::QualType> m_uid_to_type;
+
+  // From class/struct's opaque_compiler_type_t to a set containing the pairs 
of
+  // method's name and CompilerType.
+  llvm::DenseMap<lldb::opaque_compiler_type_t,
+                 llvm::SmallSet<std::pair<llvm::StringRef, CompilerType>, 8>>
+      m_cxx_record_map;
+
+  using NamespaceSet = llvm::DenseSet<clang::NamespaceDecl *>;
+
+  // These namespaces are fully parsed
+  NamespaceSet m_parsed_namespaces;
+
+  // We know about these namespaces, but they might not be completely parsed 
yet
+  NamespaceSet m_known_namespaces;
+  llvm::DenseMap<clang::DeclContext *, NamespaceSet> m_parent_to_namespaces;
+};
+
+} // namespace npdb
+} // namespace lldb_private
+
+#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_PDBASTBUILDERCLANG_H
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp 
b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
index d6f8902b7e663..0ed842a3eacc7 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
@@ -1,6 +1,6 @@
 #include "UdtRecordCompleter.h"
 
-#include "PdbAstBuilder.h"
+#include "PdbAstBuilderClang.h"
 #include "PdbIndex.h"
 #include "PdbSymUid.h"
 #include "PdbUtil.h"
@@ -36,7 +36,7 @@ using Error = llvm::Error;
 
 UdtRecordCompleter::UdtRecordCompleter(
     PdbTypeSymId id, CompilerType &derived_ct, clang::TagDecl &tag_decl,
-    PdbAstBuilder &ast_builder, PdbIndex &index,
+    PdbAstBuilderClang &ast_builder, PdbIndex &index,
     llvm::DenseMap<clang::Decl *, DeclStatus> &decl_to_status,
     llvm::DenseMap<lldb::opaque_compiler_type_t,
                    llvm::SmallSet<std::pair<llvm::StringRef, CompilerType>, 8>>
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h 
b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h
index 73c45456899e4..a603338a1fcb4 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h
@@ -9,7 +9,7 @@
 #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H
 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_NATIVEPDB_UDTRECORDCOMPLETER_H
 
-#include "PdbAstBuilder.h"
+#include "PdbAstBuilderClang.h"
 #include "PdbSymUid.h"
 #include "PdbUtil.h"
 #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h"
@@ -35,7 +35,6 @@ namespace lldb_private {
 class Type;
 class CompilerType;
 namespace npdb {
-class PdbAstBuilder;
 class PdbIndex;
 
 class UdtRecordCompleter : public llvm::codeview::TypeVisitorCallbacks {
@@ -46,7 +45,7 @@ class UdtRecordCompleter : public 
llvm::codeview::TypeVisitorCallbacks {
   PdbTypeSymId m_id;
   CompilerType &m_derived_ct;
   clang::TagDecl &m_tag_decl;
-  PdbAstBuilder &m_ast_builder;
+  PdbAstBuilderClang &m_ast_builder;
   PdbIndex &m_index;
   std::vector<IndexedBase> m_bases;
   ClangASTImporter::LayoutInfo m_layout;
@@ -58,7 +57,7 @@ class UdtRecordCompleter : public 
llvm::codeview::TypeVisitorCallbacks {
 public:
   UdtRecordCompleter(
       PdbTypeSymId id, CompilerType &derived_ct, clang::TagDecl &tag_decl,
-      PdbAstBuilder &ast_builder, PdbIndex &index,
+      PdbAstBuilderClang &ast_builder, PdbIndex &index,
       llvm::DenseMap<clang::Decl *, DeclStatus> &decl_to_status,
       llvm::DenseMap<lldb::opaque_compiler_type_t,
                      llvm::SmallSet<std::pair<llvm::StringRef, CompilerType>,
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp 
b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 1e1b265ba195a..19eb399f81431 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -82,7 +82,7 @@
 #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
 #include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h"
 #include "Plugins/SymbolFile/PDB/PDBASTParser.h"
-#include "Plugins/SymbolFile/NativePDB/PdbAstBuilder.h"
+#include "Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.h"
 
 #include <cstdio>
 
@@ -9159,7 +9159,8 @@ PDBASTParser *TypeSystemClang::GetPDBParser() {
 
 npdb::PdbAstBuilder *TypeSystemClang::GetNativePDBParser() {
   if (!m_native_pdb_ast_parser_up)
-    m_native_pdb_ast_parser_up = std::make_unique<npdb::PdbAstBuilder>(*this);
+    m_native_pdb_ast_parser_up =
+        std::make_unique<npdb::PdbAstBuilderClang>(*this);
   return m_native_pdb_ast_parser_up.get();
 }
 
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h 
b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
index 67d206e4d2df2..22a4887dffb0b 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h
@@ -44,6 +44,12 @@
 class DWARFASTParserClang;
 class PDBASTParser;
 
+namespace lldb_private {
+namespace npdb {
+class PdbAstBuilderClang;
+} // namespace npdb
+} // namespace lldb_private
+
 namespace clang {
 class FileManager;
 class HeaderSearch;
@@ -1222,7 +1228,7 @@ class TypeSystemClang : public TypeSystem {
   std::unique_ptr<clang::ModuleMap> m_module_map_up;
   std::unique_ptr<DWARFASTParserClang> m_dwarf_ast_parser_up;
   std::unique_ptr<PDBASTParser> m_pdb_ast_parser_up;
-  std::unique_ptr<npdb::PdbAstBuilder> m_native_pdb_ast_parser_up;
+  std::unique_ptr<npdb::PdbAstBuilderClang> m_native_pdb_ast_parser_up;
   std::unique_ptr<clang::MangleContext> m_mangle_ctx_up;
   uint32_t m_pointer_byte_size = 0;
   bool m_ast_owned = false;
diff --git 
a/llvm/utils/gn/secondary/lldb/source/Plugins/SymbolFile/NativePDB/BUILD.gn 
b/llvm/utils/gn/secondary/lldb/source/Plugins/SymbolFile/NativePDB/BUILD.gn
index a76b0ec3bfaaf..ad9a7c4e07b42 100644
--- a/llvm/utils/gn/secondary/lldb/source/Plugins/SymbolFile/NativePDB/BUILD.gn
+++ b/llvm/utils/gn/secondary/lldb/source/Plugins/SymbolFile/NativePDB/BUILD.gn
@@ -25,7 +25,7 @@ static_library("NativePDB") {
     "CodeViewRegisterMapping.cpp",
     "CompileUnitIndex.cpp",
     "DWARFLocationExpression.cpp",
-    "PdbAstBuilder.cpp",
+    "PdbAstBuilderClang.cpp",
     "PdbFPOProgramToDWARFExpression.cpp",
     "PdbIndex.cpp",
     "PdbSymUid.cpp",

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to