Skip to content

Commit a17de69

Browse files
committed
Separate codepaths for fat and thin LTO in write.rs
These are going to have different intermediate artifacts, so create separate codepaths for them.
1 parent 2c1883c commit a17de69

File tree

1 file changed

+56
-27
lines changed

1 file changed

+56
-27
lines changed

src/librustc_codegen_ssa/back/write.rs

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -252,30 +252,35 @@ impl<B: WriteBackendMethods> CodegenContext<B> {
252252

253253
fn 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

281286
pub struct CompiledModules {
@@ -673,7 +678,8 @@ impl<B: WriteBackendMethods> WorkItem<B> {
673678

674679
enum WorkItemResult<M> {
675680
Compiled(CompiledModule),
676-
NeedsLTO(ModuleCodegen<M>),
681+
NeedsFatLTO(ModuleCodegen<M>),
682+
NeedsThinLTO(ModuleCodegen<M>),
677683
}
678684

679685
fn 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

768778
fn execute_copy_from_cache_work_item<B: ExtraBackendMethods>(
@@ -844,7 +854,11 @@ fn execute_lto_work_item<B: ExtraBackendMethods>(
844854

845855
pub 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

Comments
 (0)