Skip to content

Commit fe2eeab

Browse files
committed
Use the object crate rather than LLVM for extracting bitcode sections
1 parent 27e2709 commit fe2eeab

File tree

5 files changed

+10
-66
lines changed

5 files changed

+10
-66
lines changed

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/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/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(

compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,40 +1650,6 @@ extern "C" LLVMModuleRef LLVMRustParseBitcodeForLTO(LLVMContextRef Context,
16501650
return wrap(std::move(*SrcOrError).release());
16511651
}
16521652

1653-
// Find a section of an object file by name. Fail if the section is missing or
1654-
// empty.
1655-
extern "C" const char *LLVMRustGetSliceFromObjectDataByName(const char *data,
1656-
size_t len,
1657-
const char *name,
1658-
size_t name_len,
1659-
size_t *out_len) {
1660-
*out_len = 0;
1661-
auto Name = StringRef(name, name_len);
1662-
auto Data = StringRef(data, len);
1663-
auto Buffer = MemoryBufferRef(Data, ""); // The id is unused.
1664-
file_magic Type = identify_magic(Buffer.getBuffer());
1665-
Expected<std::unique_ptr<object::ObjectFile>> ObjFileOrError =
1666-
object::ObjectFile::createObjectFile(Buffer, Type);
1667-
if (!ObjFileOrError) {
1668-
LLVMRustSetLastError(toString(ObjFileOrError.takeError()).c_str());
1669-
return nullptr;
1670-
}
1671-
for (const object::SectionRef &Sec : (*ObjFileOrError)->sections()) {
1672-
Expected<StringRef> SecName = Sec.getName();
1673-
if (SecName && *SecName == Name) {
1674-
Expected<StringRef> SectionOrError = Sec.getContents();
1675-
if (!SectionOrError) {
1676-
LLVMRustSetLastError(toString(SectionOrError.takeError()).c_str());
1677-
return nullptr;
1678-
}
1679-
*out_len = SectionOrError->size();
1680-
return SectionOrError->data();
1681-
}
1682-
}
1683-
LLVMRustSetLastError("could not find requested section");
1684-
return nullptr;
1685-
}
1686-
16871653
// Computes the LTO cache key for the provided 'ModId' in the given 'Data',
16881654
// storing the result in 'KeyOut'.
16891655
// Currently, this cache key is a SHA-1 hash of anything that could affect

0 commit comments

Comments
 (0)