[Lldb-commits] [lldb] e7c1da7 - [lldb/cmake] Plugin layering enforcement mechanism (#144543)
via lldb-commits
lldb-commits at lists.llvm.org
Mon Jun 23 02:31:29 PDT 2025
Author: Pavel Labath
Date: 2025-06-23T11:31:26+02:00
New Revision: e7c1da7c8ef31c258619c1668062985e7ae83b70
URL: https://github.com/llvm/llvm-project/commit/e7c1da7c8ef31c258619c1668062985e7ae83b70
DIFF: https://github.com/llvm/llvm-project/commit/e7c1da7c8ef31c258619c1668062985e7ae83b70.diff
LOG: [lldb/cmake] Plugin layering enforcement mechanism (#144543)
Some inter-plugin dependencies are okay, others are not. Yet others not,
but we're sort of stuck with them. The idea is to be able to prevent
backsliding while making sure that acceptable dependencies are..
accepted. For context, see
https://github.com/llvm/llvm-project/pull/139170 and the attached
changes to the documentation.
Added:
lldb/cmake/modules/LLDBLayeringCheck.cmake
Modified:
lldb/CMakeLists.txt
lldb/docs/resources/contributing.rst
lldb/source/Plugins/ABI/CMakeLists.txt
lldb/source/Plugins/Architecture/CMakeLists.txt
lldb/source/Plugins/Disassembler/CMakeLists.txt
lldb/source/Plugins/DynamicLoader/CMakeLists.txt
lldb/source/Plugins/ExpressionParser/CMakeLists.txt
lldb/source/Plugins/Instruction/CMakeLists.txt
lldb/source/Plugins/InstrumentationRuntime/CMakeLists.txt
lldb/source/Plugins/JITLoader/CMakeLists.txt
lldb/source/Plugins/Language/CMakeLists.txt
lldb/source/Plugins/LanguageRuntime/CMakeLists.txt
lldb/source/Plugins/MemoryHistory/CMakeLists.txt
lldb/source/Plugins/ObjectContainer/CMakeLists.txt
lldb/source/Plugins/ObjectFile/CMakeLists.txt
lldb/source/Plugins/OperatingSystem/CMakeLists.txt
lldb/source/Plugins/Platform/CMakeLists.txt
lldb/source/Plugins/Process/CMakeLists.txt
lldb/source/Plugins/Process/Utility/CMakeLists.txt
lldb/source/Plugins/REPL/CMakeLists.txt
lldb/source/Plugins/RegisterTypeBuilder/CMakeLists.txt
lldb/source/Plugins/ScriptInterpreter/CMakeLists.txt
lldb/source/Plugins/StructuredData/CMakeLists.txt
lldb/source/Plugins/SymbolFile/CMakeLists.txt
lldb/source/Plugins/SymbolLocator/CMakeLists.txt
lldb/source/Plugins/SymbolVendor/CMakeLists.txt
lldb/source/Plugins/SystemRuntime/CMakeLists.txt
lldb/source/Plugins/Trace/CMakeLists.txt
lldb/source/Plugins/TraceExporter/CMakeLists.txt
lldb/source/Plugins/TypeSystem/CMakeLists.txt
lldb/source/Plugins/UnwindAssembly/CMakeLists.txt
Removed:
################################################################################
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/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
diff erent 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
diff erent 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
diff erently). 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
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)
More information about the lldb-commits
mailing list