We already do this on some architectures, but not on amd64 for
example. The main reason is that this disables memcpy() optimizations
that have a measurable impact on the network stack performance.
We can get those optimizations back by doing:
#define memcpy(d, s, n) __builtin_memcpy((d), (s), (n))
I verified that gcc still does proper bounds checking on
__builtin_memcpy(), so we don't lose that.
The nice thing about this solution is that we can choose explicitly
which optimizations we want. And as you can see the kernel makefile
gets simpler ;).
Of course the real reason why I'm looking into this is that clang
makes it really hard to build kernels without -ffreestanding.
The diff below implements this strategy, and enabled the optimizations
for memcpy() and memset(). We can add others if we think there is a
benefit. I've tested the diff on amd64. We may need to put an #undef
memcpy somewhere for platforms that use the generic C code for memcpy.
Thoughts?
Index: sys/systm.h
===================================================================
RCS file: /cvs/src/sys/sys/systm.h,v
retrieving revision 1.120
diff -u -p -r1.120 systm.h
--- sys/systm.h 19 Dec 2016 08:36:50 -0000 1.120
+++ sys/systm.h 23 Dec 2016 22:53:15 -0000
@@ -330,6 +330,9 @@ extern int (*mountroot)(void);
#include <lib/libkern/libkern.h>
+#define memcpy(d, s, n) __builtin_memcpy((d), (s), (n))
+#define memset(b, c, n) __builtin_memset((b), (c), (n))
+
#if defined(DDB) || defined(KGDB)
/* debugger entry points */
void Debugger(void); /* in DDB only */
Index: arch/amd64/conf/Makefile.amd64
===================================================================
RCS file: /cvs/src/sys/arch/amd64/conf/Makefile.amd64,v
retrieving revision 1.74
diff -u -p -r1.74 Makefile.amd64
--- arch/amd64/conf/Makefile.amd64 29 Nov 2016 09:08:34 -0000 1.74
+++ arch/amd64/conf/Makefile.amd64 23 Dec 2016 22:53:15 -0000
@@ -29,9 +29,7 @@ CWARNFLAGS= -Werror -Wall -Wimplicit-fun
CMACHFLAGS= -mcmodel=kernel -mno-red-zone -mno-sse2 -mno-sse -mno-3dnow \
-mno-mmx -msoft-float -fno-omit-frame-pointer
-CMACHFLAGS+= -fno-builtin-printf -fno-builtin-snprintf \
- -fno-builtin-vsnprintf -fno-builtin-log \
- -fno-builtin-log2 -fno-builtin-malloc ${NOPIE_FLAGS}
+CMACHFLAGS+= -ffreestanding ${NOPIE_FLAGS}
.if ${IDENT:M-DNO_PROPOLICE}
CMACHFLAGS+= -fno-stack-protector
.endif