Skip to content

Commit bfbf9e8

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 bfbf9e8

File tree

10 files changed

+1176
-0
lines changed

10 files changed

+1176
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# For this test, we're not checking any specific output from a generated file,
2+
# but we do need a file to pass into lldb-rpc-gen so use SBAddress.h from source.
3+
RUN: %lldb-rpc-gen --output-dir=%t %S/../../../../../include/lldb/API/SBAddress.h
4+
5+
RUN: ls %t | FileCheck %s
6+
7+
# We're just making sure that the tool emits the class names,
8+
# methods and skipped methods file in the output directory.
9+
CHECK: SBAPI.def
10+
CHECK: SBClasses.def
11+
CHECK: SkippedMethods.txt

lldb/test/Shell/helper/toolchain.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,12 @@ 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+
extra_args=['--extra-arg="-resource-dir=' + config.clang_resource_dir + '"'],
163+
unresolved="ignore",
164+
),
159165
"lldb-test",
160166
"lldb-dap",
161167
ToolSubst(

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: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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)
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)