Skip to content

Commit a064bb3

Browse files
committed
Revert "Revert "Add -print-target-info libSwiftScan entry-points""
This reverts commit d8b50c7.
1 parent 5e9a1b5 commit a064bb3

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

Sources/CSwiftScan/include/swiftscan_header.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ typedef struct {
205205
void
206206
(*swiftscan_scan_invocation_dispose)(swiftscan_scan_invocation_t);
207207

208+
//=== Target Info Functions-------- ---------------------------------------===//
209+
swiftscan_string_ref_t
210+
(*swiftscan_compiler_target_info_query)(swiftscan_scan_invocation_t);
211+
208212
//=== Functionality Query Functions ---------------------------------------===//
209213
swiftscan_string_set_t *
210214
(*swiftscan_compiler_supported_arguments_query)(void);

Sources/SwiftDriver/SwiftScan/SwiftScan.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
import func Foundation.strdup
1616
import func Foundation.free
17+
import class Foundation.JSONDecoder
18+
import struct Foundation.Data
1719

1820
import protocol TSCBasic.DiagnosticData
1921
import struct TSCBasic.AbsolutePath
@@ -81,7 +83,7 @@ internal extension swiftscan_diagnostic_severity_t {
8183
}
8284

8385
/// Wrapper for libSwiftScan, taking care of initialization, shutdown, and dispatching dependency scanning queries.
84-
internal final class SwiftScan {
86+
@_spi(Testing) public final class SwiftScan {
8587
/// The path to the libSwiftScan dylib.
8688
let path: AbsolutePath
8789

@@ -308,6 +310,26 @@ internal final class SwiftScan {
308310
throw DependencyScanningError.argumentQueryFailed
309311
}
310312
}
313+
314+
@_spi(Testing) public func canQueryTargetInfo() -> Bool {
315+
return api.swiftscan_compiler_target_info_query != nil &&
316+
api.swiftscan_string_set_dispose != nil
317+
}
318+
319+
@_spi(Testing) public func queryTargetInfo(invocationCommand: [String])
320+
throws -> FrontendTargetInfo {
321+
// Create and configure the scanner invocation
322+
let invocation = api.swiftscan_scan_invocation_create()
323+
defer { api.swiftscan_scan_invocation_dispose(invocation) }
324+
withArrayOfCStrings(invocationCommand) { invocationStringArray in
325+
api.swiftscan_scan_invocation_set_argv(invocation,
326+
Int32(invocationCommand.count),
327+
invocationStringArray)
328+
}
329+
let targetInfoString = try toSwiftString(api.swiftscan_compiler_target_info_query(invocation))
330+
let targetInfoData = Data(targetInfoString.utf8)
331+
return try JSONDecoder().decode(FrontendTargetInfo.self, from: targetInfoData)
332+
}
311333
}
312334

313335
// Used for testing purposes only
@@ -347,6 +369,10 @@ private extension swiftscan_functions_t {
347369
self.swiftscan_compiler_supported_features_query =
348370
try loadOptional("swiftscan_compiler_supported_features_query")
349371

372+
// Target Info query
373+
self.swiftscan_compiler_target_info_query =
374+
try loadOptional("swiftscan_compiler_target_info_query")
375+
350376
// Dependency scanner serialization/deserialization features
351377
self.swiftscan_scanner_cache_serialize =
352378
try loadOptional("swiftscan_scanner_cache_serialize")

Tests/SwiftDriverTests/SwiftDriverTests.swift

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

47214721
func testPrintTargetInfo() throws {
47224722
do {
4723-
var driver = try Driver(args: ["swift", "-print-target-info", "-target", "arm64-apple-ios12.0", "-sdk", "bar", "-resource-dir", "baz"])
4723+
var driver = try Driver(args: ["swift", "-print-target-info", "-sdk", "bar", "-resource-dir", "baz"])
47244724
let plannedJobs = try driver.planBuild()
47254725
XCTAssertTrue(plannedJobs.count == 1)
47264726
let job = plannedJobs[0]
@@ -4731,6 +4731,22 @@ final class SwiftDriverTests: XCTestCase {
47314731
XCTAssertTrue(job.commandLine.contains(.flag("-resource-dir")))
47324732
}
47334733

4734+
do {
4735+
let targetInfoArgs = ["-print-target-info", "-sdk", "bar", "-resource-dir", "baz"]
4736+
let driver = try Driver(args: ["swift"] + targetInfoArgs)
4737+
4738+
let env = ProcessEnv.vars
4739+
let swiftScanLibPath = try Driver.getScanLibPath(of: driver.toolchain,
4740+
hostTriple: driver.hostTriple,
4741+
env: env)
4742+
if localFileSystem.exists(swiftScanLibPath) {
4743+
let libSwiftScanInstance = try SwiftScan(dylib: swiftScanLibPath)
4744+
if libSwiftScanInstance.canQueryTargetInfo() {
4745+
let _ = try libSwiftScanInstance.queryTargetInfo(invocationCommand: targetInfoArgs)
4746+
}
4747+
}
4748+
}
4749+
47344750
do {
47354751
struct MockExecutor: DriverExecutor {
47364752
let resolver: ArgsResolver

0 commit comments

Comments
 (0)