aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakayuki Matsuoka <t-mat@users.noreply.github.com>2022-08-07 19:39:50 +0900
committerTakayuki Matsuoka <t-mat@users.noreply.github.com>2022-08-07 19:39:50 +0900
commitcdf515c90ff32f681be3ee97e5889f8cdd9ed143 (patch)
tree8b06f70b56a3496015f7fa1ab455adabc60501f9
parent70e76e50b1f011685d95622049e63cf2bd47e5f8 (diff)
downloadlz4-cdf515c90ff32f681be3ee97e5889f8cdd9ed143.tar.gz
Fix: Add extern "C" to all standard C replacement functions
-rw-r--r--tests/freestanding.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/tests/freestanding.c b/tests/freestanding.c
index 00cd6957..6bf2e6d1 100644
--- a/tests/freestanding.c
+++ b/tests/freestanding.c
@@ -26,12 +26,19 @@
#include <stddef.h>
#include <stdint.h>
+#if defined(__cplusplus)
+# define EXTERN_C extern "C"
+#else
+# define EXTERN_C
+#endif
+
+
static void MY_exit(int exitCode);
static void MY_abort(void);
-void *memmove(void *dst, const void *src, size_t n);
-void *memcpy(void * __restrict__ dst, const void * __restrict__ src, size_t n);
-void *memset(void *s, int c, size_t n);
-int memcmp(const void *s1, const void *s2, size_t n);
+EXTERN_C void *memmove(void *dst, const void *src, size_t n);
+EXTERN_C void *memcpy(void * __restrict__ dst, const void * __restrict__ src, size_t n);
+EXTERN_C void *memset(void *s, int c, size_t n);
+EXTERN_C int memcmp(const void *s1, const void *s2, size_t n);
// LZ4/HC basic freestanding setup
#define LZ4_FREESTANDING 1
@@ -42,7 +49,6 @@ int memcmp(const void *s1, const void *s2, size_t n);
#include "../lib/lz4.c"
#include "../lib/lz4hc.c"
-
// Test for LZ4
static void test_lz4(const uint8_t* srcData, int srcSize) {
// Compress
@@ -172,7 +178,7 @@ void __assert_fail(const char * assertion, const char * file, unsigned int line,
// GCC requires memcpy, memmove, memset and memcmp.
// https://gcc.gnu.org/onlinedocs/gcc/Standards.html
// > GCC requires the freestanding environment provide memcpy, memmove, memset and memcmp.
-void *memmove(void *dst, const void *src, size_t n) {
+EXTERN_C void *memmove(void *dst, const void *src, size_t n) {
uint8_t* d = (uint8_t*) dst;
const uint8_t* s = (const uint8_t*) src;
@@ -190,11 +196,11 @@ void *memmove(void *dst, const void *src, size_t n) {
return dst;
}
-void *memcpy(void * __restrict__ dst, const void * __restrict__ src, size_t n) {
+EXTERN_C void *memcpy(void * __restrict__ dst, const void * __restrict__ src, size_t n) {
return memmove(dst, src, n);
}
-void *memset(void *s, int c, size_t n) {
+EXTERN_C void *memset(void *s, int c, size_t n) {
uint8_t* p = (uint8_t*) s;
while (n--) {
*p++ = (uint8_t) c;
@@ -202,7 +208,7 @@ void *memset(void *s, int c, size_t n) {
return s;
}
-int memcmp(const void *s1, const void *s2, size_t n) {
+EXTERN_C int memcmp(const void *s1, const void *s2, size_t n) {
const uint8_t* p1 = (const uint8_t*) s1;
const uint8_t* p2 = (const uint8_t*) s2;
while (n--) {
@@ -219,10 +225,7 @@ int memcmp(const void *s1, const void *s2, size_t n) {
//
-#if defined(__cplusplus)
-extern "C"
-#endif
-void _start(void) {
+EXTERN_C void _start(void) {
test();
MY_exit(0);
}