Turns out our compilers support different sets of builtins.  So the
diff below does the following:

* Enables bzero, memcmp, memcpy and memset for all compilers.
* Enables bcmp, bcopy and memmove for gcc4.

This diff should be a no-op for kernels compiled without
-ffreestanding.  I've checked a couple of architectures and so far
have not found any evidence that this isn't the case.

As soon as we start adding -ffreestanding to the kernel Makefiles,
things will start to change.  That'll be part2.

ok?


Index: sys/systm.h
===================================================================
RCS file: /cvs/src/sys/sys/systm.h,v
retrieving revision 1.121
diff -u -p -r1.121 systm.h
--- sys/systm.h 29 Dec 2016 12:12:44 -0000      1.121
+++ sys/systm.h 24 Jan 2017 05:28:04 -0000
@@ -322,6 +322,16 @@ extern int (*mountroot)(void);
 
 #include <lib/libkern/libkern.h>
 
+#define bzero(b, n)            __builtin_bzero((b), (n))
+#define memcmp(b1, b2, n)      __builtin_memcmp((b1), (b2), (n))
+#define memcpy(d, s, n)                __builtin_memcpy((d), (s), (n))
+#define memset(b, c, n)                __builtin_memset((b), (c), (n))
+#if !defined(__clang__) && (defined(__GNUC__) && __GNUC__ >= 4)
+#define bcmp(b1, b2, n)                __builtin_bcmp((b1), (b2), (n))
+#define bcopy(s, d, n)         __builtin_bcopy((s), (d), (n))
+#define memmove(d, s, n)       __builtin_memmove((d), (s), (n))
+#endif
+
 #if defined(DDB) || defined(KGDB)
 /* debugger entry points */
 void   Debugger(void); /* in DDB only */
Index: lib/libkern/bcmp.c
===================================================================
RCS file: /cvs/src/sys/lib/libkern/bcmp.c,v
retrieving revision 1.10
diff -u -p -r1.10 bcmp.c
--- lib/libkern/bcmp.c  10 Jun 2014 04:16:57 -0000      1.10
+++ lib/libkern/bcmp.c  24 Jan 2017 05:28:04 -0000
@@ -31,6 +31,8 @@
 
 #include <lib/libkern/libkern.h>
 
+#undef bcmp
+
 /*
  * bcmp -- vax cmpc3 instruction
  */
Index: lib/libkern/bcopy.c
===================================================================
RCS file: /cvs/src/sys/lib/libkern/bcopy.c,v
retrieving revision 1.1
diff -u -p -r1.1 bcopy.c
--- lib/libkern/bcopy.c 13 Jun 2013 04:33:26 -0000      1.1
+++ lib/libkern/bcopy.c 24 Jan 2017 05:28:04 -0000
@@ -35,6 +35,8 @@
 #include <sys/types.h>
 #include <sys/systm.h>
 
+#undef bcopy
+
 /*
  * sizeof(word) MUST BE A POWER OF TWO
  * SO THAT wmask BELOW IS ALL ONES
Index: lib/libkern/bzero.c
===================================================================
RCS file: /cvs/src/sys/lib/libkern/bzero.c,v
retrieving revision 1.9
diff -u -p -r1.9 bzero.c
--- lib/libkern/bzero.c 10 Jun 2014 04:16:57 -0000      1.9
+++ lib/libkern/bzero.c 24 Jan 2017 05:28:04 -0000
@@ -31,6 +31,8 @@
 
 #include <lib/libkern/libkern.h>
 
+#undef bzero
+
 /*
  * bzero -- vax movc5 instruction
  */
Index: lib/libkern/memcmp.c
===================================================================
RCS file: /cvs/src/sys/lib/libkern/memcmp.c,v
retrieving revision 1.6
diff -u -p -r1.6 memcmp.c
--- lib/libkern/memcmp.c        10 Jun 2014 04:16:57 -0000      1.6
+++ lib/libkern/memcmp.c        24 Jan 2017 05:28:04 -0000
@@ -34,6 +34,8 @@
 
 #include <lib/libkern/libkern.h>
 
+#undef memcmp
+
 /*
  * Compare memory regions.
  */
Index: lib/libkern/memcpy.c
===================================================================
RCS file: /cvs/src/sys/lib/libkern/memcpy.c,v
retrieving revision 1.3
diff -u -p -r1.3 memcpy.c
--- lib/libkern/memcpy.c        12 Jun 2013 16:44:22 -0000      1.3
+++ lib/libkern/memcpy.c        24 Jan 2017 05:28:04 -0000
@@ -32,6 +32,8 @@
 #include <sys/types.h>
 #include <sys/systm.h>
 
+#undef memcpy
+
 /*
  * This is designed to be small, not fast.
  */
Index: lib/libkern/memmove.c
===================================================================
RCS file: /cvs/src/sys/lib/libkern/memmove.c,v
retrieving revision 1.1
diff -u -p -r1.1 memmove.c
--- lib/libkern/memmove.c       11 Jun 2013 18:04:41 -0000      1.1
+++ lib/libkern/memmove.c       24 Jan 2017 05:28:04 -0000
@@ -32,6 +32,8 @@
 #include <sys/types.h>
 #include <sys/systm.h>
 
+#undef memmove
+
 /*
  * This is designed to be small, not fast.
  */
Index: lib/libkern/memset.c
===================================================================
RCS file: /cvs/src/sys/lib/libkern/memset.c,v
retrieving revision 1.7
diff -u -p -r1.7 memset.c
--- lib/libkern/memset.c        10 Jun 2014 04:16:57 -0000      1.7
+++ lib/libkern/memset.c        24 Jan 2017 05:28:04 -0000
@@ -39,6 +39,9 @@
 #include <sys/systm.h>
 #include <lib/libkern/libkern.h>
 
+#undef bzero
+#undef memset
+
 #define        wsize   sizeof(u_int)
 #define        wmask   (wsize - 1)
 

Reply via email to