Skip to content

Commit fe42c5e

Browse files
committed
wip gnullvm self-contained
1 parent 4b57d81 commit fe42c5e

File tree

6 files changed

+64
-8
lines changed

6 files changed

+64
-8
lines changed

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

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

3+
use crate::spec::crt_objects::pre_mingw_self_contained;
34
use crate::spec::{
4-
BinaryFormat, Cc, DebuginfoKind, LinkerFlavor, Lld, SplitDebuginfo, TargetOptions, cvs,
5+
BinaryFormat, Cc, DebuginfoKind, LinkSelfContainedDefault, LinkerFlavor, Lld, SplitDebuginfo,
6+
TargetOptions, add_link_args, cvs,
57
};
68

79
pub(crate) fn opts() -> TargetOptions {
@@ -14,10 +16,11 @@ pub(crate) fn opts() -> TargetOptions {
1416
&["-nolibc", "--unwindlib=none"],
1517
);
1618
// Order of `late_link_args*` does not matter with LLD.
17-
let late_link_args = TargetOptions::link_args(
18-
LinkerFlavor::Gnu(Cc::Yes, Lld::No),
19-
&["-lmingw32", "-lmingwex", "-lmsvcrt", "-lkernel32", "-luser32"],
20-
);
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);
2124

2225
TargetOptions {
2326
os: "windows".into(),
@@ -35,6 +38,8 @@ pub(crate) fn opts() -> TargetOptions {
3538
binary_format: BinaryFormat::Coff,
3639
allows_weak_linkage: false,
3740
pre_link_args,
41+
pre_link_objects_self_contained: pre_mingw_self_contained(),
42+
link_self_contained: LinkSelfContainedDefault::InferredForMingw,
3843
late_link_args,
3944
abi_return_struct_as_int: true,
4045
emit_debug_gdb_scripts: false,

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
@@ -450,7 +450,7 @@ fn copy_self_contained_objects(
450450
DependencyType::TargetSelfContained,
451451
);
452452
}
453-
} else if target.is_windows_gnu() {
453+
} else if target.is_windows_gnu() || target.is_windows_gnullvm() {
454454
for obj in ["crt2.o", "dllcrt2.o"].iter() {
455455
let src = compiler_file(builder, &builder.cc(target), target, CLang::C, obj);
456456
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
@@ -344,6 +344,44 @@ fn runtime_dll_dist(rust_root: &Path, target: TargetSelection, builder: &Builder
344344
}
345345
}
346346

347+
fn make_win_llvm_dist(plat_root: &Path, target: TargetSelection, builder: &Builder<'_>) {
348+
if builder.config.dry_run() {
349+
return;
350+
}
351+
352+
let (_, lib_path) = get_cc_search_dirs(target, builder);
353+
354+
// Libraries necessary to link the windows-gnu toolchains.
355+
// System libraries will be preferred if they are available (see #67429).
356+
let target_libs = [
357+
// MinGW libs
358+
"libunwind.a",
359+
"libunwind.dll.a",
360+
"libmingw32.a",
361+
"libmingwex.a",
362+
"libmsvcrt.a",
363+
// Windows import libs, remove them once std transitions to raw-dylib
364+
"libkernel32.a",
365+
"libuser32.a",
366+
"libntdll.a",
367+
"libuserenv.a",
368+
"libws2_32.a",
369+
"libdbghelp.a",
370+
];
371+
372+
//Find mingw artifacts we want to bundle
373+
let target_libs = find_files(&target_libs, &lib_path);
374+
375+
//Copy platform libs to platform-specific lib directory
376+
let plat_target_lib_self_contained_dir =
377+
plat_root.join("lib/rustlib").join(target).join("lib/self-contained");
378+
fs::create_dir_all(&plat_target_lib_self_contained_dir)
379+
.expect("creating plat_target_lib_self_contained_dir failed");
380+
for src in target_libs {
381+
builder.copy_link_to_folder(&src, &plat_target_lib_self_contained_dir);
382+
}
383+
}
384+
347385
fn get_cc_search_dirs(
348386
target: TargetSelection,
349387
builder: &Builder<'_>,
@@ -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/builder/cargo.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,8 @@ impl Builder<'_> {
646646
if let Mode::Rustc | Mode::ToolRustcPrivate | Mode::ToolBootstrap | Mode::ToolTarget = mode
647647
{
648648
rustflags.arg("--cfg=windows_raw_dylib");
649+
} else if mode == Mode::Std && target.ends_with("gnullvm") {
650+
rustflags.arg("--cfg=windows_raw_dylib");
649651
}
650652

651653
if use_new_symbol_mangling {

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

0 commit comments

Comments
 (0)