Skip to content

Commit 706f606

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 a7ec74f commit 706f606

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

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

251271
// Used for testing purposes only
@@ -285,6 +305,10 @@ private extension swiftscan_functions_t {
285305
self.swiftscan_compiler_supported_features_query =
286306
try loadOptional("swiftscan_compiler_supported_features_query")
287307

308+
// Target Info query
309+
self.swiftscan_compiler_target_info_query =
310+
try loadOptional("swiftscan_compiler_target_info_query")
311+
288312
// Dependency scanner serialization/deserialization features
289313
self.swiftscan_scanner_cache_serialize =
290314
try loadOptional("swiftscan_scanner_cache_serialize")

Tests/SwiftDriverTests/SwiftDriverTests.swift

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

3843+
do {
3844+
let targetInfoArgs = ["-print-target-info", "-target", "arm64-apple-ios12.0", "-sdk", "bar", "-resource-dir", "baz"]
3845+
let driver = try Driver(args: ["swift"] + targetInfoArgs)
3846+
3847+
let env = ProcessEnv.vars
3848+
let swiftScanLibPath = try Driver.getScanLibPath(of: driver.toolchain,
3849+
hostTriple: driver.hostTriple,
3850+
env: env)
3851+
if localFileSystem.exists(swiftScanLibPath) {
3852+
let libSwiftScanInstance = try SwiftScan(dylib: swiftScanLibPath)
3853+
if libSwiftScanInstance.canQueryTargetInfo() {
3854+
let _ = try libSwiftScanInstance.queryTargetInfo(invocationCommand: targetInfoArgs)
3855+
}
3856+
}
3857+
}
3858+
38433859
do {
38443860
struct MockExecutor: DriverExecutor {
38453861
let resolver: ArgsResolver

0 commit comments

Comments
 (0)