https://github.com/charles-zablit created https://github.com/llvm/llvm-project/pull/229786
<sub>Stack created with <a href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub> >From 02bb8214979747aee1408f6e0fb5ded3dd92d065 Mon Sep 17 00:00:00 2001 From: Charles Zablit <[email protected]> Date: Wed, 7 Oct 2026 15:26:35 +0100 Subject: [PATCH] [lldb] Register 'target modules dump pcm-info' from TypeSystemClang --- lldb/include/lldb/Core/PluginManager.h | 10 ++- lldb/source/Commands/CMakeLists.txt | 3 - lldb/source/Commands/CommandObjectTarget.cpp | 63 --------------- lldb/source/Core/PluginManager.cpp | 13 +-- .../Plugins/TypeSystem/Clang/CMakeLists.txt | 2 + .../TypeSystem/Clang/TypeSystemClang.cpp | 79 +++++++++++++++++++ .../TypeSystem/Clang/TypeSystemClang.h | 2 + 7 files changed, 97 insertions(+), 75 deletions(-) diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h index 8636a40d00b13..94d90db2854ba 100644 --- a/lldb/include/lldb/Core/PluginManager.h +++ b/lldb/include/lldb/Core/PluginManager.h @@ -650,10 +650,12 @@ class PluginManager { GetInstrumentationRuntimeCallbacks(bool enabled_only = true); // TypeSystem - static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, - TypeSystemCreateInstance create_callback, - LanguageSet supported_languages_for_types, - LanguageSet supported_languages_for_expressions); + static bool + RegisterPlugin(llvm::StringRef name, llvm::StringRef description, + TypeSystemCreateInstance create_callback, + LanguageSet supported_languages_for_types, + LanguageSet supported_languages_for_expressions, + DebuggerInitializeCallback debugger_init_callback = nullptr); static bool UnregisterPlugin(TypeSystemCreateInstance create_callback); diff --git a/lldb/source/Commands/CMakeLists.txt b/lldb/source/Commands/CMakeLists.txt index f2e62243e999e..69e4c45f0b8e5 100644 --- a/lldb/source/Commands/CMakeLists.txt +++ b/lldb/source/Commands/CMakeLists.txt @@ -58,9 +58,6 @@ add_lldb_library(lldbCommands NO_PLUGIN_DEPENDENCIES lldbUtility lldbValueObject lldbVersion - CLANG_LIBS - clangFrontend - clangSerialization ) add_dependencies(lldbCommands LLDBOptionsGen) diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index bce95fb872c9d..a3db3c1c8ddb7 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -61,17 +61,11 @@ #include "lldb/lldb-forward.h" #include "lldb/lldb-private-enumerations.h" -#include "clang/Driver/CreateInvocationFromArgs.h" -#include "clang/Frontend/CompilerInstance.h" -#include "clang/Frontend/CompilerInvocation.h" -#include "clang/Frontend/FrontendActions.h" -#include "clang/Serialization/ObjectFilePCHContainerReader.h" #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/FormatAdapters.h" - using namespace lldb; using namespace lldb_private; @@ -2181,59 +2175,6 @@ class CommandObjectTargetModulesDumpSections } }; -class CommandObjectTargetModulesDumpClangPCMInfo : public CommandObjectParsed { -public: - CommandObjectTargetModulesDumpClangPCMInfo(CommandInterpreter &interpreter) - : CommandObjectParsed( - interpreter, "target modules dump pcm-info", - "Dump information about the given clang module (pcm).") { - // Take a single file argument. - AddSimpleArgumentList(eArgTypeFilename); - } - - ~CommandObjectTargetModulesDumpClangPCMInfo() override = default; - -protected: - void DoExecute(Args &command, CommandReturnObject &result) override { - if (command.GetArgumentCount() != 1) { - result.AppendErrorWithFormat("'%s' takes exactly one pcm path argument", - m_cmd_name.c_str()); - return; - } - - const char *pcm_path = command.GetArgumentAtIndex(0); - const FileSpec pcm_file{pcm_path}; - - if (pcm_file.GetFileNameExtension() != ".pcm") { - result.AppendError("file must have a .pcm extension"); - return; - } - - if (!FileSystem::Instance().Exists(pcm_file)) { - result.AppendError("pcm file does not exist"); - return; - } - - const char *clang_args[] = {"clang", pcm_path}; - clang::CompilerInstance compiler(clang::createInvocation(clang_args)); - compiler.setVirtualFileSystem( - FileSystem::Instance().GetVirtualFileSystem()); - compiler.createDiagnostics(); - - // Pass empty deleter to not attempt to free memory that was allocated - // outside of the current scope, possibly statically. - std::shared_ptr<llvm::raw_ostream> Out( - &result.GetOutputStream().AsRawOstream(), [](llvm::raw_ostream *) {}); - clang::DumpModuleInfoAction dump_module_info(Out); - // DumpModuleInfoAction requires ObjectFilePCHContainerReader. - compiler.getPCHContainerOperations()->registerReader( - std::make_unique<clang::ObjectFilePCHContainerReader>()); - - if (compiler.ExecuteAction(dump_module_info)) - result.SetStatus(eReturnStatusSuccessFinishResult); - } -}; - #pragma mark CommandObjectTargetModulesDumpClangAST // Clang AST dumping command @@ -2711,10 +2652,6 @@ class CommandObjectTargetModulesDump : public CommandObjectMultiword { LoadSubCommand("line-table", CommandObjectSP(new CommandObjectTargetModulesDumpLineTable( interpreter))); - LoadSubCommand( - "pcm-info", - CommandObjectSP( - new CommandObjectTargetModulesDumpClangPCMInfo(interpreter))); LoadSubCommand("separate-debug-info", CommandObjectSP( new CommandObjectTargetModulesDumpSeparateDebugInfoFiles( diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index 6efe865d21760..303f4701246c9 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -2001,9 +2001,10 @@ struct TypeSystemInstance : public PluginInstance<TypeSystemCreateInstance> { TypeSystemInstance(llvm::StringRef name, llvm::StringRef description, CallbackType create_callback, LanguageSet supported_languages_for_types, - LanguageSet supported_languages_for_expressions) - : PluginInstance<TypeSystemCreateInstance>(name, description, - create_callback), + LanguageSet supported_languages_for_expressions, + DebuggerInitializeCallback debugger_init_callback) + : PluginInstance<TypeSystemCreateInstance>( + name, description, create_callback, debugger_init_callback), supported_languages_for_types(supported_languages_for_types), supported_languages_for_expressions( supported_languages_for_expressions) {} @@ -2023,10 +2024,11 @@ bool PluginManager::RegisterPlugin( llvm::StringRef name, llvm::StringRef description, TypeSystemCreateInstance create_callback, LanguageSet supported_languages_for_types, - LanguageSet supported_languages_for_expressions) { + LanguageSet supported_languages_for_expressions, + DebuggerInitializeCallback debugger_init_callback) { return GetTypeSystemInstances().RegisterPlugin( name, description, create_callback, supported_languages_for_types, - supported_languages_for_expressions); + supported_languages_for_expressions, debugger_init_callback); } bool PluginManager::UnregisterPlugin(TypeSystemCreateInstance create_callback) { @@ -2245,6 +2247,7 @@ void PluginManager::DebuggerInitialize(Debugger &debugger) { GetStructuredDataPluginInstances().PerformDebuggerCallback(debugger); GetTracePluginInstances().PerformDebuggerCallback(debugger); GetScriptedInterfaceInstances().PerformDebuggerCallback(debugger); + GetTypeSystemInstances().PerformDebuggerCallback(debugger); GetLanguageInstances().PerformDebuggerCallback(debugger); } diff --git a/lldb/source/Plugins/TypeSystem/Clang/CMakeLists.txt b/lldb/source/Plugins/TypeSystem/Clang/CMakeLists.txt index a316761dea950..72b3ab7558585 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/CMakeLists.txt +++ b/lldb/source/Plugins/TypeSystem/Clang/CMakeLists.txt @@ -5,6 +5,7 @@ add_lldb_library(lldbPluginTypeSystemClang PLUGIN Support LINK_LIBS lldbCore + lldbInterpreter lldbSymbol lldbTarget lldbUtility @@ -18,4 +19,5 @@ add_lldb_library(lldbPluginTypeSystemClang PLUGIN clangDriver clangFrontend clangSema + clangSerialization ) diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 0761a39f7f7d5..784822385899c 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -42,11 +42,16 @@ #include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetOptions.h" #include "clang/Driver/Driver.h" +#include "clang/Driver/CreateInvocationFromArgs.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/Frontend/CompilerInvocation.h" +#include "clang/Frontend/FrontendActions.h" #include "clang/Frontend/FrontendOptions.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/HeaderSearchOptions.h" #include "clang/Lex/ModuleMap.h" #include "clang/Sema/Sema.h" +#include "clang/Serialization/ObjectFilePCHContainerReader.h" #include "llvm/Support/Signals.h" #include "llvm/Support/Threading.h" @@ -66,7 +71,11 @@ #include "lldb/Core/PluginManager.h" #include "lldb/Core/UniqueCStringMap.h" #include "lldb/Expression/Expression.h" +#include "lldb/Host/FileSystem.h" #include "lldb/Host/StreamFile.h" +#include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/CommandObject.h" +#include "lldb/Interpreter/CommandReturnObject.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Symbol/SymbolFile.h" #include "lldb/Target/ExecutionContext.h" @@ -586,21 +595,91 @@ LanguageSet TypeSystemClang::GetSupportedLanguagesForExpressions() { return languages; } +namespace { +class CommandObjectTargetModulesDumpClangPCMInfo : public CommandObjectParsed { +public: + CommandObjectTargetModulesDumpClangPCMInfo(CommandInterpreter &interpreter) + : CommandObjectParsed( + interpreter, "target modules dump pcm-info", + "Dump information about the given clang module (pcm).") { + // Take a single file argument. + AddSimpleArgumentList(eArgTypeFilename); + } + + ~CommandObjectTargetModulesDumpClangPCMInfo() override = default; + +protected: + void DoExecute(Args &command, CommandReturnObject &result) override { + if (command.GetArgumentCount() != 1) { + result.AppendErrorWithFormat("'%s' takes exactly one pcm path argument", + m_cmd_name.c_str()); + return; + } + + const char *pcm_path = command.GetArgumentAtIndex(0); + const FileSpec pcm_file{pcm_path}; + + if (pcm_file.GetFileNameExtension() != ".pcm") { + result.AppendError("file must have a .pcm extension"); + return; + } + + if (!FileSystem::Instance().Exists(pcm_file)) { + result.AppendError("pcm file does not exist"); + return; + } + + const char *clang_args[] = {"clang", pcm_path}; + clang::CompilerInstance compiler(clang::createInvocation(clang_args)); + compiler.setVirtualFileSystem( + FileSystem::Instance().GetVirtualFileSystem()); + compiler.createDiagnostics(); + + // Pass empty deleter to not attempt to free memory that was allocated + // outside of the current scope, possibly statically. + std::shared_ptr<llvm::raw_ostream> Out( + &result.GetOutputStream().AsRawOstream(), [](llvm::raw_ostream *) {}); + clang::DumpModuleInfoAction dump_module_info(Out); + // DumpModuleInfoAction requires ObjectFilePCHContainerReader. + compiler.getPCHContainerOperations()->registerReader( + std::make_unique<clang::ObjectFilePCHContainerReader>()); + + if (compiler.ExecuteAction(dump_module_info)) + result.SetStatus(eReturnStatusSuccessFinishResult); + } +}; +} // namespace + void TypeSystemClang::Initialize() { PluginManager::RegisterPlugin( GetPluginNameStatic(), "clang base AST context plug-in", CreateInstance, +<<<<<<< HEAD GetSupportedLanguagesForTypes(), GetSupportedLanguagesForExpressions()); llvm::SmallString<128> path; if (clang::driver::Driver::getDefaultModuleCachePath(path)) ModuleList::GetGlobalModuleListProperties().SetClangModulesCachePath( FileSpec(path)); +======= + GetSupportedLanguagesForTypes(), GetSupportedLanguagesForExpressions(), + DebuggerInitialize); +>>>>>>> 986dc7988816 ([lldb] Register 'target modules dump pcm-info' from TypeSystemClang) } void TypeSystemClang::Terminate() { PluginManager::UnregisterPlugin(CreateInstance); } +void TypeSystemClang::DebuggerInitialize(Debugger &debugger) { + CommandInterpreter &interpreter = debugger.GetCommandInterpreter(); + llvm::StringRef parent = "target modules dump"; + if (CommandObject *dump = interpreter.GetCommandObjectForCommand(parent)) + dump->LoadSubCommand( + "pcm-info", + std::make_shared<CommandObjectTargetModulesDumpClangPCMInfo>( + interpreter)); +} + void TypeSystemClang::Finalize() { assert(m_ast_up); GetASTMap().Erase(m_ast_up.get()); diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index 28e79f2b0b11f..ef6d5a9c595b9 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -163,6 +163,8 @@ class TypeSystemClang : public TypeSystem { static void Terminate(); + static void DebuggerInitialize(Debugger &debugger); + static TypeSystemClang *GetASTContext(clang::ASTContext *ast_ctx); /// Returns the display name of this TypeSystemClang that indicates what _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
