@@ -117,6 +117,7 @@ impl Step for Std {
117117 & compiler. host, target) ) ;
118118 run_cargo ( builder,
119119 & mut cargo,
120+ vec ! [ ] ,
120121 & libstd_stamp ( builder, compiler, target) ,
121122 false ) ;
122123
@@ -396,6 +397,7 @@ impl Step for Test {
396397 & compiler. host, target) ) ;
397398 run_cargo ( builder,
398399 & mut cargo,
400+ vec ! [ ] ,
399401 & libtest_stamp ( builder, compiler, target) ,
400402 false ) ;
401403
@@ -529,6 +531,7 @@ impl Step for Rustc {
529531 compiler. stage, & compiler. host, target) ) ;
530532 run_cargo ( builder,
531533 & mut cargo,
534+ vec ! [ ] ,
532535 & librustc_stamp ( builder, compiler, target) ,
533536 false ) ;
534537
@@ -673,18 +676,47 @@ impl Step for CodegenBackend {
673676 let out_dir = builder. cargo_out ( compiler, Mode :: Codegen , target) ;
674677 builder. clear_if_dirty ( & out_dir, & librustc_stamp ( builder, compiler, target) ) ;
675678
676- let mut cargo = builder. cargo ( compiler, Mode :: Codegen , target, "build " ) ;
679+ let mut cargo = builder. cargo ( compiler, Mode :: Codegen , target, "rustc " ) ;
677680 cargo. arg ( "--manifest-path" )
678681 . arg ( builder. src . join ( "src/librustc_codegen_llvm/Cargo.toml" ) ) ;
679682 rustc_cargo_env ( builder, & mut cargo) ;
680683
681684 let features = build_codegen_backend ( & builder, & mut cargo, & compiler, target, backend) ;
682685
686+ let mut cargo_tails_args = vec ! [ ] ;
687+
688+ if builder. config . llvm_thin_lto {
689+ cargo_tails_args. push ( "--" . to_string ( ) ) ;
690+
691+ let num_jobs = builder. jobs ( ) ;
692+
693+ if !target. contains ( "msvc" ) {
694+ // Here we assume that the linker is clang. If it's not, there'll
695+ // be linker errors.
696+ cargo_tails_args. push ( "-Clink-arg=-fuse-ld=lld" . to_string ( ) ) ;
697+ cargo_tails_args. push ( "-Clink-arg=-flto=thin" . to_string ( ) ) ;
698+
699+ if builder. config . llvm_optimize {
700+ cargo_tails_args. push ( "-Clink-arg=-O2" . to_string ( ) ) ;
701+ }
702+
703+ // Let's make LLD respect the `-j` option.
704+ let num_jobs_arg = format ! ( "-Clink-arg=-Wl,--thinlto-jobs={}" , num_jobs) ;
705+ cargo_tails_args. push ( num_jobs_arg) ;
706+ } else {
707+ // Here we assume that the linker is lld-link.exe. lld-link.exe
708+ // does not need the extra arguments except for num_jobs
709+ let num_jobs_arg = format ! ( "-Clink-arg=/opt:lldltojobs={}" , num_jobs) ;
710+ cargo_tails_args. push ( num_jobs_arg) ;
711+ }
712+ }
713+
683714 let tmp_stamp = out_dir. join ( ".tmp.stamp" ) ;
684715
685716 let _folder = builder. fold_output ( || format ! ( "stage{}-rustc_codegen_llvm" , compiler. stage) ) ;
686717 let files = run_cargo ( builder,
687718 cargo. arg ( "--features" ) . arg ( features) ,
719+ cargo_tails_args,
688720 & tmp_stamp,
689721 false ) ;
690722 if builder. config . dry_run {
@@ -1045,7 +1077,11 @@ fn stderr_isatty() -> bool {
10451077 }
10461078}
10471079
1048- pub fn run_cargo ( builder : & Builder , cargo : & mut Command , stamp : & Path , is_check : bool )
1080+ pub fn run_cargo ( builder : & Builder ,
1081+ cargo : & mut Command ,
1082+ tail_args : Vec < String > ,
1083+ stamp : & Path ,
1084+ is_check : bool )
10491085 -> Vec < PathBuf >
10501086{
10511087 if builder. config . dry_run {
@@ -1066,7 +1102,7 @@ pub fn run_cargo(builder: &Builder, cargo: &mut Command, stamp: &Path, is_check:
10661102 // files we need to probe for later.
10671103 let mut deps = Vec :: new ( ) ;
10681104 let mut toplevel = Vec :: new ( ) ;
1069- let ok = stream_cargo ( builder, cargo, & mut |msg| {
1105+ let ok = stream_cargo ( builder, cargo, tail_args , & mut |msg| {
10701106 let filenames = match msg {
10711107 CargoMessage :: CompilerArtifact { filenames, .. } => filenames,
10721108 _ => return ,
@@ -1191,6 +1227,7 @@ pub fn run_cargo(builder: &Builder, cargo: &mut Command, stamp: &Path, is_check:
11911227pub fn stream_cargo (
11921228 builder : & Builder ,
11931229 cargo : & mut Command ,
1230+ tail_args : Vec < String > ,
11941231 cb : & mut dyn FnMut ( CargoMessage ) ,
11951232) -> bool {
11961233 if builder. config . dry_run {
@@ -1210,6 +1247,10 @@ pub fn stream_cargo(
12101247 cargo. env ( "RUSTC_COLOR" , "1" ) ;
12111248 }
12121249
1250+ for arg in tail_args {
1251+ cargo. arg ( arg) ;
1252+ }
1253+
12131254 builder. verbose ( & format ! ( "running: {:?}" , cargo) ) ;
12141255 let mut child = match cargo. spawn ( ) {
12151256 Ok ( child) => child,
0 commit comments