1
Fork 0

Turn #[allocator] into a built-in attribute and rename it to #[rustc_allocator]

This commit is contained in:
Vadim Petrochenkov 2019-06-08 11:36:30 +03:00
parent 8049e6199b
commit 74a6d1c821
8 changed files with 13 additions and 65 deletions

View file

@ -15,7 +15,8 @@ extern "Rust" {
// them from the `#[global_allocator]` attribute if there is one, or uses the // them from the `#[global_allocator]` attribute if there is one, or uses the
// default implementations in libstd (`__rdl_alloc` etc in `src/libstd/alloc.rs`) // default implementations in libstd (`__rdl_alloc` etc in `src/libstd/alloc.rs`)
// otherwise. // otherwise.
#[allocator] #[cfg_attr(bootstrap, allocator)]
#[cfg_attr(not(bootstrap), rustc_allocator)]
#[rustc_allocator_nounwind] #[rustc_allocator_nounwind]
fn __rust_alloc(size: usize, align: usize) -> *mut u8; fn __rust_alloc(size: usize, align: usize) -> *mut u8;
#[rustc_allocator_nounwind] #[rustc_allocator_nounwind]

View file

@ -79,7 +79,7 @@
#![feature(coerce_unsized)] #![feature(coerce_unsized)]
#![feature(dispatch_from_dyn)] #![feature(dispatch_from_dyn)]
#![feature(core_intrinsics)] #![feature(core_intrinsics)]
#![feature(custom_attribute)] #![cfg_attr(bootstrap, feature(custom_attribute))]
#![feature(dropck_eyepatch)] #![feature(dropck_eyepatch)]
#![feature(exact_size_is_empty)] #![feature(exact_size_is_empty)]
#![feature(fmt_internals)] #![feature(fmt_internals)]

View file

@ -2574,7 +2574,7 @@ bitflags! {
/// `#[cold]`: a hint to LLVM that this function, when called, is never on /// `#[cold]`: a hint to LLVM that this function, when called, is never on
/// the hot path. /// the hot path.
const COLD = 1 << 0; const COLD = 1 << 0;
/// `#[allocator]`: a hint to LLVM that the pointer returned from this /// `#[rustc_allocator]`: a hint to LLVM that the pointer returned from this
/// function is never null. /// function is never null.
const ALLOCATOR = 1 << 1; const ALLOCATOR = 1 << 1;
/// `#[unwind]`: an indicator that this function may unwind despite what /// `#[unwind]`: an indicator that this function may unwind despite what

View file

@ -2445,7 +2445,7 @@ fn codegen_fn_attrs<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, id: DefId) -> Codegen
for attr in attrs.iter() { for attr in attrs.iter() {
if attr.check_name(sym::cold) { if attr.check_name(sym::cold) {
codegen_fn_attrs.flags |= CodegenFnAttrFlags::COLD; codegen_fn_attrs.flags |= CodegenFnAttrFlags::COLD;
} else if attr.check_name(sym::allocator) { } else if attr.check_name(sym::rustc_allocator) {
codegen_fn_attrs.flags |= CodegenFnAttrFlags::ALLOCATOR; codegen_fn_attrs.flags |= CodegenFnAttrFlags::ALLOCATOR;
} else if attr.check_name(sym::unwind) { } else if attr.check_name(sym::unwind) {
codegen_fn_attrs.flags |= CodegenFnAttrFlags::UNWIND; codegen_fn_attrs.flags |= CodegenFnAttrFlags::UNWIND;

View file

@ -1331,6 +1331,11 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
"internal implementation detail", "internal implementation detail",
cfg_fn!(rustc_attrs))), cfg_fn!(rustc_attrs))),
(sym::rustc_allocator, Whitelisted, template!(Word), Gated(Stability::Unstable,
sym::rustc_attrs,
"internal implementation detail",
cfg_fn!(rustc_attrs))),
// FIXME: #14408 whitelist docs since rustdoc looks at them // FIXME: #14408 whitelist docs since rustdoc looks at them
( (
sym::doc, sym::doc,

View file

@ -513,6 +513,7 @@ symbols! {
rust_2018_preview, rust_2018_preview,
rust_begin_unwind, rust_begin_unwind,
rustc, rustc,
rustc_allocator,
rustc_allocator_nounwind, rustc_allocator_nounwind,
rustc_allow_const_fn_ptr, rustc_allow_const_fn_ptr,
rustc_args_required_const, rustc_args_required_const,

View file

@ -2,7 +2,7 @@
// ignore-tidy-linelength // ignore-tidy-linelength
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(custom_attribute)] #![feature(rustc_attrs)]
pub struct S { pub struct S {
_field: [i32; 8], _field: [i32; 8],
@ -146,7 +146,7 @@ pub fn enum_id_2(x: Option<u8>) -> Option<u8> {
// CHECK: noalias i8* @allocator() // CHECK: noalias i8* @allocator()
#[no_mangle] #[no_mangle]
#[allocator] #[rustc_allocator]
pub fn allocator() -> *const i8 { pub fn allocator() -> *const i8 {
std::ptr::null() std::ptr::null()
} }

View file

@ -1,59 +0,0 @@
// no-prefer-dynamic
#![feature(allocator, core_intrinsics, panic_unwind)]
#![allocator]
#![crate_type = "rlib"]
#![no_std]
extern crate unwind;
pub static mut HITS: usize = 0;
type size_t = usize;
extern {
fn malloc(size: usize) -> *mut u8;
fn free(ptr: *mut u8);
fn calloc(size: usize, amt: usize) -> *mut u8;
fn realloc(ptr: *mut u8, size: usize) -> *mut u8;
}
#[no_mangle]
pub extern fn __rust_allocate(size: usize, align: usize) -> *mut u8 {
unsafe {
HITS += 1;
malloc(size as size_t) as *mut u8
}
}
#[no_mangle]
pub extern fn __rust_allocate_zeroed(size: usize, _align: usize) -> *mut u8 {
unsafe { calloc(size as size_t, 1) as *mut u8 }
}
#[no_mangle]
pub extern fn __rust_deallocate(ptr: *mut u8, old_size: usize, align: usize) {
unsafe {
HITS += 1;
free(ptr as *mut _)
}
}
#[no_mangle]
pub extern fn __rust_reallocate(ptr: *mut u8, old_size: usize, size: usize,
align: usize) -> *mut u8 {
unsafe {
realloc(ptr as *mut _, size as size_t) as *mut u8
}
}
#[no_mangle]
pub extern fn __rust_reallocate_inplace(ptr: *mut u8, old_size: usize,
size: usize, align: usize) -> usize {
unsafe { core::intrinsics::abort() }
}
#[no_mangle]
pub extern fn __rust_usable_size(size: usize, align: usize) -> usize {
unsafe { core::intrinsics::abort() }
}