https://github.com/labath updated https://github.com/llvm/llvm-project/pull/144543
>From d33eec81bf9895857e752d3a7e6708aaebaccea0 Mon Sep 17 00:00:00 2001 From: Pavel Labath <pa...@labath.sk> Date: Tue, 17 Jun 2025 16:54:53 +0200 Subject: [PATCH 1/2] [lldb/cmake] Plugin layering enforcement mechanism --- lldb/CMakeLists.txt | 3 + lldb/cmake/modules/LLDBLayeringCheck.cmake | 68 +++++++++++++++++++ lldb/source/Plugins/ABI/CMakeLists.txt | 6 ++ .../Plugins/Architecture/CMakeLists.txt | 2 + .../Plugins/Disassembler/CMakeLists.txt | 2 + .../Plugins/DynamicLoader/CMakeLists.txt | 7 ++ .../Plugins/ExpressionParser/CMakeLists.txt | 2 + .../source/Plugins/Instruction/CMakeLists.txt | 2 + .../InstrumentationRuntime/CMakeLists.txt | 2 + lldb/source/Plugins/JITLoader/CMakeLists.txt | 3 + lldb/source/Plugins/Language/CMakeLists.txt | 6 ++ .../Plugins/LanguageRuntime/CMakeLists.txt | 3 + .../Plugins/MemoryHistory/CMakeLists.txt | 2 + .../Plugins/ObjectContainer/CMakeLists.txt | 2 + lldb/source/Plugins/ObjectFile/CMakeLists.txt | 2 + .../Plugins/OperatingSystem/CMakeLists.txt | 2 + lldb/source/Plugins/Platform/CMakeLists.txt | 7 ++ lldb/source/Plugins/Process/CMakeLists.txt | 5 ++ .../Plugins/Process/Utility/CMakeLists.txt | 3 + lldb/source/Plugins/REPL/CMakeLists.txt | 3 + .../RegisterTypeBuilder/CMakeLists.txt | 2 + .../Plugins/ScriptInterpreter/CMakeLists.txt | 2 + .../Plugins/StructuredData/CMakeLists.txt | 2 + lldb/source/Plugins/SymbolFile/CMakeLists.txt | 7 ++ .../Plugins/SymbolLocator/CMakeLists.txt | 2 + .../Plugins/SymbolVendor/CMakeLists.txt | 3 + .../Plugins/SystemRuntime/CMakeLists.txt | 3 + lldb/source/Plugins/Trace/CMakeLists.txt | 2 + .../Plugins/TraceExporter/CMakeLists.txt | 2 + lldb/source/Plugins/TypeSystem/CMakeLists.txt | 4 ++ .../Plugins/UnwindAssembly/CMakeLists.txt | 2 + 31 files changed, 163 insertions(+) create mode 100644 lldb/cmake/modules/LLDBLayeringCheck.cmake diff --git a/lldb/CMakeLists.txt b/lldb/CMakeLists.txt index 2aaf75dd87bc3..e3b72e94d4beb 100644 --- a/lldb/CMakeLists.txt +++ b/lldb/CMakeLists.txt @@ -37,6 +37,7 @@ endif() include(LLDBConfig) include(AddLLDB) +include(LLDBLayeringCheck) set(LLDB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include) @@ -127,6 +128,8 @@ add_subdirectory(source) add_subdirectory(tools) add_subdirectory(docs) +check_lldb_plugin_layering() + if (LLDB_ENABLE_PYTHON) if(LLDB_BUILD_FRAMEWORK) set(lldb_python_target_dir "${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Resources/Python/lldb") diff --git a/lldb/cmake/modules/LLDBLayeringCheck.cmake b/lldb/cmake/modules/LLDBLayeringCheck.cmake new file mode 100644 index 0000000000000..082bbe37a980f --- /dev/null +++ b/lldb/cmake/modules/LLDBLayeringCheck.cmake @@ -0,0 +1,68 @@ +define_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND) +define_property(TARGET PROPERTY LLDB_PLUGIN_KIND INHERITED) + +define_property(DIRECTORY PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES) +define_property(TARGET PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES INHERITED) + +define_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES) +define_property(TARGET PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES INHERITED) + +option(LLDB_GENERATE_PLUGIN_DEP_GRAPH OFF) + +function(check_lldb_plugin_layering) + get_property(plugins GLOBAL PROPERTY LLDB_PLUGINS) + foreach(plugin ${plugins}) + get_property(plugin_kind TARGET ${plugin} PROPERTY LLDB_PLUGIN_KIND) + get_property(acceptable_deps TARGET ${plugin} + PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES) + get_property(tolerated_deps TARGET ${plugin} + PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES) + + # A plugin is always permitted to depend on its own kind for the purposes + # subclassing. Ideally the intra-kind dependencies should not form a loop, + # but we're not checking that here. + list(APPEND acceptable_deps ${plugin_kind}) + + list(APPEND all_plugin_kinds ${plugin_kind}) + + get_property(link_libs TARGET ${plugin} PROPERTY LINK_LIBRARIES) + foreach(link_lib ${link_libs}) + if(link_lib IN_LIST plugins) + get_property(lib_kind TARGET ${link_lib} PROPERTY LLDB_PLUGIN_KIND) + if (lib_kind) + if (lib_kind IN_LIST acceptable_deps) + set(dep_kind green) + elseif (lib_kind IN_LIST tolerated_deps) + set(dep_kind yellow) + else() + set(dep_kind red) + message(SEND_ERROR "Plugin ${plugin} cannot depend on ${lib_kind} " + "plugin ${link_lib}") + endif() + list(APPEND dep_${dep_kind}_${plugin_kind}_${lib_kind} ${plugin}) + endif() + endif() + endforeach() + endforeach() + + if (LLDB_GENERATE_PLUGIN_DEP_GRAPH) + set(dep_graph "digraph Plugins {\n") + list(REMOVE_DUPLICATES all_plugin_kinds) + foreach (from ${all_plugin_kinds}) + foreach (to ${all_plugin_kinds}) + foreach (dep_kind green yellow red) + if (dep_${dep_kind}_${from}_${to}) + list(REMOVE_DUPLICATES dep_${dep_kind}_${from}_${to}) + string(REGEX REPLACE "lldbPlugin|${from}" "" short_deps + "${dep_${dep_kind}_${from}_${to}}") + string(JOIN "\n" plugins ${short_deps}) + string(APPEND dep_graph + " ${from}->${to}[color=\"${dep_kind}\" label=\"${plugins}\"];\n") + endif() + endforeach() + endforeach() + endforeach() + string(APPEND dep_graph "}\n") + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lldb-plugin-deps.dot" "${dep_graph}") + endif() +endfunction() diff --git a/lldb/source/Plugins/ABI/CMakeLists.txt b/lldb/source/Plugins/ABI/CMakeLists.txt index e33ac87354860..97a20364ae7d7 100644 --- a/lldb/source/Plugins/ABI/CMakeLists.txt +++ b/lldb/source/Plugins/ABI/CMakeLists.txt @@ -1,3 +1,9 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND ABI) +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES + ProcessUtility + TypeSystem +) + foreach(target AArch64 ARM ARC Hexagon LoongArch Mips MSP430 PowerPC RISCV SystemZ X86) if (${target} IN_LIST LLVM_TARGETS_TO_BUILD) add_subdirectory(${target}) diff --git a/lldb/source/Plugins/Architecture/CMakeLists.txt b/lldb/source/Plugins/Architecture/CMakeLists.txt index 9ed8edf70af3f..0f898ef5116e9 100644 --- a/lldb/source/Plugins/Architecture/CMakeLists.txt +++ b/lldb/source/Plugins/Architecture/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND Architecture) + add_subdirectory(Arm) add_subdirectory(Mips) add_subdirectory(PPC64) diff --git a/lldb/source/Plugins/Disassembler/CMakeLists.txt b/lldb/source/Plugins/Disassembler/CMakeLists.txt index bec56765b60fd..1d1ea206e2774 100644 --- a/lldb/source/Plugins/Disassembler/CMakeLists.txt +++ b/lldb/source/Plugins/Disassembler/CMakeLists.txt @@ -1 +1,3 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND Disassembler) + add_subdirectory(LLVMC) diff --git a/lldb/source/Plugins/DynamicLoader/CMakeLists.txt b/lldb/source/Plugins/DynamicLoader/CMakeLists.txt index 30607159acdc0..01aba34b94169 100644 --- a/lldb/source/Plugins/DynamicLoader/CMakeLists.txt +++ b/lldb/source/Plugins/DynamicLoader/CMakeLists.txt @@ -1,3 +1,10 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND DynamicLoader) +set_property(DIRECTORY PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES ObjectFile) +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES + Process # part of a loop (Process<->DynamicLoader). + TypeSystem +) + add_subdirectory(Darwin-Kernel) add_subdirectory(FreeBSD-Kernel) add_subdirectory(MacOSX-DYLD) diff --git a/lldb/source/Plugins/ExpressionParser/CMakeLists.txt b/lldb/source/Plugins/ExpressionParser/CMakeLists.txt index 17c40aee44cc2..8a8089879bd9f 100644 --- a/lldb/source/Plugins/ExpressionParser/CMakeLists.txt +++ b/lldb/source/Plugins/ExpressionParser/CMakeLists.txt @@ -1 +1,3 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND ExpressionParser) + add_subdirectory(Clang) diff --git a/lldb/source/Plugins/Instruction/CMakeLists.txt b/lldb/source/Plugins/Instruction/CMakeLists.txt index 46d610f261e0d..bf48a1c1cc11e 100644 --- a/lldb/source/Plugins/Instruction/CMakeLists.txt +++ b/lldb/source/Plugins/Instruction/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND Instruction) + add_subdirectory(ARM) add_subdirectory(ARM64) add_subdirectory(LoongArch) diff --git a/lldb/source/Plugins/InstrumentationRuntime/CMakeLists.txt b/lldb/source/Plugins/InstrumentationRuntime/CMakeLists.txt index 7f301bca14a83..2a6cf930945d1 100644 --- a/lldb/source/Plugins/InstrumentationRuntime/CMakeLists.txt +++ b/lldb/source/Plugins/InstrumentationRuntime/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND InstrumentationRuntime) + add_subdirectory(ASan) add_subdirectory(ASanLibsanitizers) add_subdirectory(MainThreadChecker) diff --git a/lldb/source/Plugins/JITLoader/CMakeLists.txt b/lldb/source/Plugins/JITLoader/CMakeLists.txt index e52230199109f..ffba54f8b287b 100644 --- a/lldb/source/Plugins/JITLoader/CMakeLists.txt +++ b/lldb/source/Plugins/JITLoader/CMakeLists.txt @@ -1 +1,4 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND JITLoader) +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES ObjectFile) + add_subdirectory(GDB) diff --git a/lldb/source/Plugins/Language/CMakeLists.txt b/lldb/source/Plugins/Language/CMakeLists.txt index 7869074566d1e..b432dd300668e 100644 --- a/lldb/source/Plugins/Language/CMakeLists.txt +++ b/lldb/source/Plugins/Language/CMakeLists.txt @@ -1,3 +1,9 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND Language) +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES + LanguageRuntime + TypeSystem +) + add_subdirectory(ClangCommon) add_subdirectory(CPlusPlus) add_subdirectory(ObjC) diff --git a/lldb/source/Plugins/LanguageRuntime/CMakeLists.txt b/lldb/source/Plugins/LanguageRuntime/CMakeLists.txt index 034ae1545ae88..32528d6d6171f 100644 --- a/lldb/source/Plugins/LanguageRuntime/CMakeLists.txt +++ b/lldb/source/Plugins/LanguageRuntime/CMakeLists.txt @@ -1,2 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND LanguageRuntime) +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES TypeSystem) + add_subdirectory(CPlusPlus) add_subdirectory(ObjC) diff --git a/lldb/source/Plugins/MemoryHistory/CMakeLists.txt b/lldb/source/Plugins/MemoryHistory/CMakeLists.txt index 113f063625789..50838bb8a0770 100644 --- a/lldb/source/Plugins/MemoryHistory/CMakeLists.txt +++ b/lldb/source/Plugins/MemoryHistory/CMakeLists.txt @@ -1 +1,3 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND MemoryHistory) + add_subdirectory(asan) diff --git a/lldb/source/Plugins/ObjectContainer/CMakeLists.txt b/lldb/source/Plugins/ObjectContainer/CMakeLists.txt index cda0c8151dd8a..4ae1bb138a9a4 100644 --- a/lldb/source/Plugins/ObjectContainer/CMakeLists.txt +++ b/lldb/source/Plugins/ObjectContainer/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND ObjectContainer) + add_subdirectory(BSD-Archive) add_subdirectory(Universal-Mach-O) add_subdirectory(Mach-O-Fileset) diff --git a/lldb/source/Plugins/ObjectFile/CMakeLists.txt b/lldb/source/Plugins/ObjectFile/CMakeLists.txt index 7abd0c96f4fd7..6004b1f414d43 100644 --- a/lldb/source/Plugins/ObjectFile/CMakeLists.txt +++ b/lldb/source/Plugins/ObjectFile/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND ObjectFile) + add_subdirectory(Breakpad) add_subdirectory(COFF) add_subdirectory(ELF) diff --git a/lldb/source/Plugins/OperatingSystem/CMakeLists.txt b/lldb/source/Plugins/OperatingSystem/CMakeLists.txt index 06d909b862a04..1a29f9ad3af4c 100644 --- a/lldb/source/Plugins/OperatingSystem/CMakeLists.txt +++ b/lldb/source/Plugins/OperatingSystem/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND OperatingSystem) + if (LLDB_ENABLE_PYTHON) add_subdirectory(Python) endif() diff --git a/lldb/source/Plugins/Platform/CMakeLists.txt b/lldb/source/Plugins/Platform/CMakeLists.txt index 0220e734b36d1..f4753ab47ce11 100644 --- a/lldb/source/Plugins/Platform/CMakeLists.txt +++ b/lldb/source/Plugins/Platform/CMakeLists.txt @@ -1,3 +1,10 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND Platform) +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES + DynamicLoader + ObjectContainer + Process +) + add_subdirectory(AIX) add_subdirectory(Android) add_subdirectory(FreeBSD) diff --git a/lldb/source/Plugins/Process/CMakeLists.txt b/lldb/source/Plugins/Process/CMakeLists.txt index 058b4b9ad2157..bd9b1b86dbf13 100644 --- a/lldb/source/Plugins/Process/CMakeLists.txt +++ b/lldb/source/Plugins/Process/CMakeLists.txt @@ -1,3 +1,8 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND Process) +set_property(DIRECTORY PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES ObjectFile) +# This dependency is part of a loop (Process<->DynamicLoader). +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES DynamicLoader) + if (CMAKE_SYSTEM_NAME MATCHES "Linux|Android") add_subdirectory(Linux) add_subdirectory(POSIX) diff --git a/lldb/source/Plugins/Process/Utility/CMakeLists.txt b/lldb/source/Plugins/Process/Utility/CMakeLists.txt index fd3019613892a..48646b784f931 100644 --- a/lldb/source/Plugins/Process/Utility/CMakeLists.txt +++ b/lldb/source/Plugins/Process/Utility/CMakeLists.txt @@ -1,3 +1,6 @@ +# TODO: Clean up this directory and its dependencies +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND ProcessUtility) + add_lldb_library(lldbPluginProcessUtility AuxVector.cpp FreeBSDSignals.cpp diff --git a/lldb/source/Plugins/REPL/CMakeLists.txt b/lldb/source/Plugins/REPL/CMakeLists.txt index 17c40aee44cc2..8b51b3899625b 100644 --- a/lldb/source/Plugins/REPL/CMakeLists.txt +++ b/lldb/source/Plugins/REPL/CMakeLists.txt @@ -1 +1,4 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND REPL) +set_property(DIRECTORY PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES TypeSystem) + add_subdirectory(Clang) diff --git a/lldb/source/Plugins/RegisterTypeBuilder/CMakeLists.txt b/lldb/source/Plugins/RegisterTypeBuilder/CMakeLists.txt index 336ae91058021..7411b24c86cbd 100644 --- a/lldb/source/Plugins/RegisterTypeBuilder/CMakeLists.txt +++ b/lldb/source/Plugins/RegisterTypeBuilder/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND RegisterTypeBuilder) + add_lldb_library(lldbPluginRegisterTypeBuilderClang PLUGIN RegisterTypeBuilderClang.cpp diff --git a/lldb/source/Plugins/ScriptInterpreter/CMakeLists.txt b/lldb/source/Plugins/ScriptInterpreter/CMakeLists.txt index fa1c72a32fe13..4429b006173a7 100644 --- a/lldb/source/Plugins/ScriptInterpreter/CMakeLists.txt +++ b/lldb/source/Plugins/ScriptInterpreter/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND ScriptInterpreter) + add_subdirectory(None) if (LLDB_ENABLE_PYTHON) add_subdirectory(Python) diff --git a/lldb/source/Plugins/StructuredData/CMakeLists.txt b/lldb/source/Plugins/StructuredData/CMakeLists.txt index 40d64558482db..a6caa233f2220 100644 --- a/lldb/source/Plugins/StructuredData/CMakeLists.txt +++ b/lldb/source/Plugins/StructuredData/CMakeLists.txt @@ -1,2 +1,4 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND StructuredData) + add_subdirectory(DarwinLog) diff --git a/lldb/source/Plugins/SymbolFile/CMakeLists.txt b/lldb/source/Plugins/SymbolFile/CMakeLists.txt index 106387b45ec1a..3516528464200 100644 --- a/lldb/source/Plugins/SymbolFile/CMakeLists.txt +++ b/lldb/source/Plugins/SymbolFile/CMakeLists.txt @@ -1,3 +1,10 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND SymbolFile) +set_property(DIRECTORY PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES ObjectFile) +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES + Language + TypeSystem # part of a loop (TypeSystem<->SymbolFile). +) + add_subdirectory(Breakpad) add_subdirectory(CTF) add_subdirectory(DWARF) diff --git a/lldb/source/Plugins/SymbolLocator/CMakeLists.txt b/lldb/source/Plugins/SymbolLocator/CMakeLists.txt index 3367022639ab8..3b466f71dca58 100644 --- a/lldb/source/Plugins/SymbolLocator/CMakeLists.txt +++ b/lldb/source/Plugins/SymbolLocator/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND SymbolLocator) + # Order matters here: the first symbol locator prevents further searching. # For DWARF binaries that are both stripped and split, the Default plugin # will return the stripped binary when asked for the ObjectFile, which then diff --git a/lldb/source/Plugins/SymbolVendor/CMakeLists.txt b/lldb/source/Plugins/SymbolVendor/CMakeLists.txt index 1981706e06f4a..a07330d7d8bc4 100644 --- a/lldb/source/Plugins/SymbolVendor/CMakeLists.txt +++ b/lldb/source/Plugins/SymbolVendor/CMakeLists.txt @@ -1,3 +1,6 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND SymbolVendor) +set_property(DIRECTORY PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES ObjectFile) + add_subdirectory(ELF) if (CMAKE_SYSTEM_NAME MATCHES "Darwin") diff --git a/lldb/source/Plugins/SystemRuntime/CMakeLists.txt b/lldb/source/Plugins/SystemRuntime/CMakeLists.txt index 0955a9eb74c2d..58fdc060bda3a 100644 --- a/lldb/source/Plugins/SystemRuntime/CMakeLists.txt +++ b/lldb/source/Plugins/SystemRuntime/CMakeLists.txt @@ -1 +1,4 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND SystemRuntime) +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES TypeSystem) + add_subdirectory(MacOSX) diff --git a/lldb/source/Plugins/Trace/CMakeLists.txt b/lldb/source/Plugins/Trace/CMakeLists.txt index 955f88cec3404..331b48f95f1a4 100644 --- a/lldb/source/Plugins/Trace/CMakeLists.txt +++ b/lldb/source/Plugins/Trace/CMakeLists.txt @@ -1,3 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND Trace) + option(LLDB_BUILD_INTEL_PT "Enable Building of Intel(R) Processor Trace Tool" OFF) add_subdirectory(common) diff --git a/lldb/source/Plugins/TraceExporter/CMakeLists.txt b/lldb/source/Plugins/TraceExporter/CMakeLists.txt index e0252ee36720c..7130548d7a9f8 100644 --- a/lldb/source/Plugins/TraceExporter/CMakeLists.txt +++ b/lldb/source/Plugins/TraceExporter/CMakeLists.txt @@ -1,2 +1,4 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND TraceExporter) + add_subdirectory(common) add_subdirectory(ctf) diff --git a/lldb/source/Plugins/TypeSystem/CMakeLists.txt b/lldb/source/Plugins/TypeSystem/CMakeLists.txt index 17c40aee44cc2..47e32ff176d8c 100644 --- a/lldb/source/Plugins/TypeSystem/CMakeLists.txt +++ b/lldb/source/Plugins/TypeSystem/CMakeLists.txt @@ -1 +1,5 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND TypeSystem) +# This dependency is part of a loop (TypeSystem<->SymbolFile). +set_property(DIRECTORY PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES SymbolFile) + add_subdirectory(Clang) diff --git a/lldb/source/Plugins/UnwindAssembly/CMakeLists.txt b/lldb/source/Plugins/UnwindAssembly/CMakeLists.txt index 1723a06045804..1f505599c3fff 100644 --- a/lldb/source/Plugins/UnwindAssembly/CMakeLists.txt +++ b/lldb/source/Plugins/UnwindAssembly/CMakeLists.txt @@ -1,2 +1,4 @@ +set_property(DIRECTORY PROPERTY LLDB_PLUGIN_KIND UnwindAssembly) + add_subdirectory(InstEmulation) add_subdirectory(x86) >From fdcfeb4fb487b1e22000f9a1df18a175e65932d1 Mon Sep 17 00:00:00 2001 From: Pavel Labath <pa...@labath.sk> Date: Thu, 19 Jun 2025 13:43:57 +0200 Subject: [PATCH 2/2] add docs --- lldb/docs/resources/contributing.rst | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/lldb/docs/resources/contributing.rst b/lldb/docs/resources/contributing.rst index 48fd000765f66..e7d46c9061d53 100644 --- a/lldb/docs/resources/contributing.rst +++ b/lldb/docs/resources/contributing.rst @@ -56,6 +56,56 @@ subset of LLDB tests (the API tests) use a different system. Refer to the `lldb/test <https://github.com/llvm/llvm-project/tree/main/lldb/test>`_ folder for examples. + +LLDB plugins and their dependencies +----------------------------------- + +LLDB has a concept of *plugins*, which are used to provide abstraction +boundaries over functionality that is specific to a certain architecture, +operating system, programming language, etc. A plugin implements an abstract +base class (rarely, a set of related base classes), which is a part of LLDB +core. This setup allows the LLDB core to remain generic while making it possible +to support for new architectures, languages, and so on. For this to work, all +code needs to obey certain rules. + +The principal rule is that LLDB core (defined as: everything under lldb/source +*minus* lldb/source/Plugins) must not depend on any specific plugin. The only +way it can interact with them is through the abstract interface. Explicit +dependencies such as casting the base class to the plugin type are not permitted +and neither are more subtle dependencies like checking the name plugin or or +other situations where some code in LLDB core is tightly coupled to the +implementation details of a specific plugin. + +The rule for interaction between different plugins is more nuanced. We recognize +that some cross-plugin dependencies are unavoidable or even desirable. For +example, a plugin may want to extend a plugin of the same kind to +add/override/refine some functionality (e.g., Android is a "kind of" Linux, but +it handles some things differently). Alternatively, a plugin of one kind may +want to build on the functionality offered by a specific plugin of another kind +(ELFCore Process plugin uses ELF ObjectFile plugin to create a process out of an +ELF core file). + +In cases such as these, direct dependencies are acceptable. However, to keep the +dependency graph manageable, we still have some rules to govern these +relationships: + +* All dependencies between plugins of the same kind must flow in the same + direction (if plugin `A1` depends on plugin `B1`, then `B2` must not depend on + `A2`) +* Dependency graph of plugin kinds must not contain loops (dependencies like + `A1->B1`, `B2->C2` and `C3->A3` are forbidden because they induce a cycle in + the plugin kind graph even though the plugins themselves are acyclical) + + +The first of these rules is checked via CMake scripts (using the +`LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES` property). Dependencies in this category +are expected and permitted (subject to other constraints such as that dependency +making sense for the particular pair of plugins). Unfortunately, due to historic +reasons, not all plugin dependencies follow this rule, which is why we have +another category called `LLDB_TOLERATED_PLUGIN_DEPENDENCIES`. New dependencies +are forbidden (even though they are accepted by CMake) and existing ones should +be removed whereever possible. + .. _Error handling: Error handling and use of assertions in LLDB _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits