From 8abf8bb5a6ff4245c9ec546e72594baef091dce3 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Mon, 8 Aug 2016 16:55:20 -0500 Subject: [PATCH] add weak memcpy et al (take 2) --- Cargo.toml | 3 +++ rlibc/Cargo.toml | 6 ++++++ rlibc/src/lib.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 2 ++ 4 files changed, 57 insertions(+) create mode 100644 rlibc/Cargo.toml create mode 100644 rlibc/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 663d9b109..40ca8c5a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,3 +2,6 @@ authors = ["Jorge Aparicio "] name = "rustc_builtins" version = "0.1.0" + +[dependencies] +rlibc = { path = "rlibc" } diff --git a/rlibc/Cargo.toml b/rlibc/Cargo.toml new file mode 100644 index 000000000..765362500 --- /dev/null +++ b/rlibc/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "rlibc" +version = "0.1.0" +authors = ["Jorge Aparicio "] + +[dependencies] diff --git a/rlibc/src/lib.rs b/rlibc/src/lib.rs new file mode 100644 index 000000000..0a9244b0b --- /dev/null +++ b/rlibc/src/lib.rs @@ -0,0 +1,46 @@ +#![feature(linkage)] +#![no_builtins] +#![no_std] + +#[linkage = "weak"] +#[no_mangle] +pub unsafe extern fn memcpy(dest: *mut u8, src: *const u8, + n: usize) -> *mut u8 { + let mut i = 0; + while i < n { + *dest.offset(i as isize) = *src.offset(i as isize); + i += 1; + } + return dest; +} + +#[linkage = "weak"] +#[no_mangle] +pub unsafe extern fn memmove(dest: *mut u8, src: *const u8, + n: usize) -> *mut u8 { + if src < dest as *const u8 { // copy from end + let mut i = n; + while i != 0 { + i -= 1; + *dest.offset(i as isize) = *src.offset(i as isize); + } + } else { // copy from beginning + let mut i = 0; + while i < n { + *dest.offset(i as isize) = *src.offset(i as isize); + i += 1; + } + } + return dest; +} + +#[linkage = "weak"] +#[no_mangle] +pub unsafe extern fn memset(s: *mut u8, c: i32, n: usize) -> *mut u8 { + let mut i = 0; + while i < n { + *s.offset(i as isize) = c as u8; + i += 1; + } + return s; +} diff --git a/src/lib.rs b/src/lib.rs index 01aca7674..e1457d482 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,8 @@ #[cfg(test)] extern crate core; +extern crate rlibc; + use core::mem; #[cfg(target_arch = "arm")]