Skip to content

Commit 3ad8250

Browse files
committed
Add rust-mingw component for *-windows-gnullvm
hosts
1 parent 2fcbda6 commit 3ad8250

File tree

7 files changed

+65
-11
lines changed

7 files changed

+65
-11
lines changed

compiler/rustc_target/src/spec/base/windows_gnullvm.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use std::borrow::Cow;
22

3+
use crate::spec::crt_objects::pre_mingw_self_contained;
34
use crate::spec::{
4-
Abi, BinaryFormat, Cc, DebuginfoKind, Env, LinkerFlavor, Lld, Os, SplitDebuginfo,
5-
TargetOptions, cvs,
5+
Abi, BinaryFormat, Cc, DebuginfoKind, Env, LinkSelfContainedDefault, LinkerFlavor, Lld, Os,
6+
SplitDebuginfo, TargetOptions, add_link_args, cvs,
67
};
78

89
pub(crate) fn opts() -> TargetOptions {
@@ -15,10 +16,11 @@ pub(crate) fn opts() -> TargetOptions {
1516
&["-nolibc", "--unwindlib=none"],
1617
);
1718
// Order of `late_link_args*` does not matter with LLD.
18-
let late_link_args = TargetOptions::link_args(
19-
LinkerFlavor::Gnu(Cc::Yes, Lld::No),
20-
&["-lmingw32", "-lmingwex", "-lmsvcrt", "-lkernel32", "-luser32"],
21-
);
19+
let mingw_libs = &["-lmingw32", "-lmingwex", "-lmsvcrt", "-lkernel32", "-luser32"];
20+
21+
let mut late_link_args =
22+
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No), mingw_libs);
23+
add_link_args(&mut late_link_args, LinkerFlavor::Gnu(Cc::Yes, Lld::No), mingw_libs);
2224

2325
TargetOptions {
2426
os: Os::Windows,
@@ -36,6 +38,8 @@ pub(crate) fn opts() -> TargetOptions {
3638
binary_format: BinaryFormat::Coff,
3739
allows_weak_linkage: false,
3840
pre_link_args,
41+
pre_link_objects_self_contained: pre_mingw_self_contained(),
42+
link_self_contained: LinkSelfContainedDefault::InferredForMingw,
3943
late_link_args,
4044
abi_return_struct_as_int: true,
4145
emit_debug_gdb_scripts: false,

compiler/rustc_target/src/spec/targets/aarch64_pc_windows_gnullvm.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
use crate::spec::{Arch, FramePointer, Target, TargetMetadata, base};
1+
use crate::spec::{Arch, Cc, FramePointer, LinkerFlavor, Lld, Target, TargetMetadata, base};
22

33
pub(crate) fn target() -> Target {
44
let mut base = base::windows_gnullvm::opts();
55
base.max_atomic_width = Some(128);
66
base.features = "+v8a,+neon,+fp-armv8".into();
77
base.linker = Some("aarch64-w64-mingw32-clang".into());
8+
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No), &["-m", "arm64pe"]);
89

910
// Microsoft recommends enabling frame pointers on Arm64 Windows.
1011
// From https://learn.microsoft.com/en-us/cpp/build/arm64-windows-abi-conventions?view=msvc-170#integer-registers

compiler/rustc_target/src/spec/targets/x86_64_pc_windows_gnullvm.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ pub(crate) fn target() -> Target {
66
base.features = "+cx16,+sse3,+sahf".into();
77
base.plt_by_default = false;
88
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]);
9+
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No), &["-m", "i386pep"]);
910
base.max_atomic_width = Some(128);
1011
base.linker = Some("x86_64-w64-mingw32-clang".into());
1112

