forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 437
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This is a subset of the Rust standard library `alloc` crate, version 1.62.0, licensed under "Apache-2.0 OR MIT", from: https://github.com/rust-lang/rust/tree/1.62.0/library/alloc/src The files are copied as-is, with no modifications whatsoever (not even adding the SPDX identifiers). For copyright details, please see: https://github.com/rust-lang/rust/blob/1.62.0/COPYRIGHT The next patch modifies these files as needed for use within the kernel. This patch split allows reviewers to double-check the import and to clearly see the differences introduced. Vendoring `alloc`, at least for the moment, allows us to have fallible allocations support (i.e. the `try_*` versions of methods which return a `Result` instead of panicking) early on. It also gives a bit more freedom to experiment with new interfaces and to iterate quickly. Eventually, the goal is to have everything the kernel needs in upstream `alloc` and drop it from the kernel tree. For a summary of work on `alloc` happening upstream, please see: #408 The following script may be used to verify the contents: for path in $(cd rust/alloc/ && find . -type f -name '*.rs'); do curl --silent --show-error --location \ https://github.com/rust-lang/rust/raw/1.62.0/library/alloc/src/$path \ | diff --unified rust/alloc/$path - && echo $path: OK done Reviewed-by: Kees Cook <[email protected]> Co-developed-by: Alex Gaynor <[email protected]> Signed-off-by: Alex Gaynor <[email protected]> Co-developed-by: Wedson Almeida Filho <[email protected]> Signed-off-by: Wedson Almeida Filho <[email protected]> Signed-off-by: Miguel Ojeda <[email protected]>
- Loading branch information
Showing
13 changed files
with
9,037 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
//! Collection types. | ||
#![stable(feature = "rust1", since = "1.0.0")] | ||
|
||
#[cfg(not(no_global_oom_handling))] | ||
pub mod binary_heap; | ||
#[cfg(not(no_global_oom_handling))] | ||
mod btree; | ||
#[cfg(not(no_global_oom_handling))] | ||
pub mod linked_list; | ||
#[cfg(not(no_global_oom_handling))] | ||
pub mod vec_deque; | ||
|
||
#[cfg(not(no_global_oom_handling))] | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
pub mod btree_map { | ||
//! An ordered map based on a B-Tree. | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
pub use super::btree::map::*; | ||
} | ||
|
||
#[cfg(not(no_global_oom_handling))] | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
pub mod btree_set { | ||
//! An ordered set based on a B-Tree. | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
pub use super::btree::set::*; | ||
} | ||
|
||
#[cfg(not(no_global_oom_handling))] | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
#[doc(no_inline)] | ||
pub use binary_heap::BinaryHeap; | ||
|
||
#[cfg(not(no_global_oom_handling))] | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
#[doc(no_inline)] | ||
pub use btree_map::BTreeMap; | ||
|
||
#[cfg(not(no_global_oom_handling))] | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
#[doc(no_inline)] | ||
pub use btree_set::BTreeSet; | ||
|
||
#[cfg(not(no_global_oom_handling))] | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
#[doc(no_inline)] | ||
pub use linked_list::LinkedList; | ||
|
||
#[cfg(not(no_global_oom_handling))] | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
#[doc(no_inline)] | ||
pub use vec_deque::VecDeque; | ||
|
||
use crate::alloc::{Layout, LayoutError}; | ||
use core::fmt::Display; | ||
|
||
/// The error type for `try_reserve` methods. | ||
#[derive(Clone, PartialEq, Eq, Debug)] | ||
#[stable(feature = "try_reserve", since = "1.57.0")] | ||
pub struct TryReserveError { | ||
kind: TryReserveErrorKind, | ||
} | ||
|
||
impl TryReserveError { | ||
/// Details about the allocation that caused the error | ||
#[inline] | ||
#[must_use] | ||
#[unstable( | ||
feature = "try_reserve_kind", | ||
reason = "Uncertain how much info should be exposed", | ||
issue = "48043" | ||
)] | ||
pub fn kind(&self) -> TryReserveErrorKind { | ||
self.kind.clone() | ||
} | ||
} | ||
|
||
/// Details of the allocation that caused a `TryReserveError` | ||
#[derive(Clone, PartialEq, Eq, Debug)] | ||
#[unstable( | ||
feature = "try_reserve_kind", | ||
reason = "Uncertain how much info should be exposed", | ||
issue = "48043" | ||
)] | ||
pub enum TryReserveErrorKind { | ||
/// Error due to the computed capacity exceeding the collection's maximum | ||
/// (usually `isize::MAX` bytes). | ||
CapacityOverflow, | ||
|
||
/// The memory allocator returned an error | ||
AllocError { | ||
/// The layout of allocation request that failed | ||
layout: Layout, | ||
|
||
#[doc(hidden)] | ||
#[unstable( | ||
feature = "container_error_extra", | ||
issue = "none", | ||
reason = "\ | ||
Enable exposing the allocator’s custom error value \ | ||
if an associated type is added in the future: \ | ||
https://github.com/rust-lang/wg-allocators/issues/23" | ||
)] | ||
non_exhaustive: (), | ||
}, | ||
} | ||
|
||
#[unstable( | ||
feature = "try_reserve_kind", | ||
reason = "Uncertain how much info should be exposed", | ||
issue = "48043" | ||
)] | ||
impl From<TryReserveErrorKind> for TryReserveError { | ||
#[inline] | ||
fn from(kind: TryReserveErrorKind) -> Self { | ||
Self { kind } | ||
} | ||
} | ||
|
||
#[unstable(feature = "try_reserve_kind", reason = "new API", issue = "48043")] | ||
impl From<LayoutError> for TryReserveErrorKind { | ||
/// Always evaluates to [`TryReserveErrorKind::CapacityOverflow`]. | ||
#[inline] | ||
fn from(_: LayoutError) -> Self { | ||
TryReserveErrorKind::CapacityOverflow | ||
} | ||
} | ||
|
||
#[stable(feature = "try_reserve", since = "1.57.0")] | ||
impl Display for TryReserveError { | ||
fn fmt( | ||
&self, | ||
fmt: &mut core::fmt::Formatter<'_>, | ||
) -> core::result::Result<(), core::fmt::Error> { | ||
fmt.write_str("memory allocation failed")?; | ||
let reason = match self.kind { | ||
TryReserveErrorKind::CapacityOverflow => { | ||
" because the computed capacity exceeded the collection's maximum" | ||
} | ||
TryReserveErrorKind::AllocError { .. } => { | ||
" because the memory allocator returned a error" | ||
} | ||
}; | ||
fmt.write_str(reason) | ||
} | ||
} | ||
|
||
/// An intermediate trait for specialization of `Extend`. | ||
#[doc(hidden)] | ||
trait SpecExtend<I: IntoIterator> { | ||
/// Extends `self` with the contents of the given iterator. | ||
fn spec_extend(&mut self, iter: I); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,236 @@ | ||
//! # The Rust core allocation and collections library | ||
//! | ||
//! This library provides smart pointers and collections for managing | ||
//! heap-allocated values. | ||
//! | ||
//! This library, like libcore, normally doesn’t need to be used directly | ||
//! since its contents are re-exported in the [`std` crate](../std/index.html). | ||
//! Crates that use the `#![no_std]` attribute however will typically | ||
//! not depend on `std`, so they’d use this crate instead. | ||
//! | ||
//! ## Boxed values | ||
//! | ||
//! The [`Box`] type is a smart pointer type. There can only be one owner of a | ||
//! [`Box`], and the owner can decide to mutate the contents, which live on the | ||
//! heap. | ||
//! | ||
//! This type can be sent among threads efficiently as the size of a `Box` value | ||
//! is the same as that of a pointer. Tree-like data structures are often built | ||
//! with boxes because each node often has only one owner, the parent. | ||
//! | ||
//! ## Reference counted pointers | ||
//! | ||
//! The [`Rc`] type is a non-threadsafe reference-counted pointer type intended | ||
//! for sharing memory within a thread. An [`Rc`] pointer wraps a type, `T`, and | ||
//! only allows access to `&T`, a shared reference. | ||
//! | ||
//! This type is useful when inherited mutability (such as using [`Box`]) is too | ||
//! constraining for an application, and is often paired with the [`Cell`] or | ||
//! [`RefCell`] types in order to allow mutation. | ||
//! | ||
//! ## Atomically reference counted pointers | ||
//! | ||
//! The [`Arc`] type is the threadsafe equivalent of the [`Rc`] type. It | ||
//! provides all the same functionality of [`Rc`], except it requires that the | ||
//! contained type `T` is shareable. Additionally, [`Arc<T>`][`Arc`] is itself | ||
//! sendable while [`Rc<T>`][`Rc`] is not. | ||
//! | ||
//! This type allows for shared access to the contained data, and is often | ||
//! paired with synchronization primitives such as mutexes to allow mutation of | ||
//! shared resources. | ||
//! | ||
//! ## Collections | ||
//! | ||
//! Implementations of the most common general purpose data structures are | ||
//! defined in this library. They are re-exported through the | ||
//! [standard collections library](../std/collections/index.html). | ||
//! | ||
//! ## Heap interfaces | ||
//! | ||
//! The [`alloc`](alloc/index.html) module defines the low-level interface to the | ||
//! default global allocator. It is not compatible with the libc allocator API. | ||
//! | ||
//! [`Arc`]: sync | ||
//! [`Box`]: boxed | ||
//! [`Cell`]: core::cell | ||
//! [`Rc`]: rc | ||
//! [`RefCell`]: core::cell | ||
// To run liballoc tests without x.py without ending up with two copies of liballoc, Miri needs to be | ||
// able to "empty" this crate. See <https://github.com/rust-lang/miri-test-libstd/issues/4>. | ||
// rustc itself never sets the feature, so this line has no affect there. | ||
#![cfg(any(not(feature = "miri-test-libstd"), test, doctest))] | ||
#![allow(unused_attributes)] | ||
#![stable(feature = "alloc", since = "1.36.0")] | ||
#![doc( | ||
html_playground_url = "https://play.rust-lang.org/", | ||
issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/", | ||
test(no_crate_inject, attr(allow(unused_variables), deny(warnings))) | ||
)] | ||
#![doc(cfg_hide( | ||
not(test), | ||
not(any(test, bootstrap)), | ||
any(not(feature = "miri-test-libstd"), test, doctest), | ||
no_global_oom_handling, | ||
not(no_global_oom_handling), | ||
target_has_atomic = "ptr" | ||
))] | ||
#![no_std] | ||
#![needs_allocator] | ||
// | ||
// Lints: | ||
#![deny(unsafe_op_in_unsafe_fn)] | ||
#![warn(deprecated_in_future)] | ||
#![warn(missing_debug_implementations)] | ||
#![warn(missing_docs)] | ||
#![allow(explicit_outlives_requirements)] | ||
// | ||
// Library features: | ||
#![cfg_attr(not(no_global_oom_handling), feature(alloc_c_string))] | ||
#![feature(alloc_layout_extra)] | ||
#![feature(allocator_api)] | ||
#![feature(array_chunks)] | ||
#![feature(array_methods)] | ||
#![feature(array_windows)] | ||
#![feature(assert_matches)] | ||
#![feature(async_iterator)] | ||
#![feature(coerce_unsized)] | ||
#![cfg_attr(not(no_global_oom_handling), feature(const_alloc_error))] | ||
#![feature(const_box)] | ||
#![cfg_attr(not(no_global_oom_handling), feature(const_btree_new))] | ||
#![feature(const_cow_is_borrowed)] | ||
#![feature(const_convert)] | ||
#![feature(const_size_of_val)] | ||
#![feature(const_align_of_val)] | ||
#![feature(const_ptr_read)] | ||
#![feature(const_maybe_uninit_write)] | ||
#![feature(const_maybe_uninit_as_mut_ptr)] | ||
#![feature(const_refs_to_cell)] | ||
#![feature(core_c_str)] | ||
#![feature(core_intrinsics)] | ||
#![feature(core_ffi_c)] | ||
#![feature(const_eval_select)] | ||
#![feature(const_pin)] | ||
#![feature(cstr_from_bytes_until_nul)] | ||
#![feature(dispatch_from_dyn)] | ||
#![feature(exact_size_is_empty)] | ||
#![feature(extend_one)] | ||
#![feature(fmt_internals)] | ||
#![feature(fn_traits)] | ||
#![feature(hasher_prefixfree_extras)] | ||
#![feature(inplace_iteration)] | ||
#![feature(iter_advance_by)] | ||
#![feature(layout_for_ptr)] | ||
#![feature(maybe_uninit_slice)] | ||
#![cfg_attr(test, feature(new_uninit))] | ||
#![feature(nonnull_slice_from_raw_parts)] | ||
#![feature(pattern)] | ||
#![feature(ptr_internals)] | ||
#![feature(ptr_metadata)] | ||
#![feature(ptr_sub_ptr)] | ||
#![feature(receiver_trait)] | ||
#![feature(set_ptr_value)] | ||
#![feature(slice_group_by)] | ||
#![feature(slice_ptr_get)] | ||
#![feature(slice_ptr_len)] | ||
#![feature(slice_range)] | ||
#![feature(str_internals)] | ||
#![feature(strict_provenance)] | ||
#![feature(trusted_len)] | ||
#![feature(trusted_random_access)] | ||
#![feature(try_trait_v2)] | ||
#![feature(unchecked_math)] | ||
#![feature(unicode_internals)] | ||
#![feature(unsize)] | ||
// | ||
// Language features: | ||
#![feature(allocator_internals)] | ||
#![feature(allow_internal_unstable)] | ||
#![feature(associated_type_bounds)] | ||
#![feature(box_syntax)] | ||
#![feature(cfg_sanitize)] | ||
#![feature(const_deref)] | ||
#![feature(const_mut_refs)] | ||
#![feature(const_ptr_write)] | ||
#![feature(const_precise_live_drops)] | ||
#![feature(const_trait_impl)] | ||
#![feature(const_try)] | ||
#![feature(dropck_eyepatch)] | ||
#![feature(exclusive_range_pattern)] | ||
#![feature(fundamental)] | ||
#![cfg_attr(not(test), feature(generator_trait))] | ||
#![feature(hashmap_internals)] | ||
#![feature(lang_items)] | ||
#![feature(let_else)] | ||
#![feature(min_specialization)] | ||
#![feature(negative_impls)] | ||
#![feature(never_type)] | ||
#![feature(nll)] // Not necessary, but here to test the `nll` feature. | ||
#![feature(rustc_allow_const_fn_unstable)] | ||
#![feature(rustc_attrs)] | ||
#![feature(slice_internals)] | ||
#![feature(staged_api)] | ||
#![cfg_attr(test, feature(test))] | ||
#![feature(unboxed_closures)] | ||
#![feature(unsized_fn_params)] | ||
#![feature(c_unwind)] | ||
// | ||
// Rustdoc features: | ||
#![feature(doc_cfg)] | ||
#![feature(doc_cfg_hide)] | ||
// Technically, this is a bug in rustdoc: rustdoc sees the documentation on `#[lang = slice_alloc]` | ||
// blocks is for `&[T]`, which also has documentation using this feature in `core`, and gets mad | ||
// that the feature-gate isn't enabled. Ideally, it wouldn't check for the feature gate for docs | ||
// from other crates, but since this can only appear for lang items, it doesn't seem worth fixing. | ||
#![feature(intra_doc_pointers)] | ||
|
||
// Allow testing this library | ||
#[cfg(test)] | ||
#[macro_use] | ||
extern crate std; | ||
#[cfg(test)] | ||
extern crate test; | ||
|
||
// Module with internal macros used by other modules (needs to be included before other modules). | ||
#[macro_use] | ||
mod macros; | ||
|
||
mod raw_vec; | ||
|
||
// Heaps provided for low-level allocation strategies | ||
|
||
pub mod alloc; | ||
|
||
// Primitive types using the heaps above | ||
|
||
// Need to conditionally define the mod from `boxed.rs` to avoid | ||
// duplicating the lang-items when building in test cfg; but also need | ||
// to allow code to have `use boxed::Box;` declarations. | ||
#[cfg(not(test))] | ||
pub mod boxed; | ||
#[cfg(test)] | ||
mod boxed { | ||
pub use std::boxed::Box; | ||
} | ||
pub mod borrow; | ||
pub mod collections; | ||
#[cfg(not(no_global_oom_handling))] | ||
pub mod ffi; | ||
pub mod fmt; | ||
pub mod rc; | ||
pub mod slice; | ||
pub mod str; | ||
pub mod string; | ||
#[cfg(target_has_atomic = "ptr")] | ||
pub mod sync; | ||
#[cfg(all(not(no_global_oom_handling), target_has_atomic = "ptr"))] | ||
pub mod task; | ||
#[cfg(test)] | ||
mod tests; | ||
pub mod vec; | ||
|
||
#[doc(hidden)] | ||
#[unstable(feature = "liballoc_internals", issue = "none", reason = "implementation detail")] | ||
pub mod __export { | ||
pub use core::format_args; | ||
} |
Oops, something went wrong.