Skip to content

Commit ed1b8c2

Browse files
committed
Fix CRT support for Windows
1 parent d8c4f60 commit ed1b8c2

File tree

3 files changed

+42
-13
lines changed

3 files changed

+42
-13
lines changed

Sources/SwiftDriver/Driver/Driver.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,9 @@ public struct Driver {
370370
self.numParallelJobs = Self.determineNumParallelJobs(&parsedOptions, diagnosticsEngine: diagnosticEngine, env: env)
371371

372372
Self.validateWarningControlArgs(&parsedOptions, diagnosticEngine: diagnosticEngine)
373+
Self.validateCRuntimeArgs(&parsedOptions,
374+
diagnosticEngine: diagnosticsEngine,
375+
targetTriple: self.frontendTargetInfo.target.triple)
373376
Self.validateProfilingArgs(&parsedOptions,
374377
fileSystem: fileSystem,
375378
workingDirectory: workingDirectory,
@@ -1660,6 +1663,14 @@ extension Driver {
16601663
}
16611664
}
16621665

1666+
static func validateCRuntimeArgs(_ parsedOptions: inout ParsedOptions,
1667+
diagnosticEngine: DiagnosticsEngine,
1668+
targetTriple: Triple) {
1669+
if parsedOptions.hasArgument(.libc) && !targetTriple.isWindows {
1670+
diagnosticEngine.emit(.error_unsupported_opt_for_target(arg: "-libc", target: targetTriple))
1671+
}
1672+
}
1673+
16631674
static func validateProfilingArgs(_ parsedOptions: inout ParsedOptions,
16641675
fileSystem: FileSystem,
16651676
workingDirectory: AbsolutePath?,

Sources/SwiftDriver/Jobs/WindowsToolchain+LinkerSupport.swift

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,20 @@ extension WindowsToolchain {
7575
}
7676
commandLine.appendFlag("-fuse-ld=\(linker)")
7777

78+
// FIXME: Do we really need `oldnames`?
79+
commandLine.appendFlags("-autolink-library", "oldnames")
80+
if let crt = parsedOptions.getLastArgument(.libc) {
81+
switch crt.asSingle {
82+
case "MT": commandLine.appendFlags("-autolink-library", "libcmt")
83+
case "MTd": commandLine.appendFlags("-autolink-library", "libcmtd")
84+
case "MD": commandLine.appendFlags("-autolink-library", "msvcrt")
85+
case "MDd": commandLine.appendFlags("-autolink-library", "msvcrtd")
86+
default: fatalError("Invalid C runtime value should be filtered")
87+
}
88+
} else {
89+
commandLine.appendFlags("-autolink-library", "msvcrt")
90+
}
91+
7892
let staticStdlib = parsedOptions.hasFlag(positive: .staticStdlib,
7993
negative: .noStaticStdlib,
8094
default: false)
@@ -152,11 +166,6 @@ extension WindowsToolchain {
152166
}
153167
}
154168

155-
if parsedOptions.hasArgument(.profileGenerate) {
156-
// Profiling support for Windows isn't ready yet. It should have been disabled.
157-
fatalError("Profiling support should have been disabled on Windows.")
158-
}
159-
160169
// Run clang++ in verbose mode if "-v" is set
161170
try commandLine.appendLast(.v, from: &parsedOptions)
162171

Sources/SwiftDriver/Toolchains/WindowsToolchain.swift

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,25 @@ extension WindowsToolchain {
117117
if parsedOptions.hasArgument(.profileUse) {
118118
throw ToolchainValidationError.argumentNotSupported("-profile-use=")
119119
}
120+
121+
if let crt = parsedOptions.getLastArgument(.libc) {
122+
if !["MT", "MTd", "MD", "MDd"].contains(crt.asSingle) {
123+
throw ToolchainValidationError.illegalCrtName(crt.asSingle)
124+
}
125+
}
120126
}
121-
}
122-
123-
public enum ToolchainValidationError: Error, DiagnosticData {
124-
case argumentNotSupported(String)
125127

126-
public var description: String {
127-
switch self {
128-
case .argumentNotSupported(let argument):
129-
return "\(argument) is not supported for Windows"
128+
public enum ToolchainValidationError: Error, DiagnosticData {
129+
case argumentNotSupported(String)
130+
case illegalCrtName(String)
131+
132+
public var description: String {
133+
switch self {
134+
case .argumentNotSupported(let argument):
135+
return "\(argument) is not supported for Windows"
136+
case .illegalCrtName(let argument):
137+
return "\(argument) is not a valid C Runtime for Windows"
138+
}
130139
}
131140
}
132141
}

0 commit comments

Comments
 (0)