@@ -29,7 +29,6 @@ use build_helper::{output, mtime, up_to_date};
2929use filetime:: FileTime ;
3030use serde_json;
3131
32- use crate :: dist;
3332use crate :: util:: { exe, libdir, is_dylib} ;
3433use crate :: { Compiler , Mode , GitRepo } ;
3534use crate :: native;
@@ -115,6 +114,7 @@ impl Step for Std {
115114 & compiler. host, target) ) ;
116115 run_cargo ( builder,
117116 & mut cargo,
117+ vec ! [ ] ,
118118 & libstd_stamp ( builder, compiler, target) ,
119119 false ) ;
120120
@@ -375,6 +375,7 @@ impl Step for Test {
375375 & compiler. host, target) ) ;
376376 run_cargo ( builder,
377377 & mut cargo,
378+ vec ! [ ] ,
378379 & libtest_stamp ( builder, compiler, target) ,
379380 false ) ;
380381
@@ -502,6 +503,7 @@ impl Step for Rustc {
502503 compiler. stage, & compiler. host, target) ) ;
503504 run_cargo ( builder,
504505 & mut cargo,
506+ vec ! [ ] ,
505507 & librustc_stamp ( builder, compiler, target) ,
506508 false ) ;
507509
@@ -644,18 +646,47 @@ impl Step for CodegenBackend {
644646
645647 let out_dir = builder. cargo_out ( compiler, Mode :: Codegen , target) ;
646648
647- let mut cargo = builder. cargo ( compiler, Mode :: Codegen , target, "build " ) ;
649+ let mut cargo = builder. cargo ( compiler, Mode :: Codegen , target, "rustc " ) ;
648650 cargo. arg ( "--manifest-path" )
649651 . arg ( builder. src . join ( "src/librustc_codegen_llvm/Cargo.toml" ) ) ;
650652 rustc_cargo_env ( builder, & mut cargo) ;
651653
652654 let features = build_codegen_backend ( & builder, & mut cargo, & compiler, target, backend) ;
653655
656+ let mut cargo_tails_args = vec ! [ ] ;
657+
658+ if builder. config . llvm_thin_lto {
659+ cargo_tails_args. push ( "--" . to_string ( ) ) ;
660+
661+ let num_jobs = builder. jobs ( ) ;
662+
663+ if !target. contains ( "msvc" ) {
664+ // Here we assume that the linker is clang. If it's not, there'll
665+ // be linker errors.
666+ cargo_tails_args. push ( "-Clink-arg=-fuse-ld=lld" . to_string ( ) ) ;
667+ cargo_tails_args. push ( "-Clink-arg=-flto=thin" . to_string ( ) ) ;
668+
669+ if builder. config . llvm_optimize {
670+ cargo_tails_args. push ( "-Clink-arg=-O2" . to_string ( ) ) ;
671+ }
672+
673+ // Let's make LLD respect the `-j` option.
674+ let num_jobs_arg = format ! ( "-Clink-arg=-Wl,--thinlto-jobs={}" , num_jobs) ;
675+ cargo_tails_args. push ( num_jobs_arg) ;
676+ } else {
677+ // Here we assume that the linker is lld-link.exe. lld-link.exe
678+ // does not need the extra arguments except for num_jobs
679+ let num_jobs_arg = format ! ( "-Clink-arg=/opt:lldltojobs={}" , num_jobs) ;
680+ cargo_tails_args. push ( num_jobs_arg) ;
681+ }
682+ }
683+
654684 let tmp_stamp = out_dir. join ( ".tmp.stamp" ) ;
655685
656686 let _folder = builder. fold_output ( || format ! ( "stage{}-rustc_codegen_llvm" , compiler. stage) ) ;
657687 let files = run_cargo ( builder,
658688 cargo. arg ( "--features" ) . arg ( features) ,
689+ cargo_tails_args,
659690 & tmp_stamp,
660691 false ) ;
661692 if builder. config . dry_run {
@@ -728,9 +759,7 @@ pub fn build_codegen_backend(builder: &Builder,
728759 "libstdc++.a" ) ;
729760 cargo. env ( "LLVM_STATIC_STDCPP" , file) ;
730761 }
731- if builder. config . llvm_link_shared ||
732- ( builder. config . llvm_thin_lto && backend != "emscripten" )
733- {
762+ if builder. config . llvm_link_shared {
734763 cargo. env ( "LLVM_LINK_SHARED" , "1" ) ;
735764 }
736765 }
@@ -970,8 +999,6 @@ impl Step for Assemble {
970999 copy_lld_to_sysroot ( builder, target_compiler, & lld_install) ;
9711000 }
9721001
973- dist:: maybe_install_llvm_dylib ( builder, target_compiler. host , & sysroot) ;
974-
9751002 // Link the compiler binary itself into place
9761003 let out_dir = builder. cargo_out ( build_compiler, Mode :: Rustc , host) ;
9771004 let rustc = out_dir. join ( exe ( "rustc_binary" , & * host) ) ;
@@ -998,6 +1025,7 @@ pub fn add_to_sysroot(builder: &Builder, sysroot_dst: &Path, stamp: &Path) {
9981025
9991026pub fn run_cargo ( builder : & Builder ,
10001027 cargo : & mut Command ,
1028+ tail_args : Vec < String > ,
10011029 stamp : & Path ,
10021030 is_check : bool )
10031031 -> Vec < PathBuf >
@@ -1020,7 +1048,7 @@ pub fn run_cargo(builder: &Builder,
10201048 // files we need to probe for later.
10211049 let mut deps = Vec :: new ( ) ;
10221050 let mut toplevel = Vec :: new ( ) ;
1023- let ok = stream_cargo ( builder, cargo, & mut |msg| {
1051+ let ok = stream_cargo ( builder, cargo, tail_args , & mut |msg| {
10241052 let filenames = match msg {
10251053 CargoMessage :: CompilerArtifact { filenames, .. } => filenames,
10261054 _ => return ,
@@ -1145,6 +1173,7 @@ pub fn run_cargo(builder: &Builder,
11451173pub fn stream_cargo (
11461174 builder : & Builder ,
11471175 cargo : & mut Command ,
1176+ tail_args : Vec < String > ,
11481177 cb : & mut dyn FnMut ( CargoMessage ) ,
11491178) -> bool {
11501179 if builder. config . dry_run {
@@ -1155,6 +1184,10 @@ pub fn stream_cargo(
11551184 cargo. arg ( "--message-format" ) . arg ( "json" )
11561185 . stdout ( Stdio :: piped ( ) ) ;
11571186
1187+ for arg in tail_args {
1188+ cargo. arg ( arg) ;
1189+ }
1190+
11581191 builder. verbose ( & format ! ( "running: {:?}" , cargo) ) ;
11591192 let mut child = match cargo. spawn ( ) {
11601193 Ok ( child) => child,
0 commit comments