Skip to content

Commit a75dcae

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 ec0aec7 commit a75dcae

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
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
@@ -56,7 +56,7 @@ public enum DependencyScanningError: Error, DiagnosticData {
5656
}
5757

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

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

256276
// Used for testing purposes only
@@ -290,6 +310,10 @@ private extension swiftscan_functions_t {
290310
self.swiftscan_compiler_supported_features_query =
291311
try loadOptional("swiftscan_compiler_supported_features_query")
292312

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

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4649,7 +4649,7 @@ final class SwiftDriverTests: XCTestCase {
46494649

46504650
func testPrintTargetInfo() throws {
46514651
do {
4652-
var driver = try Driver(args: ["swift", "-print-target-info", "-target", "arm64-apple-ios12.0", "-sdk", "bar", "-resource-dir", "baz"])
4652+
var driver = try Driver(args: ["swift", "-print-target-info", "-sdk", "bar", "-resource-dir", "baz"])
46534653
let plannedJobs = try driver.planBuild()
46544654
XCTAssertTrue(plannedJobs.count == 1)
46554655
let job = plannedJobs[0]
@@ -4660,6 +4660,22 @@ final class SwiftDriverTests: XCTestCase {
46604660
XCTAssertTrue(job.commandLine.contains(.flag("-resource-dir")))
46614661
}
46624662

4663+
do {
4664+
let targetInfoArgs = ["-print-target-info", "-sdk", "bar", "-resource-dir", "baz"]
4665+
let driver = try Driver(args: ["swift"] + targetInfoArgs)
4666+
4667+
let env = ProcessEnv.vars
4668+
let swiftScanLibPath = try Driver.getScanLibPath(of: driver.toolchain,
4669+
hostTriple: driver.hostTriple,
4670+
env: env)
4671+
if localFileSystem.exists(swiftScanLibPath) {
4672+
let libSwiftScanInstance = try SwiftScan(dylib: swiftScanLibPath)
4673+
if libSwiftScanInstance.canQueryTargetInfo() {
4674+
let _ = try libSwiftScanInstance.queryTargetInfo(invocationCommand: targetInfoArgs)
4675+
}
4676+
}
4677+
}
4678+
46634679
do {
46644680
struct MockExecutor: DriverExecutor {
46654681
let resolver: ArgsResolver

0 commit comments

Comments
 (0)