libc: omit memcpy, memmove and memset
LLVM provides these functions as intrinsics, and will generate calls to libc when appropriate. They are exposed in the `ptr` module as `copy_nonoverlapping_memory`, `copy_memory` and `set_memory`.
This commit is contained in:
parent
0e96369224
commit
8bcefef2f2
|
@ -159,8 +159,8 @@ pub use libc::funcs::c95::stdlib::{free, getenv, labs, malloc, rand};
|
||||||
pub use libc::funcs::c95::stdlib::{realloc, srand, strtod, strtol};
|
pub use libc::funcs::c95::stdlib::{realloc, srand, strtod, strtol};
|
||||||
pub use libc::funcs::c95::stdlib::{strtoul, system};
|
pub use libc::funcs::c95::stdlib::{strtoul, system};
|
||||||
|
|
||||||
pub use libc::funcs::c95::string::{memchr, memcmp, memcpy, memmove};
|
pub use libc::funcs::c95::string::{memchr, memcmp};
|
||||||
pub use libc::funcs::c95::string::{memset, strcat, strchr, strcmp};
|
pub use libc::funcs::c95::string::{strcat, strchr, strcmp};
|
||||||
pub use libc::funcs::c95::string::{strcoll, strcpy, strcspn, strerror};
|
pub use libc::funcs::c95::string::{strcoll, strcpy, strcspn, strerror};
|
||||||
pub use libc::funcs::c95::string::{strlen, strncat, strncmp, strncpy};
|
pub use libc::funcs::c95::string::{strlen, strncat, strncmp, strncpy};
|
||||||
pub use libc::funcs::c95::string::{strpbrk, strrchr, strspn, strstr};
|
pub use libc::funcs::c95::string::{strpbrk, strrchr, strspn, strstr};
|
||||||
|
@ -1452,26 +1452,17 @@ pub mod funcs {
|
||||||
-> size_t;
|
-> size_t;
|
||||||
unsafe fn wcslen(buf: *wchar_t) -> size_t;
|
unsafe fn wcslen(buf: *wchar_t) -> size_t;
|
||||||
|
|
||||||
|
// Omitted: memcpy, memmove, memset (provided by LLVM)
|
||||||
|
|
||||||
// These are fine to execute on the Rust stack. They must be,
|
// These are fine to execute on the Rust stack. They must be,
|
||||||
// in fact, because LLVM generates calls to them!
|
// in fact, because LLVM generates calls to them!
|
||||||
#[rust_stack]
|
#[rust_stack]
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
unsafe fn memcpy(s: *c_void, ct: *c_void, n: size_t)
|
|
||||||
-> *c_void;
|
|
||||||
#[rust_stack]
|
|
||||||
#[inline(always)]
|
|
||||||
unsafe fn memmove(s: *c_void, ct: *c_void, n: size_t)
|
|
||||||
-> *c_void;
|
|
||||||
#[rust_stack]
|
|
||||||
#[inline(always)]
|
|
||||||
unsafe fn memcmp(cx: *c_void, ct: *c_void, n: size_t)
|
unsafe fn memcmp(cx: *c_void, ct: *c_void, n: size_t)
|
||||||
-> c_int;
|
-> c_int;
|
||||||
#[rust_stack]
|
#[rust_stack]
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
unsafe fn memchr(cx: *c_void, c: c_int, n: size_t) -> *c_void;
|
unsafe fn memchr(cx: *c_void, c: c_int, n: size_t) -> *c_void;
|
||||||
#[rust_stack]
|
|
||||||
#[inline(always)]
|
|
||||||
unsafe fn memset(s: *c_void, c: c_int, n: size_t) -> *c_void;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,22 +20,6 @@ use unstable::intrinsics;
|
||||||
#[cfg(not(test))] use cmp::{Eq, Ord};
|
#[cfg(not(test))] use cmp::{Eq, Ord};
|
||||||
use uint;
|
use uint;
|
||||||
|
|
||||||
#[cfg(stage0)]
|
|
||||||
pub mod libc_ {
|
|
||||||
use libc::c_void;
|
|
||||||
use libc;
|
|
||||||
|
|
||||||
#[nolink]
|
|
||||||
#[abi = "cdecl"]
|
|
||||||
pub extern {
|
|
||||||
#[rust_stack]
|
|
||||||
unsafe fn memset(dest: *mut c_void,
|
|
||||||
c: libc::c_int,
|
|
||||||
len: libc::size_t)
|
|
||||||
-> *c_void;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Calculate the offset from a pointer
|
/// Calculate the offset from a pointer
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn offset<T>(ptr: *T, count: uint) -> *T {
|
pub fn offset<T>(ptr: *T, count: uint) -> *T {
|
||||||
|
@ -178,13 +162,6 @@ pub unsafe fn copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: u
|
||||||
memcpy64(dst, src as *T, count as u64);
|
memcpy64(dst, src as *T, count as u64);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
#[cfg(stage0)]
|
|
||||||
pub unsafe fn set_memory<T>(dst: *mut T, c: int, count: uint) {
|
|
||||||
let n = count * sys::size_of::<T>();
|
|
||||||
libc_::memset(dst as *mut c_void, c as libc::c_int, n as size_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invokes memset on the specified pointer, setting `count` bytes of memory
|
* Invokes memset on the specified pointer, setting `count` bytes of memory
|
||||||
* starting at `dst` to `c`.
|
* starting at `dst` to `c`.
|
||||||
|
@ -601,6 +578,7 @@ pub mod ptr_tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
#[cfg(not(stage0))]
|
||||||
fn test_set_memory() {
|
fn test_set_memory() {
|
||||||
let mut xs = [0u8, ..20];
|
let mut xs = [0u8, ..20];
|
||||||
let ptr = vec::raw::to_mut_ptr(xs);
|
let ptr = vec::raw::to_mut_ptr(xs);
|
||||||
|
|
Loading…
Reference in New Issue