Skip to content

Commit fa86c78

Browse files
committed
Add LLD flags to rustdoc cargo invocations
1 parent e1763c8 commit fa86c78

File tree

3 files changed

+73
-16
lines changed

3 files changed

+73
-16
lines changed

src/bootstrap/src/core/build_steps/test.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ use crate::utils;
2929
use crate::utils::cache::{Interned, INTERNER};
3030
use crate::utils::exec::BootstrapCommand;
3131
use crate::utils::helpers::{
32-
self, add_link_lib_path, add_rustdoc_lld_flags, dylib_path, dylib_path_var, output, t,
33-
target_supports_cranelift_backend, up_to_date,
32+
self, add_link_lib_path, add_rustdoc_cargo_lld_flags, add_rustdoc_lld_flags, dylib_path,
33+
dylib_path_var, output, t, target_supports_cranelift_backend, up_to_date, LldThreadMode,
3434
};
3535
use crate::utils::render_tests::{add_flags_and_try_run_tests, try_run_tests};
3636
use crate::{envify, CLang, DocTests, GitRepo, Mode};
@@ -271,13 +271,19 @@ impl Step for Cargotest {
271271

272272
let _time = helpers::timeit(&builder);
273273
let mut cmd = builder.tool_cmd(Tool::CargoTest);
274-
builder.run_delaying_failure(
275-
cmd.arg(&cargo)
276-
.arg(&out_dir)
277-
.args(builder.config.test_args())
278-
.env("RUSTC", builder.rustc(compiler))
279-
.env("RUSTDOC", builder.rustdoc(compiler)),
274+
let mut cmd = cmd
275+
.arg(&cargo)
276+
.arg(&out_dir)
277+
.args(builder.config.test_args())
278+
.env("RUSTC", builder.rustc(compiler))
279+
.env("RUSTDOC", builder.rustdoc(compiler));
280+
add_rustdoc_cargo_lld_flags(
281+
&mut cmd,
282+
builder,
283+
compiler.host,
284+
LldThreadMode::SingleThreaded,
280285
);
286+
builder.run_delaying_failure(cmd);
281287
}
282288
}
283289

@@ -862,7 +868,7 @@ impl Step for RustdocTheme {
862868
.env("CFG_RELEASE_CHANNEL", &builder.config.channel)
863869
.env("RUSTDOC_REAL", builder.rustdoc(self.compiler))
864870
.env("RUSTC_BOOTSTRAP", "1");
865-
add_rustdoc_lld_flags(&mut cmd, builder, self.compiler.host, true);
871+
add_rustdoc_lld_flags(&mut cmd, builder, self.compiler.host, LldThreadMode::SingleThreaded);
866872

867873
builder.run_delaying_failure(&mut cmd);
868874
}
@@ -1037,6 +1043,13 @@ impl Step for RustdocGUI {
10371043
cmd.env("RUSTDOC", builder.rustdoc(self.compiler))
10381044
.env("RUSTC", builder.rustc(self.compiler));
10391045

1046+
add_rustdoc_cargo_lld_flags(
1047+
&mut cmd,
1048+
builder,
1049+
self.compiler.host,
1050+
LldThreadMode::SingleThreaded,
1051+
);
1052+
10401053
for path in &builder.paths {
10411054
if let Some(p) = helpers::is_valid_test_suite_arg(path, "tests/rustdoc-gui", builder) {
10421055
if !p.ends_with(".goml") {

src/bootstrap/src/core/builder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use crate::core::config::{DryRun, SplitDebuginfo, TargetSelection};
2020
use crate::utils::cache::{Cache, Interned, INTERNER};
2121
use crate::utils::helpers::{
2222
self, add_dylib_path, add_link_lib_path, add_rustdoc_lld_flags, exe, libdir, output, t,
23+
LldThreadMode,
2324
};
2425
use crate::Crate;
2526
use crate::EXTRA_CHECK_CFGS;
@@ -1175,7 +1176,7 @@ impl<'a> Builder<'a> {
11751176
cmd.env_remove("MAKEFLAGS");
11761177
cmd.env_remove("MFLAGS");
11771178

1178-
add_rustdoc_lld_flags(&mut cmd, self, compiler.host, false);
1179+
add_rustdoc_lld_flags(&mut cmd, self, compiler.host, LldThreadMode::MultiThreaded);
11791180
cmd
11801181
}
11811182

src/bootstrap/src/utils/helpers.rs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
66
use build_helper::util::fail;
77
use std::env;
8+
use std::ffi::{OsStr, OsString};
89
use std::fs;
910
use std::io;
1011
use std::path::{Path, PathBuf};
@@ -471,21 +472,63 @@ pub fn extract_beta_rev(version: &str) -> Option<String> {
471472
count
472473
}
473474

475+
pub enum LldThreadMode {
476+
SingleThreaded,
477+
MultiThreaded,
478+
}
479+
474480
pub fn add_rustdoc_lld_flags(
475481
cmd: &mut Command,
476-
builder: &Builder,
482+
builder: &Builder<'_>,
483+
target: TargetSelection,
484+
lld_thread_mode: LldThreadMode,
485+
) {
486+
let args = build_rustdoc_lld_flags(builder, target, lld_thread_mode);
487+
cmd.args(args);
488+
}
489+
490+
pub fn add_rustdoc_cargo_lld_flags(
491+
cmd: &mut Command,
492+
builder: &Builder<'_>,
477493
target: TargetSelection,
478-
single_threaded: bool,
494+
lld_thread_mode: LldThreadMode,
479495
) {
496+
let args = build_rustdoc_lld_flags(builder, target, lld_thread_mode);
497+
let mut flags = cmd
498+
.get_envs()
499+
.find(|(k, _)| *k == OsStr::new("RUSTDOCFLAGS"))
500+
.and_then(|(_, v)| v)
501+
.unwrap_or(OsStr::new(""))
502+
.to_os_string();
503+
for arg in args {
504+
if !flags.is_empty() {
505+
flags.push(" ");
506+
}
507+
flags.push(arg);
508+
}
509+
cmd.env("RUSTDOCFLAGS", flags);
510+
}
511+
512+
fn build_rustdoc_lld_flags(
513+
builder: &Builder<'_>,
514+
target: TargetSelection,
515+
lld_thread_mode: LldThreadMode,
516+
) -> Vec<OsString> {
517+
let mut args = vec![];
518+
480519
if let Some(linker) = builder.linker(target) {
481520
let mut flag = std::ffi::OsString::from("-Clinker=");
482521
flag.push(linker);
483-
cmd.arg(flag);
522+
args.push(flag);
484523
}
485524
if builder.is_fuse_ld_lld(target) {
486-
cmd.arg("-Clink-arg=-fuse-ld=lld");
487-
if single_threaded {
488-
cmd.arg(format!("-Clink-arg=-Wl,{}", lld_flag_no_threads(target.contains("windows"))));
525+
args.push(OsString::from("-Clink-arg=-fuse-ld=lld"));
526+
if matches!(lld_thread_mode, LldThreadMode::SingleThreaded) {
527+
args.push(OsString::from(format!(
528+
"-Clink-arg=-Wl,{}",
529+
lld_flag_no_threads(target.contains("windows"))
530+
)));
489531
}
490532
}
533+
args
491534
}

0 commit comments

Comments
 (0)