https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/86159
>From e028a31433ef1dced308f485851b0eb3d43ff54c Mon Sep 17 00:00:00 2001 From: Michael Buch <[email protected]> Date: Thu, 21 Mar 2024 17:45:23 +0000 Subject: [PATCH 1/3] [lldb][TypeSystem] Enable colored AST dump This patch sets the necessary `ASTContext` flag to ensure that the various ASTs (i.e., symbolfile-backed ASTs, scratch AST and the expression AST) in LLDB are dumped using syntax highlighting (i.e., whenever a user runs `target modules dump ast` or calls the `dump() on a `clang::Decl`). Decided to not put this behind a setting because the diagnostics object persists on some AST and gets re-used, so the setting wouldn't consistenly turn off syntax highlighting (unless we made the setter fetch all live ASTs and turn the highlighting off). --- .../Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp | 3 +++ lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp index 097a4661e0c96..9dda3328b5d0c 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -732,6 +732,9 @@ ClangExpressionParser::ClangExpressionParser( // A value of 0 means no limit for both LLDB and Clang. m_compiler->getDiagnostics().setErrorLimit(target_sp->GetExprErrorLimit()); + // AST nodes will be dumped with color + m_compiler->getDiagnostics().setShowColors(true); + if (auto *target_info = TargetInfo::CreateTargetInfo( m_compiler->getDiagnostics(), m_compiler->getInvocation().getTargetOpts())) { diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 39aacdb58e694..32da5659d2295 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -679,6 +679,9 @@ void TypeSystemClang::CreateASTContext() { m_diagnostic_consumer_up = std::make_unique<NullDiagnosticConsumer>(); m_ast_up->getDiagnostics().setClient(m_diagnostic_consumer_up.get(), false); + // AST nodes will be dumped with color + m_ast_up->getDiagnostics().setShowColors(true); + // This can be NULL if we don't know anything about the architecture or if // the target for an architecture isn't enabled in the llvm/clang that we // built >From 48bcd3b1b82c85c60a4e7cdde7609653583d2fe5 Mon Sep 17 00:00:00 2001 From: Michael Buch <[email protected]> Date: Sat, 13 Sep 2025 14:37:18 +0100 Subject: [PATCH 2/3] fixup! pass GetUseColor to SymbolFile::Dump --- lldb/include/lldb/Symbol/SymbolFile.h | 3 +- lldb/include/lldb/Symbol/SymbolFileOnDemand.h | 3 +- lldb/include/lldb/Symbol/TypeSystem.h | 4 ++- lldb/source/Commands/CommandObjectTarget.cpp | 9 ++++-- .../Clang/ClangExpressionParser.cpp | 3 -- .../SymbolFile/DWARF/SymbolFileDWARF.cpp | 5 ++-- .../SymbolFile/DWARF/SymbolFileDWARF.h | 3 +- .../DWARF/SymbolFileDWARFDebugMap.cpp | 5 ++-- .../DWARF/SymbolFileDWARFDebugMap.h | 3 +- .../SymbolFile/NativePDB/PdbAstBuilder.cpp | 5 ++-- .../SymbolFile/NativePDB/PdbAstBuilder.h | 2 +- .../NativePDB/SymbolFileNativePDB.cpp | 5 ++-- .../NativePDB/SymbolFileNativePDB.h | 3 +- .../Plugins/SymbolFile/PDB/SymbolFilePDB.cpp | 5 ++-- .../Plugins/SymbolFile/PDB/SymbolFilePDB.h | 3 +- .../TypeSystem/Clang/TypeSystemClang.cpp | 29 ++++++++++++++----- .../TypeSystem/Clang/TypeSystemClang.h | 6 ++-- lldb/source/Symbol/SymbolFileOnDemand.cpp | 4 +-- 18 files changed, 65 insertions(+), 35 deletions(-) diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index ff67e002e5b02..3b4d7bc01d132 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -297,7 +297,8 @@ class SymbolFile : public PluginInterface { lldb::SymbolContextItem resolve_scope, SymbolContextList &sc_list); - virtual void DumpClangAST(Stream &s, llvm::StringRef filter) {} + virtual void DumpClangAST(Stream &s, llvm::StringRef filter, + bool show_colors) {} 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 6e3c2477d1769..b376de73419d4 100644 --- a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -127,7 +127,8 @@ 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, llvm::StringRef filter) override; + void DumpClangAST(lldb_private::Stream &s, llvm::StringRef filter, + bool show_color) override; void FindGlobalVariables(lldb_private::ConstString name, diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index 16a2e0b5a52fb..0ec3a28898329 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -448,7 +448,9 @@ class TypeSystem : public PluginInterface, /// \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; + /// \param[in] show_color If true, prints the AST color-highlighted. + virtual void Dump(llvm::raw_ostream &output, llvm::StringRef filter, + bool show_color) = 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 004542e3e6aed..0f96fa92a731d 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -2275,7 +2275,8 @@ class CommandObjectTargetModulesDumpClangAST if (INTERRUPT_REQUESTED(GetDebugger(), "Interrupted dumping clang ast")) break; if (SymbolFile *sf = module_sp->GetSymbolFile()) - sf->DumpClangAST(result.GetOutputStream(), filter); + sf->DumpClangAST(result.GetOutputStream(), filter, + GetCommandInterpreter().GetDebugger().GetUseColor()); } result.SetStatus(eReturnStatusSuccessFinishResult); return; @@ -2304,7 +2305,8 @@ class CommandObjectTargetModulesDumpClangAST Module *m = module_list.GetModulePointerAtIndex(i); if (SymbolFile *sf = m->GetSymbolFile()) - sf->DumpClangAST(result.GetOutputStream(), filter); + sf->DumpClangAST(result.GetOutputStream(), filter, + GetCommandInterpreter().GetDebugger().GetUseColor()); } } result.SetStatus(eReturnStatusSuccessFinishResult); @@ -5294,7 +5296,8 @@ 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(), "", + GetCommandInterpreter().GetDebugger().GetUseColor()); result.SetStatus(eReturnStatusSuccessFinishResult); } diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp index 9dda3328b5d0c..097a4661e0c96 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -732,9 +732,6 @@ ClangExpressionParser::ClangExpressionParser( // A value of 0 means no limit for both LLDB and Clang. m_compiler->getDiagnostics().setErrorLimit(target_sp->GetExprErrorLimit()); - // AST nodes will be dumped with color - m_compiler->getDiagnostics().setShowColors(true); - if (auto *target_info = TargetInfo::CreateTargetInfo( m_compiler->getDiagnostics(), m_compiler->getInvocation().getTargetOpts())) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index d3d0110d5e302..5801fa97bf753 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -4325,7 +4325,8 @@ void SymbolFileDWARF::Dump(lldb_private::Stream &s) { m_index->Dump(s); } -void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter) { +void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter, + bool show_color) { auto ts_or_err = GetTypeSystemForLanguage(eLanguageTypeC_plus_plus); if (!ts_or_err) return; @@ -4333,7 +4334,7 @@ void SymbolFileDWARF::DumpClangAST(Stream &s, llvm::StringRef filter) { TypeSystemClang *clang = llvm::dyn_cast_or_null<TypeSystemClang>(ts.get()); if (!clang) return; - clang->Dump(s.AsRawOstream(), filter); + clang->Dump(s.AsRawOstream(), filter, show_color); } 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 85306d8b4fb5f..a60527b8eda33 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -277,7 +277,8 @@ class SymbolFileDWARF : public SymbolFileCommon { void Dump(Stream &s) override; - void DumpClangAST(Stream &s, llvm::StringRef filter) override; + void DumpClangAST(Stream &s, llvm::StringRef filter, + bool show_colors) override; /// List separate dwo files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index 8b8229a7020c5..a44bf82d3b705 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1267,9 +1267,10 @@ CompilerDeclContext SymbolFileDWARFDebugMap::FindNamespace( return matching_namespace; } -void SymbolFileDWARFDebugMap::DumpClangAST(Stream &s, llvm::StringRef filter) { +void SymbolFileDWARFDebugMap::DumpClangAST(Stream &s, llvm::StringRef filter, + bool show_color) { ForEachSymbolFile("Dumping clang AST", [&](SymbolFileDWARF &oso_dwarf) { - oso_dwarf.DumpClangAST(s, filter); + oso_dwarf.DumpClangAST(s, filter, show_color); // 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 bce1ed2671af0..74b97f610f29c 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -129,7 +129,8 @@ class SymbolFileDWARFDebugMap : public SymbolFileCommon { std::vector<std::unique_ptr<CallEdge>> ParseCallEdgesInFunction(UserID func_id) override; - void DumpClangAST(Stream &s, llvm::StringRef filter) override; + void DumpClangAST(Stream &s, llvm::StringRef filter, + bool show_color) override; /// List separate oso files. bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp index 933c4361d93da..51bdcc92b05a8 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp @@ -1454,8 +1454,9 @@ PdbAstBuilder::FromCompilerDeclContext(CompilerDeclContext context) { return static_cast<clang::DeclContext *>(context.GetOpaqueDeclContext()); } -void PdbAstBuilder::Dump(Stream &stream, llvm::StringRef filter) { - m_clang.Dump(stream.AsRawOstream(), filter); +void PdbAstBuilder::Dump(Stream &stream, llvm::StringRef filter, + bool show_color) { + m_clang.Dump(stream.AsRawOstream(), filter, show_color); } clang::NamespaceDecl * diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h index fef65227bc8f5..16247fcf88b12 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, llvm::StringRef filter); + void Dump(Stream &stream, llvm::StringRef filter, bool show_color); clang::NamespaceDecl *FindNamespaceDecl(const clang::DeclContext *parent, llvm::StringRef name); diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index cfecda4817976..b866e473853f3 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1683,7 +1683,8 @@ size_t SymbolFileNativePDB::ParseSymbolArrayInScope( return count; } -void SymbolFileNativePDB::DumpClangAST(Stream &s, llvm::StringRef filter) { +void SymbolFileNativePDB::DumpClangAST(Stream &s, llvm::StringRef filter, + bool show_color) { auto ts_or_err = GetTypeSystemForLanguage(eLanguageTypeC_plus_plus); if (!ts_or_err) return; @@ -1691,7 +1692,7 @@ void SymbolFileNativePDB::DumpClangAST(Stream &s, llvm::StringRef filter) { TypeSystemClang *clang = llvm::dyn_cast_or_null<TypeSystemClang>(ts.get()); if (!clang) return; - clang->GetNativePDBParser()->Dump(s, filter); + clang->GetNativePDBParser()->Dump(s, filter, show_color); } void SymbolFileNativePDB::CacheGlobalBaseNames() { diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h index 095b40c72c52a..2405f8b299339 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -157,7 +157,8 @@ class SymbolFileNativePDB : public SymbolFileCommon { PdbIndex &GetIndex() { return *m_index; }; - void DumpClangAST(Stream &s, llvm::StringRef filter) override; + void DumpClangAST(Stream &s, llvm::StringRef filter, + bool show_color) 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 2f0b6539445fb..0e2ca1784e7e9 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1515,7 +1515,8 @@ void SymbolFilePDB::AddSymbols(lldb_private::Symtab &symtab) { symtab.Finalize(); } -void SymbolFilePDB::DumpClangAST(Stream &s, llvm::StringRef filter) { +void SymbolFilePDB::DumpClangAST(Stream &s, llvm::StringRef filter, + bool show_color) { auto type_system_or_err = GetTypeSystemForLanguage(lldb::eLanguageTypeC_plus_plus); if (auto err = type_system_or_err.takeError()) { @@ -1529,7 +1530,7 @@ void SymbolFilePDB::DumpClangAST(Stream &s, llvm::StringRef filter) { llvm::dyn_cast_or_null<TypeSystemClang>(ts.get()); if (!clang_type_system) return; - clang_type_system->Dump(s.AsRawOstream(), filter); + clang_type_system->Dump(s.AsRawOstream(), filter, show_color); } void SymbolFilePDB::FindTypesByRegex( diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h index e6560813ce75e..ccbf02db1159f 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -159,7 +159,8 @@ class SymbolFilePDB : public lldb_private::SymbolFileCommon { const llvm::pdb::IPDBSession &GetPDBSession() const; - void DumpClangAST(lldb_private::Stream &s, llvm::StringRef filter) override; + void DumpClangAST(lldb_private::Stream &s, llvm::StringRef filter, + bool show_color) override; private: struct SecContribInfo { diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 32da5659d2295..13d03f0d08ec3 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -11,6 +11,7 @@ #include "clang/AST/DeclBase.h" #include "clang/AST/ExprCXX.h" #include "clang/Frontend/ASTConsumers.h" +#include "llvm/ADT/ScopeExit.h" #include "llvm/Support/Casting.h" #include "llvm/Support/FormatAdapters.h" #include "llvm/Support/FormatVariadic.h" @@ -679,9 +680,6 @@ void TypeSystemClang::CreateASTContext() { m_diagnostic_consumer_up = std::make_unique<NullDiagnosticConsumer>(); m_ast_up->getDiagnostics().setClient(m_diagnostic_consumer_up.get(), false); - // AST nodes will be dumped with color - m_ast_up->getDiagnostics().setShowColors(true); - // This can be NULL if we don't know anything about the architecture or if // the target for an architecture isn't enabled in the llvm/clang that we // built @@ -8543,7 +8541,24 @@ TypeSystemClang::dump(lldb::opaque_compiler_type_t type) const { } #endif -void TypeSystemClang::Dump(llvm::raw_ostream &output, llvm::StringRef filter) { +namespace { +struct ScopedASTColor { + ScopedASTColor(clang::ASTContext &ast, bool show_colors) + : ast(ast), old_show_colors(ast.getDiagnostics().getShowColors()) { + ast.getDiagnostics().setShowColors(show_colors); + } + + ~ScopedASTColor() { ast.getDiagnostics().setShowColors(old_show_colors); } + + clang::ASTContext * + bool old_show_colors; +}; +} // namespace + +void TypeSystemClang::Dump(llvm::raw_ostream &output, llvm::StringRef filter, + bool show_color) { + ScopedASTColor colored(getASTContext(), show_color); + auto consumer = clang::CreateASTDumper(output, filter, /*DumpDecls=*/true, @@ -9686,10 +9701,10 @@ GetNameForIsolatedASTKind(ScratchTypeSystemClang::IsolatedASTKind kind) { } void ScratchTypeSystemClang::Dump(llvm::raw_ostream &output, - llvm::StringRef filter) { + llvm::StringRef filter, bool show_color) { // First dump the main scratch AST. output << "State of scratch Clang type system:\n"; - TypeSystemClang::Dump(output, filter); + TypeSystemClang::Dump(output, filter, show_color); // Now sort the isolated sub-ASTs. typedef std::pair<IsolatedASTKey, TypeSystem *> KeyAndTS; @@ -9704,7 +9719,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, filter); + a.second->Dump(output, filter, show_color); } } diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index 709f89590ba3b..9e0a54209345d 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -1074,7 +1074,8 @@ class TypeSystemClang : public TypeSystem { #endif /// \see lldb_private::TypeSystem::Dump - void Dump(llvm::raw_ostream &output, llvm::StringRef filter) override; + void Dump(llvm::raw_ostream &output, llvm::StringRef filter, + bool show_color) override; /// Dump clang AST types from the symbol file. /// @@ -1318,7 +1319,8 @@ class ScratchTypeSystemClang : public TypeSystemClang { } /// \see lldb_private::TypeSystem::Dump - void Dump(llvm::raw_ostream &output, llvm::StringRef filter) override; + void Dump(llvm::raw_ostream &output, llvm::StringRef filter, + bool show_color) override; UserExpression *GetUserExpression(llvm::StringRef expr, llvm::StringRef prefix, diff --git a/lldb/source/Symbol/SymbolFileOnDemand.cpp b/lldb/source/Symbol/SymbolFileOnDemand.cpp index 807c2124e48d9..9fc13c5989fc2 100644 --- a/lldb/source/Symbol/SymbolFileOnDemand.cpp +++ b/lldb/source/Symbol/SymbolFileOnDemand.cpp @@ -306,13 +306,13 @@ void SymbolFileOnDemand::Dump(lldb_private::Stream &s) { } void SymbolFileOnDemand::DumpClangAST(lldb_private::Stream &s, - llvm::StringRef filter) { + llvm::StringRef filter, bool show_color) { if (!m_debug_info_enabled) { LLDB_LOG(GetLog(), "[{0}] {1} is skipped", GetSymbolFileName(), __FUNCTION__); return; } - return m_sym_file_impl->DumpClangAST(s, filter); + return m_sym_file_impl->DumpClangAST(s, filter, show_color); } void SymbolFileOnDemand::FindGlobalVariables(const RegularExpression ®ex, >From 2b4d973c7908e317ffc792096ec164674cbb26ac Mon Sep 17 00:00:00 2001 From: Michael Buch <[email protected]> Date: Sat, 13 Sep 2025 15:16:38 +0100 Subject: [PATCH 3/3] fixup! add test --- .../TypeSystem/Clang/TypeSystemClang.cpp | 2 +- .../command-image-dump-ast-colored.test | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 lldb/test/Shell/Commands/command-image-dump-ast-colored.test diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 13d03f0d08ec3..406ac07092ce1 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -8551,7 +8551,7 @@ struct ScopedASTColor { ~ScopedASTColor() { ast.getDiagnostics().setShowColors(old_show_colors); } clang::ASTContext * - bool old_show_colors; + const bool old_show_colors; }; } // namespace diff --git a/lldb/test/Shell/Commands/command-image-dump-ast-colored.test b/lldb/test/Shell/Commands/command-image-dump-ast-colored.test new file mode 100644 index 0000000000000..355ef6bb1d199 --- /dev/null +++ b/lldb/test/Shell/Commands/command-image-dump-ast-colored.test @@ -0,0 +1,34 @@ +# Test AST dumping with and without color. + +# 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 + +int main() {} + +#--- commands.input + +settings set use-color true + +target modules dump ast + +# CHECK: target modules dump ast +# CHECK: TranslationUnitDecl +# CHECK-SAME: + +target dump typesystem + +# CHECK: target dump typesystem +# CHECK: TranslationUnitDecl +# CHECK-SAME: + +settings set use-color false + +target modules dump ast +target dump typesystem + +# CHECK: settings set use-color false +# CHECK-NOT: _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
