diff --git a/include/swift-c/DependencyScan/DependencyScan.h b/include/swift-c/DependencyScan/DependencyScan.h index eb13e82c6403d..4de2a6ea95104 100644 --- a/include/swift-c/DependencyScan/DependencyScan.h +++ b/include/swift-c/DependencyScan/DependencyScan.h @@ -303,6 +303,9 @@ swiftscan_compiler_supported_features_query(); //=== Target-Info Functions -----------------------------------------------===// SWIFTSCAN_PUBLIC swiftscan_string_ref_t swiftscan_compiler_target_info_query(swiftscan_scan_invocation_t invocation); +SWIFTSCAN_PUBLIC swiftscan_string_ref_t +swiftscan_compiler_target_info_query_v2(swiftscan_scan_invocation_t invocation, + const char *main_executable_path); //=== Scanner Functions ---------------------------------------------------===// diff --git a/include/swift/DependencyScan/DependencyScanningTool.h b/include/swift/DependencyScan/DependencyScanningTool.h index ec7eb810ba949..6792cde8b3ccc 100644 --- a/include/swift/DependencyScan/DependencyScanningTool.h +++ b/include/swift/DependencyScan/DependencyScanningTool.h @@ -48,7 +48,8 @@ class DependencyScannerDiagnosticCollectingConsumer : public DiagnosticConsumer /// Given a set of arguments to a print-target-info frontend tool query, produce the /// JSON target info. -llvm::ErrorOr getTargetInfo(ArrayRef Command); +llvm::ErrorOr getTargetInfo(ArrayRef Command, + const char *main_executable_path); /// The high-level implementation of the dependency scanner that runs on /// an individual worker thread. diff --git a/lib/DependencyScan/DependencyScanningTool.cpp b/lib/DependencyScan/DependencyScanningTool.cpp index 3afc4032a9530..6f01bfab37a96 100644 --- a/lib/DependencyScan/DependencyScanningTool.cpp +++ b/lib/DependencyScan/DependencyScanningTool.cpp @@ -26,7 +26,8 @@ namespace swift { namespace dependencies { -llvm::ErrorOr getTargetInfo(ArrayRef Command) { +llvm::ErrorOr getTargetInfo(ArrayRef Command, + const char *main_executable_path) { // We must reset option occurrences because we are handling an unrelated // command-line to those possibly parsed before using the same tool. // We must do so because LLVM options parsing is done using a managed @@ -45,7 +46,7 @@ llvm::ErrorOr getTargetInfo(ArrayRef Comma SourceManager dummySM; DiagnosticEngine DE(dummySM); CompilerInvocation Invocation; - if (Invocation.parseArgs(Args, DE)) { + if (Invocation.parseArgs(Args, DE, nullptr, {}, main_executable_path)) { return std::make_error_code(std::errc::invalid_argument); } @@ -235,7 +236,8 @@ DependencyScanningTool::initCompilerInstanceForScan( // We must do so because LLVM options parsing is done using a managed // static `GlobalParser`. llvm::cl::ResetAllOptionOccurrences(); - if (Invocation.parseArgs(CommandArgs, Instance->getDiags())) { + if (Invocation.parseArgs(CommandArgs, Instance->getDiags(), + nullptr, WorkingDirectory, "/tmp/foo")) { return std::make_error_code(std::errc::invalid_argument); } diff --git a/tools/libSwiftScan/libSwiftScan.cpp b/tools/libSwiftScan/libSwiftScan.cpp index baf1e3a039ce1..7d043f54acb4c 100644 --- a/tools/libSwiftScan/libSwiftScan.cpp +++ b/tools/libSwiftScan/libSwiftScan.cpp @@ -507,12 +507,18 @@ static void addFrontendFlagOption(llvm::opt::OptTable &table, swiftscan_string_ref_t swiftscan_compiler_target_info_query(swiftscan_scan_invocation_t invocation) { + return swiftscan_compiler_target_info_query_v2(invocation, nullptr); +} + +swiftscan_string_ref_t +swiftscan_compiler_target_info_query_v2(swiftscan_scan_invocation_t invocation, + const char *main_executable_path) { int argc = invocation->argv->count; std::vector Compilation; for (int i = 0; i < argc; ++i) Compilation.push_back(swift::c_string_utils::get_C_string(invocation->argv->strings[i])); - auto TargetInfo = swift::dependencies::getTargetInfo(Compilation); + auto TargetInfo = swift::dependencies::getTargetInfo(Compilation, main_executable_path); if (TargetInfo.getError()) return swift::c_string_utils::create_null(); return TargetInfo.get(); diff --git a/tools/libSwiftScan/libSwiftScan.exports b/tools/libSwiftScan/libSwiftScan.exports index b39053cfb4b25..abfcc6c820607 100644 --- a/tools/libSwiftScan/libSwiftScan.exports +++ b/tools/libSwiftScan/libSwiftScan.exports @@ -58,6 +58,7 @@ swiftscan_scanner_dispose swiftscan_compiler_supported_arguments_query swiftscan_compiler_supported_features_query swiftscan_compiler_target_info_query +swiftscan_compiler_target_info_query_v2 swiftscan_scanner_cache_serialize swiftscan_scanner_cache_load swiftscan_scanner_cache_reset diff --git a/unittests/DependencyScan/PrintTarget.cpp b/unittests/DependencyScan/PrintTarget.cpp index ff45b760f32e5..9f9e9587d3699 100644 --- a/unittests/DependencyScan/PrintTarget.cpp +++ b/unittests/DependencyScan/PrintTarget.cpp @@ -36,7 +36,13 @@ TEST_F(ScanTest, TestTargetInfoQuery) { for (auto &str : CommandStrArr) Compilation.push_back(str.c_str()); - auto targetInfo = swift::dependencies::getTargetInfo(Compilation); + SmallString<128> pathRoot(llvm::sys::path::root_directory(SWIFTLIB_DIR)); + SmallString<128> compilerPath(pathRoot); + llvm::sys::path::append(compilerPath, "foo", "bar", "bin", "swift-frontend"); + SmallString<128> relativeLibPath(pathRoot); + llvm::sys::path::append(relativeLibPath, "foo", "bar", "lib", "swift");; + + auto targetInfo = swift::dependencies::getTargetInfo(Compilation, compilerPath.c_str()); if (targetInfo.getError()) { llvm::errs() << "For compilation: "; for (auto &str : Compilation) @@ -45,6 +51,8 @@ TEST_F(ScanTest, TestTargetInfoQuery) { } auto targetInfoStr = std::string(swift::c_string_utils::get_C_string(targetInfo.get())); + std::string expectedRuntimeResourcePath = "\"runtimeResourcePath\": \"" + relativeLibPath.str().str() + "\""; EXPECT_NE(targetInfoStr.find("\"triple\": \"x86_64-apple-macosx12.0\""), std::string::npos); EXPECT_NE(targetInfoStr.find("\"librariesRequireRPath\": false"), std::string::npos); + EXPECT_NE(targetInfoStr.find(expectedRuntimeResourcePath.c_str()), std::string::npos); }