Skip to content

Commit

Permalink
Auto merge of #95456 - RalfJung:size, r=oli-obk
Browse files Browse the repository at this point in the history
allow large Size again

This basically reverts most of #80042, and instead does the panic in `bits()` with a `#[cold]` function to make sure it does not get inlined.

#80042 added a comment about an invariant ("The top 3 bits are ALWAYS zero") that is not actually enforced, and if it were enforced that would be a problem for #95388. So I think we should not have that invariant, and I adjusted the code accordingly.

r? `@oli-obk` Cc `@sivadeilra`
  • Loading branch information
bors committed Mar 31, 2022
2 parents e730969 + 2799885 commit df20355
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 df20355

Please sign in to comment.