summaryrefslogtreecommitdiff
path: root/rust
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2026-07-25 10:15:23 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2026-07-25 10:15:23 -0700
commit3dab139d4795f688e4f243e40c7474df00d329d9 (patch)
treea1a5e86f6d9e9ea1c74d6d04541f9be9e3c12d17 /rust
parentef9ce800df95726978490534f9e2c14ca71858e8 (diff)
parent880c43b185ca52239e75bc546cc4f4d9154d0fed (diff)
Merge tag 'rust-fixes-7.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ojeda/linuxHEADmaster
Pull rust fixes from Miguel Ojeda: "Toolchain and infrastructure: - 'zerocopy' crates: update to v0.8.54 to fix a modpost error under 'CONFIG_CC_OPTIMIZE_FOR_SIZE=y'. There are actually two updates in the PR: the one to v0.8.52 is fairly large and was originally not intended for a fixes PR, but the actual fix landed in the v0.8.54 one. Thus I included both here. The v0.8.52 update includes two things upstream added for us: '--cfg no_fp_fmt_parse' to avoid a local workaround, and the new 'most_traits' feature. The good news is that, after these updates, the delta with upstream is now trivial: only an identifier prefix change and the SPDX parentheses. - Fix an objtool warning by adding one more 'noreturn' function for Rust 1.99.0 (expected 2026-10-01). - Clean up new 'semicolon_in_expressions_from_macros' lint errors for Rust 1.99.0 (expected 2026-10-01). The lint can be allowed, but it will be a hard error at some point in the future anyway, so clean it up now. - Locally allow new 'suspicious_runtime_symbol_definitions' lint for Rust 1.98.0 (expected 2026-08-20). - Globally allow 'clippy::unwrap_or_default' lint since it relies on optimizations -- under 'CONFIG_CC_OPTIMIZE_FOR_SIZE=y' it does not work well. 'kernel' crate: - 'time' module: fix 'Delta::as_micros_ceil()' to round negative values correctly" * tag 'rust-fixes-7.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ojeda/linux: rust: time: fix as_micros_ceil() to round correctly for negative Delta rust: device: avoid trailing ; in printing macros objtool/rust: add one more `noreturn` Rust function for Rust 1.99.0 rust: zerocopy: update to v0.8.54 rust: zerocopy: update to v0.8.52 rust: allow `clippy::unwrap_or_default` globally rust: allow `suspicious_runtime_symbol_definitions` lint for Rust >= 1.98
Diffstat (limited to 'rust')
-rw-r--r--rust/Makefile16
-rw-r--r--rust/bindings/lib.rs4
-rw-r--r--rust/kernel/device.rs20
-rw-r--r--rust/kernel/time.rs11
-rw-r--r--rust/uapi/lib.rs4
-rw-r--r--rust/zerocopy-derive/README.md14
-rw-r--r--rust/zerocopy-derive/derive/from_bytes.rs2
-rw-r--r--rust/zerocopy-derive/derive/into_bytes.rs2
-rw-r--r--rust/zerocopy-derive/derive/known_layout.rs3
-rw-r--r--rust/zerocopy-derive/derive/mod.rs20
-rw-r--r--rust/zerocopy-derive/derive/try_from_bytes.rs6
-rw-r--r--rust/zerocopy-derive/derive/unaligned.rs2
-rw-r--r--rust/zerocopy-derive/lib.rs36
-rw-r--r--rust/zerocopy-derive/repr.rs2
-rw-r--r--rust/zerocopy-derive/util.rs34
-rw-r--r--rust/zerocopy/README.md15
-rw-r--r--rust/zerocopy/rustdoc/style.css1
-rw-r--r--rust/zerocopy/src/byte_slice.rs2
-rw-r--r--rust/zerocopy/src/byteorder.rs50
-rw-r--r--rust/zerocopy/src/deprecated.rs2
-rw-r--r--rust/zerocopy/src/error.rs2
-rw-r--r--rust/zerocopy/src/impls.rs4
-rw-r--r--rust/zerocopy/src/layout.rs4
-rw-r--r--rust/zerocopy/src/lib.rs12
-rw-r--r--rust/zerocopy/src/macros.rs2
-rw-r--r--rust/zerocopy/src/pointer/inner.rs2
-rw-r--r--rust/zerocopy/src/pointer/invariant.rs2
-rw-r--r--rust/zerocopy/src/pointer/mod.rs2
-rw-r--r--rust/zerocopy/src/pointer/ptr.rs2
-rw-r--r--rust/zerocopy/src/pointer/transmute.rs2
-rw-r--r--rust/zerocopy/src/ref.rs2
-rw-r--r--rust/zerocopy/src/split_at.rs2
-rw-r--r--rust/zerocopy/src/util/macro_util.rs2
-rw-r--r--rust/zerocopy/src/util/macros.rs2
-rw-r--r--rust/zerocopy/src/util/mod.rs8
-rw-r--r--rust/zerocopy/src/wrappers.rs2
36 files changed, 208 insertions, 90 deletions
diff --git a/rust/Makefile b/rust/Makefile
index a870d1616c71..627ed79dc6f5 100644
--- a/rust/Makefile
+++ b/rust/Makefile
@@ -84,11 +84,15 @@ core-flags := \
--edition=$(core-edition) \
$(call cfgs-to-flags,$(core-cfgs))
+zerocopy-cfgs := \
+ no_fp_fmt_parse
+
zerocopy-flags := \
- --cap-lints=allow
+ --cap-lints=allow \
+ $(call cfgs-to-flags,$(zerocopy-cfgs))
zerocopy-envs := \
- CARGO_PKG_VERSION=0.8.50
+ CARGO_PKG_VERSION=0.8.54
proc_macro2-cfgs := \
feature="proc-macro" \
@@ -128,11 +132,15 @@ syn-flags := \
--extern quote \
$(call cfgs-to-flags,$(syn-cfgs))
+zerocopy_derive-cfgs := \
+ zerocopy_unstable_linux
+
zerocopy_derive-flags := \
--cap-lints=allow \
--extern proc_macro2 \
--extern quote \
- --extern syn
+ --extern syn \
+ $(call cfgs-to-flags,$(zerocopy_derive-cfgs))
pin_init_internal-cfgs := \
kernel USE_RUSTC_FEATURES
@@ -644,9 +652,11 @@ quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L
rust-analyzer:
$(Q)MAKEFLAGS= $(srctree)/scripts/generate_rust_analyzer.py \
--cfgs='core=$(core-cfgs)' $(core-edition) \
+ --cfgs='zerocopy=$(zerocopy-cfgs)' \
--cfgs='proc_macro2=$(proc_macro2-cfgs)' \
--cfgs='quote=$(quote-cfgs)' \
--cfgs='syn=$(syn-cfgs)' \
+ --cfgs='zerocopy_derive=$(zerocopy_derive-cfgs)' \
--cfgs='pin_init_internal=$(pin_init_internal-cfgs)' \
--cfgs='pin_init=$(pin_init-cfgs)' \
--envs='zerocopy=$(zerocopy-envs)' \
diff --git a/rust/bindings/lib.rs b/rust/bindings/lib.rs
index 854e7c471434..812f8e5a08d5 100644
--- a/rust/bindings/lib.rs
+++ b/rust/bindings/lib.rs
@@ -27,6 +27,10 @@
#[allow(clippy::ref_as_ptr)]
#[allow(clippy::undocumented_unsafe_blocks)]
#[cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]
+#[cfg_attr(
+ CONFIG_RUSTC_HAS_SUSPICIOUS_RUNTIME_SYMBOL_DEFINITIONS,
+ allow(suspicious_runtime_symbol_definitions)
+)]
mod bindings_raw {
use pin_init::{MaybeZeroable, Zeroable};
diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs
index 645afc49a27d..1a38b3bbdfb7 100644
--- a/rust/kernel/device.rs
+++ b/rust/kernel/device.rs
@@ -708,9 +708,7 @@ macro_rules! impl_device_context_into_aref {
#[macro_export]
macro_rules! dev_printk {
($method:ident, $dev:expr, $($f:tt)*) => {
- {
- $crate::device::Device::$method($dev.as_ref(), $crate::prelude::fmt!($($f)*))
- }
+ $crate::device::Device::$method($dev.as_ref(), $crate::prelude::fmt!($($f)*))
}
}
@@ -737,7 +735,7 @@ macro_rules! dev_printk {
/// ```
#[macro_export]
macro_rules! dev_emerg {
- ($($f:tt)*) => { $crate::dev_printk!(pr_emerg, $($f)*); }
+ ($($f:tt)*) => { $crate::dev_printk!(pr_emerg, $($f)*) }
}
/// Prints an alert-level message (level 1) prefixed with device information.
@@ -763,7 +761,7 @@ macro_rules! dev_emerg {
/// ```
#[macro_export]
macro_rules! dev_alert {
- ($($f:tt)*) => { $crate::dev_printk!(pr_alert, $($f)*); }
+ ($($f:tt)*) => { $crate::dev_printk!(pr_alert, $($f)*) }
}
/// Prints a critical-level message (level 2) prefixed with device information.
@@ -789,7 +787,7 @@ macro_rules! dev_alert {
/// ```
#[macro_export]
macro_rules! dev_crit {
- ($($f:tt)*) => { $crate::dev_printk!(pr_crit, $($f)*); }
+ ($($f:tt)*) => { $crate::dev_printk!(pr_crit, $($f)*) }
}
/// Prints an error-level message (level 3) prefixed with device information.
@@ -815,7 +813,7 @@ macro_rules! dev_crit {
/// ```
#[macro_export]
macro_rules! dev_err {
- ($($f:tt)*) => { $crate::dev_printk!(pr_err, $($f)*); }
+ ($($f:tt)*) => { $crate::dev_printk!(pr_err, $($f)*) }
}
/// Prints a warning-level message (level 4) prefixed with device information.
@@ -841,7 +839,7 @@ macro_rules! dev_err {
/// ```
#[macro_export]
macro_rules! dev_warn {
- ($($f:tt)*) => { $crate::dev_printk!(pr_warn, $($f)*); }
+ ($($f:tt)*) => { $crate::dev_printk!(pr_warn, $($f)*) }
}
/// Prints a notice-level message (level 5) prefixed with device information.
@@ -867,7 +865,7 @@ macro_rules! dev_warn {
/// ```
#[macro_export]
macro_rules! dev_notice {
- ($($f:tt)*) => { $crate::dev_printk!(pr_notice, $($f)*); }
+ ($($f:tt)*) => { $crate::dev_printk!(pr_notice, $($f)*) }
}
/// Prints an info-level message (level 6) prefixed with device information.
@@ -893,7 +891,7 @@ macro_rules! dev_notice {
/// ```
#[macro_export]
macro_rules! dev_info {
- ($($f:tt)*) => { $crate::dev_printk!(pr_info, $($f)*); }
+ ($($f:tt)*) => { $crate::dev_printk!(pr_info, $($f)*) }
}
/// Prints a debug-level message (level 7) prefixed with device information.
@@ -919,5 +917,5 @@ macro_rules! dev_info {
/// ```
#[macro_export]
macro_rules! dev_dbg {
- ($($f:tt)*) => { $crate::dev_printk!(pr_dbg, $($f)*); }
+ ($($f:tt)*) => { $crate::dev_printk!(pr_dbg, $($f)*) }
}
diff --git a/rust/kernel/time.rs b/rust/kernel/time.rs
index 363e93cbb139..b8463823aed9 100644
--- a/rust/kernel/time.rs
+++ b/rust/kernel/time.rs
@@ -441,15 +441,22 @@ impl Delta {
/// to the value in the [`Delta`].
#[inline]
pub fn as_micros_ceil(self) -> i64 {
+ let n = self.as_nanos();
+ let n = if n >= 0 {
+ n.saturating_add(NSEC_PER_USEC - 1)
+ } else {
+ n
+ };
+
#[cfg(CONFIG_64BIT)]
{
- self.as_nanos().saturating_add(NSEC_PER_USEC - 1) / NSEC_PER_USEC
+ n / NSEC_PER_USEC
}
#[cfg(not(CONFIG_64BIT))]
// SAFETY: It is always safe to call `ktime_to_us()` with any value.
unsafe {
- bindings::ktime_to_us(self.as_nanos().saturating_add(NSEC_PER_USEC - 1))
+ bindings::ktime_to_us(n)
}
}
diff --git a/rust/uapi/lib.rs b/rust/uapi/lib.rs
index b8a515de31ca..797ead5b5626 100644
--- a/rust/uapi/lib.rs
+++ b/rust/uapi/lib.rs
@@ -24,6 +24,10 @@
unsafe_op_in_unsafe_fn
)]
#![cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]
+#![cfg_attr(
+ CONFIG_RUSTC_HAS_SUSPICIOUS_RUNTIME_SYMBOL_DEFINITIONS,
+ allow(suspicious_runtime_symbol_definitions)
+)]
#![feature(cfi_encoding)]
// Manual definition of blocklisted types.
diff --git a/rust/zerocopy-derive/README.md b/rust/zerocopy-derive/README.md
index 110f4a401778..d62c79804342 100644
--- a/rust/zerocopy-derive/README.md
+++ b/rust/zerocopy-derive/README.md
@@ -1,14 +1,14 @@
# `zerocopy-derive`
-These source files come from the Rust `zerocopy-derive` crate, version v0.8.50
-(released 2026-05-31), hosted in the <https://github.com/google/zerocopy>
+These source files come from the Rust `zerocopy-derive` crate, version v0.8.54
+(released 2026-07-08), hosted in the <https://github.com/google/zerocopy>
repository, licensed under "BSD-2-Clause OR Apache-2.0 OR MIT" and only
-modified to add the SPDX license identifiers and to remove the generation of
+modified to tweak the SPDX license identifiers and to remove the generation of
non-ASCII identifiers.
For copyright details, please see:
- https://github.com/google/zerocopy/blob/v0.8.50/README.md?plain=1
- https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-BSD
- https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-APACHE
- https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-MIT
+ https://github.com/google/zerocopy/blob/v0.8.54/README.md?plain=1
+ https://github.com/google/zerocopy/blob/v0.8.54/LICENSE-BSD
+ https://github.com/google/zerocopy/blob/v0.8.54/LICENSE-APACHE
+ https://github.com/google/zerocopy/blob/v0.8.54/LICENSE-MIT
diff --git a/rust/zerocopy-derive/derive/from_bytes.rs b/rust/zerocopy-derive/derive/from_bytes.rs
index d693a63b7645..66d820f6ad4c 100644
--- a/rust/zerocopy-derive/derive/from_bytes.rs
+++ b/rust/zerocopy-derive/derive/from_bytes.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
use proc_macro2::{Span, TokenStream};
use syn::{
parse_quote, Data, DataEnum, DataStruct, DataUnion, Error, Expr, ExprLit, ExprUnary, Lit, UnOp,
diff --git a/rust/zerocopy-derive/derive/into_bytes.rs b/rust/zerocopy-derive/derive/into_bytes.rs
index ad52a6b45d28..0103a78d087f 100644
--- a/rust/zerocopy-derive/derive/into_bytes.rs
+++ b/rust/zerocopy-derive/derive/into_bytes.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
use proc_macro2::{Span, TokenStream};
use quote::quote;
use syn::{Data, DataEnum, DataStruct, DataUnion, Error, Type};
diff --git a/rust/zerocopy-derive/derive/known_layout.rs b/rust/zerocopy-derive/derive/known_layout.rs
index fddffd167c82..d0c4cecfff15 100644
--- a/rust/zerocopy-derive/derive/known_layout.rs
+++ b/rust/zerocopy-derive/derive/known_layout.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
use proc_macro2::TokenStream;
use quote::quote;
use syn::{parse_quote, Data, Error, Type};
@@ -87,7 +87,6 @@ fn derive_known_layout_for_repr_c_struct<'a>(
};
let inner_extras = {
- let leading_fields_tys = leading_fields_tys.clone();
let methods = make_methods(*trailing_field_ty);
let (_, ty_generics, _) = ctx.ast.generics.split_for_impl();
diff --git a/rust/zerocopy-derive/derive/mod.rs b/rust/zerocopy-derive/derive/mod.rs
index 665ba7da55a8..b3839fcf73c9 100644
--- a/rust/zerocopy-derive/derive/mod.rs
+++ b/rust/zerocopy-derive/derive/mod.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
pub mod from_bytes;
pub mod into_bytes;
pub mod known_layout;
@@ -15,8 +15,8 @@ use crate::{
util::{Ctx, DataExt, FieldBounds, ImplBlockBuilder, Trait},
};
-pub(crate) fn derive_immutable(ctx: &Ctx, _top_level: Trait) -> TokenStream {
- match &ctx.ast.data {
+pub(crate) fn derive_immutable(ctx: &Ctx, _top_level: Trait) -> Result<TokenStream, Error> {
+ Ok(match &ctx.ast.data {
Data::Struct(strct) => {
ImplBlockBuilder::new(ctx, strct, Trait::Immutable, FieldBounds::ALL_SELF).build()
}
@@ -26,7 +26,7 @@ pub(crate) fn derive_immutable(ctx: &Ctx, _top_level: Trait) -> TokenStream {
Data::Union(unn) => {
ImplBlockBuilder::new(ctx, unn, Trait::Immutable, FieldBounds::ALL_SELF).build()
}
- }
+ })
}
pub(crate) fn derive_hash(ctx: &Ctx, _top_level: Trait) -> Result<TokenStream, Error> {
@@ -97,16 +97,20 @@ pub(crate) fn derive_split_at(ctx: &Ctx, _top_level: Trait) -> Result<TokenStrea
match &ctx.ast.data {
Data::Struct(_) => {}
Data::Enum(_) | Data::Union(_) => {
- return Err(Error::new(Span::call_site(), "can only be applied to structs"));
+ return ctx
+ .error_or_skip(Error::new(Span::call_site(), "can only be applied to structs"));
}
};
if repr.get_packed().is_some() {
- return Err(Error::new(Span::call_site(), "must not have #[repr(packed)] attribute"));
+ return ctx.error_or_skip(Error::new(
+ Span::call_site(),
+ "must not have #[repr(packed)] attribute",
+ ));
}
if !(repr.is_c() || repr.is_transparent()) {
- return Err(Error::new(
+ return ctx.error_or_skip(Error::new(
Span::call_site(),
"must have #[repr(C)] or #[repr(transparent)] in order to guarantee this type's layout is splitable",
));
@@ -116,7 +120,7 @@ pub(crate) fn derive_split_at(ctx: &Ctx, _top_level: Trait) -> Result<TokenStrea
let trailing_field = if let Some(((_, _, trailing_field), _)) = fields.split_last() {
trailing_field
} else {
- return Err(Error::new(Span::call_site(), "must at least one field"));
+ return ctx.error_or_skip(Error::new(Span::call_site(), "must at least one field"));
};
let zerocopy_crate = &ctx.zerocopy_crate;
diff --git a/rust/zerocopy-derive/derive/try_from_bytes.rs b/rust/zerocopy-derive/derive/try_from_bytes.rs
index a3e4a75631a5..44f083328786 100644
--- a/rust/zerocopy-derive/derive/try_from_bytes.rs
+++ b/rust/zerocopy-derive/derive/try_from_bytes.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
use proc_macro2::TokenStream;
use quote::quote;
use syn::{
@@ -531,8 +531,8 @@ fn derive_has_field_struct_union(ctx: &Ctx, data: &dyn DataExt) -> TokenStream {
data,
Trait::ProjectField {
variant_id: variant_id.clone(),
- field: field.clone(),
- field_id: field_id.clone(),
+ field,
+ field_id,
invariants: parse_quote!((Aliasing, Alignment, #zerocopy_crate::invariant::Initialized)),
},
FieldBounds::None,
diff --git a/rust/zerocopy-derive/derive/unaligned.rs b/rust/zerocopy-derive/derive/unaligned.rs
index d6dea0a11f1e..7c97d62e2dcb 100644
--- a/rust/zerocopy-derive/derive/unaligned.rs
+++ b/rust/zerocopy-derive/derive/unaligned.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
use proc_macro2::{Span, TokenStream};
use syn::{Data, DataEnum, DataStruct, DataUnion, Error};
diff --git a/rust/zerocopy-derive/lib.rs b/rust/zerocopy-derive/lib.rs
index c517ea7db1eb..d387de368367 100644
--- a/rust/zerocopy-derive/lib.rs
+++ b/rust/zerocopy-derive/lib.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2019 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
@@ -129,6 +129,40 @@ derive!(ByteHash => derive_hash => crate::derive::derive_hash);
derive!(ByteEq => derive_eq => crate::derive::derive_eq);
derive!(SplitAt => derive_split_at => crate::derive::derive_split_at);
+#[cfg_attr(not(zerocopy_unstable_linux), doc(hidden))]
+#[proc_macro_derive(most_traits, attributes(zerocopy))]
+pub fn most_traits(ts: proc_macro::TokenStream) -> proc_macro::TokenStream {
+ let ast = syn::parse_macro_input!(ts as DeriveInput);
+ let ctx = match Ctx::try_from_derive_input(ast) {
+ Ok(ctx) => ctx,
+ Err(e) => return e.into_compile_error().into(),
+ }
+ .skip_on_error();
+
+ // top-level traits for which to attempt a derive
+ let derives: [(fn(&Ctx, Trait) -> _, _); 6] = [
+ (crate::derive::known_layout::derive, Trait::KnownLayout),
+ (crate::derive::derive_immutable, Trait::Immutable),
+ (crate::derive::from_bytes::derive_from_bytes, Trait::FromBytes),
+ (crate::derive::into_bytes::derive_into_bytes, Trait::IntoBytes),
+ (crate::derive::derive_split_at, Trait::SplitAt),
+ (crate::derive::unaligned::derive_unaligned, Trait::Unaligned),
+ ];
+
+ let mut tokens = proc_macro2::TokenStream::new();
+ for (derive, t) in derives {
+ tokens.extend(derive(&ctx, t))
+ }
+
+ // We wrap in `const_block` as a backstop in case any derive fails
+ // to wrap its output in `const_block` (and thus fails to annotate)
+ // with the full set of `#[allow(...)]` attributes).
+ let ts = const_block([Some(tokens)]);
+ #[cfg(test)]
+ crate::util::testutil::check_hygiene(ts.clone());
+ ts.into()
+}
+
/// Deprecated: prefer [`FromZeros`] instead.
#[deprecated(since = "0.8.0", note = "`FromZeroes` was renamed to `FromZeros`")]
#[doc(hidden)]
diff --git a/rust/zerocopy-derive/repr.rs b/rust/zerocopy-derive/repr.rs
index 74fd376d9fda..1525e94302d1 100644
--- a/rust/zerocopy-derive/repr.rs
+++ b/rust/zerocopy-derive/repr.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2019 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
diff --git a/rust/zerocopy-derive/util.rs b/rust/zerocopy-derive/util.rs
index 5ba5228e2a44..5c5e9d3bdcb8 100644
--- a/rust/zerocopy-derive/util.rs
+++ b/rust/zerocopy-derive/util.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2019 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
@@ -98,6 +98,11 @@ impl Ctx {
}
}
+ pub(crate) fn skip_on_error(mut self) -> Self {
+ self.skip_on_error = true;
+ self
+ }
+
pub(crate) fn core_path(&self) -> TokenStream {
let zerocopy_crate = &self.zerocopy_crate;
quote!(#zerocopy_crate::util::macro_util::core_reexport)
@@ -106,20 +111,21 @@ impl Ctx {
pub(crate) fn cfg_compile_error(&self) -> TokenStream {
// By checking both during the compilation of the proc macro *and* in
// the generated code, we ensure that `--cfg
- // zerocopy_unstable_derive_on_error` need only be passed *either* when
+ // zerocopy_unstable_linux` need only be passed *either* when
// compiling this crate *or* when compiling the user's crate. The former
// is preferable, but in some situations (such as when cross-compiling
// using `cargo build --target`), it doesn't get propagated to this
// crate's build by default.
- if cfg!(zerocopy_unstable_derive_on_error) {
+ if cfg!(zerocopy_unstable_linux) {
quote!()
} else if let Some(span) = self.on_error_span {
let core = self.core_path();
- let error_message = "`on_error` is experimental; pass '--cfg zerocopy_unstable_derive_on_error' to enable";
+ let error_message =
+ "`on_error` is experimental; pass '--cfg zerocopy_unstable_linux' to enable";
quote::quote_spanned! {span=>
#[allow(unused_attributes, unexpected_cfgs)]
const _: () = {
- #[cfg(not(zerocopy_unstable_derive_on_error))]
+ #[cfg(not(zerocopy_unstable_linux))]
#core::compile_error!(#error_message);
};
}
@@ -612,6 +618,20 @@ impl<'a> ImplBlockBuilder<'a> {
}
};
+ let zerocopy_bounds =
+ field_type_bounds
+ .into_iter()
+ .chain(padding_check_bound)
+ .chain(self_bounds)
+ .map(|bound| {
+ if self.ctx.skip_on_error {
+ parse_quote!(for<'zc> #bound)
+ } else {
+ bound.clone()
+ }
+ })
+ .collect::<Vec<_>>();
+
let bounds = self
.ctx
.ast
@@ -621,9 +641,7 @@ impl<'a> ImplBlockBuilder<'a> {
.map(|where_clause| where_clause.predicates.iter())
.into_iter()
.flatten()
- .chain(field_type_bounds.iter())
- .chain(padding_check_bound.iter())
- .chain(self_bounds.iter());
+ .chain(zerocopy_bounds.iter());
// The parameters with trait bounds, but without type defaults.
let mut params: Vec<_> = self
diff --git a/rust/zerocopy/README.md b/rust/zerocopy/README.md
index 99e6cad0e26c..3d11a6502cf0 100644
--- a/rust/zerocopy/README.md
+++ b/rust/zerocopy/README.md
@@ -1,14 +1,13 @@
# `zerocopy`
-These source files come from the Rust `zerocopy` crate, version v0.8.50
-(released 2026-05-31), hosted in the <https://github.com/google/zerocopy>
+These source files come from the Rust `zerocopy` crate, version v0.8.54
+(released 2026-07-08), hosted in the <https://github.com/google/zerocopy>
repository, licensed under "BSD-2-Clause OR Apache-2.0 OR MIT" and only
-modified to add the SPDX license identifiers and to remove `Display`
-for `f32` and `f64`.
+modified to tweak the SPDX license identifiers.
For copyright details, please see:
- https://github.com/google/zerocopy/blob/v0.8.50/README.md?plain=1
- https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-BSD
- https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-APACHE
- https://github.com/google/zerocopy/blob/v0.8.50/LICENSE-MIT
+ https://github.com/google/zerocopy/blob/v0.8.54/README.md?plain=1
+ https://github.com/google/zerocopy/blob/v0.8.54/LICENSE-BSD
+ https://github.com/google/zerocopy/blob/v0.8.54/LICENSE-APACHE
+ https://github.com/google/zerocopy/blob/v0.8.54/LICENSE-MIT
diff --git a/rust/zerocopy/rustdoc/style.css b/rust/zerocopy/rustdoc/style.css
index 414348964af2..d2d55ad2e689 100644
--- a/rust/zerocopy/rustdoc/style.css
+++ b/rust/zerocopy/rustdoc/style.css
@@ -1,5 +1,4 @@
/* SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT */
-
/*
Copyright 2026 The Fuchsia Authors
diff --git a/rust/zerocopy/src/byte_slice.rs b/rust/zerocopy/src/byte_slice.rs
index a5ded4a18b39..b7f85098dbc4 100644
--- a/rust/zerocopy/src/byte_slice.rs
+++ b/rust/zerocopy/src/byte_slice.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2024 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
diff --git a/rust/zerocopy/src/byteorder.rs b/rust/zerocopy/src/byteorder.rs
index 8f70048f1eb0..c761d5728320 100644
--- a/rust/zerocopy/src/byteorder.rs
+++ b/rust/zerocopy/src/byteorder.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2019 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
@@ -100,6 +100,7 @@ mod private {
#[allow(missing_copy_implementations, missing_debug_implementations)]
#[doc(hidden)]
+#[derive(PartialEq)]
pub enum Order {
BigEndian,
LittleEndian,
@@ -164,6 +165,42 @@ pub type BE = BigEndian;
/// A type alias for [`LittleEndian`].
pub type LE = LittleEndian;
+macro_rules! impl_dbg_trait {
+ ($name:ident, $native:ident) => {
+ impl<O: ByteOrder> Debug for $name<O> {
+ #[inline]
+ fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+ // This results in a format like "U16(42)".
+ f.debug_tuple(stringify!($name)).field(&self.get()).finish()
+ }
+ }
+ };
+}
+
+macro_rules! impl_dbg_traits {
+ ($name:ident, $native:ident, "floating point number") => {
+ #[cfg(not(no_fp_fmt_parse))]
+ impl_dbg_trait!($name, $native);
+
+ #[cfg(no_fp_fmt_parse)]
+ impl<O: ByteOrder> Debug for $name<O> {
+ #[inline]
+ fn fmt(&self, _f: &mut Formatter<'_>) -> fmt::Result {
+ panic!("floating point support is turned off");
+ }
+ }
+ };
+ ($name:ident, $native:ident, "unsigned integer") => {
+ impl_dbg_traits!($name, $native, @all_types);
+ };
+ ($name:ident, $native:ident, "signed integer") => {
+ impl_dbg_traits!($name, $native, @all_types);
+ };
+ ($name:ident, $native:ident, @all_types) => {
+ impl_dbg_trait!($name, $native);
+ };
+}
+
macro_rules! impl_fmt_trait {
($name:ident, $native:ident, $trait:ident) => {
impl<O: ByteOrder> $trait for $name<O> {
@@ -177,6 +214,8 @@ macro_rules! impl_fmt_trait {
macro_rules! impl_fmt_traits {
($name:ident, $native:ident, "floating point number") => {
+ #[cfg(not(no_fp_fmt_parse))]
+ impl_fmt_trait!($name, $native, Display);
};
($name:ident, $native:ident, "unsigned integer") => {
impl_fmt_traits!($name, $native, @all_types);
@@ -687,16 +726,9 @@ example of how it can be used for parsing UDP packets.
}
}
+ impl_dbg_traits!($name, $native, $number_kind);
impl_fmt_traits!($name, $native, $number_kind);
impl_ops_traits!($name, $native, $number_kind);
-
- impl<O: ByteOrder> Debug for $name<O> {
- #[inline]
- fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
- // This results in a format like "U16(42)".
- f.debug_tuple(stringify!($name)).field(&self.get()).finish()
- }
- }
};
}
diff --git a/rust/zerocopy/src/deprecated.rs b/rust/zerocopy/src/deprecated.rs
index 24bafbf9adeb..59ddd35c77c6 100644
--- a/rust/zerocopy/src/deprecated.rs
+++ b/rust/zerocopy/src/deprecated.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2024 The Fuchsia Authors
//
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
diff --git a/rust/zerocopy/src/error.rs b/rust/zerocopy/src/error.rs
index 7cb08c31d452..5eb30de934f3 100644
--- a/rust/zerocopy/src/error.rs
+++ b/rust/zerocopy/src/error.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2024 The Fuchsia Authors
//
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
diff --git a/rust/zerocopy/src/impls.rs b/rust/zerocopy/src/impls.rs
index 22fd6c3d5d94..62e234c5202b 100644
--- a/rust/zerocopy/src/impls.rs
+++ b/rust/zerocopy/src/impls.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2024 The Fuchsia Authors
//
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
@@ -1359,7 +1359,7 @@ mod simd {
#[cfg(not(no_zerocopy_aarch64_simd_1_59_0))]
simd_arch_mod!(
#[cfg(all(
- target_arch = "aarch64",
+ target_arch = "aarch64",
any(
target_endian = "little",
not(no_zerocopy_aarch64_simd_be_1_87_0)
diff --git a/rust/zerocopy/src/layout.rs b/rust/zerocopy/src/layout.rs
index 6015d0f2de52..b1fa0cd436db 100644
--- a/rust/zerocopy/src/layout.rs
+++ b/rust/zerocopy/src/layout.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2024 The Fuchsia Authors
//
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
@@ -71,6 +71,8 @@ impl SizeInfo {
/// Attempts to create a `SizeInfo` from `Self` in which `elem_size` is a
/// `NonZeroUsize`. If `elem_size` is 0, returns `None`.
#[allow(unused)]
+ #[cfg_attr(not(zerocopy_inline_always), inline)]
+ #[cfg_attr(zerocopy_inline_always, inline(always))]
const fn try_to_nonzero_elem_size(&self) -> Option<SizeInfo<NonZeroUsize>> {
Some(match *self {
SizeInfo::Sized { size } => SizeInfo::Sized { size },
diff --git a/rust/zerocopy/src/lib.rs b/rust/zerocopy/src/lib.rs
index 3302d67602ab..572f0563fe2f 100644
--- a/rust/zerocopy/src/lib.rs
+++ b/rust/zerocopy/src/lib.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2018 The Fuchsia Authors
//
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
@@ -12,7 +12,7 @@
// After updating the following doc comment, make sure to run the following
// command to update `README.md` based on its contents:
//
-// cargo -q run --manifest-path tools/Cargo.toml -p generate-readme > README.md
+// (cd .. && cargo -q run --manifest-path tools/Cargo.toml -p generate-readme) > README.md
//! ***<span style="font-size: 140%">Fast, safe, <span
//! style="color:red;">compile error</span>. Pick two.</span>***
@@ -174,7 +174,7 @@
//!
//! [Miri]: https://github.com/rust-lang/miri
//! [Kani]: https://github.com/model-checking/kani
-//! [soundness policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#soundness
+//! [soundness policy]: https://github.com/google/zerocopy/blob/main/zerocopy/POLICIES.md#soundness
//!
//! # Relationship to Project Safe Transmute
//!
@@ -203,7 +203,7 @@
//!
//! See our [MSRV policy].
//!
-//! [MSRV policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#msrv
+//! [MSRV policy]: https://github.com/google/zerocopy/blob/main/zerocopy/POLICIES.md#msrv
//!
//! # Changelog
//!
@@ -435,6 +435,8 @@ const _: () = {
WARNING
};
+#[cfg(all(any(feature = "derive", test), zerocopy_unstable_linux))]
+pub use zerocopy_derive::most_traits;
/// Implements [`KnownLayout`].
///
/// This derive analyzes various aspects of a type's layout that are needed for
@@ -2832,7 +2834,7 @@ pub unsafe trait TryFromBytes {
/// ```
///
/// [`try_mut_from_bytes`]: TryFromBytes::try_mut_from_bytes
- ///
+ ///
#[doc = codegen_header!("h5", "try_mut_from_bytes_with_elems")]
///
/// See [`TryFromBytes::try_ref_from_bytes_with_elems`](#method.try_ref_from_bytes_with_elems.codegen).
diff --git a/rust/zerocopy/src/macros.rs b/rust/zerocopy/src/macros.rs
index b801d86a8fa6..ec67c03a44fc 100644
--- a/rust/zerocopy/src/macros.rs
+++ b/rust/zerocopy/src/macros.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2024 The Fuchsia Authors
//
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
diff --git a/rust/zerocopy/src/pointer/inner.rs b/rust/zerocopy/src/pointer/inner.rs
index 5db08080141f..949b60a3f83e 100644
--- a/rust/zerocopy/src/pointer/inner.rs
+++ b/rust/zerocopy/src/pointer/inner.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2024 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
diff --git a/rust/zerocopy/src/pointer/invariant.rs b/rust/zerocopy/src/pointer/invariant.rs
index 1802d23563db..7ff0d43dad5e 100644
--- a/rust/zerocopy/src/pointer/invariant.rs
+++ b/rust/zerocopy/src/pointer/invariant.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2024 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
diff --git a/rust/zerocopy/src/pointer/mod.rs b/rust/zerocopy/src/pointer/mod.rs
index 3461f7f5ca80..d6eacc52febe 100644
--- a/rust/zerocopy/src/pointer/mod.rs
+++ b/rust/zerocopy/src/pointer/mod.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2023 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
diff --git a/rust/zerocopy/src/pointer/ptr.rs b/rust/zerocopy/src/pointer/ptr.rs
index b7c4ea56d2b2..7213f6f4a04e 100644
--- a/rust/zerocopy/src/pointer/ptr.rs
+++ b/rust/zerocopy/src/pointer/ptr.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2023 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
diff --git a/rust/zerocopy/src/pointer/transmute.rs b/rust/zerocopy/src/pointer/transmute.rs
index a534984b70d3..ef9836698203 100644
--- a/rust/zerocopy/src/pointer/transmute.rs
+++ b/rust/zerocopy/src/pointer/transmute.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2025 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
diff --git a/rust/zerocopy/src/ref.rs b/rust/zerocopy/src/ref.rs
index 860066d75196..e49f2a887ffa 100644
--- a/rust/zerocopy/src/ref.rs
+++ b/rust/zerocopy/src/ref.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2024 The Fuchsia Authors
//
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
diff --git a/rust/zerocopy/src/split_at.rs b/rust/zerocopy/src/split_at.rs
index 9a67d5acbb0d..d7778425a31d 100644
--- a/rust/zerocopy/src/split_at.rs
+++ b/rust/zerocopy/src/split_at.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2025 The Fuchsia Authors
//
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
diff --git a/rust/zerocopy/src/util/macro_util.rs b/rust/zerocopy/src/util/macro_util.rs
index 1abb0fbeb46e..ceeb80432b0b 100644
--- a/rust/zerocopy/src/util/macro_util.rs
+++ b/rust/zerocopy/src/util/macro_util.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2022 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
diff --git a/rust/zerocopy/src/util/macros.rs b/rust/zerocopy/src/util/macros.rs
index 43e4fd64ee15..7e63e3a54fc4 100644
--- a/rust/zerocopy/src/util/macros.rs
+++ b/rust/zerocopy/src/util/macros.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2023 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
diff --git a/rust/zerocopy/src/util/mod.rs b/rust/zerocopy/src/util/mod.rs
index d6d4c6c2fcd9..02fd4ed62741 100644
--- a/rust/zerocopy/src/util/mod.rs
+++ b/rust/zerocopy/src/util/mod.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2023 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
@@ -150,6 +150,8 @@ pub(crate) fn validate_aligned_to<T: AsAddress, U>(t: T) -> Result<(), Alignment
// Ensures that we add the minimum required padding.
kani::ensures(|&p| p < align.get()),
)]
+#[cfg_attr(not(zerocopy_inline_always), inline)]
+#[cfg_attr(zerocopy_inline_always, inline(always))]
pub(crate) const fn padding_needed_for(len: usize, align: NonZeroUsize) -> usize {
#[cfg(kani)]
#[kani::proof_for_contract(padding_needed_for)]
@@ -251,6 +253,8 @@ pub(crate) const fn round_down_to_next_multiple_of_alignment(
n & mask
}
+#[cfg_attr(not(zerocopy_inline_always), inline)]
+#[cfg_attr(zerocopy_inline_always, inline(always))]
pub(crate) const fn max(a: NonZeroUsize, b: NonZeroUsize) -> NonZeroUsize {
if a.get() < b.get() {
b
@@ -259,6 +263,8 @@ pub(crate) const fn max(a: NonZeroUsize, b: NonZeroUsize) -> NonZeroUsize {
}
}
+#[cfg_attr(not(zerocopy_inline_always), inline)]
+#[cfg_attr(zerocopy_inline_always, inline(always))]
pub(crate) const fn min(a: NonZeroUsize, b: NonZeroUsize) -> NonZeroUsize {
if a.get() > b.get() {
b
diff --git a/rust/zerocopy/src/wrappers.rs b/rust/zerocopy/src/wrappers.rs
index 266aec25fa58..1a8cf2b41d55 100644
--- a/rust/zerocopy/src/wrappers.rs
+++ b/rust/zerocopy/src/wrappers.rs
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: (BSD-2-Clause OR Apache-2.0) OR MIT
-
+//
// Copyright 2023 The Fuchsia Authors
//
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0