Sha256: bf602961483f1ed0266602c00bc31345da38f4601954ed4a673f26d7ae8199b9

Contents?: true

Size: 1.76 KB

Versions: 19

Compression:

Stored size: 1.76 KB

Contents

use core::num::NonZeroUsize;

/// Returns the amount of padding we must insert after `len` bytes to ensure
/// that the following address will satisfy `align` (measured in bytes).
///
/// e.g., if `len` is 9, then `padding_needed_for(len, 4)` returns 3, because
/// that is the minimum number of bytes of padding required to get a 4-aligned
/// address (assuming that the corresponding memory block starts at a 4-aligned
/// address).
///
/// The return value of this function has no meaning if `align` is not a
/// power-of-two.
///
/// # Panics
///
/// May panic if `align` is not a power of two.
//
// TODO(#419): Replace `len` with a witness type for region size.
#[allow(unused)]
#[inline(always)]
pub(crate) const fn padding_needed_for(len: usize, align: NonZeroUsize) -> usize {
    // Rounded up value is:
    //   len_rounded_up = (len + align - 1) & !(align - 1);
    // and then we return the padding difference: `len_rounded_up - len`.
    //
    // We use modular arithmetic throughout:
    //
    // 1. align is guaranteed to be > 0, so align - 1 is always
    //    valid.
    //
    // 2. `len + align - 1` can overflow by at most `align - 1`,
    //    so the &-mask with `!(align - 1)` will ensure that in the
    //    case of overflow, `len_rounded_up` will itself be 0.
    //    Thus the returned padding, when added to `len`, yields 0,
    //    which trivially satisfies the alignment `align`.
    //
    // (Of course, attempts to allocate blocks of memory whose
    // size and padding overflow in the above manner should cause
    // the allocator to yield an error anyway.)

    let align = align.get();
    debug_assert!(align.is_power_of_two());
    let len_rounded_up = len.wrapping_add(align).wrapping_sub(1) & !align.wrapping_sub(1);
    len_rounded_up.wrapping_sub(len)
}

Version data entries

19 entries across 19 versions & 1 rubygems

Version Path
wasmtime-29.0.0 ./ext/cargo-vendor/zerocopy-0.7.35/src/third_party/rust/layout.rs
wasmtime-28.0.0 ./ext/cargo-vendor/zerocopy-0.7.35/src/third_party/rust/layout.rs
wasmtime-27.0.0 ./ext/cargo-vendor/zerocopy-0.7.35/src/third_party/rust/layout.rs
wasmtime-26.0.0 ./ext/cargo-vendor/zerocopy-0.7.35/src/third_party/rust/layout.rs
wasmtime-25.0.2 ./ext/cargo-vendor/zerocopy-0.7.35/src/third_party/rust/layout.rs
wasmtime-25.0.1 ./ext/cargo-vendor/zerocopy-0.7.35/src/third_party/rust/layout.rs
wasmtime-25.0.0 ./ext/cargo-vendor/zerocopy-0.7.35/src/third_party/rust/layout.rs
wasmtime-24.0.0 ./ext/cargo-vendor/zerocopy-0.7.35/src/third_party/rust/layout.rs
wasmtime-23.0.2 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-22.0.0 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-21.0.1 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-20.0.2 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-20.0.0 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-18.0.3 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-17.0.1 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-17.0.0 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-16.0.0 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-15.0.1 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs
wasmtime-15.0.0 ./ext/cargo-vendor/zerocopy-0.7.32/src/third_party/rust/layout.rs