src/bootstrap/src/core/build_steps/compile.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ fn copy_self_contained_objects(
448448
DependencyType::TargetSelfContained,
449449
);
450450
}
451-
} else if target.is_windows_gnu() {
451+
} else if target.is_windows_gnu() || target.is_windows_gnullvm() {
452452
for obj in ["crt2.o", "dllcrt2.o"].iter() {
453453
let src = compiler_file(builder, &builder.cc(target), target, CLang::C, obj);
454454
let dst = libdir_self_contained.join(obj);

src/bootstrap/src/core/build_steps/dist.rs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,44 @@ fn make_win_dist(plat_root: &Path, target: TargetSelection, builder: &Builder<'_
295295
}
296296
}
297297

298+
fn make_win_llvm_dist(plat_root: &Path, target: TargetSelection, builder: &Builder<'_>) {
299+
if builder.config.dry_run() {
300+
return;
301+
}
302+
303+
let (_, lib_path) = get_cc_search_dirs(target, builder);
304+
305+
// Libraries necessary to link the windows-gnullvm toolchains.
306+
// System libraries will be preferred if they are available (see #67429).
307+
let target_libs = [
308+
// MinGW libs
309+
"libunwind.a",
310+
"libunwind.dll.a",
311+
"libmingw32.a",
312+
"libmingwex.a",
313+
"libmsvcrt.a",
314+
// Windows import libs, remove them once std transitions to raw-dylib
315+
"libkernel32.a",
316+
"libuser32.a",
317+
"libntdll.a",
318+
"libuserenv.a",
319+
"libws2_32.a",
320+
"libdbghelp.a",
321+
];
322+
323+
//Find mingw artifacts we want to bundle
324+
let target_libs = find_files(&target_libs, &lib_path);
325+
326+
//Copy platform libs to platform-specific lib directory
327+
let plat_target_lib_self_contained_dir =
328+
plat_root.join("lib/rustlib").join(target).join("lib/self-contained");
329+
fs::create_dir_all(&plat_target_lib_self_contained_dir)
330+
.expect("creating plat_target_lib_self_contained_dir failed");
331+
for src in target_libs {
332+
builder.copy_link_to_folder(&src, &plat_target_lib_self_contained_dir);
333+
}
334+
}
335+
298336
fn runtime_dll_dist(rust_root: &Path, target: TargetSelection, builder: &Builder<'_>) {
299337
if builder.config.dry_run() {
300338
return;
@@ -394,14 +432,20 @@ impl Step for Mingw {
394432

395433
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
396434
let target = self.target;
397-
if !target.ends_with("pc-windows-gnu") || !builder.config.dist_include_mingw_linker {
435+
if !target.contains("pc-windows-gnu") || !builder.config.dist_include_mingw_linker {
398436
return None;
399437
}
400438

401439
let mut tarball = Tarball::new(builder, "rust-mingw", &target.triple);
402440
tarball.set_product_name("Rust MinGW");
403441

404-
make_win_dist(tarball.image_dir(), target, builder);
442+
if target.ends_with("pc-windows-gnu") {
443+
make_win_dist(tarball.image_dir(), target, builder);
444+
} else if target.ends_with("pc-windows-gnullvm") {
445+
make_win_llvm_dist(tarball.image_dir(), target, builder);
446+
} else {
447+
unreachable!();
448+
}
405449

406450
Some(tarball.generate())
407451
}

src/bootstrap/src/core/config/target_selection.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ impl TargetSelection {
8686
self.ends_with("windows-gnu")
8787
}
8888

89+
pub fn is_windows_gnullvm(&self) -> bool {
90+
self.ends_with("windows-gnullvm")
91+
}
92+
8993
pub fn is_cygwin(&self) -> bool {
9094
self.is_windows() &&
9195
// ref. https://cygwin.com/pipermail/cygwin/2022-February/250802.html

src/tools/build-manifest/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ impl Builder {
476476
}
477477
// so is rust-mingw if it's available for the target
478478
PkgType::RustMingw => {
479-
if host.ends_with("pc-windows-gnu") {
479+
if host.contains("pc-windows-gnu") {
480480
components.push(host_component(pkg));
481481
}
482482
}

0 commit comments

Comments
 (0)