From dd4876fb4507f274b55ef4c9b6b30636a13b132f Mon Sep 17 00:00:00 2001 From: artemcm Date: Mon, 12 Aug 2024 11:27:50 -0700 Subject: [PATCH 1/4] Link 'swift-ide-test' against the new (early)swift-driver and exercise its 'getSingleFrontendInvocationFromDriverArguments' API This lays the groundwork for what it takes to start using the new driver's C API from compiler products such as SourceKit --- lib/Tooling/libSwiftScan/CMakeLists.txt | 14 ++++++---- tools/swift-ide-test/CMakeLists.txt | 34 ++++++++++++++++++++++++- tools/swift-ide-test/swift-ide-test.cpp | 34 +++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 6 deletions(-) diff --git a/lib/Tooling/libSwiftScan/CMakeLists.txt b/lib/Tooling/libSwiftScan/CMakeLists.txt index cd68ea874a619..08237f952cb2d 100644 --- a/lib/Tooling/libSwiftScan/CMakeLists.txt +++ b/lib/Tooling/libSwiftScan/CMakeLists.txt @@ -10,6 +10,14 @@ add_swift_host_library(libSwiftScan SHARED SwiftCaching.cpp HAS_SWIFT_MODULES) +add_library(libSwiftScanDependencies INTERFACE) +target_link_libraries(libSwiftScanDependencies INTERFACE + swiftDependencyScan + swiftDriverTool + swiftStaticMirror + swiftRemoteInspection + swiftCompilerModules) + if(SWIFT_HOST_VARIANT_SDK IN_LIST SWIFT_DARWIN_PLATFORMS) # Workaround for a linker crash related to autolinking: rdar://77839981 set_property(TARGET libSwiftScan APPEND_STRING PROPERTY @@ -21,11 +29,7 @@ add_dependencies(libSwiftScan swiftDependencyScan) target_link_libraries(libSwiftScan PRIVATE - swiftDependencyScan - swiftDriverTool - swiftStaticMirror - swiftRemoteInspection - swiftCompilerModules) + libSwiftScanDependencies) set_target_properties(libSwiftScan PROPERTIES diff --git a/tools/swift-ide-test/CMakeLists.txt b/tools/swift-ide-test/CMakeLists.txt index 3cc33b10db1b4..5c0419221f8ef 100644 --- a/tools/swift-ide-test/CMakeLists.txt +++ b/tools/swift-ide-test/CMakeLists.txt @@ -1,3 +1,20 @@ +# Early swift-driver is built adjacent to the compiler (swift build dir) +if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + set(driver_package_configuration_dir "release") +else() + set(driver_package_configuration_dir "debug") +endif() + +message(STATUS "${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/cmake/modules/") +message(STATUS "${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/dependencies/swift-tools-support-core/cmake/modules/") + +set(SwiftDriver_DIR + "${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/cmake/modules/") +set(TSC_DIR "${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/dependencies/swift-tools-support-core/cmake/modules/") +find_package(TSC CONFIG) +find_package(SwiftDriver CONFIG) + + add_swift_host_tool(swift-ide-test swift-ide-test.cpp ModuleAPIDiff.cpp @@ -6,14 +23,29 @@ add_swift_host_tool(swift-ide-test THINLTO_LD64_ADD_FLTO_CODEGEN_ONLY HAS_SWIFT_MODULES ) + +set_property( + TARGET swift-ide-test + APPEND PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/lib/" +) +set_property( + TARGET swift-ide-test + APPEND PROPERTY INSTALL_RPATH "${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/dependencies/swift-tools-support-core/lib/" +) + target_link_libraries(swift-ide-test PRIVATE swiftAST swiftDriver + SwiftDriver swiftFrontend swiftIDE swiftIDETool - swiftCompilerModules) + swiftCompilerModules + libSwiftScanDependencies) +target_sources(swift-ide-test + PRIVATE + $) # If libxml2 is available, make it available for swift-ide-test. if(LLVM_ENABLE_LIBXML2) diff --git a/tools/swift-ide-test/swift-ide-test.cpp b/tools/swift-ide-test/swift-ide-test.cpp index 8ea7ceaf6bc3a..975553000162c 100644 --- a/tools/swift-ide-test/swift-ide-test.cpp +++ b/tools/swift-ide-test/swift-ide-test.cpp @@ -4235,6 +4235,28 @@ static int doPrintUSRs(const CompilerInvocation &InitInvok, return 0; } +extern "C" { + typedef enum { + SWIFTDRIVER_TOOLING_DIAGNOSTIC_ERROR = 0, + SWIFTDRIVER_TOOLING_DIAGNOSTIC_WARNING = 1, + SWIFTDRIVER_TOOLING_DIAGNOSTIC_REMARK = 2, + SWIFTDRIVER_TOOLING_DIAGNOSTIC_NOTE = 3 + } swiftdriver_tooling_diagnostic_kind; + bool swift_getSingleFrontendInvocationFromDriverArgumentsV2(const char *, int, const char**, bool(int, const char**), + void(swiftdriver_tooling_diagnostic_kind, const char*), bool); +} +bool displayFrontendArgs(int FrontendArgC, const char ** FrontendArgV) { + llvm::outs() << "SwiftDriver (new) Frontend Arguments BEGIN\n"; + for (int i = 0; i < FrontendArgC; ++i) { + llvm::outs() << FrontendArgV[i] << "\n"; + } + llvm::outs() << "SwiftDriver (new) Frontend Arguments END\n"; + return false; +} +void handleDiagnostic(swiftdriver_tooling_diagnostic_kind diagKind, const char * diagMessage) { + return; +} + static int doTestCreateCompilerInvocation(StringRef DriverPath, ArrayRef Args, bool ForceNoOutputs) { @@ -4256,6 +4278,18 @@ static int doTestCreateCompilerInvocation(StringRef DriverPath, }, ForceNoOutputs); + { + const char **argList = (const char**)malloc(sizeof(const char*) * Args.size()); + for (size_t i = 0; i < Args.size(); ++i) { + argList[i] = Args[i]; + } + bool HadError = swift_getSingleFrontendInvocationFromDriverArgumentsV2( + DriverPath.str().c_str(), Args.size(), argList, + &displayFrontendArgs, + &handleDiagnostic, + ForceNoOutputs); + } + if (HadError) { llvm::errs() << "error: unable to create a CompilerInvocation\n"; return 1; From 07a255d7e531d52329d1aca2fb61c01ea6b8b59f Mon Sep 17 00:00:00 2001 From: Artem Chikin Date: Tue, 17 Sep 2024 16:29:59 -0700 Subject: [PATCH 2/4] Rename 'SwiftOptions' CMake target to 'SwiftOptionDefinitions' to avoid conflict with the new driver's corresponding entry --- include/swift/Option/CMakeLists.txt | 2 +- lib/Driver/CMakeLists.txt | 2 +- lib/Frontend/CMakeLists.txt | 2 +- lib/FrontendTool/CMakeLists.txt | 2 +- lib/Option/CMakeLists.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/swift/Option/CMakeLists.txt b/include/swift/Option/CMakeLists.txt index 524634a680a53..4b0b7d101a6bf 100644 --- a/include/swift/Option/CMakeLists.txt +++ b/include/swift/Option/CMakeLists.txt @@ -1,3 +1,3 @@ set(LLVM_TARGET_DEFINITIONS Options.td) swift_tablegen(Options.inc -gen-opt-parser-defs) -swift_add_public_tablegen_target(SwiftOptions) +swift_add_public_tablegen_target(SwiftOptionDefinitions) diff --git a/lib/Driver/CMakeLists.txt b/lib/Driver/CMakeLists.txt index b5d95832435cc..30cb8356fa850 100644 --- a/lib/Driver/CMakeLists.txt +++ b/lib/Driver/CMakeLists.txt @@ -20,7 +20,7 @@ set(swiftDriver_targetDefines) add_swift_host_library(swiftDriver STATIC ${swiftDriver_sources}) add_dependencies(swiftDriver - SwiftOptions) + SwiftOptionDefinitions) target_link_libraries(swiftDriver PRIVATE swiftAST swiftBasic diff --git a/lib/Frontend/CMakeLists.txt b/lib/Frontend/CMakeLists.txt index 63ec151388e5f..12b7895afe95a 100644 --- a/lib/Frontend/CMakeLists.txt +++ b/lib/Frontend/CMakeLists.txt @@ -23,7 +23,7 @@ add_swift_host_library(swiftFrontend STATIC Serialization.cpp SerializedDiagnosticConsumer.cpp) add_dependencies(swiftFrontend - SwiftOptions) + SwiftOptionDefinitions) target_link_libraries(swiftFrontend PRIVATE swiftAPIDigester swiftAST diff --git a/lib/FrontendTool/CMakeLists.txt b/lib/FrontendTool/CMakeLists.txt index e21505a2d6c57..5df3faa9dae8f 100644 --- a/lib/FrontendTool/CMakeLists.txt +++ b/lib/FrontendTool/CMakeLists.txt @@ -5,7 +5,7 @@ add_swift_host_library(swiftFrontendTool STATIC LoadedModuleTrace.cpp TBD.cpp) add_dependencies(swiftFrontendTool - SwiftOptions) + SwiftOptionDefinitions) target_link_libraries(swiftFrontendTool INTERFACE clangAPINotes clangBasic) diff --git a/lib/Option/CMakeLists.txt b/lib/Option/CMakeLists.txt index 8659377a63d0a..0c11865a8a33b 100644 --- a/lib/Option/CMakeLists.txt +++ b/lib/Option/CMakeLists.txt @@ -2,7 +2,7 @@ add_swift_host_library(swiftOption STATIC Options.cpp SanitizerOptions.cpp) add_dependencies(swiftOption - SwiftOptions) + SwiftOptionDefinitions) target_link_libraries(swiftOption PRIVATE swiftBasic) From a62a0d509541dede069bb3b4d5ea62d6c95470f7 Mon Sep 17 00:00:00 2001 From: Pavel Yaskevich Date: Mon, 21 Jul 2025 21:11:38 -0700 Subject: [PATCH 3/4] [Tests] Switch `swift-ide-test` to use `swift_getSingleFrontendInvocationFromDriverArgumentsV3` This is the most recent version of the API. --- tools/swift-ide-test/swift-ide-test.cpp | 28 +++++++++++++++---------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/tools/swift-ide-test/swift-ide-test.cpp b/tools/swift-ide-test/swift-ide-test.cpp index 975553000162c..8d85f8e530414 100644 --- a/tools/swift-ide-test/swift-ide-test.cpp +++ b/tools/swift-ide-test/swift-ide-test.cpp @@ -4242,8 +4242,9 @@ extern "C" { SWIFTDRIVER_TOOLING_DIAGNOSTIC_REMARK = 2, SWIFTDRIVER_TOOLING_DIAGNOSTIC_NOTE = 3 } swiftdriver_tooling_diagnostic_kind; - bool swift_getSingleFrontendInvocationFromDriverArgumentsV2(const char *, int, const char**, bool(int, const char**), - void(swiftdriver_tooling_diagnostic_kind, const char*), bool); + bool swift_getSingleFrontendInvocationFromDriverArgumentsV3( + const char *, int, const char **, bool(int, const char **), + void(swiftdriver_tooling_diagnostic_kind, const char *), bool, bool); } bool displayFrontendArgs(int FrontendArgC, const char ** FrontendArgV) { llvm::outs() << "SwiftDriver (new) Frontend Arguments BEGIN\n"; @@ -4278,21 +4279,26 @@ static int doTestCreateCompilerInvocation(StringRef DriverPath, }, ForceNoOutputs); + if (HadError) { + llvm::errs() << "error: unable to create a CompilerInvocation\n"; + return 1; + } + { const char **argList = (const char**)malloc(sizeof(const char*) * Args.size()); for (size_t i = 0; i < Args.size(); ++i) { argList[i] = Args[i]; } - bool HadError = swift_getSingleFrontendInvocationFromDriverArgumentsV2( - DriverPath.str().c_str(), Args.size(), argList, - &displayFrontendArgs, - &handleDiagnostic, - ForceNoOutputs); - } - if (HadError) { - llvm::errs() << "error: unable to create a CompilerInvocation\n"; - return 1; + bool NewHadError = swift_getSingleFrontendInvocationFromDriverArgumentsV3( + DriverPath.str().c_str(), Args.size(), argList, &displayFrontendArgs, + &handleDiagnostic, + /*compilerIntegratedTooling=*/true, ForceNoOutputs); + if (NewHadError) { + llvm::errs() + << "error: unable to create a CompilerInvocation (new driver)\n"; + return 1; + } } return 0; From ff94c642c735f49a41266832ef83c2b0a80ac0a8 Mon Sep 17 00:00:00 2001 From: Pavel Yaskevich Date: Tue, 22 Jul 2025 09:58:59 -0700 Subject: [PATCH 4/4] [Tools] `swift-ide-test` should re-export `libSwiftScan` symbols To function properly in "in-process" mode `swift-driver` requires all swift scanner symbols to be present in the binary to be discoverable by dlsym. --- tools/swift-ide-test/CMakeLists.txt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tools/swift-ide-test/CMakeLists.txt b/tools/swift-ide-test/CMakeLists.txt index 5c0419221f8ef..225a656483741 100644 --- a/tools/swift-ide-test/CMakeLists.txt +++ b/tools/swift-ide-test/CMakeLists.txt @@ -5,8 +5,14 @@ else() set(driver_package_configuration_dir "debug") endif() -message(STATUS "${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/cmake/modules/") -message(STATUS "${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/dependencies/swift-tools-support-core/cmake/modules/") +get_target_property(LIB_SCAN_SOURCE_DIR libSwiftScan SOURCE_DIR) + +set(LIB_SCAN_EXPORTED_SYMBOL_FILE + ${LIB_SCAN_SOURCE_DIR}/libSwiftScan.exports) + +message(STATUS "libSwiftScan: ${LIB_SCAN_SOURCE_DIR}") +message(STATUS "swift-driver: ${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/cmake/modules/") +message(STATUS "swift-tools-support-core: ${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/dependencies/swift-tools-support-core/cmake/modules/") set(SwiftDriver_DIR "${CMAKE_BINARY_DIR}/../earlyswiftdriver-${SWIFT_HOST_VARIANT}-${SWIFT_HOST_VARIANT_ARCH}/${driver_package_configuration_dir}/cmake/modules/") @@ -47,6 +53,10 @@ target_sources(swift-ide-test PRIVATE $) +# This is required because swift-driver in "integrated" mode depends on libSwiftScan symbols +# that have to be re-exported from the `libSwiftScan` library. +add_llvm_symbol_exports(swift-ide-test ${LIB_SCAN_EXPORTED_SYMBOL_FILE}) + # If libxml2 is available, make it available for swift-ide-test. if(LLVM_ENABLE_LIBXML2) target_link_libraries(swift-ide-test PRIVATE LibXml2::LibXml2)