Skip to content

Commit e362aaa

Browse files
committed
De-inlining some memory functions for freestanding gcc.
1 parent de098e3 commit e362aaa

File tree

4 files changed

+65
-58
lines changed

4 files changed

+65
-58
lines changed

libc/LIB.status

+4-4
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ lseek - ok
123123
String:
124124
------
125125

126-
memcpy - ok, inlined
127-
memmove - ok, inlined
128-
memset - ok, inlined
129-
memcmp - ok, inlined
126+
memcpy - ok
127+
memmove - ok
128+
memset - ok
129+
memcmp - ok
130130
memchr - ok, inlined
131131

132132
strcpy - ok, inlined

libc/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ TARGET_SRCS = \
1616
src/cxx-glue.c \
1717
src/unistd.c \
1818
src/stdio.c \
19+
src/string.c \
1920
src/errno.c \
2021
\
2122
src/qsort.c \

libc/include/string.h

+4-54
Original file line numberDiff line numberDiff line change
@@ -4,60 +4,10 @@
44
#include <stddef.h>
55
#include <malloc.h>
66

7-
static __inline__ void * memcpy(void * _s1, const void * _s2, size_t n) {
8-
uint8_t * s1 = (uint8_t *) _s1;
9-
const uint8_t * s2 = (uint8_t *) _s2;
10-
size_t i;
11-
12-
for (i = 0; i < n; i++)
13-
*s1++ = *s2++;
14-
15-
return _s1;
16-
}
17-
18-
static __inline__ void * memmove(void * _s1, const void * _s2, size_t n) {
19-
uint8_t * s1 = (uint8_t *) _s1;
20-
const uint8_t * s2 = (uint8_t *) _s2;
21-
size_t i;
22-
23-
if (s1 < s2) {
24-
for (i = 0; i < n; i++)
25-
*s1++ = *s2++;
26-
} else if (s1 > s2) {
27-
s1 += n;
28-
s2 += n;
29-
for (i = 0; i < n; i++)
30-
*--s1 = *--s2;
31-
}
32-
33-
return _s1;
34-
}
35-
36-
static __inline__ int memcmp(const void * _s1, const void * _s2, size_t n) {
37-
uint8_t * s1 = (uint8_t *) _s1;
38-
const uint8_t * s2 = (uint8_t *) _s2;
39-
size_t i;
40-
41-
for (i = 0; i < n; i++, s1++, s2++) {
42-
if (*s1 < *s2) {
43-
return -1;
44-
} else if (*s1 > *s2) {
45-
return 1;
46-
}
47-
}
48-
49-
return 0;
50-
}
51-
52-
static __inline__ void * memset(void * _s, int c, size_t n) {
53-
uint8_t * s = (uint8_t *) _s;
54-
size_t i;
55-
56-
for (i = 0; i < n; i++)
57-
*s++ = (uint8_t) c;
58-
59-
return _s;
60-
}
7+
void * memcpy(void * _s1, const void * _s2, size_t n);
8+
void * memmove(void * _s1, const void * _s2, size_t n);
9+
int memcmp(const void * _s1, const void * _s2, size_t n);
10+
void * memset(void * _s, int c, size_t n);
6111

6212
static __inline__ const void * memchr(const void * _s, int c, size_t n) {
6313
const uint8_t * s = (uint8_t *) _s;

libc/src/string.c

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include <string.h>
2+
3+
void * memcpy(void * _s1, const void * _s2, size_t n) {
4+
uint8_t * s1 = (uint8_t *) _s1;
5+
const uint8_t * s2 = (uint8_t *) _s2;
6+
size_t i;
7+
8+
for (i = 0; i < n; i++)
9+
*s1++ = *s2++;
10+
11+
return _s1;
12+
}
13+
14+
void * memmove(void * _s1, const void * _s2, size_t n) {
15+
uint8_t * s1 = (uint8_t *) _s1;
16+
const uint8_t * s2 = (uint8_t *) _s2;
17+
size_t i;
18+
19+
if (s1 < s2) {
20+
for (i = 0; i < n; i++)
21+
*s1++ = *s2++;
22+
} else if (s1 > s2) {
23+
s1 += n;
24+
s2 += n;
25+
for (i = 0; i < n; i++)
26+
*--s1 = *--s2;
27+
}
28+
29+
return _s1;
30+
}
31+
32+
int memcmp(const void * _s1, const void * _s2, size_t n) {
33+
uint8_t * s1 = (uint8_t *) _s1;
34+
const uint8_t * s2 = (uint8_t *) _s2;
35+
size_t i;
36+
37+
for (i = 0; i < n; i++, s1++, s2++) {
38+
if (*s1 < *s2) {
39+
return -1;
40+
} else if (*s1 > *s2) {
41+
return 1;
42+
}
43+
}
44+
45+
return 0;
46+
}
47+
48+
void * memset(void * _s, int c, size_t n) {
49+
uint8_t * s = (uint8_t *) _s;
50+
size_t i;
51+
52+
for (i = 0; i < n; i++)
53+
*s++ = (uint8_t) c;
54+
55+
return _s;
56+
}

0 commit comments

Comments
 (0)