Skip to content

Commit 3ec1f9e

Browse files
committed
Add support for static linking and swiftrt.o
1 parent 9fdda9e commit 3ec1f9e

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

lib/Driver/Driver.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,18 +215,18 @@ Driver::buildToolChain(const llvm::opt::InputArgList &ArgList) {
215215
break;
216216
case llvm::Triple::Linux:
217217
if (target.isAndroid())
218-
return llvm::make_unique<toolchains::Android>(driver, target);
218+
return llvm::make_unique<toolchains::Android>(*this, target);
219219
else
220-
return llvm::make_unique<toolchains::GenericUnix>(driver, target);
220+
return llvm::make_unique<toolchains::GenericUnix>(*this, target);
221221
break;
222222
case llvm::Triple::FreeBSD:
223223
return llvm::make_unique<toolchains::GenericUnix>(*this, target);
224224
break;
225225
case llvm::Triple::Win32:
226226
if (target.isWindowsCygwinEnvironment())
227-
return llvm::make_unique<toolchains::Cygwin>(driver, target);
227+
return llvm::make_unique<toolchains::Cygwin>(*this, target);
228228
else
229-
return llvm::make_unique<toolchains::Windows>(driver, target);
229+
return llvm::make_unique<toolchains::Windows>(*this, target);
230230
break;
231231
case llvm::Triple::Haiku:
232232
return llvm::make_unique<toolchains::GenericUnix>(*this, target);

lib/Driver/ToolChains.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,18 +1581,39 @@ toolchains::Windows::constructInvocation(const LinkJobAction &job,
15811581
Arguments.push_back(context.Args.MakeArgString(Target));
15821582
}
15831583

1584+
15841585
SmallString<128> SharedRuntimeLibPath;
15851586
getRuntimeLibraryPath(SharedRuntimeLibPath, context.Args, *this);
1586-
1587-
// Add the runtime library link path, which is platform-specific and found
1588-
// relative to the compiler.
1587+
1588+
// Link the standard library.
15891589
Arguments.push_back("-L");
1590-
Arguments.push_back(context.Args.MakeArgString(SharedRuntimeLibPath + "/"
1590+
if (context.Args.hasFlag(options::OPT_static_stdlib,
1591+
options::OPT_no_static_stdlib,
1592+
false)) {
1593+
SmallString<128> StaticRuntimeLibPath;
1594+
getRuntimeStaticLibraryPath(StaticRuntimeLibPath, context.Args, *this);
1595+
1596+
// Since Windows has separate libraries per architecture, link against the
1597+
// architecture specific version of the static library.
1598+
Arguments.push_back(context.Args.MakeArgString(StaticRuntimeLibPath + "/"
1599+
+ getTriple().getArchName()));
1600+
1601+
Arguments.push_back("-Xlinker");
1602+
Arguments.push_back("/NODEFAULTLIB:libcmt");
1603+
} else {
1604+
Arguments.push_back(context.Args.MakeArgString(SharedRuntimeLibPath + "/"
15911605
+ getTriple().getArchName()));
1606+
}
15921607

1608+
SmallString<128> swiftrtPath = SharedRuntimeLibPath;
1609+
llvm::sys::path::append(swiftrtPath,
1610+
swift::getMajorArchitectureName(getTriple()));
1611+
llvm::sys::path::append(swiftrtPath, "swiftrt.o");
1612+
Arguments.push_back(context.Args.MakeArgString(swiftrtPath));
1613+
15931614
addPrimaryInputsOfType(Arguments, context.Inputs, types::TY_Object);
15941615
addInputsOfType(Arguments, context.InputActions, types::TY_Object);
1595-
1616+
15961617
for (const Arg *arg : context.Args.filtered(options::OPT_F,
15971618
options::OPT_Fsystem)) {
15981619
if (arg->getOption().matches(options::OPT_Fsystem))

test/Driver/sdk.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
// WINDOWS: -sdk {{.*}}/Inputs/clang-importer-sdk
4141
// WINDOWS-NEXT: bin/swift
4242
// WINDOWS: -sdk {{.*}}/Inputs/clang-importer-sdk
43-
// WINDOWS: bin/{{.+}} {{.*}}.o{{[ "]}}
43+
// WINDOWS: bin/{{.+}} {{.*}}swiftrt.o
4444
// WINDOWS: {{-syslibroot|--sysroot}} {{.*}}/Inputs/clang-importer-sdk
4545

4646
// RUN: %swift_driver -driver-print-jobs -repl -sdk %S/Inputs/nonexistent-sdk 2>&1 | %FileCheck %s --check-prefix=SDKWARNING

0 commit comments

Comments
 (0)