@@ -117,6 +117,7 @@ impl Step for Std {
117
117
& compiler. host, target) ) ;
118
118
run_cargo ( builder,
119
119
& mut cargo,
120
+ vec ! [ ] ,
120
121
& libstd_stamp ( builder, compiler, target) ,
121
122
false ) ;
122
123
@@ -396,6 +397,7 @@ impl Step for Test {
396
397
& compiler. host, target) ) ;
397
398
run_cargo ( builder,
398
399
& mut cargo,
400
+ vec ! [ ] ,
399
401
& libtest_stamp ( builder, compiler, target) ,
400
402
false ) ;
401
403
@@ -529,6 +531,7 @@ impl Step for Rustc {
529
531
compiler. stage, & compiler. host, target) ) ;
530
532
run_cargo ( builder,
531
533
& mut cargo,
534
+ vec ! [ ] ,
532
535
& librustc_stamp ( builder, compiler, target) ,
533
536
false ) ;
534
537
@@ -673,18 +676,47 @@ impl Step for CodegenBackend {
673
676
let out_dir = builder. cargo_out ( compiler, Mode :: Codegen , target) ;
674
677
builder. clear_if_dirty ( & out_dir, & librustc_stamp ( builder, compiler, target) ) ;
675
678
676
- let mut cargo = builder. cargo ( compiler, Mode :: Codegen , target, "build " ) ;
679
+ let mut cargo = builder. cargo ( compiler, Mode :: Codegen , target, "rustc " ) ;
677
680
cargo. arg ( "--manifest-path" )
678
681
. arg ( builder. src . join ( "src/librustc_codegen_llvm/Cargo.toml" ) ) ;
679
682
rustc_cargo_env ( builder, & mut cargo) ;
680
683
681
684
let features = build_codegen_backend ( & builder, & mut cargo, & compiler, target, backend) ;
682
685
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
+
683
714
let tmp_stamp = out_dir. join ( ".tmp.stamp" ) ;
684
715
685
716
let _folder = builder. fold_output ( || format ! ( "stage{}-rustc_codegen_llvm" , compiler. stage) ) ;
686
717
let files = run_cargo ( builder,
687
718
cargo. arg ( "--features" ) . arg ( features) ,
719
+ cargo_tails_args,
688
720
& tmp_stamp,
689
721
false ) ;
690
722
if builder. config . dry_run {
@@ -1045,7 +1077,11 @@ fn stderr_isatty() -> bool {
1045
1077
}
1046
1078
}
1047
1079
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 )
1049
1085
-> Vec < PathBuf >
1050
1086
{
1051
1087
if builder. config . dry_run {
@@ -1066,7 +1102,7 @@ pub fn run_cargo(builder: &Builder, cargo: &mut Command, stamp: &Path, is_check:
1066
1102
// files we need to probe for later.
1067
1103
let mut deps = Vec :: new ( ) ;
1068
1104
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| {
1070
1106
let filenames = match msg {
1071
1107
CargoMessage :: CompilerArtifact { filenames, .. } => filenames,
1072
1108
_ => return ,
@@ -1191,6 +1227,7 @@ pub fn run_cargo(builder: &Builder, cargo: &mut Command, stamp: &Path, is_check:
1191
1227
pub fn stream_cargo (
1192
1228
builder : & Builder ,
1193
1229
cargo : & mut Command ,
1230
+ tail_args : Vec < String > ,
1194
1231
cb : & mut dyn FnMut ( CargoMessage ) ,
1195
1232
) -> bool {
1196
1233
if builder. config . dry_run {
@@ -1210,6 +1247,10 @@ pub fn stream_cargo(
1210
1247
cargo. env ( "RUSTC_COLOR" , "1" ) ;
1211
1248
}
1212
1249
1250
+ for arg in tail_args {
1251
+ cargo. arg ( arg) ;
1252
+ }
1253
+
1213
1254
builder. verbose ( & format ! ( "running: {:?}" , cargo) ) ;
1214
1255
let mut child = match cargo. spawn ( ) {
1215
1256
Ok ( child) => child,
0 commit comments