https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/142164
>From 662e07aa9bb6560f37c079ba6f13be17e7885b48 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 30 May 2025 15:44:09 +0100 Subject: [PATCH 1/5] [clang][Frontend] Add overload to ASTPrinter that doesn't own output stream We're planning on using the ASTPrinter in LLDB for AST dumping. But it currently takes the output stream via `unique_ptr`. In LLDB we don't have the output stream available in this form and instead it would be convenient if we could just pass a reference to the stream. This patch adds that overload. (cherry picked from commit 9bd15ee7ed44adc836bcd07ff7e856d7a32ba6a9) --- clang/include/clang/Frontend/ASTConsumers.h | 5 +++++ clang/lib/Frontend/ASTConsumers.cpp | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/clang/include/clang/Frontend/ASTConsumers.h b/clang/include/clang/Frontend/ASTConsumers.h index 0e068bf5cccb5..890701b6ff188 100644 --- a/clang/include/clang/Frontend/ASTConsumers.h +++ b/clang/include/clang/Frontend/ASTConsumers.h @@ -35,6 +35,11 @@ CreateASTDumper(std::unique_ptr<raw_ostream> OS, StringRef FilterString, bool DumpDecls, bool Deserialize, bool DumpLookups, bool DumpDeclTypes, ASTDumpOutputFormat Format); +std::unique_ptr<ASTConsumer> +CreateASTDumper(raw_ostream &OS, StringRef FilterString, bool DumpDecls, + bool Deserialize, bool DumpLookups, bool DumpDeclTypes, + ASTDumpOutputFormat Format); + // AST Decl node lister: prints qualified names of all filterable AST Decl // nodes. std::unique_ptr<ASTConsumer> CreateASTDeclNodeLister(); diff --git a/clang/lib/Frontend/ASTConsumers.cpp b/clang/lib/Frontend/ASTConsumers.cpp index a6e35452b4fbe..a5ff4d44592d4 100644 --- a/clang/lib/Frontend/ASTConsumers.cpp +++ b/clang/lib/Frontend/ASTConsumers.cpp @@ -41,6 +41,13 @@ namespace { OutputKind(K), OutputFormat(Format), FilterString(FilterString), DumpLookups(DumpLookups), DumpDeclTypes(DumpDeclTypes) {} + ASTPrinter(raw_ostream &Out, Kind K, ASTDumpOutputFormat Format, + StringRef FilterString, bool DumpLookups = false, + bool DumpDeclTypes = false) + : Out(Out), OwnedOut(nullptr), OutputKind(K), OutputFormat(Format), + FilterString(FilterString), DumpLookups(DumpLookups), + DumpDeclTypes(DumpDeclTypes) {} + void HandleTranslationUnit(ASTContext &Context) override { TranslationUnitDecl *D = Context.getTranslationUnitDecl(); @@ -176,6 +183,19 @@ clang::CreateASTDumper(std::unique_ptr<raw_ostream> Out, StringRef FilterString, Format, FilterString, DumpLookups, DumpDeclTypes); } +std::unique_ptr<ASTConsumer> +clang::CreateASTDumper(raw_ostream &Out, StringRef FilterString, bool DumpDecls, + bool Deserialize, bool DumpLookups, bool DumpDeclTypes, + ASTDumpOutputFormat Format) { + assert((DumpDecls || Deserialize || DumpLookups) && "nothing to dump"); + return std::make_unique<ASTPrinter>(Out, + Deserialize ? ASTPrinter::DumpFull + : DumpDecls ? ASTPrinter::Dump + : ASTPrinter::None, + Format, FilterString, DumpLookups, + DumpDeclTypes); +} + std::unique_ptr<ASTConsumer> clang::CreateASTDeclNodeLister() { return std::make_unique<ASTDeclNodeLister>(nullptr); } >From 0ba5a4f09caeb54008594adfb3b8efa2a740e5e6 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 30 May 2025 15:46:27 +0100 Subject: [PATCH 2/5] [lldb] Add filter option to AST dump command This patch makes the `-ast-dump-filter` Clang option available to the `target modules dump ast` command. This allows us to selectively dump parts of the AST by name. The AST can quickly grow way too large to skim on the console. This will aid in debugging AST related issues. Example: ``` (lldb) target modules dump ast --filter func Dumping clang ast for 48 modules. Dumping func: FunctionDecl 0xc4b785008 <<invalid sloc>> <invalid sloc> func 'void (int)' extern |-ParmVarDecl 0xc4b7853d8 <<invalid sloc>> <invalid sloc> x 'int' `-AsmLabelAttr 0xc4b785358 <<invalid sloc>> Implicit "_Z4funcIiEvT_" Dumping func<int>: FunctionDecl 0xc4b7850b8 <<invalid sloc>> <invalid sloc> func<int> 'void (int)' implicit_instantiation extern |-TemplateArgument type 'int' | `-BuiltinType 0xc4b85b110 'int' `-ParmVarDecl 0xc4b7853d8 <<invalid sloc>> <invalid sloc> x 'int' ``` --- lldb/include/lldb/Symbol/SymbolFile.h | 2 +- lldb/include/lldb/Symbol/SymbolFileOnDemand.h | 2 +- lldb/include/lldb/Symbol/TypeSystem.h | 3 ++- lldb/source/Commands/CommandObjectTarget.cpp | 23 +++++++++++++++---- .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 4 ++-- .../SymbolFile/DWARF/SymbolFileDWARF.h | 2 +- .../DWARF/SymbolFileDWARFDebugMap.cpp | 6 ++--- .../DWARF/SymbolFileDWARFDebugMap.h | 2 +- .../SymbolFile/NativePDB/PdbAstBuilder.cpp | 4 ++-- .../SymbolFile/NativePDB/PdbAstBuilder.h | 2 +- .../NativePDB/SymbolFileNativePDB.cpp | 4 ++-- .../NativePDB/SymbolFileNativePDB.h | 2 +- .../Plugins/SymbolFile/PDB/SymbolFilePDB.cpp | 4 ++-- .../Plugins/SymbolFile/PDB/SymbolFilePDB.h | 2 +- .../TypeSystem/Clang/TypeSystemClang.cpp | 20 ++++++++++++---- .../TypeSystem/Clang/TypeSystemClang.h | 4 ++-- lldb/source/Symbol/SymbolFileOnDemand.cpp | 5 ++-- 17 files changed, 58 insertions(+), 33 deletions(-) diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index df2f263b18e17..086bb7ffebbda 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -296,7 +296,7 @@ class SymbolFile : public PluginInterface { lldb::SymbolContextItem resolve_scope, SymbolContextList &sc_list); - virtual void DumpClangAST(Stream &s) {} + virtual void DumpClangAST(Stream &s, llvm::StringRef filter_string) {} virtual void FindGlobalVariables(ConstString name, const CompilerDeclContext &parent_decl_ctx, uint32_t max_matches, diff --git a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h index 6ed389a48880c..ba4a7f09afeaa 100644 --- a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -127,7 +127,7 @@ class SymbolFileOnDemand : public lldb_private::SymbolFile { lldb_private::SymbolContextList &sc_list) override; void Dump(lldb_private::Stream &s) override; - void DumpClangAST(lldb_private::Stream &s) override; + void DumpClangAST(lldb_private::Stream &s, llvm::StringRef filter) override; void FindGlobalVariables(lldb_private::ConstString name, diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index 1f1a3ac4bc56b..25be595db685e 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -443,7 +443,8 @@ class TypeSystem : public PluginInterface, /// given stream. /// /// This should not modify the state of the TypeSystem if possible. - virtual void Dump(llvm::raw_ostream &output) = 0; + virtual void Dump(llvm::raw_ostream &output, + llvm::StringRef filter_string) = 0; /// This is used by swift. virtual bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) = 0; diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index e2ba0008badd3..256d3b576324b 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -2235,11 +2235,22 @@ class CommandObjectTargetModulesDumpClangAST : CommandObjectTargetModulesModuleAutoComplete( interpreter, "target modules dump ast", "Dump the clang ast for a given module's symbol file.", - //"target modules dump ast [<file1> ...]") - nullptr, eCommandRequiresTarget) {} + "target modules dump ast [--filter <name>] [<file1> ...]", + eCommandRequiresTarget), + m_filter(LLDB_OPT_SET_1, false, "filter", 'f', 0, eArgTypeName, "TODO", + /*default_value=*/"") { + m_option_group.Append(&m_filter, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); + m_option_group.Finalize(); + AddSimpleArgumentList(eArgTypeFilename, eArgRepeatStar); + } + + Options *GetOptions() override { return &m_option_group; } ~CommandObjectTargetModulesDumpClangAST() override = default; + OptionGroupOptions m_option_group; + OptionGroupString m_filter; + protected: void DoExecute(Args &command, CommandReturnObject &result) override { Target &target = GetTarget(); @@ -2251,6 +2262,8 @@ class CommandObjectTargetModulesDumpClangAST return; } + llvm::StringRef filter = m_filter.GetOptionValue().GetCurrentValueAsRef(); + if (command.GetArgumentCount() == 0) { // Dump all ASTs for all modules images result.GetOutputStream().Format("Dumping clang ast for {0} modules.\n", @@ -2259,7 +2272,7 @@ class CommandObjectTargetModulesDumpClangAST if (INTERRUPT_REQUESTED(GetDebugger(), "Interrupted dumping clang ast")) break; if (SymbolFile *sf = module_sp->GetSymbolFile()) - sf->DumpClangAST(result.GetOutputStream()); + sf->DumpClangAST(result.GetOutputStream(), filter); } result.SetStatus(eReturnStatusSuccessFinishResult); return; @@ -2288,7 +2301,7 @@ class CommandObjectTargetModulesDumpClangAST Module *m = module_list.GetModulePointerAtIndex(i); if (SymbolFile *sf = m->GetSymbolFile()) - sf->DumpClangAST(result.GetOutputStream()); + sf->DumpClangAST(result.GetOutputStream(), filter); } } result.SetStatus(eReturnStatusSuccessFinishResult); @@ -5272,7 +5285,7 @@ class CommandObjectTargetDumpTypesystem : public CommandObjectParsed { // Go over every scratch TypeSystem and dump to the command output. for (lldb::TypeSystemSP ts : GetTarget().GetScratchTypeSystems()) if (ts) - ts->Dump(result.GetOutputStream().AsRawOstream()); + ts->Dump(result.GetOutputStream().AsRawOstream(), ""); result.SetStatus(eReturnStatusSuccessFinishResult); } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 24f905a023317..6b082a01a89d5 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -4127,7 +4127,7 @@ void SymbolFileDWARF::Dump(lldb_private::Stream &s) { m_index->Dump(s); } -void SymbolFileDWARF::DumpClangAST(Stream &s) { +void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter_string) { auto ts_or_err = GetTypeSystemForLanguage(eLanguageTypeC_plus_plus); if (!ts_or_err) return; @@ -4135,7 +4135,7 @@ void SymbolFileDWARF::DumpClangAST(Stream &s) { TypeSystemClang *clang = llvm::dyn_cast_or_null<TypeSystemClang>(ts.get()); if (!clang) return; - clang->Dump(s.AsRawOstream()); + clang->Dump(s.AsRawOstream(), filter_string); } bool SymbolFileDWARF::GetSeparateDebugInfo(StructuredData::Dictionary &d, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index c9fdfb7b1cf91..5e2f9d9a5a85f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -276,7 +276,7 @@ class SymbolFileDWARF : public SymbolFileCommon { void Dump(Stream &s) override; - void DumpClangAST(Stream &s) override; + void DumpClangAST(Stream &s, llvm::StringRef filter_string) override; /// List separate dwo files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 961c212e2e6dc..f3a940b2ee396 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1267,9 +1267,9 @@ CompilerDeclContext SymbolFileDWARFDebugMap::FindNamespace( return matching_namespace; } -void SymbolFileDWARFDebugMap::DumpClangAST(Stream &s) { - ForEachSymbolFile("Dumping clang AST", [&s](SymbolFileDWARF &oso_dwarf) { - oso_dwarf.DumpClangAST(s); +void SymbolFileDWARFDebugMap::DumpClangAST(Stream &s, llvm::StringRef filter) { + ForEachSymbolFile("Dumping clang AST", [&](SymbolFileDWARF &oso_dwarf) { + oso_dwarf.DumpClangAST(s, filter); // The underlying assumption is that DumpClangAST(...) will obtain the // AST from the underlying TypeSystem and therefore we only need to do // this once and can stop after the first iteration hence we return true. diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h index 8399a267d7856..35cbdbbb1692f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -129,7 +129,7 @@ class SymbolFileDWARFDebugMap : public SymbolFileCommon { std::vector<std::unique_ptr<CallEdge>> ParseCallEdgesInFunction(UserID func_id) override; - void DumpClangAST(Stream &s) override; + void DumpClangAST(Stream &s, llvm::StringRef filter) override; /// List separate oso files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp index 92840da74a21f..f7cde5db31caf 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp @@ -1449,6 +1449,6 @@ PdbAstBuilder::FromCompilerDeclContext(CompilerDeclContext context) { return static_cast<clang::DeclContext *>(context.GetOpaqueDeclContext()); } -void PdbAstBuilder::Dump(Stream &stream) { - m_clang.Dump(stream.AsRawOstream()); +void PdbAstBuilder::Dump(Stream &stream, llvm::StringRef filter) { + m_clang.Dump(stream.AsRawOstream(), filter); } diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h index b7cad30c69c0c..66a3836fac053 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h +++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h @@ -87,7 +87,7 @@ class PdbAstBuilder { TypeSystemClang &clang() { return m_clang; } ClangASTImporter &GetClangASTImporter() { return m_importer; } - void Dump(Stream &stream); + void Dump(Stream &stream, llvm::StringRef filter); private: clang::Decl *TryGetDecl(PdbSymUid uid) const; diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index dadc969c48a3a..20d8c1acf9c42 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1630,7 +1630,7 @@ size_t SymbolFileNativePDB::ParseSymbolArrayInScope( return count; } -void SymbolFileNativePDB::DumpClangAST(Stream &s) { +void SymbolFileNativePDB::DumpClangAST(Stream &s, llvm::StringRef filter) { auto ts_or_err = GetTypeSystemForLanguage(eLanguageTypeC_plus_plus); if (!ts_or_err) return; @@ -1638,7 +1638,7 @@ void SymbolFileNativePDB::DumpClangAST(Stream &s) { TypeSystemClang *clang = llvm::dyn_cast_or_null<TypeSystemClang>(ts.get()); if (!clang) return; - clang->GetNativePDBParser()->Dump(s); + clang->GetNativePDBParser()->Dump(s, filter); } void SymbolFileNativePDB::FindGlobalVariables( diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h index b0e78a243a3c2..9891313f11d0b 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -157,7 +157,7 @@ class SymbolFileNativePDB : public SymbolFileCommon { PdbIndex &GetIndex() { return *m_index; }; - void DumpClangAST(Stream &s) override; + void DumpClangAST(Stream &s, llvm::StringRef filter) override; std::optional<llvm::codeview::TypeIndex> GetParentType(llvm::codeview::TypeIndex ti); diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index f1d98e780994d..96519ae0b3157 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1431,7 +1431,7 @@ void SymbolFilePDB::AddSymbols(lldb_private::Symtab &symtab) { symtab.Finalize(); } -void SymbolFilePDB::DumpClangAST(Stream &s) { +void SymbolFilePDB::DumpClangAST(Stream &s, llvm::StringRef filter) { auto type_system_or_err = GetTypeSystemForLanguage(lldb::eLanguageTypeC_plus_plus); if (auto err = type_system_or_err.takeError()) { @@ -1445,7 +1445,7 @@ void SymbolFilePDB::DumpClangAST(Stream &s) { llvm::dyn_cast_or_null<TypeSystemClang>(ts.get()); if (!clang_type_system) return; - clang_type_system->Dump(s.AsRawOstream()); + clang_type_system->Dump(s.AsRawOstream(), filter); } void SymbolFilePDB::FindTypesByRegex( diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h index ea495c575f1f1..c0b25b6ee4055 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -157,7 +157,7 @@ class SymbolFilePDB : public lldb_private::SymbolFileCommon { const llvm::pdb::IPDBSession &GetPDBSession() const; - void DumpClangAST(lldb_private::Stream &s) override; + void DumpClangAST(lldb_private::Stream &s, llvm::StringRef filter) override; private: struct SecContribInfo { diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index eb8271d46a043..5efafd4c9c3eb 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -10,6 +10,7 @@ #include "clang/AST/DeclBase.h" #include "clang/AST/ExprCXX.h" +#include "clang/Frontend/ASTConsumers.h" #include "llvm/Support/Casting.h" #include "llvm/Support/FormatAdapters.h" #include "llvm/Support/FormatVariadic.h" @@ -8511,8 +8512,16 @@ TypeSystemClang::dump(lldb::opaque_compiler_type_t type) const { } #endif -void TypeSystemClang::Dump(llvm::raw_ostream &output) { - GetTranslationUnitDecl()->dump(output); +void TypeSystemClang::Dump(llvm::raw_ostream &output, + llvm::StringRef filter_string) { + auto consumer = + clang::CreateASTDumper(output /*Dump to stdout.*/, filter_string, + /*DumpDecls=*/true, + /*Deserialize=*/false, + /*DumpLookups=*/false, + /*DumpDeclTypes=*/false, clang::ADOF_Default); + lldbassert(consumer); + consumer->HandleTranslationUnit(*m_ast_up); } void TypeSystemClang::DumpFromSymbolFile(Stream &s, @@ -9637,10 +9646,11 @@ GetNameForIsolatedASTKind(ScratchTypeSystemClang::IsolatedASTKind kind) { llvm_unreachable("Unimplemented IsolatedASTKind?"); } -void ScratchTypeSystemClang::Dump(llvm::raw_ostream &output) { +void ScratchTypeSystemClang::Dump(llvm::raw_ostream &output, + llvm::StringRef filter) { // First dump the main scratch AST. output << "State of scratch Clang type system:\n"; - TypeSystemClang::Dump(output); + TypeSystemClang::Dump(output, filter); // Now sort the isolated sub-ASTs. typedef std::pair<IsolatedASTKey, TypeSystem *> KeyAndTS; @@ -9655,7 +9665,7 @@ void ScratchTypeSystemClang::Dump(llvm::raw_ostream &output) { static_cast<ScratchTypeSystemClang::IsolatedASTKind>(a.first); output << "State of scratch Clang type subsystem " << GetNameForIsolatedASTKind(kind) << ":\n"; - a.second->Dump(output); + a.second->Dump(output, filter); } } diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index 285748719390c..bcad0559b8d34 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -1077,7 +1077,7 @@ class TypeSystemClang : public TypeSystem { #endif /// \see lldb_private::TypeSystem::Dump - void Dump(llvm::raw_ostream &output) override; + void Dump(llvm::raw_ostream &output, llvm::StringRef filter_string) override; /// Dump clang AST types from the symbol file. /// @@ -1321,7 +1321,7 @@ class ScratchTypeSystemClang : public TypeSystemClang { } /// \see lldb_private::TypeSystem::Dump - void Dump(llvm::raw_ostream &output) override; + void Dump(llvm::raw_ostream &output, llvm::StringRef filter) override; UserExpression *GetUserExpression(llvm::StringRef expr, llvm::StringRef prefix, diff --git a/lldb/source/Symbol/SymbolFileOnDemand.cpp b/lldb/source/Symbol/SymbolFileOnDemand.cpp index 94979b2fb1c22..807c2124e48d9 100644 --- a/lldb/source/Symbol/SymbolFileOnDemand.cpp +++ b/lldb/source/Symbol/SymbolFileOnDemand.cpp @@ -305,13 +305,14 @@ void SymbolFileOnDemand::Dump(lldb_private::Stream &s) { return m_sym_file_impl->Dump(s); } -void SymbolFileOnDemand::DumpClangAST(lldb_private::Stream &s) { +void SymbolFileOnDemand::DumpClangAST(lldb_private::Stream &s, + llvm::StringRef filter) { if (!m_debug_info_enabled) { LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__); return; } - return m_sym_file_impl->DumpClangAST(s); + return m_sym_file_impl->DumpClangAST(s, filter); } void SymbolFileOnDemand::FindGlobalVariables(const RegularExpression ®ex, >From 765545937f42b652c79c7782f5a3cc85814684fb Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 30 May 2025 20:28:57 +0100 Subject: [PATCH 3/5] fixup! cleanups --- lldb/include/lldb/Symbol/SymbolFile.h | 2 +- lldb/include/lldb/Symbol/TypeSystem.h | 7 +++++-- lldb/source/Commands/CommandObjectTarget.cpp | 5 +++-- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 4 ++-- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h | 2 +- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp | 6 +++--- lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h | 2 +- 7 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index 086bb7ffebbda..75c7f230ddf3d 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -296,7 +296,7 @@ class SymbolFile : public PluginInterface { lldb::SymbolContextItem resolve_scope, SymbolContextList &sc_list); - virtual void DumpClangAST(Stream &s, llvm::StringRef filter_string) {} + virtual void DumpClangAST(Stream &s, llvm::StringRef filter) {} virtual void FindGlobalVariables(ConstString name, const CompilerDeclContext &parent_decl_ctx, uint32_t max_matches, diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index 25be595db685e..cb1f0130b548d 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -443,8 +443,11 @@ class TypeSystem : public PluginInterface, /// given stream. /// /// This should not modify the state of the TypeSystem if possible. - virtual void Dump(llvm::raw_ostream &output, - llvm::StringRef filter_string) = 0; + /// + /// \param[out] output Stream to dup the AST into. + /// \param[in] filter If empty, dump whole AST. If non-empty, will only + /// dump decls whose names contain \c filter. + virtual void Dump(llvm::raw_ostream &output, llvm::StringRef filter) = 0; /// This is used by swift. virtual bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) = 0; diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index 256d3b576324b..21b21954bbc90 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -2237,11 +2237,12 @@ class CommandObjectTargetModulesDumpClangAST "Dump the clang ast for a given module's symbol file.", "target modules dump ast [--filter <name>] [<file1> ...]", eCommandRequiresTarget), - m_filter(LLDB_OPT_SET_1, false, "filter", 'f', 0, eArgTypeName, "TODO", + m_filter(LLDB_OPT_SET_1, false, "filter", 'f', 0, eArgTypeName, + "Dump only the decls whose names contain the specified filter " + "string.", /*default_value=*/"") { m_option_group.Append(&m_filter, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); m_option_group.Finalize(); - AddSimpleArgumentList(eArgTypeFilename, eArgRepeatStar); } Options *GetOptions() override { return &m_option_group; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 6b082a01a89d5..71f204c03a42a 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -4127,7 +4127,7 @@ void SymbolFileDWARF::Dump(lldb_private::Stream &s) { m_index->Dump(s); } -void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter_string) { +void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter) { auto ts_or_err = GetTypeSystemForLanguage(eLanguageTypeC_plus_plus); if (!ts_or_err) return; @@ -4135,7 +4135,7 @@ void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter_string) { TypeSystemClang *clang = llvm::dyn_cast_or_null<TypeSystemClang>(ts.get()); if (!clang) return; - clang->Dump(s.AsRawOstream(), filter_string); + clang->Dump(s.AsRawOstream(), filter); } bool SymbolFileDWARF::GetSeparateDebugInfo(StructuredData::Dictionary &d, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 5e2f9d9a5a85f..d2d30d7decb16 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -276,7 +276,7 @@ class SymbolFileDWARF : public SymbolFileCommon { void Dump(Stream &s) override; - void DumpClangAST(Stream &s, llvm::StringRef filter_string) override; + void DumpClangAST(Stream &s, llvm::StringRef filter) override; /// List separate dwo files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 5efafd4c9c3eb..cccf62f12576a 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -8512,15 +8512,15 @@ TypeSystemClang::dump(lldb::opaque_compiler_type_t type) const { } #endif -void TypeSystemClang::Dump(llvm::raw_ostream &output, - llvm::StringRef filter_string) { +void TypeSystemClang::Dump(llvm::raw_ostream &output, llvm::StringRef filter) { auto consumer = - clang::CreateASTDumper(output /*Dump to stdout.*/, filter_string, + clang::CreateASTDumper(output, filter, /*DumpDecls=*/true, /*Deserialize=*/false, /*DumpLookups=*/false, /*DumpDeclTypes=*/false, clang::ADOF_Default); lldbassert(consumer); + lldbassert(m_ast_up); consumer->HandleTranslationUnit(*m_ast_up); } diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index bcad0559b8d34..d5c8943c5a853 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -1077,7 +1077,7 @@ class TypeSystemClang : public TypeSystem { #endif /// \see lldb_private::TypeSystem::Dump - void Dump(llvm::raw_ostream &output, llvm::StringRef filter_string) override; + void Dump(llvm::raw_ostream &output, llvm::StringRef filter) override; /// Dump clang AST types from the symbol file. /// >From 9148a317370b4f44c3ecca958780598bee402626 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 30 May 2025 20:51:01 +0100 Subject: [PATCH 4/5] fixup! add test --- .../Commands/command-image-dump-ast.test | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 lldb/test/Shell/Commands/command-image-dump-ast.test diff --git a/lldb/test/Shell/Commands/command-image-dump-ast.test b/lldb/test/Shell/Commands/command-image-dump-ast.test new file mode 100644 index 0000000000000..2417a20ec0825 --- /dev/null +++ b/lldb/test/Shell/Commands/command-image-dump-ast.test @@ -0,0 +1,70 @@ +# Test the ${function.basename} frame-format variable. + +# RUN: split-file %s %t +# RUN: %clang_host -g -gdwarf %t/main.cpp -o %t.out +# RUN: %lldb -x -b -s %t/commands.input %t.out -o exit 2>&1 \ +# RUN: | FileCheck %s + +#--- main.cpp + +void A() {} +void A1() {} +void BA1() {} +void AB() {} + +int main() { + A(); + A1(); + BA1(); + AB(); +} + +#--- commands.input + +break set -n main +run +expr A(); A1(); BA1(); AB() + +image dump ast + +# CHECK: image dump ast +# CHECK-DAG: FunctionDecl {{.*}} main +# CHECK-DAG: FunctionDecl {{.*}} A +# CHECK-DAG: FunctionDecl {{.*}} A1 +# CHECK-DAG: FunctionDecl {{.*}} BA1 +# CHECK-DAG: FunctionDecl {{.*}} AB + +image dump ast --filter A + +# CHECK: image dump ast --filter A +# CHECK: Dumping A +# CHECK-NOT: FunctionDecl {{.*}} main +# CHECK-DAG: FunctionDecl {{.*}} A1 +# CHECK-DAG: FunctionDecl {{.*}} BA1 +# CHECK-DAG: FunctionDecl {{.*}} AB + +image dump ast --filter A1 + +# CHECK: image dump ast --filter A1 +# CHECK: Dumping A +# CHECK-NOT: FunctionDecl {{.*}} main +# CHECK-NOT: FunctionDecl {{.*}} AB +# CHECK-DAG: FunctionDecl {{.*}} A1 +# CHECK-DAG: FunctionDecl {{.*}} BA1 + +image dump ast --filter "" + +# CHECK: image dump ast --filter "" +# CHECK-DAG: FunctionDecl {{.*}} main +# CHECK-DAG: FunctionDecl {{.*}} AB +# CHECK-DAG: FunctionDecl {{.*}} A1 +# CHECK-DAG: FunctionDecl {{.*}} BA1 + +image dump ast -f AB + +# CHECK: image dump ast -f AB +# CHECK: Dumping AB +# CHECK-NOT: FunctionDecl {{.*}} main +# CHECK-NOT: FunctionDecl {{.*}} A1 +# CHECK-NOT: FunctionDecl {{.*}} BA1 +# CHECK: FunctionDecl {{.*}} AB >From 586555bf0199c2b33057d3a8ecd24b8efe6e8298 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Fri, 30 May 2025 20:51:35 +0100 Subject: [PATCH 5/5] fixup! fix test comment --- lldb/test/Shell/Commands/command-image-dump-ast.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/test/Shell/Commands/command-image-dump-ast.test b/lldb/test/Shell/Commands/command-image-dump-ast.test index 2417a20ec0825..ca57570ab7224 100644 --- a/lldb/test/Shell/Commands/command-image-dump-ast.test +++ b/lldb/test/Shell/Commands/command-image-dump-ast.test @@ -1,4 +1,4 @@ -# Test the ${function.basename} frame-format variable. +# Test `image dump ast` command. # RUN: split-file %s %t # RUN: %clang_host -g -gdwarf %t/main.cpp -o %t.out _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits