[Lldb-commits] [lldb] [lldb/cmake][WIP] Plugin layering enforcement mechanism (PR #144543)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Thu Jun 19 04:44:20 PDT 2025
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 <pavel at 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 <pavel at 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
More information about the lldb-commits
mailing list