Skip to content

Commit e2de0f9

Browse files
committed
Add -print-target-info libSwiftScan entry-points
This change adds the relevant API entry-points to `SwiftScan`. It does not yet transition the driver's current use-sites where we shell out a `swift-frontend` process, but should make it easy to do so.
1 parent f4ce1c6 commit e2de0f9

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

Sources/CSwiftScan/include/swiftscan_header.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,10 @@ typedef struct {
193193
void
194194
(*swiftscan_scan_invocation_dispose)(swiftscan_scan_invocation_t);
195195

196+
//=== Target Info Functions-------- ---------------------------------------===//
197+
swiftscan_string_ref_t
198+
(*swiftscan_compiler_target_info_query)(swiftscan_scan_invocation_t);
199+
196200
//=== Functionality Query Functions ---------------------------------------===//
197201
swiftscan_string_set_t *
198202
(*swiftscan_compiler_supported_arguments_query)(void);

Sources/SwiftDriver/SwiftScan/SwiftScan.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public enum DependencyScanningError: Error, DiagnosticData {
5555
}
5656

5757
/// Wrapper for libSwiftScan, taking care of initialization, shutdown, and dispatching dependency scanning queries.
58-
internal final class SwiftScan {
58+
@_spi(Testing) public final class SwiftScan {
5959
/// The path to the libSwiftScan dylib.
6060
let path: AbsolutePath
6161

@@ -250,6 +250,26 @@ internal final class SwiftScan {
250250
throw DependencyScanningError.argumentQueryFailed
251251
}
252252
}
253+
254+
@_spi(Testing) public func canQueryTargetInfo() -> Bool {
255+
return api.swiftscan_compiler_target_info_query != nil &&
256+
api.swiftscan_string_set_dispose != nil
257+
}
258+
259+
@_spi(Testing) public func queryTargetInfo(invocationCommand: [String])
260+
throws -> FrontendTargetInfo {
261+
// Create and configure the scanner invocation
262+
let invocation = api.swiftscan_scan_invocation_create()
263+
defer { api.swiftscan_scan_invocation_dispose(invocation) }
264+
withArrayOfCStrings(invocationCommand) { invocationStringArray in
265+
api.swiftscan_scan_invocation_set_argv(invocation,
266+
Int32(invocationCommand.count),
267+
invocationStringArray)
268+
}
269+
let targetInfoString = try toSwiftString(api.swiftscan_compiler_target_info_query(invocation))
270+
let targetInfoData = Data(targetInfoString.utf8)
271+
return try JSONDecoder().decode(FrontendTargetInfo.self, from: targetInfoData)
272+
}
253273
}
254274

255275
// Used for testing purposes only
@@ -289,6 +309,10 @@ private extension swiftscan_functions_t {
289309
self.swiftscan_compiler_supported_features_query =
290310
try loadOptional("swiftscan_compiler_supported_features_query")
291311

312+
// Target Info query
313+
self.swiftscan_compiler_target_info_query =
314+
try loadOptional("swiftscan_compiler_target_info_query")
315+
292316
// Dependency scanner serialization/deserialization features
293317
self.swiftscan_scanner_cache_serialize =
294318
try loadOptional("swiftscan_scanner_cache_serialize")

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4061,6 +4061,22 @@ final class SwiftDriverTests: XCTestCase {
40614061
XCTAssertTrue(job.commandLine.contains(.flag("-resource-dir")))
40624062
}
40634063

4064+
do {
4065+
let targetInfoArgs = ["-print-target-info", "-target", "arm64-apple-ios12.0", "-sdk", "bar", "-resource-dir", "baz"]
4066+
let driver = try Driver(args: ["swift"] + targetInfoArgs)
4067+
4068+
let env = ProcessEnv.vars
4069+
let swiftScanLibPath = try Driver.getScanLibPath(of: driver.toolchain,
4070+
hostTriple: driver.hostTriple,
4071+
env: env)
4072+
if localFileSystem.exists(swiftScanLibPath) {
4073+
let libSwiftScanInstance = try SwiftScan(dylib: swiftScanLibPath)
4074+
if libSwiftScanInstance.canQueryTargetInfo() {
4075+
let _ = try libSwiftScanInstance.queryTargetInfo(invocationCommand: targetInfoArgs)
4076+
}
4077+
}
4078+
}
4079+
40644080
do {
40654081
struct MockExecutor: DriverExecutor {
40664082
let resolver: ArgsResolver

0 commit comments

Comments
 (0)