diff options
| author | Yoshiki Matsuda <myskjp@gmail.com> | 2022-05-30 01:12:05 +0900 |
|---|---|---|
| committer | Yoshiki Matsuda <myskjp@gmail.com> | 2022-07-02 22:54:37 +0900 |
| commit | 34e44e577485da3f8de4803a1f9248fa6c0089b8 (patch) | |
| tree | 3df46e2c93d27813d0c2cf11de51d3c9de462087 | |
| parent | ec64b4c90ed7b277b9946e6d10bea25befe13488 (diff) | |
| download | rust-34e44e577485da3f8de4803a1f9248fa6c0089b8.tar.gz rust-34e44e577485da3f8de4803a1f9248fa6c0089b8.zip | |
Revert "write the root position at the end"
This reverts commit 44f66429e1fdba2cd167b4033f04f462a368b717.
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/decoder.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/encoder.rs | 27 |
2 files changed, 16 insertions, 13 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index 990ff9e6b40..3280fd5c310 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -688,7 +688,7 @@ impl MetadataBlob { pub(crate) fn get_root(&self) -> CrateRoot { let slice = &self.blob()[..]; - let offset = slice.len() - 4; + let offset = METADATA_HEADER.len(); 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 b58f95b058b..cce59e06bf7 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -733,7 +733,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { assert_eq!(total_bytes, computed_total_bytes); if tcx.sess.meta_stats() { - self.opaque.flush().unwrap(); + self.opaque.flush(); let pos_before_rewind = self.opaque.file().stream_position().unwrap(); let mut zero_bytes = 0; @@ -2225,10 +2225,8 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>, path: &Path) { .unwrap_or_else(|err| tcx.sess.fatal(&format!("failed to create file encoder: {}", err))); encoder.emit_raw_bytes(METADATA_HEADER); - // Though we had holded the root position historically in this place, we moved it to the end - // of all emitted bytes by #96544. Therefore, now these 4 bytes are just a dummy to avoid the - // breaking change. - encoder.emit_raw_bytes(&[0, 0, 0, 0]).unwrap(); + // 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); @@ -2259,20 +2257,25 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>, path: &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) + .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(); - ecx.opaque.emit_raw_bytes(&[ - (pos >> 24) as u8, - (pos >> 16) as u8, - (pos >> 8) as u8, - (pos >> 0) as u8, - ]); + 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))); // Record metadata size for self-profiling tcx.prof.artifact_size( "crate_metadata", "crate_metadata", - ecx.opaque.file().metadata().unwrap().len() as u64, + file.metadata().unwrap().len() as u64, ); } |
