Skip to content

Commit 6eac7dc

Browse files
author
Jorge Aparicio
committed
add weak memcpy et al symbols
closes #28
1 parent d546f18 commit 6eac7dc

File tree

3 files changed

+75
-18
lines changed

3 files changed

+75
-18
lines changed

src/arm.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,63 +32,57 @@ pub unsafe extern "aapcs" fn __aeabi_uldivmod() {
3232
intrinsics::unreachable();
3333
}
3434

35-
extern "C" {
36-
fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8;
37-
fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8;
38-
fn memset(dest: *mut u8, c: i32, n: usize) -> *mut u8;
39-
}
40-
4135
// FIXME: The `*4` and `*8` variants should be defined as aliases.
4236

4337
#[no_mangle]
4438
pub unsafe extern "aapcs" fn __aeabi_memcpy(dest: *mut u8, src: *const u8, n: usize) {
45-
memcpy(dest, src, n);
39+
::mem::memcpy(dest, src, n);
4640
}
4741
#[no_mangle]
4842
pub unsafe extern "aapcs" fn __aeabi_memcpy4(dest: *mut u8, src: *const u8, n: usize) {
49-
memcpy(dest, src, n);
43+
::mem::memcpy(dest, src, n);
5044
}
5145
#[no_mangle]
5246
pub unsafe extern "aapcs" fn __aeabi_memcpy8(dest: *mut u8, src: *const u8, n: usize) {
53-
memcpy(dest, src, n);
47+
::mem::memcpy(dest, src, n);
5448
}
5549

5650
#[no_mangle]
5751
pub unsafe extern "aapcs" fn __aeabi_memmove(dest: *mut u8, src: *const u8, n: usize) {
58-
memmove(dest, src, n);
52+
::mem::memmove(dest, src, n);
5953
}
6054
#[no_mangle]
6155
pub unsafe extern "aapcs" fn __aeabi_memmove4(dest: *mut u8, src: *const u8, n: usize) {
62-
memmove(dest, src, n);
56+
::mem::memmove(dest, src, n);
6357
}
6458
#[no_mangle]
6559
pub unsafe extern "aapcs" fn __aeabi_memmove8(dest: *mut u8, src: *const u8, n: usize) {
66-
memmove(dest, src, n);
60+
::mem::memmove(dest, src, n);
6761
}
6862

6963
// Note the different argument order
7064
#[no_mangle]
7165
pub unsafe extern "aapcs" fn __aeabi_memset(dest: *mut u8, n: usize, c: i32) {
72-
memset(dest, c, n);
66+
::mem::memset(dest, c, n);
7367
}
7468
#[no_mangle]
7569
pub unsafe extern "aapcs" fn __aeabi_memset4(dest: *mut u8, n: usize, c: i32) {
76-
memset(dest, c, n);
70+
::mem::memset(dest, c, n);
7771
}
7872
#[no_mangle]
7973
pub unsafe extern "aapcs" fn __aeabi_memset8(dest: *mut u8, n: usize, c: i32) {
80-
memset(dest, c, n);
74+
::mem::memset(dest, c, n);
8175
}
8276

8377
#[no_mangle]
8478
pub unsafe extern "aapcs" fn __aeabi_memclr(dest: *mut u8, n: usize) {
85-
memset(dest, 0, n);
79+
::mem::memset(dest, 0, n);
8680
}
8781
#[no_mangle]
8882
pub unsafe extern "aapcs" fn __aeabi_memclr4(dest: *mut u8, n: usize) {
89-
memset(dest, 0, n);
83+
::mem::memset(dest, 0, n);
9084
}
9185
#[no_mangle]
9286
pub unsafe extern "aapcs" fn __aeabi_memclr8(dest: *mut u8, n: usize) {
93-
memset(dest, 0, n);
87+
::mem::memset(dest, 0, n);
9488
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
#![cfg_attr(not(test), 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
#[cfg(test)]
1012
extern crate core;
@@ -16,6 +18,7 @@ extern crate quickcheck;
1618
pub mod arm;
1719

1820
pub mod div;
21+
pub mod mem;
1922

2023
#[cfg(test)]
2124
mod test;

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)