Skip to content

Commit ddfd03d

Browse files
committed
[lldb][RPC] Upstream lldb-rpc-gen tool
This commit upstreams the `lldb-rpc-gen` tool, a ClangTool that generates the LLDB RPC client and server interfaces. https://discourse.llvm.org/t/rfc-upstreaming-lldb-rpc/85804
1 parent 8a8ea8f commit ddfd03d

File tree

15 files changed

+1188
-1
lines changed

15 files changed

+1188
-1
lines changed

lldb/cmake/modules/LLDBConfig.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,4 +322,6 @@ else()
322322
set(LLDB_CAN_USE_DEBUGSERVER OFF)
323323
endif()
324324

325+
set(LLDB_BUILD_LLDBRPC ON CACHE BOOL "")
326+
325327
include(LLDBGenerateConfig)

lldb/test/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ if(TARGET lldb-framework)
132132
add_lldb_test_dependency(lldb-framework)
133133
endif()
134134

135+
if (LLDB_BUILD_LLDBRPC)
136+
add_lldb_test_dependency(lldb-rpc-generate-sources)
137+
endif()
138+
135139
# Add dependencies that are not exported targets when building standalone.
136140
if(NOT LLDB_BUILT_STANDALONE)
137141
add_lldb_test_dependency(
@@ -249,7 +253,8 @@ llvm_canonicalize_cmake_booleans(
249253
LLDB_TEST_SHELL_DISABLE_REMOTE
250254
LLDB_TOOL_LLDB_SERVER_BUILD
251255
LLDB_USE_SYSTEM_DEBUGSERVER
252-
LLDB_IS_64_BITS)
256+
LLDB_IS_64_BITS
257+
LLDB_BUILD_LLDBRPC)
253258

254259
# Configure the individual test suites.
255260
add_subdirectory(API)

lldb/test/Shell/RPC/Generator/Inputs/SBDummy.h

Whitespace-only changes.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
RUN: %lldb-rpc-gen --output-dir=%t %S/../Inputs/SBDummy.h
2+
3+
RUN: ls %t | FileCheck %s
4+
5+
# We're just making sure that the tool emits the class names,
6+
# methods and skipped methods file in the output directory.
7+
CHECK: SBAPI.def
8+
CHECK: SBClasses.def
9+
CHECK: SkippedMethods.txt
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# All tests for the tool need lldb-rpc-gen to be built.
2+
if not config.lldb_has_lldbrpc:
3+
config.unsupported = True

