Skip to content

Commit d8308ec

Browse files
committed
Move Object creation into metadata.rs
1 parent a929c95 commit d8308ec

File tree

3 files changed

+62
-78
lines changed

3 files changed

+62
-78
lines changed

src/backend.rs

Lines changed: 2 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,13 @@ use cranelift_codegen::isa::TargetIsa;
99
use cranelift_module::FuncId;
1010
use cranelift_object::{ObjectBuilder, ObjectModule, ObjectProduct};
1111

12-
use object::write::*;
13-
use object::{RelocationEncoding, SectionKind, SymbolFlags};
12+
use object::write::{Relocation, StandardSegment};
13+
use object::{RelocationEncoding, SectionKind};
1414

1515
use gimli::SectionId;
1616

1717
use crate::debuginfo::{DebugReloc, DebugRelocName};
1818

19-
pub(crate) trait WriteMetadata {
20-
fn add_rustc_section(&mut self, symbol_name: String, data: Vec<u8>);
21-
}
22-
23-
impl WriteMetadata for object::write::Object {
24-
fn add_rustc_section(&mut self, symbol_name: String, data: Vec<u8>) {
25-
let segment = self.segment_name(object::write::StandardSegment::Data).to_vec();
26-
let section_id = self.add_section(segment, b".rustc".to_vec(), object::SectionKind::Data);
27-
let offset = self.append_section_data(section_id, &data, 1);
28-
// For MachO and probably PE this is necessary to prevent the linker from throwing away the
29-
// .rustc section. For ELF this isn't necessary, but it also doesn't harm.
30-
self.add_symbol(object::write::Symbol {
31-
name: symbol_name.into_bytes(),
32-
value: offset,
33-
size: data.len() as u64,
34-
kind: object::SymbolKind::Data,
35-
scope: object::SymbolScope::Dynamic,
36-
weak: false,
37-
section: SymbolSection::Section(section_id),
38-
flags: SymbolFlags::None,
39-
});
40-
}
41-
}
42-
4319
pub(crate) trait WriteDebugInfo {
4420
type SectionId: Copy;
4521

@@ -112,48 +88,6 @@ impl WriteDebugInfo for ObjectProduct {
11288
}
11389
}
11490

