Skip to content

Commit a64ead3

Browse files
committed
Don't pass -rpath and -lswiftCore for embedded Wasm
These options already aren't passed to the linker when linking statically, we shouldn't pass them in embedded mode either, where everything is linked statically too.
1 parent 8e47ffe commit a64ead3

File tree

3 files changed

+34
-8
lines changed

3 files changed

+34
-8
lines changed

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

+15-6
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,10 @@ extension Driver {
112112
commandLine.appendFlag("-aarch64-use-tbi")
113113
}
114114

115-
let experimentalFeatures = parsedOptions.arguments(for: .enableExperimentalFeature)
116-
let embeddedEnabled = experimentalFeatures.map(\.argument).map(\.asSingle).contains("Embedded")
115+
let isEmbeddedEnabled = parsedOptions.isEmbeddedEnabled
117116

118117
// Enable or disable ObjC interop appropriately for the platform
119-
if targetTriple.isDarwin && !embeddedEnabled {
118+
if targetTriple.isDarwin && !isEmbeddedEnabled {
120119
commandLine.appendFlag(.enableObjcInterop)
121120
} else {
122121
commandLine.appendFlag(.disableObjcInterop)
@@ -130,18 +129,18 @@ extension Driver {
130129
commandLine.appendFlag("-stdlib=\(stdlibVariant)")
131130
}
132131

133-
if embeddedEnabled && parsedOptions.hasArgument(.enableLibraryEvolution) {
132+
if isEmbeddedEnabled && parsedOptions.hasArgument(.enableLibraryEvolution) {
134133
diagnosticEngine.emit(.error_no_library_evolution_embedded)
135134
throw ErrorDiagnostics.emitted
136135
}
137136

138-
if embeddedEnabled &&
137+
if isEmbeddedEnabled &&
139138
(!parsedOptions.hasArgument(.wmo) || !parsedOptions.hasArgument(.wholeModuleOptimization)) {
140139
diagnosticEngine.emit(.error_need_wmo_embedded)
141140
throw ErrorDiagnostics.emitted
142141
}
143142

144-
if embeddedEnabled && parsedOptions.hasArgument(.enableObjcInterop) {
143+
if isEmbeddedEnabled && parsedOptions.hasArgument(.enableObjcInterop) {
145144
diagnosticEngine.emit(.error_no_objc_interop_embedded)
146145
throw ErrorDiagnostics.emitted
147146
}
@@ -873,3 +872,13 @@ extension Driver {
873872
return try cas.computeCacheKey(commandLine: arguments, input: remappedPath.name)
874873
}
875874
}
875+
876+
extension ParsedOptions {
877+
/// Checks whether experimental embedded mode is enabled.
878+
var isEmbeddedEnabled: Bool {
879+
mutating get {
880+
let experimentalFeatures = self.arguments(for: .enableExperimentalFeature)
881+
return experimentalFeatures.map(\.argument).map(\.asSingle).contains("Embedded")
882+
}
883+
}
884+
}

Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,13 @@ extension GenericUnixToolchain {
158158
let staticExecutable = parsedOptions.hasFlag(positive: .staticExecutable,
159159
negative: .noStaticExecutable,
160160
default: false)
161+
let isEmbeddedEnabled = parsedOptions.isEmbeddedEnabled
162+
161163
let toolchainStdlibRpath = parsedOptions
162164
.hasFlag(positive: .toolchainStdlibRpath,
163165
negative: .noToolchainStdlibRpath,
164166
default: true)
165-
let hasRuntimeArgs = !(staticStdlib || staticExecutable)
167+
let hasRuntimeArgs = !(staticStdlib || staticExecutable || isEmbeddedEnabled)
166168

167169
let runtimePaths = try runtimeLibraryPaths(
168170
for: targetInfo,
@@ -251,7 +253,7 @@ extension GenericUnixToolchain {
251253
linkFilePath = linkFilePath?.appending(component: "static-executable-args.lnk")
252254
} else if staticStdlib {
253255
linkFilePath = linkFilePath?.appending(component: "static-stdlib-args.lnk")
254-
} else {
256+
} else if !isEmbeddedEnabled {
255257
linkFilePath = nil
256258
commandLine.appendFlag("-lswiftCore")
257259
}

Tests/SwiftDriverTests/SwiftDriverTests.swift

+15
Original file line numberDiff line numberDiff line change
@@ -6482,6 +6482,9 @@ final class SwiftDriverTests: XCTestCase {
64826482
}
64836483

64846484
func testEmbeddedSwiftOptions() throws {
6485+
var env = ProcessEnv.vars
6486+
env["SWIFT_DRIVER_SWIFT_AUTOLINK_EXTRACT_EXEC"] = "/garbage/swift-autolink-extract"
6487+
64856488
do {
64866489
var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-macosx10.13", "test.swift", "-enable-experimental-feature", "Embedded", "-parse-as-library", "-wmo", "-o", "a.out", "-module-name", "main"])
64876490
let plannedJobs = try driver.planBuild()
@@ -6491,6 +6494,18 @@ final class SwiftDriverTests: XCTestCase {
64916494
XCTAssertTrue(compileJob.commandLine.contains(.flag("-disable-objc-interop")))
64926495
XCTAssertFalse(linkJob.commandLine.contains(.flag("-force_load")))
64936496
}
6497+
do {
6498+
var driver = try Driver(args: ["swiftc", "-target", "wasm32-none-none-wasm", "test.swift", "-enable-experimental-feature", "Embedded", "-wmo", "-o", "a.wasm"], env: env)
6499+
let plannedJobs = try driver.planBuild()
6500+
XCTAssertEqual(plannedJobs.count, 3)
6501+
let compileJob = plannedJobs[0]
6502+
let _ /*autolinkJob*/ = plannedJobs[1]
6503+
let linkJob = plannedJobs[2]
6504+
XCTAssertTrue(compileJob.commandLine.contains(.flag("-disable-objc-interop")))
6505+
XCTAssertFalse(linkJob.commandLine.contains(.flag("-force_load")))
6506+
XCTAssertFalse(linkJob.commandLine.contains(.flag("-rpath")))
6507+
XCTAssertFalse(linkJob.commandLine.contains(.flag("-lswiftCore")))
6508+
}
64946509
do {
64956510
let diags = DiagnosticsEngine()
64966511
var driver = try Driver(args: ["swiftc", "-target", "arm64-apple-macosx10.13", "test.swift", "-enable-experimental-feature", "Embedded", "-parse-as-library", "-wmo", "-o", "a.out", "-module-name", "main", "-enable-library-evolution"], diagnosticsEngine: diags)

0 commit comments

Comments
 (0)