Skip to content

Commit 52cba7d

Browse files
author
Jorge Aparicio
committed
add weak memcpy et al symbols
closes #28
1 parent ac9f96f commit 52cba7d

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
#![no_std]
33
#![feature(asm)]
44
#![feature(core_intrinsics)]
5+
#![feature(linkage)]
56
#![feature(naked_functions)]
67
// TODO(rust-lang/rust#35021) uncomment when that PR lands
78
// #![feature(rustc_builtins)]
9+
#![no_builtins]
810

911
// We disable #[no_mangle] for tests so that we can verify the test results
1012
// against the native compiler-rt implementations of the builtins.
@@ -17,6 +19,7 @@ extern crate quickcheck;
1719
pub mod arm;
1820

1921
pub mod udiv;
22+
pub mod mem;
2023
pub mod mul;
2124
pub mod shift;
2225

src/mem.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// NOTE Copied verbatim from the rlibc crate
2+
// cf. https://crates.io/crates/rlibc
3+
4+
#[linkage = "weak"]
5+
#[no_mangle]
6+
pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
7+
let mut i = 0;
8+
while i < n {
9+
*dest.offset(i as isize) = *src.offset(i as isize);
10+
i += 1;
11+
}
12+
dest
13+
}
14+
15+
#[linkage = "weak"]
16+
#[no_mangle]
17+
pub unsafe extern "C" fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
18+
if src < dest as *const u8 {
19+
// copy from end
20+
let mut i = n;
21+
while i != 0 {
22+
i -= 1;
23+
*dest.offset(i as isize) = *src.offset(i as isize);
24+
}
25+
} else {
26+
// copy from beginning
27+
let mut i = 0;
28+
while i < n {
29+
*dest.offset(i as isize) = *src.offset(i as isize);
30+
i += 1;
31+
}
32+
}
33+
dest
34+
}
35+
36+
#[linkage = "weak"]
37+
#[no_mangle]
38+
pub unsafe extern "C" fn memset(s: *mut u8, c: i32, n: usize) -> *mut u8 {
39+
let mut i = 0;
40+
while i < n {
41+
*s.offset(i as isize) = c as u8;
42+
i += 1;
43+
}
44+
s
45+
}
46+
47+
#[linkage = "weak"]
48+
#[no_mangle]
49+
pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 {
50+
let mut i = 0;
51+
while i < n {
52+
let a = *s1.offset(i as isize);
53+
let b = *s2.offset(i as isize);
54+
if a != b {
55+
return a as i32 - b as i32;
56+
}
57+
i += 1;
58+
}
59+
0
60+
}

0 commit comments

Comments
 (0)