Skip to content

Commit 6eaa93f

Browse files
committed
Fix compiler-builtins runtime symbols definitions
1 parent 1c08f1b commit 6eaa93f

2 files changed

Lines changed: 80 additions & 24 deletions

File tree

  • library/compiler-builtins/compiler-builtins/src

library/compiler-builtins/compiler-builtins/src/arm.rs

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,11 @@ intrinsics! {
8484
///
8585
/// Usual `memcpy` requirements apply.
8686
#[cfg(not(target_vendor = "apple"))]
87-
pub unsafe extern "aapcs" fn __aeabi_memcpy(dst: *mut u8, src: *const u8, n: usize) {
87+
pub unsafe extern "aapcs" fn __aeabi_memcpy(
88+
dst: *mut core::ffi::c_void,
89+
src: *const core::ffi::c_void,
90+
n: usize
91+
) {
8892
// SAFETY: memcpy preconditions apply.
8993
unsafe { crate::mem::memcpy(dst, src, n) };
9094
}
@@ -96,7 +100,11 @@ intrinsics! {
96100
/// Usual `memcpy` requirements apply. Additionally, `dest` and `src` must be aligned to
97101
/// four bytes.
98102
#[cfg(not(target_vendor = "apple"))]
99-
pub unsafe extern "aapcs" fn __aeabi_memcpy4(dst: *mut u8, src: *const u8, n: usize) {
103+
pub unsafe extern "aapcs" fn __aeabi_memcpy4(
104+
dst: *mut core::ffi::c_void,
105+
src: *const core::ffi::c_void,
106+
n: usize
107+
) {
100108
// We are guaranteed 4-alignment, so accessing at u32 is okay.
101109
let mut dst = dst.cast::<u32>();
102110
let mut src = src.cast::<u32>();
@@ -121,7 +129,7 @@ intrinsics! {
121129
}
122130

123131
// SAFETY: `dst` and `src` will still be valid for `n` bytes
124-
unsafe { __aeabi_memcpy(dst.cast::<u8>(), src.cast::<u8>(), n) };
132+
unsafe { __aeabi_memcpy(dst.cast::<core::ffi::c_void>(), src.cast::<core::ffi::c_void>(), n) };
125133
}
126134

127135
/// `memcpy` for 8-byte alignment.
@@ -131,7 +139,11 @@ intrinsics! {
131139
/// Usual `memcpy` requirements apply. Additionally, `dest` and `src` must be aligned to
132140
/// eight bytes.
133141
#[cfg(not(target_vendor = "apple"))]
134-
pub unsafe extern "aapcs" fn __aeabi_memcpy8(dst: *mut u8, src: *const u8, n: usize) {
142+
pub unsafe extern "aapcs" fn __aeabi_memcpy8(
143+
dst: *mut core::ffi::c_void,
144+
src: *const core::ffi::c_void,
145+
n: usize
146+
) {
135147
debug_assert!(dst.addr().is_multiple_of(8));
136148
debug_assert!(src.addr().is_multiple_of(8));
137149

@@ -145,7 +157,11 @@ intrinsics! {
145157
///
146158
/// Usual `memmove` requirements apply.
147159
#[cfg(not(target_vendor = "apple"))]
148-
pub unsafe extern "aapcs" fn __aeabi_memmove(dst: *mut u8, src: *const u8, n: usize) {
160+
pub unsafe extern "aapcs" fn __aeabi_memmove(
161+
dst: *mut core::ffi::c_void,
162+
src: *const core::ffi::c_void,
163+
n: usize
164+
) {
149165
// SAFETY: memmove preconditions apply.
150166
unsafe { crate::mem::memmove(dst, src, n) };
151167
}
@@ -157,7 +173,11 @@ intrinsics! {
157173
/// Usual `memmove` requirements apply. Additionally, `dest` and `src` must be aligned to
158174
/// four bytes.
159175
#[cfg(not(any(target_vendor = "apple", target_env = "msvc")))]
160-
pub unsafe extern "aapcs" fn __aeabi_memmove4(dst: *mut u8, src: *const u8, n: usize) {
176+
pub unsafe extern "aapcs" fn __aeabi_memmove4(
177+
dst: *mut core::ffi::c_void,
178+
src: *const core::ffi::c_void,
179+
n: usize
180+
) {
161181
debug_assert!(dst.addr().is_multiple_of(4));
162182
debug_assert!(src.addr().is_multiple_of(4));
163183

@@ -172,7 +192,11 @@ intrinsics! {
172192
/// Usual `memmove` requirements apply. Additionally, `dst` and `src` must be aligned to
173193
/// eight bytes.
174194
#[cfg(not(any(target_vendor = "apple", target_env = "msvc")))]
175-
pub unsafe extern "aapcs" fn __aeabi_memmove8(dst: *mut u8, src: *const u8, n: usize) {
195+
pub unsafe extern "aapcs" fn __aeabi_memmove8(
196+
dst: *mut core::ffi::c_void,
197+
src: *const core::ffi::c_void,
198+
n: usize
199+
) {
176200
debug_assert!(dst.addr().is_multiple_of(8));
177201
debug_assert!(src.addr().is_multiple_of(8));
178202

@@ -186,7 +210,11 @@ intrinsics! {
186210
///
187211
/// Usual `memset` requirements apply.
188212
#[cfg(not(target_vendor = "apple"))]
189-
pub unsafe extern "aapcs" fn __aeabi_memset(dst: *mut u8, n: usize, c: i32) {
213+
pub unsafe extern "aapcs" fn __aeabi_memset(
214+
dst: *mut core::ffi::c_void,
215+
n: usize,
216+
c: i32
217+
) {
190218
// Note the different argument order
191219
// SAFETY: memset preconditions apply.
192220
unsafe { crate::mem::memset(dst, c, n) };
@@ -199,7 +227,11 @@ intrinsics! {
199227
/// Usual `memset` requirements apply. Additionally, `dest` and `src` must be aligned to
200228
/// four bytes.
201229
#[cfg(not(target_vendor = "apple"))]
202-
pub unsafe extern "aapcs" fn __aeabi_memset4(dst: *mut u8, n: usize, c: i32) {
230+
pub unsafe extern "aapcs" fn __aeabi_memset4(
231+
dst: *mut core::ffi::c_void,
232+
n: usize,
233+
c: i32
234+
) {
203235
let mut dst = dst.cast::<u32>();
204236
debug_assert!(dst.is_aligned());
205237
let mut n = n;
@@ -222,7 +254,7 @@ intrinsics! {
222254
}
223255

224256
// SAFETY: `dst` will still be valid for `n` bytes
225-
unsafe { __aeabi_memset(dst.cast::<u8>(), n, byte as i32) };
257+
unsafe { __aeabi_memset(dst.cast::<core::ffi::c_void>(), n, byte as i32) };
226258
}
227259

228260
/// `memset` for 8-byte alignment.
@@ -232,7 +264,11 @@ intrinsics! {
232264
/// Usual `memset` requirements apply. Additionally, `dst` and `src` must be aligned to
233265
/// eight bytes.
234266
#[cfg(not(target_vendor = "apple"))]
235-
pub unsafe extern "aapcs" fn __aeabi_memset8(dst: *mut u8, n: usize, c: i32) {
267+
pub unsafe extern "aapcs" fn __aeabi_memset8(
268+
dst: *mut core::ffi::c_void,
269+
n: usize,
270+
c: i32
271+
) {
236272
debug_assert!(dst.addr().is_multiple_of(8));
237273

238274
// SAFETY: memset preconditions apply, less strict alignment.
@@ -245,7 +281,7 @@ intrinsics! {
245281
///
246282
/// Usual `memclr` requirements apply.
247283
#[cfg(not(target_vendor = "apple"))]
248-
pub unsafe extern "aapcs" fn __aeabi_memclr(dst: *mut u8, n: usize) {
284+
pub unsafe extern "aapcs" fn __aeabi_memclr(dst: *mut core::ffi::c_void, n: usize) {
249285
// SAFETY: memclr preconditions apply, less strict alignment.
250286
unsafe { __aeabi_memset(dst, n, 0) };
251287
}
@@ -257,7 +293,7 @@ intrinsics! {
257293
/// Usual `memclr` requirements apply. Additionally, `dest` and `src` must be aligned to
258294
/// four bytes.
259295
#[cfg(not(any(target_vendor = "apple", target_env = "msvc")))]
260-
pub unsafe extern "aapcs" fn __aeabi_memclr4(dst: *mut u8, n: usize) {
296+
pub unsafe extern "aapcs" fn __aeabi_memclr4(dst: *mut core::ffi::c_void, n: usize) {
261297
debug_assert!(dst.addr().is_multiple_of(4));
262298

263299
// SAFETY: memclr preconditions apply, less strict alignment.
@@ -271,7 +307,7 @@ intrinsics! {
271307
/// Usual `memclr` requirements apply. Additionally, `dst` and `src` must be aligned to
272308
/// eight bytes.
273309
#[cfg(not(any(target_vendor = "apple", target_env = "msvc")))]
274-
pub unsafe extern "aapcs" fn __aeabi_memclr8(dst: *mut u8, n: usize) {
310+
pub unsafe extern "aapcs" fn __aeabi_memclr8(dst: *mut core::ffi::c_void, n: usize) {
275311
debug_assert!(dst.addr().is_multiple_of(8));
276312

277313
// SAFETY: memclr preconditions apply, less strict alignment.

library/compiler-builtins/compiler-builtins/src/mem/mod.rs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,57 @@ mod impls;
99

1010
intrinsics! {
1111
#[mem_builtin]
12-
pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
13-
impls::copy_forward(dest, src, n);
12+
pub unsafe extern "C" fn memcpy(
13+
dest: *mut core::ffi::c_void,
14+
src: *const core::ffi::c_void,
15+
n: usize
16+
) -> *mut core::ffi::c_void {
17+
impls::copy_forward(dest.cast(), src.cast(), n);
1418
dest
1519
}
1620

1721
#[mem_builtin]
18-
pub unsafe extern "C" fn memmove(dest: *mut u8, src: *const u8, n: usize) -> *mut u8 {
22+
pub unsafe extern "C" fn memmove(
23+
dest: *mut core::ffi::c_void,
24+
src: *const core::ffi::c_void,
25+
n: usize
26+
) -> *mut core::ffi::c_void {
1927
let delta = (dest as usize).wrapping_sub(src as usize);
2028
if delta >= n {
2129
// We can copy forwards because either dest is far enough ahead of src,
2230
// or src is ahead of dest (and delta overflowed).
23-
impls::copy_forward(dest, src, n);
31+
impls::copy_forward(dest.cast(), src.cast(), n);
2432
} else {
25-
impls::copy_backward(dest, src, n);
33+
impls::copy_backward(dest.cast(), src.cast(), n);
2634
}
2735
dest
2836
}
2937

3038
#[mem_builtin]
31-
pub unsafe extern "C" fn memset(s: *mut u8, c: core::ffi::c_int, n: usize) -> *mut u8 {
32-
impls::set_bytes(s, c as u8, n);
39+
pub unsafe extern "C" fn memset(
40+
s: *mut core::ffi::c_void,
41+
c: core::ffi::c_int,
42+
n: usize
43+
) -> *mut core::ffi::c_void {
44+
impls::set_bytes(s.cast(), c as u8, n);
3345
s
3446
}
3547

3648
#[mem_builtin]
37-
pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> core::ffi::c_int {
38-
impls::compare_bytes(s1, s2, n)
49+
pub unsafe extern "C" fn memcmp(
50+
s1: *const core::ffi::c_void,
51+
s2: *const core::ffi::c_void,
52+
n: usize
53+
) -> core::ffi::c_int {
54+
impls::compare_bytes(s1.cast(), s2.cast(), n)
3955
}
4056

4157
#[mem_builtin]
42-
pub unsafe extern "C" fn bcmp(s1: *const u8, s2: *const u8, n: usize) -> core::ffi::c_int {
58+
pub unsafe extern "C" fn bcmp(
59+
s1: *const core::ffi::c_void,
60+
s2: *const core::ffi::c_void,
61+
n: usize
62+
) -> core::ffi::c_int {
4363
memcmp(s1, s2, n)
4464
}
4565

0 commit comments

Comments
 (0)