lldb/test/Shell/helper/toolchain.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,16 @@ def use_lldb_substitutions(config):
156156
extra_args=["platform"],
157157
unresolved="ignore",
158158
),
159+
ToolSubst(
160+
"%lldb-rpc-gen",
161+
command=FindTool("lldb-rpc-gen"),
162+
# We need the LLDB build directory root to pass into the tool, not the test build root.
163+
extra_args=[
164+
'-p ' + config.lldb_build_directory + '/..',
165+
'--extra-arg="-resource-dir=' + config.clang_resource_dir + '"'
166+
],
167+
unresolved="ignore",
168+
),
159169
"lldb-test",
160170
"lldb-dap",
161171
ToolSubst(

lldb/test/Shell/lit.site.cfg.py.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ config.lldb_build_directory = "@LLDB_TEST_BUILD_DIRECTORY@"
3333
config.have_lldb_server = @LLDB_TOOL_LLDB_SERVER_BUILD@
3434
config.lldb_system_debugserver = @LLDB_USE_SYSTEM_DEBUGSERVER@
3535
config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
36+
config.lldb_has_lldbrpc = @LLDB_BUILD_LLDBRPC@
3637
# The shell tests use their own module caches.
3738
config.lldb_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_LLDB@", "lldb-shell")
3839
config.clang_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_CLANG@", "lldb-shell")

lldb/tools/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ add_subdirectory(lldb-fuzzer EXCLUDE_FROM_ALL)
1010

1111
add_lldb_tool_subdirectory(lldb-instr)
1212
add_lldb_tool_subdirectory(lldb-dap)
13+
if (LLDB_BUILD_LLDBRPC)
14+
add_lldb_tool_subdirectory(lldb-rpc)
15+
endif()
1316

1417
if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
1518
add_lldb_tool_subdirectory(darwin-debug)

lldb/tools/lldb-rpc/CMakeLists.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
include(CheckCXXCompilerFlag)
2+
# Umbrella target for the entire framework is a default target.
3+
add_custom_target(lldb-rpc ALL)
4+
5+
if(LLDB_CODESIGN_IDENTITY)
6+
# Use explicit LLDB identity
7+
set(LLVM_CODESIGNING_IDENTITY ${LLDB_CODESIGN_IDENTITY})
8+
else()
9+
# Use explicit LLVM identity or default to ad-hoc signing if empty
10+
if(NOT LLVM_CODESIGNING_IDENTITY)
11+
set(LLVM_CODESIGNING_IDENTITY -)
12+
endif()
13+
endif()
14+
15+
# LLDBRPCGeneration.cmake needs the LLDB_RPC_GEN_EXE variable
16+
# which gets defined in the lldb-rpc-gen folder, so we're adding
17+
# this folder before we add that file.
18+
add_lldb_tool_subdirectory(lldb-rpc-gen)
19+
include(${CMAKE_CURRENT_SOURCE_DIR}/LLDBRPCGeneration.cmake)
20+
include(${CMAKE_CURRENT_SOURCE_DIR}/LLDBRPCHeaders.cmake)
21+
22+
add_dependencies(lldb-rpc lldb-rpc-generate-sources liblldbrpc-headers)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
if (NOT DEFINED LLDB_RPC_GEN_EXE)
2+
message(FATAL_ERROR
3+
"Unable to generate lldb-rpc sources because LLDB_RPC_GEN_EXE is not
4+
defined. If you are cross-compiling, please build lldb-rpc-gen for your host
5+
platform.")
6+
endif()
7+
set(lldb_rpc_generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated")
8+
9+
file(GLOB api_headers ${LLDB_SOURCE_DIR}/include/lldb/API/SB*.h)
10+
# We don't generate SBCommunication
11+
list(REMOVE_ITEM api_headers ${LLDB_SOURCE_DIR}/include/lldb/API/SBCommunication.h)
12+
# SBDefines.h is mostly definitions and forward declarations, nothing to
13+
# generate.
14+
list(REMOVE_ITEM api_headers ${LLDB_SOURCE_DIR}/include/lldb/API/SBDefines.h)
15+
16+
# Generate the list of byproducts. Note that we cannot just glob the files in
17+
# the directory with the generated sources because BYPRODUCTS needs to be known
18+
# at configure time but the files are generated at build time.
19+
set(lldb_rpc_gen_byproducts
20+
${lldb_rpc_generated_dir}/SBClasses.def
21+
${lldb_rpc_generated_dir}/SBAPI.def
22+
${lldb_rpc_generated_dir}/lldb.py
23+
${lldb_rpc_server_generated_source_dir}/SBAPI.h
24+
)
25+
26+
# Make sure that the clang-resource-dir is set correctly or else the tool will
27+
# fail to run. This is only needed when we do a standalone build.
28+
set(clang_resource_dir_arg)
29+
if (LLDB_BUILT_STANDALONE)
30+
if (TARGET clang-resource-headers)
31+
set(clang_resource_headers_dir
32+
$<TARGET_PROPERTY:clang-resource-headers,INTERFACE_INCLUDE_DIRECTORIES>)
33+
set(clang_resource_dir_arg --extra-arg="-resource-dir=${clang_resource_headers_dir}/..")
34+
else()
35+
set(clang_resource_dir_arg --extra-arg="-resource-dir=${LLDB_EXTERNAL_CLANG_RESOURCE_DIR}")
36+
endif()
37+
endif()
38+
39+
add_custom_command(OUTPUT ${lldb_rpc_gen_byproducts}
40+
COMMAND ${CMAKE_COMMAND} -E make_directory
41+
${lldb_rpc_generated_dir}
42+
43+
COMMAND ${LLDB_RPC_GEN_EXE}
44+
-p ${CMAKE_BINARY_DIR}
45+
--output-dir=${lldb_rpc_generated_dir}
46+
${clang_resource_dir_arg}
47+
--extra-arg="-USWIG"
48+
${api_headers}
49+
50+
DEPENDS ${LLDB_RPC_GEN_EXE} ${api_headers}
51+
COMMENT "Generating sources for lldb-rpc-server..."
52+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
53+
)
54+
55+
add_custom_target(lldb-rpc-generate-sources
56+
DEPENDS
57+
${lldb_rpc_gen_byproducts}
58+
lldb-sbapi-dwarf-enums)
59+
60+
add_dependencies(lldb-rpc-generate-sources clang-resource-headers)
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
set(derived_headers_location "${CMAKE_CURRENT_BINARY_DIR}/DerivedHeaders")
2+
3+
# Obtain the original headers from their staged location in the build directory.
4+
set(original_headers_location "${CMAKE_BINARY_DIR}/include/lldb")
5+
set(headers_to_process
6+
SBDefines.h
7+
lldb-defines.h
8+
lldb-enumerations.h
9+
lldb-types.h
10+
)
11+
12+
file(MAKE_DIRECTORY ${derived_headers_location})
13+
14+
# Take the original headers and convert them RPC as necessary using the conversion script.
15+
set(original_headers)
16+
set(derived_headers)
17+
foreach(header ${headers_to_process})
18+
set(original_header "${original_headers_location}/${header}")
19+
20+
get_filename_component(header_filename ${header} NAME)
21+
string(REPLACE "lldb-" "lldb-rpc-" rpc_header_filename "${header_filename}")
22+
set(derived_header "${derived_headers_location}/${rpc_header_filename}")
23+
24+
list(APPEND original_headers "${original_header}")
25+
list(APPEND derived_headers "${derived_header}")
26+
add_custom_command(OUTPUT ${derived_header}
27+
COMMAND ${Python3_EXECUTABLE} ${LLDB_SOURCE_DIR}/scripts/convert-lldb-header-to-rpc-header.py
28+
${original_header} ${derived_header}
29+
DEPENDS ${original_header}
30+
31+
COMMENT "Creating ${derived_header}"
32+
)
33+
endforeach()
34+
35+
# Do the same thing for any header files that were autogenerated.
36+
set(generated_headers_to_process
37+
API/SBLanguages.h
38+
)
39+
foreach(header ${generated_headers_to_process})
40+
set(original_header "${LLDB_OBJ_DIR}/include/lldb/${header}")
41+
42+
get_filename_component(header_filename ${header} NAME)
43+
string(REPLACE "lldb-" "lldb-rpc-" rpc_header_filename "${header_filename}")
44+
set(derived_header "${derived_headers_location}/${rpc_header_filename}")
45+
46+
list(APPEND original_headers "${original_header}")
47+
list(APPEND derived_headers "${derived_header}")
48+
add_custom_command(OUTPUT ${derived_header}
49+
COMMAND ${CMAKE_COMMAND} -E copy ${original_header} ${derived_header}
50+
COMMAND ${Python3_EXECUTABLE} ${LLDB_SOURCE_DIR}/scripts/convert-lldb-header-to-rpc-header.py
51+
${original_header} ${derived_header}
52+
DEPENDS lldb-sbapi-dwarf-enums
53+
54+
COMMENT "Creating ${derived_header}"
55+
)
56+
endforeach()
57+
58+
add_custom_target(copy-aux-rpc-headers DEPENDS ${derived_headers})
59+
add_dependencies(copy-aux-rpc-headers liblldb-header-staging)
60+
61+
list(APPEND public_headers
62+
${derived_headers_location}/SBDefines.h
63+
${derived_headers_location}/SBLanguages.h
64+
${derived_headers_location}/lldb-rpc-enumerations.h
65+
${derived_headers_location}/lldb-rpc-types.h
66+
${derived_headers_location}/lldb-rpc-defines.h
67+
)
68+
69+
# Collect and preprocess headers for the framework bundle
70+
set(version_header
71+
${derived_headers_location}/lldb-rpc-defines.h
72+
)
73+
74+
function(FixIncludePaths in subfolder out)
75+
get_filename_component(base_name ${in} NAME)
76+
set(parked_header ${CMAKE_CURRENT_BINARY_DIR}/ParkedHeaders/${subfolder}/${base_name})
77+
set(${out} ${parked_header} PARENT_SCOPE)
78+
find_program(unifdef_EXECUTABLE unifdef)
79+
80+
add_custom_command(OUTPUT ${parked_header}
81+
COMMAND ${LLDB_SOURCE_DIR}/scripts/framework-header-fix.py
82+
-f lldb_rpc -i ${in} -o ${parked_header} -p ${unifdef_EXECUTABLE} USWIG
83+
DEPENDS ${in}
84+
COMMENT "Fixing includes in ${in}"
85+
)
86+
endfunction()
87+
88+
set(preprocessed_headers)
89+
90+
# Apply include-paths fix and any version fix on all headers and park them.
91+
foreach(source_header ${public_headers})
92+
FixIncludePaths(${source_header} Headers parked_header)
93+
list(APPEND preprocessed_headers ${parked_header})
94+
endforeach()
95+
96+
# Wrap header preprocessing in a target, so liblldbrpc can depend on.
97+
add_custom_target(liblldbrpc-headers DEPENDS ${preprocessed_headers})
98+
add_dependencies(liblldbrpc-headers copy-aux-rpc-headers liblldb-header-staging)
99+
set_target_properties(liblldbrpc-headers PROPERTIES
100+
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ParkedHeaders
101+
)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
add_lldb_tool(lldb-rpc-gen
2+
RPCCommon.cpp
3+
lldb-rpc-gen.cpp
4+
5+
CLANG_LIBS
6+
clangAST
7+
clangBasic
8+
clangCodeGen
9+
clangFrontend
10+
clangLex
11+
clangRewrite
12+
clangSerialization
13+
clangTooling
14+
15+
LINK_COMPONENTS
16+
Support
17+
)
18+
19+
if (NOT DEFINED LLDB_RPC_GEN_EXE)
20+
set(LLDB_RPC_GEN_EXE $<TARGET_FILE:lldb-rpc-gen> CACHE STRING "Executable that generates lldb-rpc-server")
21+
endif()

0 commit comments

Comments
 (0)