]> git.lizzy.rs Git - rust.git/commitdiff
Use cg_ssa for creating the dylib metadata file
authorbjorn3 <bjorn3@users.noreply.github.com>
Thu, 9 Dec 2021 12:36:33 +0000 (13:36 +0100)
committerbjorn3 <bjorn3@users.noreply.github.com>
Thu, 9 Dec 2021 12:36:33 +0000 (13:36 +0100)
The new api was introduced in rust-lang/rust#91604

src/driver/aot.rs
src/lib.rs
src/metadata.rs [deleted file]

index 8317f40c7eac94dc85cb2db67e0bf2583dde2f6b..607d76c150bf4c0c2f32ad088654ca6e0ecdcc59 100644 (file)
@@ -4,6 +4,7 @@
 use std::path::PathBuf;
 
 use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece};
+use rustc_codegen_ssa::back::metadata::create_compressed_metadata_file;
 use rustc_codegen_ssa::{CodegenResults, CompiledModule, CrateInfo, ModuleKind};
 use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
 use rustc_metadata::EncodedMetadata;
@@ -278,7 +279,8 @@ pub(crate) fn run_aot(
             let tmp_file =
                 tcx.output_filenames(()).temp_path(OutputType::Metadata, Some(&metadata_cgu_name));
 
-            let obj = crate::metadata::new_metadata_object(tcx, &metadata_cgu_name, &metadata);
+            let symbol_name = rustc_middle::middle::exported_symbols::metadata_symbol_name(tcx);
+            let obj = create_compressed_metadata_file(tcx.sess, &metadata, &symbol_name);
 
             if let Err(err) = std::fs::write(&tmp_file, obj) {
                 tcx.sess.fatal(&format!("error writing metadata object file: {}", err));
index d752dc9e4f7c8d71e213e833f0989b88dca748ea..fee2ea97a5761dc5458df4c58d45c98db6cad97b 100644 (file)
@@ -61,7 +61,6 @@
 mod intrinsics;
 mod linkage;
 mod main_shim;
-mod metadata;
 mod num;
 mod optimize;
 mod pointer;
diff --git a/src/metadata.rs b/src/metadata.rs
deleted file mode 100644 (file)
index 1c8fd0b..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-//! Writing of the rustc metadata for dylibs
-
-use object::write::{Object, StandardSegment, Symbol, SymbolSection};
-use object::{SectionKind, SymbolFlags, SymbolKind, SymbolScope};
-
-use rustc_metadata::EncodedMetadata;
-use rustc_middle::ty::TyCtxt;
-
-// Adapted from https://github.com/rust-lang/rust/blob/da573206f87b5510de4b0ee1a9c044127e409bd3/src/librustc_codegen_llvm/base.rs#L47-L112
-pub(crate) fn new_metadata_object(
-    tcx: TyCtxt<'_>,
-    cgu_name: &str,
-    metadata: &EncodedMetadata,
-) -> Vec<u8> {
-    use snap::write::FrameEncoder;
-    use std::io::Write;
-
-    let mut compressed = rustc_metadata::METADATA_HEADER.to_vec();
-    FrameEncoder::new(&mut compressed).write_all(metadata.raw_data()).unwrap();
-
-    let triple = crate::target_triple(tcx.sess);
-
-    let binary_format = match triple.binary_format {
-        target_lexicon::BinaryFormat::Elf => object::BinaryFormat::Elf,
-        target_lexicon::BinaryFormat::Coff => object::BinaryFormat::Coff,
-        target_lexicon::BinaryFormat::Macho => object::BinaryFormat::MachO,
-        binary_format => tcx.sess.fatal(&format!("binary format {} is unsupported", binary_format)),
-    };
-    let architecture = match triple.architecture {
-        target_lexicon::Architecture::Aarch64(_) => object::Architecture::Aarch64,
-        target_lexicon::Architecture::Arm(_) => object::Architecture::Arm,
-        target_lexicon::Architecture::Avr => object::Architecture::Avr,
-        target_lexicon::Architecture::Hexagon => object::Architecture::Hexagon,
-        target_lexicon::Architecture::Mips32(_) => object::Architecture::Mips,
-        target_lexicon::Architecture::Mips64(_) => object::Architecture::Mips64,
-        target_lexicon::Architecture::Msp430 => object::Architecture::Msp430,
-        target_lexicon::Architecture::Powerpc => object::Architecture::PowerPc,
-        target_lexicon::Architecture::Powerpc64 => object::Architecture::PowerPc64,
-        target_lexicon::Architecture::Powerpc64le => todo!(),
-        target_lexicon::Architecture::Riscv32(_) => object::Architecture::Riscv32,
-        target_lexicon::Architecture::Riscv64(_) => object::Architecture::Riscv64,
-        target_lexicon::Architecture::S390x => object::Architecture::S390x,
-        target_lexicon::Architecture::Sparc64 => object::Architecture::Sparc64,
-        target_lexicon::Architecture::Sparcv9 => object::Architecture::Sparc64,
-        target_lexicon::Architecture::X86_32(_) => object::Architecture::I386,
-        target_lexicon::Architecture::X86_64 => object::Architecture::X86_64,
-        architecture => {
-            tcx.sess.fatal(&format!("target architecture {:?} is unsupported", architecture,))
-        }
-    };
-    let endian = match triple.endianness().unwrap() {
-        target_lexicon::Endianness::Little => object::Endianness::Little,
-        target_lexicon::Endianness::Big => object::Endianness::Big,
-    };
-
-    let mut object = Object::new(binary_format, architecture, endian);
-    object.add_file_symbol(cgu_name.as_bytes().to_vec());
-
-    let segment = object.segment_name(StandardSegment::Data).to_vec();
-    let section_id = object.add_section(segment, b".rustc".to_vec(), SectionKind::Data);
-    let offset = object.append_section_data(section_id, &compressed, 1);
-    // For MachO and probably PE this is necessary to prevent the linker from throwing away the
-    // .rustc section. For ELF this isn't necessary, but it also doesn't harm.
-    object.add_symbol(Symbol {
-        name: rustc_middle::middle::exported_symbols::metadata_symbol_name(tcx).into_bytes(),
-        value: offset,
-        size: compressed.len() as u64,
-        kind: SymbolKind::Data,
-        scope: SymbolScope::Dynamic,
-        weak: false,
-        section: SymbolSection::Section(section_id),
-        flags: SymbolFlags::None,
-    });
-
-    object.write().unwrap()
-}