https://github.com/chelcassanova updated https://github.com/llvm/llvm-project/pull/138028
>From 208288fc19c742553a4a4c7bb71e54b85a7b8ada Mon Sep 17 00:00:00 2001 From: Chelsea Cassanova <chelsea_cassan...@apple.com> Date: Wed, 30 Apr 2025 13:37:15 -0700 Subject: [PATCH] [lldb][RPC] Upstream LLDB to RPC converstion Python script As part of upstreaming LLDB RPC, this commit adds a python script that is used by LLDB RPC to modify the public lldb header files for use with RPC. https://discourse.llvm.org/t/rfc-upstreaming-lldb-rpc/85804 --- .../convert-lldb-header-to-rpc-header.py | 81 +++++++++++++++++++ .../TestConvertScript/CheckLLDBDefines.test | 22 +++++ .../CheckLLDBEnumerations.test | 20 +++++ .../TestConvertScript/CheckLLDBTypes.test | 24 ++++++ .../TestConvertScript/CheckSBDefines.test | 22 +++++ .../TestConvertScript/Inputs/SBDefines.h | 22 +++++ .../TestConvertScript/Inputs/lldb-defines.h | 23 ++++++ .../Inputs/lldb-enumerations.h | 17 ++++ .../TestConvertScript/Inputs/lldb-types.h | 23 ++++++ 9 files changed, 254 insertions(+) create mode 100755 lldb/scripts/convert-lldb-header-to-rpc-header.py create mode 100644 lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBDefines.test create mode 100644 lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBEnumerations.test create mode 100644 lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBTypes.test create mode 100644 lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckSBDefines.test create mode 100644 lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/SBDefines.h create mode 100644 lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-defines.h create mode 100644 lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-enumerations.h create mode 100644 lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-types.h diff --git a/lldb/scripts/convert-lldb-header-to-rpc-header.py b/lldb/scripts/convert-lldb-header-to-rpc-header.py new file mode 100755 index 0000000000000..b826fc1f99207 --- /dev/null +++ b/lldb/scripts/convert-lldb-header-to-rpc-header.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +""" +Usage: convert-lldb-header-to-rpc-header.py <path/to/input-header.h> <path/to/output-header.h> + +This scripts takes common LLDB headers (such as lldb-defines.h) and replaces references to LLDB +with those for RPC. This happens for: +- namespace definitions +- namespace usage +- version string macros +- ifdef/ifndef lines +""" + +import argparse +import os +import re + + +INCLUDES_TO_REMOVE_REGEX = re.compile( + r'#include "lldb/lldb-forward|#include "lldb/lldb-versioning' +) +LLDB_GUARD_REGEX = re.compile(r".+LLDB_LLDB_") +LLDB_API_GUARD_REGEX = re.compile(r".+LLDB_API_") +LLDB_VERSION_REGEX = re.compile(r"#define LLDB_VERSION") +LLDB_REVISION_REGEX = re.compile(r"#define LLDB_REVISION") +LLDB_VERSION_STRING_REGEX = re.compile(r"#define LLDB_VERSION_STRING") +LLDB_LOCAL_INCLUDE_REGEX = re.compile(r'#include "lldb/lldb-') +LLDB_NAMESPACE_DEFINITION_REGEX = re.compile(r".*namespace lldb") +LLDB_NAMESPACE_REGEX = re.compile(r".+lldb::") + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("input") + parser.add_argument("output") + args = parser.parse_args() + input_path = str(args.input) + output_path = str(args.output) + with open(input_path, "r") as input_file: + lines = input_file.readlines() + + with open(output_path, "w") as output_file: + for line in lines: + # NOTE: We do not use lldb-forward.h or lldb-versioning.h in RPC, so remove + # all includes that are found for these files. + if INCLUDES_TO_REMOVE_REGEX.match(line): + continue + # For lldb-rpc-defines.h, replace the ifndef LLDB_LLDB_ portion with LLDB_RPC_ as we're not + # using LLDB private definitions in RPC. + elif LLDB_GUARD_REGEX.match(line): + output_file.write(re.sub(r"LLDB_LLDB_", r"LLDB_RPC_", line)) + # Similarly to lldb-rpc-defines.h, replace the ifndef for LLDB_API in SBDefines.h to LLDB_RPC_API_ for the same reason. + elif LLDB_API_GUARD_REGEX.match(line): + output_file.write(re.sub(r"LLDB_API_", r"LLDB_RPC_API_", line)) + # Replace the references for the macros that define the versioning strings in + # lldb-rpc-defines.h. + # NOTE: Here we assume that the versioning info has already been uncommented and + # populated from the original lldb-defines.h. + elif LLDB_VERSION_REGEX.match(line): + output_file.write(re.sub(r"LLDB_VERSION", r"LLDB_RPC_VERSION", line)) + elif LLDB_REVISION_REGEX.match(line): + output_file.write(re.sub(r"LLDB_REVISION", r"LLDB_RPC_REVISION", line)) + elif LLDB_VERSION_STRING_REGEX.match(line): + output_file.write( + re.sub(r"LLDB_VERSION_STRING", r"LLDB_RPC_VERSION_STRING", line) + ) + # For local #includes + elif LLDB_LOCAL_INCLUDE_REGEX.match(line): + output_file.write(re.sub(r"lldb/lldb-", r"lldb-rpc-", line)) + # Rename the lldb namespace definition to lldb-rpc. + elif LLDB_NAMESPACE_DEFINITION_REGEX.match(line): + output_file.write(re.sub(r"lldb", r"lldb_rpc", line)) + # Rename namespace references + elif LLDB_NAMESPACE_REGEX.match(line): + output_file.write(re.sub(r"lldb::", r"lldb_rpc::", line)) + else: + # Write any line that doesn't need to be converted + output_file.write(line) + + +if __name__ == "__main__": + main() diff --git a/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBDefines.test b/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBDefines.test new file mode 100644 index 0000000000000..0d89d627cfedf --- /dev/null +++ b/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBDefines.test @@ -0,0 +1,22 @@ +RUN: mkdir -p %t/Outputs + +# Run the convert script on lldb-defines.h. +RUN: %python %p/../../../../../scripts/convert-lldb-header-to-rpc-header.py %p/Inputs/lldb-defines.h %t/Outputs/lldb-rpc-defines.h + +# Check the output +RUN: cat %t/Outputs/lldb-rpc-defines.h | FileCheck %s + +# The include guards must change from LLDB_LLDB_DEFINES_H to LLDB_RPC_DEFINES_H. +CHECK: #ifndef LLDB_RPC_DEFINES_H +CHECK: #define LLDB_RPC_DEFINES_H + +# Includes of other lldb headers must begin with "lldb-rpc-". +CHECK: #include "lldb-rpc-types.h" + +# The version info must be changed from LLDB_VERSION to LLDB_RPC_VERSION +CHECK: #define LLDB_RPC_VERSION 21 +CHECK: #define LLDB_RPC_REVISION 12 +CHECK: #define LLDB_RPC_VERSION_STRING "21.0.12" + +# The comment that closes the include guard should match the guard. +CHECK: #endif // LLDB_RPC_DEFINES_H diff --git a/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBEnumerations.test b/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBEnumerations.test new file mode 100644 index 0000000000000..7a825680bb48b --- /dev/null +++ b/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBEnumerations.test @@ -0,0 +1,20 @@ +RUN: mkdir -p %t/Outputs + +# Run the convert script on lldb-enumerations.h. +RUN: %python %p/../../../../../scripts/convert-lldb-header-to-rpc-header.py %p/Inputs/lldb-enumerations.h %t/Outputs/lldb-rpc-enumerations.h + +# Check the output +RUN: cat %t/Outputs/lldb-rpc-enumerations.h | FileCheck %s + +# The include guards must change from LLDB_LLDB_ENUMERATIONS_H to LLDB_RPC_ENUMERATIONS_H. +CHECK: #ifndef LLDB_RPC_ENUMERATIONS_H +CHECK: #define LLDB_RPC_ENUMERATIONS_H + +# Change the namespace to lldb_rpc. +CHECK: namespace lldb_rpc + +# The comment that closes the namespace should match the namespace. +CHECK: // namespace lldb_rpc + +# The comment that closes the include guard should match the guard. +CHECK: #endif // LLDB_RPC_ENUMERATIONS_H diff --git a/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBTypes.test b/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBTypes.test new file mode 100644 index 0000000000000..86f2d290209e1 --- /dev/null +++ b/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckLLDBTypes.test @@ -0,0 +1,24 @@ +RUN: mkdir -p %t/Outputs + +# Run the convert script on lldb-types.h. +RUN: %python %p/../../../../../scripts/convert-lldb-header-to-rpc-header.py %p/Inputs/lldb-types.h %t/Outputs/lldb-rpc-types.h + +# Check the output +RUN: cat %t/Outputs/lldb-rpc-types.h | FileCheck %s + +# The include guards must change from LLDB_LLDB_TYPES_H to LLDB_RPC_TYPES_H. +CHECK: #ifndef LLDB_RPC_TYPES_H +CHECK: #define LLDB_RPC_TYPES_H + +# Includes of other lldb headers must begin with "lldb-rpc-". +# Also, the includes for lldb-forward.h should be removed. +CHECK: #include "lldb-rpc-enumerations.h" + +# Change the namespace to lldb_rpc. +CHECK: namespace lldb_rpc + +# The comment that closes the namespace should match the namespace. +CHECK: // namespace lldb_rpc + +# The comment that closes the include guard should match the guard. +CHECK: #endif // LLDB_RPC_TYPES_H diff --git a/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckSBDefines.test b/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckSBDefines.test new file mode 100644 index 0000000000000..72444aaf069a4 --- /dev/null +++ b/lldb/test/Shell/RPC/Scripts/TestConvertScript/CheckSBDefines.test @@ -0,0 +1,22 @@ +RUN: mkdir -p %t/Outputs + +# Run the convert script on SBDefines.h. +RUN: %python %p/../../../../../scripts/convert-lldb-header-to-rpc-header.py %p/Inputs/SBDefines.h %t/Outputs/SBDefines.h + +# Check the output +RUN: cat %t/Outputs/SBDefines.h | FileCheck %s + +# The include guards must change from LLDB_LLDB_API_SBDEFINES_H to LLDB_RPC_API_SBDEFINES_H. +CHECK: #ifndef LLDB_RPC_API_SBDEFINES_H +CHECK: #define LLDB_RPC_API_SBDEFINES_H + +# Includes of other lldb headers must begin with "lldb-rpc-". +# Also, the includes for lldb-forward.h and lldb-versioning.h should be removed. +CHECK: #include "lldb-rpc-defines.h" +CHECK-NOT: #include "lldb-rpc-forward.h" +CHECK: #include "lldb-rpc-enumerations.h" +CHECK: #include "lldb-rpc-types.h" +CHECK-NOT: #include "lldb-rpc-versioning.h" + +# The comment that closes the include guard should match the guard. +CHECK: #endif // LLDB_RPC_API_SBDEFINES_H diff --git a/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/SBDefines.h b/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/SBDefines.h new file mode 100644 index 0000000000000..50476c402ba72 --- /dev/null +++ b/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/SBDefines.h @@ -0,0 +1,22 @@ +// This is a truncated version of SBDefines.h used to test that the script +// convert-lldb-header-to-rpc-header.py works correctly. The script changes LLDB references in +// the original file to RPC references. + +// The include guard should change from LLDB_LLDB to LLDB_RPC. +// LLDB_API_SBDEFINES_H -> LLDB_RPC_SBDEFINES_H +#ifndef LLDB_API_SBDEFINES_H +#define LLDB_API_SBDEFINES_H + +// Includes of public main LLDB headers should change to their RPC equivalents: +// "lldb/lldb-defines.h" -> "lldb-rpc-defines.h" +// Also, the includes for lldb-forward.h and lldb-versioning.h should be removed. +#include "lldb/lldb-defines.h" +#include "lldb/lldb-enumerations.h" +#include "lldb/lldb-forward.h" +#include "lldb/lldb-types.h" +#include "lldb/lldb-versioning.h" + +// The comment that closes the include guard must change in the same way +// the original guard did. +// #endif // LLDB_API_SBDEFINES_H -> #endif // LLDB_RPC_API_SBDEFINES_H +#endif // LLDB_API_SBDEFINES_H diff --git a/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-defines.h b/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-defines.h new file mode 100644 index 0000000000000..32064430b3d04 --- /dev/null +++ b/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-defines.h @@ -0,0 +1,23 @@ +// This is a truncated version of lldb-defines.h used to test that the script +// convert-lldb-header-to-rpc-header.py works correctly. The script changes LLDB references in +// the original file to RPC references. + +// The include guard should change from LLDB_LLDB to LLDB_RPC. +// LLDB_LLDB_DEFINES_H -> LLDB_RPC_DEFINES_H +#ifndef LLDB_LLDB_DEFINES_H +#define LLDB_LLDB_DEFINES_H + +// Includes of public main LLDB headers should change to their RPC equivalents: +// "lldb/lldb-types.h" -> "lldb-rpc-types.h" +#include "lldb/lldb-types.h" + +// The LLDB version must change from LLDB to LLDB_RPC +// LLDB_VERSION -> LLDB_RPC_VERSION +#define LLDB_VERSION 21 +#define LLDB_REVISION 12 +#define LLDB_VERSION_STRING "21.0.12" + +// The comment that closes the include guard must change in the same way +// the original guard did. +// #endif // LLDB_LLDB_DEFINES_H -> #endif // LLDB_RPC_DEFINES_H +#endif // LLDB_LLDB_DEFINES_H diff --git a/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-enumerations.h b/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-enumerations.h new file mode 100644 index 0000000000000..42c4bb277fc45 --- /dev/null +++ b/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-enumerations.h @@ -0,0 +1,17 @@ +// This is a truncated version of lldb-enumerations.h used to test that the script +// convert-lldb-header-to-rpc-header.py works correctly. The script changes LLDB references in +// the original file to RPC references. + +// The include guard should change from LLDB_LLDB to LLDB_RPC. +// LLDB_LLDB_ENUMERATIONS_H -> LLDB_RPC_ENUMERATIONS_H +#ifndef LLDB_LLDB_ENUMERATIONS_H +#define LLDB_LLDB_ENUMERATIONS_H + +// The namespace definition should change to the lldb_rpc namespace, so should the comment that closes it: +// namespace lldb -> namespace lldb_rpc +namespace lldb {} // namespace lldb + +// The comment that closes the include guard must change in the same way +// the original guard did: +// #endif // LLDB_LLDB_ENUMERATIONS_H -> #endif // LLDB_RPC_ENUMERATIONS_H +#endif // LLDB_LLDB_ENUMERATIONS_H diff --git a/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-types.h b/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-types.h new file mode 100644 index 0000000000000..5a49920405ec6 --- /dev/null +++ b/lldb/test/Shell/RPC/Scripts/TestConvertScript/Inputs/lldb-types.h @@ -0,0 +1,23 @@ +// This is a truncated version of lldb-types.h used to test that the script +// convert-lldb-header-to-rpc-header.py works correctly. The script changes LLDB references in +// the original file to RPC references. + +// The include guard should change from LLDB_LLDB to LLDB_RPC. +// LLDB_LLDB_TYPES_H -> LLDB_RPC_TYPES_H +#ifndef LLDB_LLDB_TYPES_H +#define LLDB_LLDB_TYPES_H + +// Includes of public main LLDB headers should change to their RPC equivalents: +// "lldb/lldb-defines.h" -> "lldb-rpc-defines.h": +// Also, the includes for lldb-forward.h should be removed. +#include "lldb/lldb-enumerations.h" +#include "lldb/lldb-forward.h" + +// The namespace definition should change to the lldb_rpc namespace, so should the comment that closes it: +// namespace lldb -> namespace lldb_rpc +namespace lldb {} // namespace lldb + +// The comment that closes the include guard must change in the same way +// the original guard did: +// #endif // LLDB_LLDB_TYPES_H -> #endif // LLDB_RPC_TYPES_H +#endif // LLDB_LLDB_TYPES_H _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits