From 4c716fc39da170db258a8b9c2f2706b27941dd3c Mon Sep 17 00:00:00 2001 From: Sean Klein Date: Fri, 15 Dec 2023 15:01:41 -0800 Subject: [PATCH] 11.0.0: v9 format: Increase StringId and Addr size to u64 --- CHANGELOG.md | 7 ++ analyzeme/Cargo.toml | 8 +- analyzeme/src/file_formats/mod.rs | 5 +- analyzeme/src/file_formats/v7.rs | 4 +- analyzeme/src/file_formats/v8.rs | 74 ++++++++++++++-- analyzeme/src/file_formats/v9.rs | 25 ++++++ analyzeme/src/profiling_data.rs | 98 +++++++++++++++++++-- analyzeme/tests/profdata/v9.mm_profdata.gz | Bin 0 -> 82461 bytes crox/Cargo.toml | 2 +- decodeme/Cargo.toml | 2 +- decodeme/src/lib.rs | 18 ++-- decodeme/src/stringtable.rs | 20 +++-- flamegraph/Cargo.toml | 2 +- measureme/Cargo.toml | 2 +- measureme/src/event_id.rs | 12 +-- measureme/src/file_header.rs | 2 +- measureme/src/raw_event.rs | 2 +- measureme/src/serialization.rs | 10 +-- measureme/src/stringtable.rs | 38 ++++---- mmedit/Cargo.toml | 2 +- mmview/Cargo.toml | 2 +- stack_collapse/Cargo.toml | 2 +- summarize/Cargo.toml | 2 +- version_checker/Cargo.toml | 2 +- 24 files changed, 270 insertions(+), 71 deletions(-) create mode 100644 analyzeme/src/file_formats/v9.rs create mode 100644 analyzeme/tests/profdata/v9.mm_profdata.gz diff --git a/CHANGELOG.md b/CHANGELOG.md index e55b9a6..6116dd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [11.0.0] - 2023-12-14 + +### Changed +- `measureme`: Update StringId and Addr sizes from u32 to u64 ([GH-216]) +- `analyzeme`: v9 file format, which uses larger events ([GH-216]) + ## [10.1.2] - 2023-12-14 ### Changed @@ -232,3 +238,4 @@ [GH-208]: https://github.com/rust-lang/measureme/pull/208 [GH-209]: https://github.com/rust-lang/measureme/pull/209 [GH-211]: https://github.com/rust-lang/measureme/pull/211 +[GH-216]: https://github.com/rust-lang/measureme/pull/216 diff --git a/analyzeme/Cargo.toml b/analyzeme/Cargo.toml index 463d732..ee30421 100644 --- a/analyzeme/Cargo.toml +++ b/analyzeme/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "analyzeme" -version = "10.1.2" +version = "11.0.0" authors = ["Wesley Wiser ", "Michael Woerister "] edition = "2018" license = "MIT OR Apache-2.0" @@ -14,7 +14,13 @@ serde = { version = "1.0", features = ["derive"] } # Depending on older versions of this crate allows us to keep supporting older # file formats. + +# File format: v7 analyzeme_9_2_0 = { package = "analyzeme", git = "https://github.com/rust-lang/measureme", tag = "9.2.0" } +# File format: v8 +decodeme_10_1_2 = { package = "decodeme", git = "https://github.com/rust-lang/measureme", tag = "10.1.2" } +measureme_10_1_2 = { package = "measureme", git = "https://github.com/rust-lang/measureme", tag = "10.1.2" } + [dev-dependencies] flate2 = "1.0" diff --git a/analyzeme/src/file_formats/mod.rs b/analyzeme/src/file_formats/mod.rs index 2864f47..7c2e27f 100644 --- a/analyzeme/src/file_formats/mod.rs +++ b/analyzeme/src/file_formats/mod.rs @@ -3,13 +3,14 @@ use std::fmt::Debug; pub mod v7; pub mod v8; +pub mod v9; -pub use v8 as current; +pub use v9 as current; /// The [EventDecoder] knows how to decode events for a specific file format. pub trait EventDecoder: Debug + Send + Sync { fn num_events(&self) -> usize; - fn metadata(&self) -> &Metadata; + fn metadata(&self) -> Metadata; fn decode_full_event<'a>(&'a self, event_index: usize) -> Event<'a>; fn decode_lightweight_event<'a>(&'a self, event_index: usize) -> LightweightEvent; } diff --git a/analyzeme/src/file_formats/v7.rs b/analyzeme/src/file_formats/v7.rs index 995853d..57e4570 100644 --- a/analyzeme/src/file_formats/v7.rs +++ b/analyzeme/src/file_formats/v7.rs @@ -41,8 +41,8 @@ impl super::EventDecoder for EventDecoder { self.legacy_profiling_data.num_events() } - fn metadata(&self) -> &Metadata { - &self.metadata + fn metadata(&self) -> Metadata { + self.metadata.clone() } fn decode_full_event(&self, event_index: usize) -> Event<'_> { diff --git a/analyzeme/src/file_formats/v8.rs b/analyzeme/src/file_formats/v8.rs index 4ea4c9c..23d01fc 100644 --- a/analyzeme/src/file_formats/v8.rs +++ b/analyzeme/src/file_formats/v8.rs @@ -1,26 +1,84 @@ //! This module implements file loading for the v8 file format used until -//! crate version 10.0.0 +//! crate version 10.0.0. +//! +//! The difference from v8 to v9 copes with the expansion of StringId and Addr +//! types from u32 to u64. Most of the EventDecoder interface is actually +//! unchanged, but the construction of "EventDecoder::new", which parses +//! the stream of events, varies based on these sizes. +//! +//! This file provides conversions to current interfaces, relying on an +//! old version of this crate to parse the u32-based v8 version. -use crate::{Event, LightweightEvent}; -pub use decodeme::EventDecoder; +use crate::{Event, EventPayload, LightweightEvent, Timestamp}; use decodeme::Metadata; +use decodeme_10_1_2::event_payload::EventPayload as OldEventPayload; +use decodeme_10_1_2::event_payload::Timestamp as OldTimestamp; +use decodeme_10_1_2::lightweight_event::LightweightEvent as OldLightweightEvent; +pub use decodeme_10_1_2::EventDecoder; +use decodeme_10_1_2::Metadata as OldMetadata; -pub const FILE_FORMAT: u32 = decodeme::CURRENT_FILE_FORMAT_VERSION; +pub const FILE_FORMAT: u32 = measureme_10_1_2::file_header::CURRENT_FILE_FORMAT_VERSION; + +// NOTE: These are functionally a hand-rolled "impl From -> New", but +// given orphan rules, it seems undesirable to spread version-specific +// converters around the codebase. +// +// In lieu of an idiomatic type conversion, we at least centralize compatibility +// with the old "v8" version to this file. + +fn v8_metadata_as_current(old: &OldMetadata) -> Metadata { + Metadata { + start_time: old.start_time, + process_id: old.process_id, + cmd: old.cmd.clone(), + } +} + +fn v8_timestamp_as_current(old: OldTimestamp) -> Timestamp { + match old { + OldTimestamp::Interval { start, end } => Timestamp::Interval { start, end }, + OldTimestamp::Instant(t) => Timestamp::Instant(t), + } +} + +fn v8_event_payload_as_current(old: OldEventPayload) -> EventPayload { + match old { + OldEventPayload::Timestamp(t) => EventPayload::Timestamp(v8_timestamp_as_current(t)), + OldEventPayload::Integer(t) => EventPayload::Integer(t), + } +} + +fn v8_lightweightevent_as_current(old: OldLightweightEvent) -> LightweightEvent { + LightweightEvent { + event_index: old.event_index, + thread_id: old.thread_id, + payload: v8_event_payload_as_current(old.payload), + } +} impl super::EventDecoder for EventDecoder { fn num_events(&self) -> usize { self.num_events() } - fn metadata(&self) -> &Metadata { - self.metadata() + fn metadata(&self) -> Metadata { + let old = self.metadata(); + v8_metadata_as_current(&old) } fn decode_full_event(&self, event_index: usize) -> Event<'_> { - self.decode_full_event(event_index) + let old = self.decode_full_event(event_index); + + Event { + event_kind: old.event_kind, + label: old.label, + additional_data: old.additional_data, + payload: v8_event_payload_as_current(old.payload), + thread_id: old.thread_id, + } } fn decode_lightweight_event(&self, event_index: usize) -> LightweightEvent { - self.decode_lightweight_event(event_index) + v8_lightweightevent_as_current(self.decode_lightweight_event(event_index)) } } diff --git a/analyzeme/src/file_formats/v9.rs b/analyzeme/src/file_formats/v9.rs new file mode 100644 index 0000000..762bc2d --- /dev/null +++ b/analyzeme/src/file_formats/v9.rs @@ -0,0 +1,25 @@ +//! This module implements file loading for the v9 file format + +use crate::{Event, LightweightEvent}; +pub use decodeme::EventDecoder; +use decodeme::Metadata; + +pub const FILE_FORMAT: u32 = decodeme::CURRENT_FILE_FORMAT_VERSION; + +impl super::EventDecoder for EventDecoder { + fn num_events(&self) -> usize { + self.num_events() + } + + fn metadata(&self) -> Metadata { + self.metadata() + } + + fn decode_full_event(&self, event_index: usize) -> Event<'_> { + self.decode_full_event(event_index) + } + + fn decode_lightweight_event(&self, event_index: usize) -> LightweightEvent { + self.decode_lightweight_event(event_index) + } +} diff --git a/analyzeme/src/profiling_data.rs b/analyzeme/src/profiling_data.rs index 90e572e..d8fda6b 100644 --- a/analyzeme/src/profiling_data.rs +++ b/analyzeme/src/profiling_data.rs @@ -7,6 +7,7 @@ use measureme::file_header::{ use measureme::{ EventId, PageTag, RawEvent, SerializationSink, SerializationSinkBuilder, StringTableBuilder, }; +use std::cell::OnceCell; use std::fs; use std::path::Path; use std::sync::Arc; @@ -15,6 +16,7 @@ use std::{error::Error, path::PathBuf}; #[derive(Debug)] pub struct ProfilingData { event_decoder: Box, + metadata: OnceCell, } impl ProfilingData { @@ -50,9 +52,6 @@ impl ProfilingData { data: Vec, diagnostic_file_path: Option<&Path>, ) -> Result> { - // let event_decoder = EventDecoder::new(data, diagnostic_file_path)?; - // Ok(ProfilingData { event_decoder }) - let file_format_version = read_file_header( &data, FILE_MAGIC_TOP_LEVEL, @@ -66,6 +65,10 @@ impl ProfilingData { data, diagnostic_file_path, )?), + file_formats::v9::FILE_FORMAT => Box::new(file_formats::v9::EventDecoder::new( + data, + diagnostic_file_path, + )?), unsupported_version => { let msg = if unsupported_version > file_formats::current::FILE_FORMAT { format!( @@ -83,11 +86,15 @@ impl ProfilingData { } }; - Ok(ProfilingData { event_decoder }) + Ok(ProfilingData { + event_decoder, + metadata: OnceCell::new(), + }) } pub fn metadata(&self) -> &Metadata { - self.event_decoder.metadata() + // Cache the metadata during the first access + self.metadata.get_or_init(|| self.event_decoder.metadata()) } pub fn iter<'a>(&'a self) -> ProfilerEventIterator<'a> { @@ -301,6 +308,7 @@ impl ProfilingDataBuilder { ) .unwrap(), ), + metadata: OnceCell::new(), } } @@ -641,6 +649,86 @@ mod tests { ); } + // To generate this revision, a v9 revision of the rust toolchain was + // created, and "rustup toolchain link" was used to name it "bespoke". + // Then, the following commands were executed: + // + // # Make a small test binary and profile it. + // cargo new --bin testbinary + // cargo +bespoke rustc --bin testbinary -- -Zself-profile + // + // # Gzip the output profdata. + // gzip testbinary-...mm_profdata + // mv testbinary-...mm_profdata.gz v9.mm_profdata.gz + #[test] + fn can_read_v9_profdata_files() { + let (data, file_format_version) = + read_data_and_version("tests/profdata/v9.mm_profdata.gz"); + assert_eq!(file_format_version, file_formats::v9::FILE_FORMAT); + let profiling_data = ProfilingData::from_paged_buffer(data, None) + .expect("Creating the profiling data failed"); + let grouped_events = group_events(&profiling_data); + let event_kinds = grouped_events + .keys() + .map(|k| k.as_str()) + .collect::>(); + let expect_event_kinds = vec![ + "GenericActivity", + "IncrementalResultHashing", + "Query", + "ArtifactSize", + ] + .into_iter() + .collect::>(); + assert_eq!(event_kinds, expect_event_kinds); + + let generic_activity_len = 5125; + let incremental_hashing_len = 1844; + let query_len = 1877; + let artifact_size_len = 24; + assert_eq!( + grouped_events["GenericActivity"].len(), + generic_activity_len + ); + assert_eq!( + grouped_events["IncrementalResultHashing"].len(), + incremental_hashing_len + ); + assert_eq!(grouped_events["Query"].len(), query_len); + assert_eq!(grouped_events["ArtifactSize"].len(), artifact_size_len); + + assert_eq!( + grouped_events["GenericActivity"][generic_activity_len / 2].label, + "metadata_decode_entry_item_attrs" + ); + assert_eq!( + grouped_events["GenericActivity"][generic_activity_len / 2].duration(), + Some(Duration::from_nanos(376)) + ); + + assert_eq!( + grouped_events["IncrementalResultHashing"][incremental_hashing_len - 1].label, + "crate_hash" + ); + assert_eq!( + grouped_events["IncrementalResultHashing"][incremental_hashing_len - 1].duration(), + Some(Duration::from_nanos(461)) + ); + + assert_eq!(grouped_events["Query"][0].label, "registered_tools"); + assert_eq!( + grouped_events["Query"][0].duration(), + Some(Duration::from_nanos(45077)) + ); + + assert_eq!( + grouped_events["ArtifactSize"][0].label, + "codegen_unit_size_estimate" + ); + assert_eq!(grouped_events["ArtifactSize"][0].duration(), None); + assert_eq!(grouped_events["ArtifactSize"][0].integer(), Some(3)); + } + fn read_data_and_version(file_path: &str) -> (Vec, u32) { let data = std::fs::read(file_path).expect("Test data not found"); let mut gz = flate2::read::GzDecoder::new(&data[..]); diff --git a/analyzeme/tests/profdata/v9.mm_profdata.gz b/analyzeme/tests/profdata/v9.mm_profdata.gz new file mode 100644 index 0000000000000000000000000000000000000000..233350444c07d16e26e38a674ca61d4631937bca GIT binary patch literal 82461 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 z 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 C0J25^ literal 0 HcmV?d00001 diff --git a/crox/Cargo.toml b/crox/Cargo.toml index a42b820..21a9414 100644 --- a/crox/Cargo.toml +++ b/crox/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "crox" -version = "10.1.2" +version = "11.0.0" authors = ["Wesley Wiser "] edition = "2018" diff --git a/decodeme/Cargo.toml b/decodeme/Cargo.toml index bf6a94d..d15e64b 100644 --- a/decodeme/Cargo.toml +++ b/decodeme/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "decodeme" -version = "10.1.2" +version = "11.0.0" edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/decodeme/src/lib.rs b/decodeme/src/lib.rs index 6a5f7bd..2087f62 100644 --- a/decodeme/src/lib.rs +++ b/decodeme/src/lib.rs @@ -38,7 +38,7 @@ where .expect("a time that can be represented as SystemTime")) } -#[derive(Debug, Deserialize)] +#[derive(Clone, Debug, Deserialize)] pub struct Metadata { #[serde(deserialize_with = "system_time_from_nanos")] pub start_time: SystemTime, @@ -113,9 +113,15 @@ impl EventDecoder { let mut split_data = measureme::split_streams(&entire_file_data[FILE_HEADER_SIZE..]); - let string_data = split_data.remove(&PageTag::StringData).expect("Invalid file: No string data found"); - let index_data = split_data.remove(&PageTag::StringIndex).expect("Invalid file: No string index data found"); - let event_data = split_data.remove(&PageTag::Events).expect("Invalid file: No event data found"); + let string_data = split_data + .remove(&PageTag::StringData) + .expect("Invalid file: No string data found"); + let index_data = split_data + .remove(&PageTag::StringIndex) + .expect("Invalid file: No string index data found"); + let event_data = split_data + .remove(&PageTag::Events) + .expect("Invalid file: No event data found"); Self::from_separate_buffers(string_data, index_data, event_data, diagnostic_file_path) } @@ -151,8 +157,8 @@ impl EventDecoder { event_byte_count / RAW_EVENT_SIZE } - pub fn metadata(&self) -> &Metadata { - &self.metadata + pub fn metadata(&self) -> Metadata { + self.metadata.clone() } pub fn decode_full_event<'a>(&'a self, event_index: usize) -> Event<'a> { diff --git a/decodeme/src/stringtable.rs b/decodeme/src/stringtable.rs index fed6fcf..b600937 100644 --- a/decodeme/src/stringtable.rs +++ b/decodeme/src/stringtable.rs @@ -17,10 +17,12 @@ use std::convert::TryInto; use std::error::Error; use std::path::Path; +const INDEX_ENTRY_SIZE: usize = std::mem::size_of::() + std::mem::size_of::(); + fn deserialize_index_entry(bytes: &[u8]) -> (StringId, Addr) { ( - StringId::new(u32::from_le_bytes(bytes[0..4].try_into().unwrap())), - Addr(u32::from_le_bytes(bytes[4..8].try_into().unwrap())), + StringId::new(u64::from_le_bytes(bytes[0..8].try_into().unwrap())), + Addr(u64::from_le_bytes(bytes[8..16].try_into().unwrap())), ) } @@ -152,9 +154,9 @@ fn decode_string_ref_from_data(bytes: &[u8]) -> StringId { // refs, where the first byte is STRING_REF_TAG and the // following 4 bytes are a little-endian u32 string ID value. assert!(bytes[0] == STRING_REF_TAG); - assert!(STRING_REF_ENCODED_SIZE == 5); + assert!(STRING_REF_ENCODED_SIZE == 9); - let id = u32::from_le_bytes(bytes[1..5].try_into().unwrap()); + let id = u64::from_le_bytes(bytes[1..9].try_into().unwrap()); StringId::new(id) } @@ -185,9 +187,15 @@ impl StringTable { "StringTable Index", )?; - assert!(index_data.len() % 8 == 0); + // The non-header data should be divisible into index entries. + assert!( + (index_data.len() - measureme::file_header::FILE_HEADER_SIZE) % INDEX_ENTRY_SIZE == 0, + "StringTable index size appears malformed", + ); + assert_eq!(INDEX_ENTRY_SIZE, 16); + let index: FxHashMap<_, _> = strip_file_header(&index_data) - .chunks(8) + .chunks(INDEX_ENTRY_SIZE) .map(deserialize_index_entry) .collect(); diff --git a/flamegraph/Cargo.toml b/flamegraph/Cargo.toml index b5d0c15..edf4c3b 100644 --- a/flamegraph/Cargo.toml +++ b/flamegraph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "flamegraph" -version = "10.1.2" +version = "11.0.0" authors = ["Wesley Wiser ", "Michael Woerister "] edition = "2018" license = "MIT OR Apache-2.0" diff --git a/measureme/Cargo.toml b/measureme/Cargo.toml index 6a370e7..d057d2c 100644 --- a/measureme/Cargo.toml +++ b/measureme/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "measureme" -version = "10.1.2" +version = "11.0.0" authors = ["Wesley Wiser ", "Michael Woerister "] edition = "2018" description = "Support crate for rustc's self-profiling feature" diff --git a/measureme/src/event_id.rs b/measureme/src/event_id.rs index e2b0f53..d8dd251 100644 --- a/measureme/src/event_id.rs +++ b/measureme/src/event_id.rs @@ -33,24 +33,24 @@ impl EventId { } #[inline] - pub fn as_u32(self) -> u32 { - self.0.as_u32() + pub fn as_u64(self) -> u64 { + self.0.as_u64() } #[inline] - pub fn from_label(label: StringId) -> EventId { + pub fn from_label(label: StringId) -> Self { EventId(label) } #[inline] - pub fn from_virtual(virtual_id: StringId) -> EventId { + pub fn from_virtual(virtual_id: StringId) -> Self { EventId(virtual_id) } - /// Create an EventId from a raw u32 value. Only used internally for + /// Create an EventId from a raw u64 value. Only used internally for /// deserialization. #[inline] - pub fn from_u32(raw_id: u32) -> EventId { + pub fn from_u64(raw_id: u64) -> Self { EventId(StringId::new(raw_id)) } } diff --git a/measureme/src/file_header.rs b/measureme/src/file_header.rs index 8ad1928..f576b6d 100644 --- a/measureme/src/file_header.rs +++ b/measureme/src/file_header.rs @@ -5,7 +5,7 @@ use std::convert::TryInto; use std::error::Error; use std::path::Path; -pub const CURRENT_FILE_FORMAT_VERSION: u32 = 8; +pub const CURRENT_FILE_FORMAT_VERSION: u32 = 9; pub const FILE_MAGIC_TOP_LEVEL: &[u8; 4] = b"MMPD"; pub const FILE_MAGIC_EVENT_STREAM: &[u8; 4] = b"MMES"; diff --git a/measureme/src/raw_event.rs b/measureme/src/raw_event.rs index f181fb5..ec17427 100644 --- a/measureme/src/raw_event.rs +++ b/measureme/src/raw_event.rs @@ -214,7 +214,7 @@ mod tests { #[test] fn raw_event_has_expected_size() { // A test case to prevent accidental regressions of RawEvent's size. - assert_eq!(std::mem::size_of::(), 24); + assert_eq!(std::mem::size_of::(), 32); } #[test] diff --git a/measureme/src/serialization.rs b/measureme/src/serialization.rs index 28bfd96..487504e 100644 --- a/measureme/src/serialization.rs +++ b/measureme/src/serialization.rs @@ -70,7 +70,7 @@ impl std::convert::TryFrom for PageTag { // TODO: Evaluate if it makes sense to add a type tag to `Addr` in order to // prevent accidental use of `Addr` values with the wrong address space. #[derive(Clone, Copy, Eq, PartialEq, Debug)] -pub struct Addr(pub u32); +pub struct Addr(pub u64); impl Addr { pub fn as_usize(self) -> usize { @@ -169,7 +169,7 @@ impl<'a> Write for StdWriteAdapter<'a> { #[derive(Debug)] struct SerializationSinkInner { buffer: Vec, - addr: u32, + addr: u64, } /// This state is shared between all `SerializationSink`s writing to the same @@ -326,7 +326,7 @@ impl SerializationSink { buffer.resize(buf_end, 0u8); write(&mut buffer[buf_start..buf_end]); - *addr += num_bytes as u32; + *addr += num_bytes as u64; Addr(curr_addr) } @@ -356,7 +356,7 @@ impl SerializationSink { } = *data; let curr_addr = Addr(*addr); - *addr += bytes.len() as u32; + *addr += bytes.len() as u64; let mut bytes_left = bytes; @@ -438,7 +438,7 @@ mod tests { tags.iter().map(|&tag| sink_builder.new_sink(tag)).collect(); for chunk_index in 0..chunk_count { - let expected_addr = Addr((chunk_index * chunk_size) as u32); + let expected_addr = Addr((chunk_index * chunk_size) as u64); for sink in sinks.iter() { assert_eq!(write(sink, &expected_chunk[..]), expected_addr); } diff --git a/measureme/src/stringtable.rs b/measureme/src/stringtable.rs index a56bbcb..33bcf07 100644 --- a/measureme/src/stringtable.rs +++ b/measureme/src/stringtable.rs @@ -74,18 +74,18 @@ use std::{error::Error, sync::Arc}; /// that maps virtual `StringId`s to addresses. #[derive(Clone, Copy, Eq, PartialEq, Debug, Hash)] #[repr(C)] -pub struct StringId(u32); +pub struct StringId(u64); impl StringId { pub const INVALID: StringId = StringId(INVALID_STRING_ID); #[inline] - pub fn new(id: u32) -> StringId { + pub fn new(id: u64) -> StringId { StringId(id) } #[inline] - pub fn new_virtual(id: u32) -> StringId { + pub fn new_virtual(id: u64) -> StringId { assert!(id <= MAX_USER_VIRTUAL_STRING_ID); StringId(id) } @@ -96,7 +96,7 @@ impl StringId { } #[inline] - pub fn as_u32(self) -> u32 { + pub fn as_u64(self) -> u64 { self.0 } @@ -115,18 +115,18 @@ impl StringId { // See module-level documentation for more information on the encoding. pub const TERMINATOR: u8 = 0xFF; pub const STRING_REF_TAG: u8 = 0xFE; -pub const STRING_REF_ENCODED_SIZE: usize = 5; +pub const STRING_REF_ENCODED_SIZE: usize = 9; /// The maximum id value a virtual string may be. -const MAX_USER_VIRTUAL_STRING_ID: u32 = 100_000_000; +const MAX_USER_VIRTUAL_STRING_ID: u64 = 100_000_000; /// The id of the profile metadata string entry. -pub const METADATA_STRING_ID: u32 = MAX_USER_VIRTUAL_STRING_ID + 1; +pub const METADATA_STRING_ID: u64 = MAX_USER_VIRTUAL_STRING_ID + 1; /// Some random string ID that we make sure cannot be generated or assigned to. -const INVALID_STRING_ID: u32 = METADATA_STRING_ID + 1; +const INVALID_STRING_ID: u64 = METADATA_STRING_ID + 1; -pub const FIRST_REGULAR_STRING_ID: u32 = INVALID_STRING_ID + 1; +pub const FIRST_REGULAR_STRING_ID: u64 = INVALID_STRING_ID + 1; /// Write-only version of the string table pub struct StringTableBuilder { @@ -180,14 +180,14 @@ impl<'s> StringComponent<'s> { &mut bytes[s.len()..] } StringComponent::Ref(string_id) => { - // The code below assumes we use a 5-byte encoding for string + // The code below assumes we use a 9-byte encoding for string // refs, where the first byte is STRING_REF_TAG and the - // following 4 bytes are a little-endian u32 string ID value. - assert!(STRING_REF_ENCODED_SIZE == 5); + // following 8 bytes are a little-endian u64 string ID value. + assert!(STRING_REF_ENCODED_SIZE == 9); bytes[0] = STRING_REF_TAG; - bytes[1..5].copy_from_slice(&string_id.0.to_le_bytes()); - &mut bytes[5..] + bytes[1..9].copy_from_slice(&string_id.0.to_le_bytes()); + &mut bytes[9..] } } } @@ -248,9 +248,9 @@ impl_serializable_string_for_fixed_size!(15); impl_serializable_string_for_fixed_size!(16); fn serialize_index_entry(sink: &SerializationSink, id: StringId, addr: Addr) { - sink.write_atomic(8, |bytes| { - bytes[0..4].copy_from_slice(&id.0.to_le_bytes()); - bytes[4..8].copy_from_slice(&addr.0.to_le_bytes()); + sink.write_atomic(16, |bytes| { + bytes[0..8].copy_from_slice(&id.0.to_le_bytes()); + bytes[8..16].copy_from_slice(&addr.0.to_le_bytes()); }); } @@ -289,8 +289,8 @@ impl StringTableBuilder { // multiple StringIds to the same addr, so we don't have to repeat // the `concrete_id` over and over. - type MappingEntry = [u32; 2]; - assert!(std::mem::size_of::() == 8); + type MappingEntry = [u64; 2]; + assert!(std::mem::size_of::() == 16); let to_addr_le = concrete_id.to_addr().0.to_le(); diff --git a/mmedit/Cargo.toml b/mmedit/Cargo.toml index ee3f794..ca0bc35 100644 --- a/mmedit/Cargo.toml +++ b/mmedit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mmedit" -version = "10.1.2" +version = "11.0.0" edition = "2018" [dependencies] diff --git a/mmview/Cargo.toml b/mmview/Cargo.toml index c11dfff..5a720c7 100644 --- a/mmview/Cargo.toml +++ b/mmview/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mmview" -version = "10.1.2" +version = "11.0.0" authors = ["Wesley Wiser ", "Michael Woerister "] edition = "2018" license = "MIT OR Apache-2.0" diff --git a/stack_collapse/Cargo.toml b/stack_collapse/Cargo.toml index 539d9d9..e536097 100644 --- a/stack_collapse/Cargo.toml +++ b/stack_collapse/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "stack_collapse" -version = "10.1.2" +version = "11.0.0" authors = ["Wesley Wiser ", "Michael Woerister "] edition = "2018" license = "MIT OR Apache-2.0" diff --git a/summarize/Cargo.toml b/summarize/Cargo.toml index ebe5d4c..5d8f871 100644 --- a/summarize/Cargo.toml +++ b/summarize/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "summarize" -version = "10.1.2" +version = "11.0.0" authors = ["Wesley Wiser ", "Michael Woerister "] edition = "2018" license = "MIT OR Apache-2.0" diff --git a/version_checker/Cargo.toml b/version_checker/Cargo.toml index c9667c6..75bccd2 100644 --- a/version_checker/Cargo.toml +++ b/version_checker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "version_checker" -version = "10.1.2" +version = "11.0.0" authors = ["Michael Woerister "] edition = "2018" license = "MIT OR Apache-2.0"