diff options
| author | Yoshiki Matsuda <myskjp@gmail.com> | 2022-05-02 15:45:36 +0900 |
|---|---|---|
| committer | Yoshiki Matsuda <myskjp@gmail.com> | 2022-07-02 22:54:37 +0900 |
| commit | c8e49e4b25a10ebf9333742c3bb0724edf1ef2d9 (patch) | |
| tree | e354bb3841e19ac464760f5d60f31b68e95b7bd3 | |
| parent | b28b7c90cb5b11d0bba77a86fe119f5b775fe289 (diff) | |
| download | rust-c8e49e4b25a10ebf9333742c3bb0724edf1ef2d9.tar.gz rust-c8e49e4b25a10ebf9333742c3bb0724edf1ef2d9.zip | |
write the root position at the end
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/decoder.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/encoder.rs | 24 |
2 files changed, 10 insertions, 18 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index 3280fd5c310..37ccf592aa5 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -682,13 +682,13 @@ impl MetadataBlob { } pub(crate) fn get_rustc_version(&self) -> String { - LazyValue::<String>::from_position(NonZeroUsize::new(METADATA_HEADER.len() + 4).unwrap()) + LazyValue::<String>::from_position(NonZeroUsize::new(METADATA_HEADER.len()).unwrap()) .decode(self) } pub(crate) fn get_root(&self) -> CrateRoot { let slice = &self.blob()[..]; - let offset = METADATA_HEADER.len(); + let offset = slice.len() - 4; let pos = (((slice[offset + 0] as u32) << 24) | ((slice[offset + 1] as u32) << 16) | ((slice[offset + 2] as u32) << 8) diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 96bc2b4f8f1..c0750abf188 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -40,7 +40,7 @@ use rustc_span::{ use rustc_target::abi::VariantIdx; use std::borrow::Borrow; use std::hash::Hash; -use std::io::{Read, Seek, Write}; +use std::io::{Read, Write}; use std::iter; use std::num::NonZeroUsize; use std::path::{Path, PathBuf}; @@ -2215,9 +2215,6 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>, path: impl AsRef<Path>) { .unwrap_or_else(|err| tcx.sess.fatal(&format!("failed to create file encoder: {}", err))); encoder.emit_raw_bytes(METADATA_HEADER); - // Will be filled with the root position after encoding everything. - encoder.emit_raw_bytes(&[0, 0, 0, 0]); - let source_map_files = tcx.sess.source_map().files(); let source_file_cache = (source_map_files[0].clone(), 0); let required_source_files = Some(GrowableBitSet::with_capacity(source_map_files.len())); @@ -2247,25 +2244,20 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>, path: impl AsRef<Path>) { // culminating in the `CrateRoot` which points to all of it. let root = ecx.encode_crate_root(); - ecx.opaque.flush(); - let mut file = std::fs::OpenOptions::new() - .write(true) - .open(path.as_ref()) - .unwrap_or_else(|err| tcx.sess.fatal(&format!("failed to open the file: {}", err))); - // Encode the root position. - let header = METADATA_HEADER.len(); - file.seek(std::io::SeekFrom::Start(header as u64)) - .unwrap_or_else(|err| tcx.sess.fatal(&format!("failed to seek the file: {}", err))); let pos = root.position.get(); - file.write_all(&[(pos >> 24) as u8, (pos >> 16) as u8, (pos >> 8) as u8, (pos >> 0) as u8]) - .unwrap_or_else(|err| tcx.sess.fatal(&format!("failed to write to the file: {}", err))); + ecx.opaque.emit_raw_bytes(&[ + (pos >> 24) as u8, + (pos >> 16) as u8, + (pos >> 8) as u8, + (pos >> 0) as u8, + ]); // Record metadata size for self-profiling tcx.prof.artifact_size( "crate_metadata", "crate_metadata", - file.metadata().unwrap().len() as u64, + ecx.opaque.file().metadata().unwrap().len() as u64, ); } |
