Skip to content

Commit ec86930

Browse files
authored
Rollup merge of #144503 - bjorn3:lto_refactors3, r=petrochenkov
Various refactors to the codegen coordinator code (part 3) Continuing from #144062 this removes an option without any known users, uses the object crate in favor of LLVM for getting the LTO bitcode and improves the coordinator channel handling.
2 parents e36b844 + 948f779 commit ec86930

File tree

13 files changed

+41
-197
lines changed

13 files changed

+41
-197
lines changed

compiler/rustc_codegen_gcc/src/back/write.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use gccjit::{Context, OutputKind};
44
use rustc_codegen_ssa::back::link::ensure_removed;
55
use rustc_codegen_ssa::back::write::{BitcodeSection, CodegenContext, EmitObj, ModuleConfig};
66
use rustc_codegen_ssa::{CompiledModule, ModuleCodegen};
7-
use rustc_errors::DiagCtxtHandle;
87
use rustc_fs_util::link_or_copy;
98
use rustc_session::config::OutputType;
109
use rustc_span::fatal_error::FatalError;
@@ -258,14 +257,6 @@ pub(crate) fn codegen(
258257
))
259258
}
260259

261-
pub(crate) fn link(
262-
_cgcx: &CodegenContext<GccCodegenBackend>,
263-
_dcx: DiagCtxtHandle<'_>,
264-
mut _modules: Vec<ModuleCodegen<GccContext>>,
265-
) -> Result<ModuleCodegen<GccContext>, FatalError> {
266-
unimplemented!();
267-
}
268-
269260
pub(crate) fn save_temp_bitcode(
270261
cgcx: &CodegenContext<GccCodegenBackend>,
271262
_module: &ModuleCodegen<GccContext>,

compiler/rustc_codegen_gcc/src/lib.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -426,14 +426,6 @@ impl WriteBackendMethods for GccCodegenBackend {
426426
fn serialize_module(_module: ModuleCodegen<Self::Module>) -> (String, Self::ModuleBuffer) {
427427
unimplemented!();
428428
}
429-
430-
fn run_link(
431-
cgcx: &CodegenContext<Self>,
432-
dcx: DiagCtxtHandle<'_>,
433-
modules: Vec<ModuleCodegen<Self::Module>>,
434-
) -> Result<ModuleCodegen<Self::Module>, FatalError> {
435-
back::write::link(cgcx, dcx, modules)
436-
}
437429
}
438430

439431
/// This is the entrypoint for a hot plugged rustc_codegen_gccjit

compiler/rustc_codegen_llvm/messages.ftl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ codegen_llvm_from_llvm_optimization_diag = {$filename}:{$line}:{$column} {$pass_
1212
codegen_llvm_load_bitcode = failed to load bitcode of module "{$name}"
1313
codegen_llvm_load_bitcode_with_llvm_err = failed to load bitcode of module "{$name}": {$llvm_err}
1414
15-
codegen_llvm_lto_bitcode_from_rlib = failed to get bitcode from object file for LTO ({$llvm_err})
15+
codegen_llvm_lto_bitcode_from_rlib = failed to get bitcode from object file for LTO ({$err})
1616
1717
codegen_llvm_mismatch_data_layout =
1818
data-layout for target `{$rustc_target}`, `{$rustc_layout}`, differs from LLVM target's `{$llvm_target}` default layout, `{$llvm_layout}`

compiler/rustc_codegen_llvm/src/back/lto.rs

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use std::sync::Arc;
77
use std::{io, iter, slice};
88

99
use object::read::archive::ArchiveFile;
10+
use object::{Object, ObjectSection};
1011
use rustc_codegen_ssa::back::lto::{SerializedModule, ThinModule, ThinShared};
1112
use rustc_codegen_ssa::back::write::{CodegenContext, FatLtoInput};
1213
use rustc_codegen_ssa::traits::*;
@@ -105,31 +106,15 @@ fn get_bitcode_slice_from_object_data<'a>(
105106
// name" which in the public API for sections gets treated as part of the section name, but
106107
// internally in MachOObjectFile.cpp gets treated separately.
107108
let section_name = bitcode_section_name(cgcx).to_str().unwrap().trim_start_matches("__LLVM,");
108-
let mut len = 0;
109-
let data = unsafe {
110-
llvm::LLVMRustGetSliceFromObjectDataByName(
111-
obj.as_ptr(),
112-
obj.len(),
113-
section_name.as_ptr(),
114-
section_name.len(),
115-
&mut len,
116-
)
117-
};
118-
if !data.is_null() {
119-
assert!(len != 0);
120-
let bc = unsafe { slice::from_raw_parts(data, len) };
121109

122-
// `bc` must be a sub-slice of `obj`.
123-
assert!(obj.as_ptr() <= bc.as_ptr());
124-
assert!(bc[bc.len()..bc.len()].as_ptr() <= obj[obj.len()..obj.len()].as_ptr());
110+
let obj =
111+
object::File::parse(obj).map_err(|err| LtoBitcodeFromRlib { err: err.to_string() })?;
125112

126-
Ok(bc)
127-
} else {
128-
assert!(len == 0);
129-
Err(LtoBitcodeFromRlib {
130-
llvm_err: llvm::last_error().unwrap_or_else(|| "unknown LLVM error".to_string()),
131-
})
132-
}
113+
let section = obj
114+
.section_by_name(section_name)
115+
.ok_or_else(|| LtoBitcodeFromRlib { err: format!("Can't find section {section_name}") })?;
116+
117+
section.data().map_err(|err| LtoBitcodeFromRlib { err: err.to_string() })
133118
}
134119

135120
/// Performs fat LTO by merging all modules into a single one and returning it

compiler/rustc_codegen_llvm/src/back/write.rs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -796,29 +796,6 @@ pub(crate) fn optimize(
796796
Ok(())
797797
}
798798

799-
pub(crate) fn link(
800-
cgcx: &CodegenContext<LlvmCodegenBackend>,
801-
dcx: DiagCtxtHandle<'_>,
802-
mut modules: Vec<ModuleCodegen<ModuleLlvm>>,
803-
) -> Result<ModuleCodegen<ModuleLlvm>, FatalError> {
804-
use super::lto::{Linker, ModuleBuffer};
805-
// Sort the modules by name to ensure deterministic behavior.
806-
modules.sort_by(|a, b| a.name.cmp(&b.name));
807-
let (first, elements) =
808-
modules.split_first().expect("Bug! modules must contain at least one module.");
809-
810-
let mut linker = Linker::new(first.module_llvm.llmod());
811-
for module in elements {
812-
let _timer = cgcx.prof.generic_activity_with_arg("LLVM_link_module", &*module.name);
813-
let buffer = ModuleBuffer::new(module.module_llvm.llmod());
814-
linker
815-
.add(buffer.data())
816-
.map_err(|()| llvm_err(dcx, LlvmError::SerializeModule { name: &module.name }))?;
817-
}
818-
drop(linker);
819-
Ok(modules.remove(0))
820-
}
821-
822799
pub(crate) fn codegen(
823800
cgcx: &CodegenContext<LlvmCodegenBackend>,
824801
module: ModuleCodegen<ModuleLlvm>,

compiler/rustc_codegen_llvm/src/errors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub(crate) struct AutoDiffWithoutEnable;
3939
#[derive(Diagnostic)]
4040
#[diag(codegen_llvm_lto_bitcode_from_rlib)]
4141
pub(crate) struct LtoBitcodeFromRlib {
42-
pub llvm_err: String,
42+
pub err: String,
4343
}
4444

4545
#[derive(Diagnostic)]

compiler/rustc_codegen_llvm/src/lib.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,6 @@ impl WriteBackendMethods for LlvmCodegenBackend {
168168
let stats = llvm::build_string(|s| unsafe { llvm::LLVMRustPrintStatistics(s) }).unwrap();
169169
print!("{stats}");
170170
}
171-
fn run_link(
172-
cgcx: &CodegenContext<Self>,
173-
dcx: DiagCtxtHandle<'_>,
174-
modules: Vec<ModuleCodegen<Self::Module>>,
175-
) -> Result<ModuleCodegen<Self::Module>, FatalError> {
176-
back::write::link(cgcx, dcx, modules)
177-
}
178171
fn run_and_optimize_fat_lto(
179172
cgcx: &CodegenContext<Self>,
180173
exported_symbols_for_lto: &[String],

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2612,13 +2612,6 @@ unsafe extern "C" {
26122612
len: usize,
26132613
Identifier: *const c_char,
26142614
) -> Option<&Module>;
2615-
pub(crate) fn LLVMRustGetSliceFromObjectDataByName(
2616-
data: *const u8,
2617-
len: usize,
2618-
name: *const u8,
2619-
name_len: usize,
2620-
out_len: &mut usize,
2621-
) -> *const u8;
26222615

26232616
pub(crate) fn LLVMRustLinkerNew(M: &Module) -> &mut Linker<'_>;
26242617
pub(crate) fn LLVMRustLinkerAdd(

0 commit comments

Comments
 (0)