Skip to content

Commit

Permalink
allow large Size again
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed Mar 30, 2022
1 parent 9c06e1b commit 2799885
Showing 1 changed file with 7 additions and 16 deletions.
23 changes: 7 additions & 16 deletions compiler/rustc_target/src/abi/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -279,30 +279,16 @@ impl ToJson for Endian {
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Encodable, Decodable)]
#[derive(HashStable_Generic)]
pub struct Size {
// The top 3 bits are ALWAYS zero.
raw: u64,
}

impl Size {
pub const ZERO: Size = Size { raw: 0 };

/// Rounds `bits` up to the next-higher byte boundary, if `bits` is
/// is not aligned.
/// not a multiple of 8.
pub fn from_bits(bits: impl TryInto<u64>) -> Size {
let bits = bits.try_into().ok().unwrap();

#[cold]
fn overflow(bits: u64) -> ! {
panic!("Size::from_bits({}) has overflowed", bits);
}

// This is the largest value of `bits` that does not cause overflow
// during rounding, and guarantees that the resulting number of bytes
// cannot cause overflow when multiplied by 8.
if bits > 0xffff_ffff_ffff_fff8 {
overflow(bits);
}

// Avoid potential overflow from `bits + 7`.
Size { raw: bits / 8 + ((bits % 8) + 7) / 8 }
}
Expand All @@ -325,7 +311,12 @@ impl Size {

#[inline]
pub fn bits(self) -> u64 {
self.raw << 3
#[cold]
fn overflow(bytes: u64) -> ! {
panic!("Size::bits: {} bytes in bits doesn't fit in u64", bytes)
}

self.bytes().checked_mul(8).unwrap_or_else(|| overflow(self.bytes()))
}

#[inline]
Expand Down

0 comments on commit 2799885

Please sign in to comment.