115-
pub(crate) fn with_object(sess: &Session, name: &str, f: impl FnOnce(&mut Object)) -> Vec<u8> {
116-
let triple = crate::target_triple(sess);
117-
118-
let binary_format = match triple.binary_format {
119-
target_lexicon::BinaryFormat::Elf => object::BinaryFormat::Elf,
120-
target_lexicon::BinaryFormat::Coff => object::BinaryFormat::Coff,
121-
target_lexicon::BinaryFormat::Macho => object::BinaryFormat::MachO,
122-
binary_format => sess.fatal(&format!("binary format {} is unsupported", binary_format)),
123-
};
124-
let architecture = match triple.architecture {
125-
target_lexicon::Architecture::Aarch64(_) => object::Architecture::Aarch64,
126-
target_lexicon::Architecture::Arm(_) => object::Architecture::Arm,
127-
target_lexicon::Architecture::Avr => object::Architecture::Avr,
128-
target_lexicon::Architecture::Hexagon => object::Architecture::Hexagon,
129-
target_lexicon::Architecture::Mips32(_) => object::Architecture::Mips,
130-
target_lexicon::Architecture::Mips64(_) => object::Architecture::Mips64,
131-
target_lexicon::Architecture::Msp430 => object::Architecture::Msp430,
132-
target_lexicon::Architecture::Powerpc => object::Architecture::PowerPc,
133-
target_lexicon::Architecture::Powerpc64 => object::Architecture::PowerPc64,
134-
target_lexicon::Architecture::Powerpc64le => todo!(),
135-
target_lexicon::Architecture::Riscv32(_) => object::Architecture::Riscv32,
136-
target_lexicon::Architecture::Riscv64(_) => object::Architecture::Riscv64,
137-
target_lexicon::Architecture::S390x => object::Architecture::S390x,
138-
target_lexicon::Architecture::Sparc64 => object::Architecture::Sparc64,
139-
target_lexicon::Architecture::Sparcv9 => object::Architecture::Sparc64,
140-
target_lexicon::Architecture::X86_32(_) => object::Architecture::I386,
141-
target_lexicon::Architecture::X86_64 => object::Architecture::X86_64,
142-
architecture => {
143-
sess.fatal(&format!("target architecture {:?} is unsupported", architecture,))
144-
}
145-
};
146-
let endian = match triple.endianness().unwrap() {
147-
target_lexicon::Endianness::Little => object::Endianness::Little,
148-
target_lexicon::Endianness::Big => object::Endianness::Big,
149-
};
150-
151-
let mut metadata_object = object::write::Object::new(binary_format, architecture, endian);
152-
metadata_object.add_file_symbol(name.as_bytes().to_vec());
153-
f(&mut metadata_object);
154-
metadata_object.write().unwrap()
155-
}
156-
15791
pub(crate) fn make_module(sess: &Session, isa: Box<dyn TargetIsa>, name: String) -> ObjectModule {
15892
let mut builder =
15993
ObjectBuilder::new(isa, name + ".o", cranelift_module::default_libcall_names()).unwrap();

src/driver/aot.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,7 @@ pub(crate) fn run_aot(
267267
let tmp_file =
268268
tcx.output_filenames(()).temp_path(OutputType::Metadata, Some(&metadata_cgu_name));
269269

270-
let obj = crate::backend::with_object(tcx.sess, &metadata_cgu_name, |object| {
271-
crate::metadata::write_metadata(tcx, object);
272-
});
270+
let obj = crate::metadata::new_metadata_object(tcx, &metadata_cgu_name);
273271

274272
if let Err(err) = std::fs::write(&tmp_file, obj) {
275273
tcx.sess.fatal(&format!("error writing metadata object file: {}", err));

src/metadata.rs

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,72 @@
11
//! Writing of the rustc metadata for dylibs
22
3-
use rustc_middle::ty::TyCtxt;
3+
use object::write::{Object, StandardSegment, Symbol, SymbolSection};
4+
use object::{SectionKind, SymbolFlags, SymbolKind, SymbolScope};
45

5-
use crate::backend::WriteMetadata;
6+
use rustc_middle::ty::TyCtxt;
67

78
// Adapted from https://github.com/rust-lang/rust/blob/da573206f87b5510de4b0ee1a9c044127e409bd3/src/librustc_codegen_llvm/base.rs#L47-L112
8-
pub(crate) fn write_metadata<O: WriteMetadata>(tcx: TyCtxt<'_>, object: &mut O) {
9+
pub(crate) fn new_metadata_object(tcx: TyCtxt<'_>, cgu_name: &str) -> Vec<u8> {
910
use snap::write::FrameEncoder;
1011
use std::io::Write;
1112

1213
let metadata = tcx.encode_metadata();
1314
let mut compressed = rustc_metadata::METADATA_HEADER.to_vec();
1415
FrameEncoder::new(&mut compressed).write_all(&metadata.raw_data).unwrap();
1516

16-
object.add_rustc_section(
17-
rustc_middle::middle::exported_symbols::metadata_symbol_name(tcx),
18-
compressed,
19-
);
17+
let triple = crate::target_triple(tcx.sess);
18+
19+
let binary_format = match triple.binary_format {
20+
target_lexicon::BinaryFormat::Elf => object::BinaryFormat::Elf,
21+
target_lexicon::BinaryFormat::Coff => object::BinaryFormat::Coff,
22+
target_lexicon::BinaryFormat::Macho => object::BinaryFormat::MachO,
23+
binary_format => tcx.sess.fatal(&format!("binary format {} is unsupported", binary_format)),
24+
};
25+
let architecture = match triple.architecture {
26+
target_lexicon::Architecture::Aarch64(_) => object::Architecture::Aarch64,
27+
target_lexicon::Architecture::Arm(_) => object::Architecture::Arm,
28+
target_lexicon::Architecture::Avr => object::Architecture::Avr,
29+
target_lexicon::Architecture::Hexagon => object::Architecture::Hexagon,
30+
target_lexicon::Architecture::Mips32(_) => object::Architecture::Mips,
31+
target_lexicon::Architecture::Mips64(_) => object::Architecture::Mips64,
32+
target_lexicon::Architecture::Msp430 => object::Architecture::Msp430,
33+
target_lexicon::Architecture::Powerpc => object::Architecture::PowerPc,
34+
target_lexicon::Architecture::Powerpc64 => object::Architecture::PowerPc64,
35+
target_lexicon::Architecture::Powerpc64le => todo!(),
36+
target_lexicon::Architecture::Riscv32(_) => object::Architecture::Riscv32,
37+
target_lexicon::Architecture::Riscv64(_) => object::Architecture::Riscv64,
38+
target_lexicon::Architecture::S390x => object::Architecture::S390x,
39+
target_lexicon::Architecture::Sparc64 => object::Architecture::Sparc64,
40+
target_lexicon::Architecture::Sparcv9 => object::Architecture::Sparc64,
41+
target_lexicon::Architecture::X86_32(_) => object::Architecture::I386,
42+
target_lexicon::Architecture::X86_64 => object::Architecture::X86_64,
43+
architecture => {
44+
tcx.sess.fatal(&format!("target architecture {:?} is unsupported", architecture,))
45+
}
46+
};
47+
let endian = match triple.endianness().unwrap() {
48+
target_lexicon::Endianness::Little => object::Endianness::Little,
49+
target_lexicon::Endianness::Big => object::Endianness::Big,
50+
};
51+
52+
let mut object = Object::new(binary_format, architecture, endian);
53+
object.add_file_symbol(cgu_name.as_bytes().to_vec());
54+
55+
let segment = object.segment_name(StandardSegment::Data).to_vec();
56+
let section_id = object.add_section(segment, b".rustc".to_vec(), SectionKind::Data);
57+
let offset = object.append_section_data(section_id, &compressed, 1);
58+
// For MachO and probably PE this is necessary to prevent the linker from throwing away the
59+
// .rustc section. For ELF this isn't necessary, but it also doesn't harm.
60+
object.add_symbol(Symbol {
61+
name: rustc_middle::middle::exported_symbols::metadata_symbol_name(tcx).into_bytes(),
62+
value: offset,
63+
size: compressed.len() as u64,
64+
kind: SymbolKind::Data,
65+
scope: SymbolScope::Dynamic,
66+
weak: false,
67+
section: SymbolSection::Section(section_id),
68+
flags: SymbolFlags::None,
69+
});
70+
71+
object.write().unwrap()
2072
}

0 commit comments

Comments
 (0)