@@ -252,30 +252,35 @@ impl<B: WriteBackendMethods> CodegenContext<B> {
252252
253253fn generate_lto_work < B : ExtraBackendMethods > (
254254 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 > > ,
256257 import_only_modules : Vec < ( SerializedModule < B :: ModuleBuffer > , WorkProduct ) >
257258) -> Vec < ( WorkItem < B > , u64 ) > {
258259 let mut timeline = cgcx. time_graph . as_ref ( ) . map ( |tg| {
259260 tg. start ( CODEGEN_WORKER_TIMELINE ,
260261 CODEGEN_WORK_PACKAGE_KIND ,
261262 "generate lto" )
262263 } ) . 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 ( ) ) ;
265264
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| {
267276 let cost = module. cost ( ) ;
268277 ( WorkItem :: LTO ( module) , cost)
269- } ) ;
270-
271- let copy_jobs = copy_jobs. into_iter ( ) . map ( |wp| {
278+ } ) . chain ( copy_jobs. into_iter ( ) . map ( |wp| {
272279 ( WorkItem :: CopyPostLtoArtifacts ( CachedModuleCodegen {
273280 name : wp. cgu_name . clone ( ) ,
274281 source : wp,
275282 } ) , 0 )
276- } ) ;
277-
278- lto_modules. chain ( copy_jobs) . collect ( )
283+ } ) ) . collect ( )
279284}
280285
281286pub struct CompiledModules {
@@ -673,7 +678,8 @@ impl<B: WriteBackendMethods> WorkItem<B> {
673678
674679enum WorkItemResult < M > {
675680 Compiled ( CompiledModule ) ,
676- NeedsLTO ( ModuleCodegen < M > ) ,
681+ NeedsFatLTO ( ModuleCodegen < M > ) ,
682+ NeedsThinLTO ( ModuleCodegen < M > ) ,
677683}
678684
679685fn execute_work_item < B : ExtraBackendMethods > (
@@ -757,12 +763,16 @@ fn execute_optimize_work_item<B: ExtraBackendMethods>(
757763 }
758764 } ;
759765
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+ } )
766776}
767777
768778fn execute_copy_from_cache_work_item < B : ExtraBackendMethods > (
@@ -844,7 +854,11 @@ fn execute_lto_work_item<B: ExtraBackendMethods>(
844854
845855pub enum Message < B : WriteBackendMethods > {
846856 Token ( io:: Result < Acquired > ) ,
847- NeedsLTO {
857+ NeedsFatLTO {
858+ result : ModuleCodegen < B :: Module > ,
859+ worker_id : usize ,
860+ } ,
861+ NeedsThinLTO {
848862 result : ModuleCodegen < B :: Module > ,
849863 worker_id : usize ,
850864 } ,
@@ -1143,7 +1157,8 @@ fn start_executing_work<B: ExtraBackendMethods>(
11431157 let mut compiled_modules = vec ! [ ] ;
11441158 let mut compiled_metadata_module = None ;
11451159 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 ( ) ;
11471162 let mut lto_import_only_modules = Vec :: new ( ) ;
11481163 let mut started_lto = false ;
11491164 let mut codegen_aborted = false ;
@@ -1172,7 +1187,8 @@ fn start_executing_work<B: ExtraBackendMethods>(
11721187 running > 0 ||
11731188 ( !codegen_aborted && (
11741189 work_items. len ( ) > 0 ||
1175- needs_lto. len ( ) > 0 ||
1190+ needs_fat_lto. len ( ) > 0 ||
1191+ needs_thin_lto. len ( ) > 0 ||
11761192 lto_import_only_modules. len ( ) > 0 ||
11771193 main_thread_worker_state != MainThreadWorkerState :: Idle
11781194 ) )
@@ -1218,12 +1234,17 @@ fn start_executing_work<B: ExtraBackendMethods>(
12181234 running == 0 &&
12191235 main_thread_worker_state == MainThreadWorkerState :: Idle {
12201236 assert ! ( !started_lto) ;
1221- assert ! ( needs_lto. len( ) + lto_import_only_modules. len( ) > 0 ) ;
12221237 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 ( ) ) ;
12241243 let import_only_modules =
12251244 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) {
12271248 let insertion_index = work_items
12281249 . binary_search_by_key ( & cost, |& ( _, cost) | cost)
12291250 . unwrap_or_else ( |e| e) ;
@@ -1395,10 +1416,15 @@ fn start_executing_work<B: ExtraBackendMethods>(
13951416 }
13961417 }
13971418 }
1398- Message :: NeedsLTO { result, worker_id } => {
1419+ Message :: NeedsFatLTO { result, worker_id } => {
13991420 assert ! ( !started_lto) ;
14001421 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) ;
14021428 }
14031429 Message :: AddImportOnlyModule { module_data, work_product } => {
14041430 assert ! ( !started_lto) ;
@@ -1496,8 +1522,11 @@ fn spawn_work<B: ExtraBackendMethods>(
14961522 Some ( WorkItemResult :: Compiled ( m) ) => {
14971523 Message :: Done :: < B > { result : Ok ( m) , worker_id }
14981524 }
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 }
15011530 }
15021531 None => Message :: Done :: < B > { result : Err ( ( ) ) , worker_id }
15031532 } ;
0 commit comments