diff --git a/Cargo.toml b/Cargo.toml index 663d9b109..97b8f35b9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,8 @@ [package] authors = ["Jorge Aparicio "] +build = "build.rs" name = "rustc_builtins" version = "0.1.0" + +[dependencies] +rlibc = { path = "rlibc" } diff --git a/build.rs b/build.rs new file mode 100644 index 000000000..27d51570d --- /dev/null +++ b/build.rs @@ -0,0 +1,18 @@ +use std::path::Path; +use std::env; + +fn main() { + let target_dir = Path::new(env!("OUT_DIR")).parent().unwrap().parent().unwrap().parent().unwrap().parent().unwrap(); + let mut deps_dir = target_dir.to_owned(); + let host = env::var_os("HOST").unwrap(); + let target = env::var_os("TARGET").unwrap(); + + if target != host { + deps_dir.push(target); + } + deps_dir.push(env::var_os("PROFILE").unwrap()); + deps_dir.push("deps"); + + println!("cargo:rustc-link-search=native={}", deps_dir.display()); + println!("cargo:rustc-link-lib=static=rlibc"); +} diff --git a/rlibc/Cargo.toml b/rlibc/Cargo.toml new file mode 100644 index 000000000..abe7f9fdc --- /dev/null +++ b/rlibc/Cargo.toml @@ -0,0 +1,7 @@ +[package] +authors = ["Jorge Aparicio "] +name = "rlibc" +version = "0.1.0" + +[lib] +crate-type = ["staticlib"] diff --git a/rlibc/src/lib.rs b/rlibc/src/lib.rs new file mode 100644 index 000000000..98f97097f --- /dev/null +++ b/rlibc/src/lib.rs @@ -0,0 +1,53 @@ +#![feature(lang_items)] +#![feature(linkage)] +#![no_builtins] +#![no_std] + +#[linkage = "weak"] +#[no_mangle] +pub unsafe extern "C" 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; + } + dest +} + +#[linkage = "weak"] +#[no_mangle] +pub unsafe extern "C" 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; + } + } + dest +} + +#[linkage = "weak"] +#[no_mangle] +pub unsafe extern "C" 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; + } + s +} + +#[lang = "panic_fmt"] +fn panic_fmt() {} + +#[lang = "eh_personality"] +fn eh_personality() {}