mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
Update our vendored copy of `zerocopy` (and `zerocopy-derive`) to v0.8.52.
Most SPDX identifiers have been added upstream at our request [1]
(without parentheses -- supporting them is an issue on the kernel side,
but it does already reduce our differences). The CSS one for `rustdoc`
was added too [2], but will be picked up in a later version.
For `zerocopy`, enable `--cfg no_fp_fmt_parse`, which was added at our
request to avoid our local workaround [3]. This means one less difference,
thus indicate so in our `README.md`.
For `zerocopy-derive`, enable `--cfg zerocopy_unstable_linux`. This
allows us to use `#[derive(zerocopy_derive::most_traits)]`, a new feature
upstream added for us [4]. We noticed a minor doc render bug [5], which
will be fixed for a future version too.
The following script may be used to check for the remaining differences:
for path in $(cd rust/zerocopy-derive/ && find . -type f ! -name README.md); do
curl --silent --show-error --location \
https://github.com/google/zerocopy/raw/v0.8.52/zerocopy/zerocopy-derive/src/$path |
git diff --no-index - rust/zerocopy-derive/$path &&
echo $path: OK
done
for path in $(cd rust/zerocopy/ && find . -type f ! -name README.md); do
curl --silent --show-error --location \
https://github.com/google/zerocopy/raw/v0.8.52/zerocopy/$path |
git diff --no-index - rust/zerocopy/$path &&
echo $path: OK
done
Cc: Joshua Liebow-Feeser <joshlf@google.com>
Cc: Jack Wrenn <jswrenn@google.com>
Link: https://github.com/google/zerocopy/issues/3428 [1]
Link: https://github.com/google/zerocopy/issues/3457 [2]
Link: https://github.com/google/zerocopy/issues/3426 [3]
Link: https://github.com/google/zerocopy/pull/3416 [4]
Link: https://github.com/google/zerocopy/issues/3466 [5]
Acked-by: Nicolas Schier <n.schier@fritz.com>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Link: https://patch.msgid.link/20260625231919.692444-1-ojeda@kernel.org
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
81 lines
2.9 KiB
Rust
81 lines
2.9 KiB
Rust
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
|
|
//
|
|
use proc_macro2::{Span, TokenStream};
|
|
use syn::{Data, DataEnum, DataStruct, DataUnion, Error};
|
|
|
|
use crate::{
|
|
repr::{EnumRepr, StructUnionRepr},
|
|
util::{Ctx, FieldBounds, ImplBlockBuilder, Trait},
|
|
};
|
|
|
|
pub(crate) fn derive_unaligned(ctx: &Ctx, _top_level: Trait) -> Result<TokenStream, Error> {
|
|
match &ctx.ast.data {
|
|
Data::Struct(strct) => derive_unaligned_struct(ctx, strct),
|
|
Data::Enum(enm) => derive_unaligned_enum(ctx, enm),
|
|
Data::Union(unn) => derive_unaligned_union(ctx, unn),
|
|
}
|
|
}
|
|
|
|
/// A struct is `Unaligned` if:
|
|
/// - `repr(align)` is no more than 1 and either
|
|
/// - `repr(C)` or `repr(transparent)` and
|
|
/// - all fields `Unaligned`
|
|
/// - `repr(packed)`
|
|
fn derive_unaligned_struct(ctx: &Ctx, strct: &DataStruct) -> Result<TokenStream, Error> {
|
|
let repr = StructUnionRepr::from_attrs(&ctx.ast.attrs)?;
|
|
repr.unaligned_validate_no_align_gt_1()?;
|
|
|
|
let field_bounds = if repr.is_packed_1() {
|
|
FieldBounds::None
|
|
} else if repr.is_c() || repr.is_transparent() {
|
|
FieldBounds::ALL_SELF
|
|
} else {
|
|
return ctx.error_or_skip(Error::new(
|
|
Span::call_site(),
|
|
"must have #[repr(C)], #[repr(transparent)], or #[repr(packed)] attribute in order to guarantee this type's alignment",
|
|
));
|
|
};
|
|
|
|
Ok(ImplBlockBuilder::new(ctx, strct, Trait::Unaligned, field_bounds).build())
|
|
}
|
|
|
|
/// An enum is `Unaligned` if:
|
|
/// - No `repr(align(N > 1))`
|
|
/// - `repr(u8)` or `repr(i8)`
|
|
fn derive_unaligned_enum(ctx: &Ctx, enm: &DataEnum) -> Result<TokenStream, Error> {
|
|
let repr = EnumRepr::from_attrs(&ctx.ast.attrs)?;
|
|
repr.unaligned_validate_no_align_gt_1()?;
|
|
|
|
if !repr.is_u8() && !repr.is_i8() {
|
|
return ctx.error_or_skip(Error::new(
|
|
Span::call_site(),
|
|
"must have #[repr(u8)] or #[repr(i8)] attribute in order to guarantee this type's alignment",
|
|
));
|
|
}
|
|
|
|
Ok(ImplBlockBuilder::new(ctx, enm, Trait::Unaligned, FieldBounds::ALL_SELF).build())
|
|
}
|
|
|
|
/// Like structs, a union is `Unaligned` if:
|
|
/// - `repr(align)` is no more than 1 and either
|
|
/// - `repr(C)` or `repr(transparent)` and
|
|
/// - all fields `Unaligned`
|
|
/// - `repr(packed)`
|
|
fn derive_unaligned_union(ctx: &Ctx, unn: &DataUnion) -> Result<TokenStream, Error> {
|
|
let repr = StructUnionRepr::from_attrs(&ctx.ast.attrs)?;
|
|
repr.unaligned_validate_no_align_gt_1()?;
|
|
|
|
let field_type_trait_bounds = if repr.is_packed_1() {
|
|
FieldBounds::None
|
|
} else if repr.is_c() || repr.is_transparent() {
|
|
FieldBounds::ALL_SELF
|
|
} else {
|
|
return ctx.error_or_skip(Error::new(
|
|
Span::call_site(),
|
|
"must have #[repr(C)], #[repr(transparent)], or #[repr(packed)] attribute in order to guarantee this type's alignment",
|
|
));
|
|
};
|
|
|
|
Ok(ImplBlockBuilder::new(ctx, unn, Trait::Unaligned, field_type_trait_bounds).build())
|
|
}
|