@@ -252,30 +252,35 @@ impl<B: WriteBackendMethods> CodegenContext<B> {
252
252
253
253
fn generate_lto_work < B : ExtraBackendMethods > (
254
254
cgcx : & CodegenContext < B > ,
255
- modules : Vec < ModuleCodegen < B :: Module > > ,
255
+ needs_fat_lto : Vec < ModuleCodegen < B :: Module > > ,
256
+ needs_thin_lto : Vec < ModuleCodegen < B :: Module > > ,
256
257
import_only_modules : Vec < ( SerializedModule < B :: ModuleBuffer > , WorkProduct ) >
257
258
) -> Vec < ( WorkItem < B > , u64 ) > {
258
259
let mut timeline = cgcx. time_graph . as_ref ( ) . map ( |tg| {
259
260
tg. start ( CODEGEN_WORKER_TIMELINE ,
260
261
CODEGEN_WORK_PACKAGE_KIND ,
261
262
"generate lto" )
262
263
} ) . unwrap_or ( Timeline :: noop ( ) ) ;
263
- let ( lto_modules, copy_jobs) = B :: run_lto ( cgcx, modules, import_only_modules, & mut timeline)
264
- . unwrap_or_else ( |e| e. raise ( ) ) ;
265
264
266
- let lto_modules = lto_modules. into_iter ( ) . map ( |module| {
265
+ let ( lto_modules, copy_jobs) = if !needs_fat_lto. is_empty ( ) {
266
+ assert ! ( needs_thin_lto. is_empty( ) ) ;
267
+ B :: run_lto ( cgcx, needs_fat_lto, import_only_modules, & mut timeline)
268
+ . unwrap_or_else ( |e| e. raise ( ) )
269
+ } else {
270
+ assert ! ( needs_fat_lto. is_empty( ) ) ;
271
+ B :: run_lto ( cgcx, needs_thin_lto, import_only_modules, & mut timeline)
272
+ . unwrap_or_else ( |e| e. raise ( ) )
273
+ } ;
274
+
275
+ lto_modules. into_iter ( ) . map ( |module| {
267
276
let cost = module. cost ( ) ;
268
277
( WorkItem :: LTO ( module) , cost)
269
- } ) ;
270
-
271
- let copy_jobs = copy_jobs. into_iter ( ) . map ( |wp| {
278
+ } ) . chain ( copy_jobs. into_iter ( ) . map ( |wp| {
272
279
( WorkItem :: CopyPostLtoArtifacts ( CachedModuleCodegen {
273
280
name : wp. cgu_name . clone ( ) ,
274
281
source : wp,
275
282
} ) , 0 )
276
- } ) ;
277
-
278
- lto_modules. chain ( copy_jobs) . collect ( )
283
+ } ) ) . collect ( )
279
284
}
280
285
281
286
pub struct CompiledModules {
@@ -673,7 +678,8 @@ impl<B: WriteBackendMethods> WorkItem<B> {
673
678
674
679
enum WorkItemResult < M > {
675
680
Compiled ( CompiledModule ) ,
676
- NeedsLTO ( ModuleCodegen < M > ) ,
681
+ NeedsFatLTO ( ModuleCodegen < M > ) ,
682
+ NeedsThinLTO ( ModuleCodegen < M > ) ,
677
683
}
678
684
679
685
fn execute_work_item < B : ExtraBackendMethods > (
@@ -757,12 +763,16 @@ fn execute_optimize_work_item<B: ExtraBackendMethods>(
757
763
}
758
764
} ;
759
765
760
- if let ComputedLtoType :: No = lto_type {
761
- let module = unsafe { B :: codegen ( cgcx, & diag_handler, module, module_config, timeline) ? } ;
762
- Ok ( WorkItemResult :: Compiled ( module) )
763
- } else {
764
- Ok ( WorkItemResult :: NeedsLTO ( module) )
765
- }
766
+ Ok ( match lto_type {
767
+ ComputedLtoType :: No => {
768
+ let module = unsafe {
769
+ B :: codegen ( cgcx, & diag_handler, module, module_config, timeline) ?
770
+ } ;
771
+ WorkItemResult :: Compiled ( module)
772
+ }
773
+ ComputedLtoType :: Thin => WorkItemResult :: NeedsThinLTO ( module) ,
774
+ ComputedLtoType :: Fat => WorkItemResult :: NeedsFatLTO ( module) ,
775
+ } )
766
776
}
767
777
768
778
fn execute_copy_from_cache_work_item < B : ExtraBackendMethods > (
@@ -844,7 +854,11 @@ fn execute_lto_work_item<B: ExtraBackendMethods>(
844
854
845
855
pub enum Message < B : WriteBackendMethods > {
846
856
Token ( io:: Result < Acquired > ) ,
847
- NeedsLTO {
857
+ NeedsFatLTO {
858
+ result : ModuleCodegen < B :: Module > ,
859
+ worker_id : usize ,
860
+ } ,
861
+ NeedsThinLTO {
848
862
result : ModuleCodegen < B :: Module > ,
849
863
worker_id : usize ,
850
864
} ,
@@ -1143,7 +1157,8 @@ fn start_executing_work<B: ExtraBackendMethods>(
1143
1157
let mut compiled_modules = vec ! [ ] ;
1144
1158
let mut compiled_metadata_module = None ;
1145
1159
let mut compiled_allocator_module = None ;
1146
- let mut needs_lto = Vec :: new ( ) ;
1160
+ let mut needs_fat_lto = Vec :: new ( ) ;
1161
+ let mut needs_thin_lto = Vec :: new ( ) ;
1147
1162
let mut lto_import_only_modules = Vec :: new ( ) ;
1148
1163
let mut started_lto = false ;
1149
1164
let mut codegen_aborted = false ;
@@ -1172,7 +1187,8 @@ fn start_executing_work<B: ExtraBackendMethods>(
1172
1187
running > 0 ||
1173
1188
( !codegen_aborted && (
1174
1189
work_items. len ( ) > 0 ||
1175
- needs_lto. len ( ) > 0 ||
1190
+ needs_fat_lto. len ( ) > 0 ||
1191
+ needs_thin_lto. len ( ) > 0 ||
1176
1192
lto_import_only_modules. len ( ) > 0 ||
1177
1193
main_thread_worker_state != MainThreadWorkerState :: Idle
1178
1194
) )
@@ -1218,12 +1234,17 @@ fn start_executing_work<B: ExtraBackendMethods>(
1218
1234
running == 0 &&
1219
1235
main_thread_worker_state == MainThreadWorkerState :: Idle {
1220
1236
assert ! ( !started_lto) ;
1221
- assert ! ( needs_lto. len( ) + lto_import_only_modules. len( ) > 0 ) ;
1222
1237
started_lto = true ;
1223
- let modules = mem:: replace ( & mut needs_lto, Vec :: new ( ) ) ;
1238
+
1239
+ let needs_fat_lto =
1240
+ mem:: replace ( & mut needs_fat_lto, Vec :: new ( ) ) ;
1241
+ let needs_thin_lto =
1242
+ mem:: replace ( & mut needs_thin_lto, Vec :: new ( ) ) ;
1224
1243
let import_only_modules =
1225
1244
mem:: replace ( & mut lto_import_only_modules, Vec :: new ( ) ) ;
1226
- for ( work, cost) in generate_lto_work ( & cgcx, modules, import_only_modules) {
1245
+
1246
+ for ( work, cost) in generate_lto_work ( & cgcx, needs_fat_lto,
1247
+ needs_thin_lto, import_only_modules) {
1227
1248
let insertion_index = work_items
1228
1249
. binary_search_by_key ( & cost, |& ( _, cost) | cost)
1229
1250
. unwrap_or_else ( |e| e) ;
@@ -1395,10 +1416,15 @@ fn start_executing_work<B: ExtraBackendMethods>(
1395
1416
}
1396
1417
}
1397
1418
}
1398
- Message :: NeedsLTO { result, worker_id } => {
1419
+ Message :: NeedsFatLTO { result, worker_id } => {
1399
1420
assert ! ( !started_lto) ;
1400
1421
free_worker ( worker_id) ;
1401
- needs_lto. push ( result) ;
1422
+ needs_fat_lto. push ( result) ;
1423
+ }
1424
+ Message :: NeedsThinLTO { result, worker_id } => {
1425
+ assert ! ( !started_lto) ;
1426
+ free_worker ( worker_id) ;
1427
+ needs_thin_lto. push ( result) ;
1402
1428
}
1403
1429
Message :: AddImportOnlyModule { module_data, work_product } => {
1404
1430
assert ! ( !started_lto) ;
@@ -1496,8 +1522,11 @@ fn spawn_work<B: ExtraBackendMethods>(
1496
1522
Some ( WorkItemResult :: Compiled ( m) ) => {
1497
1523
Message :: Done :: < B > { result : Ok ( m) , worker_id }
1498
1524
}
1499
- Some ( WorkItemResult :: NeedsLTO ( m) ) => {
1500
- Message :: NeedsLTO :: < B > { result : m, worker_id }
1525
+ Some ( WorkItemResult :: NeedsFatLTO ( m) ) => {
1526
+ Message :: NeedsFatLTO :: < B > { result : m, worker_id }
1527
+ }
1528
+ Some ( WorkItemResult :: NeedsThinLTO ( m) ) => {
1529
+ Message :: NeedsThinLTO :: < B > { result : m, worker_id }
1501
1530
}
1502
1531
None => Message :: Done :: < B > { result : Err ( ( ) ) , worker_id }
1503
1532
} ;
0 commit comments