sel4runtime: add CONFIG_SEL4RUNTIME_USE_BUILTINS to reduce code size

Bundled implementations of memcpy and memset yield larger code size
vs. using compiler builtins. Add a config flag to use the latter to
reduce memory footprint.

Bug: 264267056
Change-Id: I4710c62767844a4035511e678067224d74ea3dca
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1964501..1975581 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,6 +33,13 @@
     16384
     UNQUOTE
 )
+config_option(
+    Sel4RuntimeUseBuiltins
+    SEL4RUNTIME_USE_BUILTINS
+    "Use compilter __builtin_* functions when possible to reduce code size"
+    DEFAULT
+    ON
+)
 add_config_library(sel4runtime "${configure_string}")
 
 list(APPEND crt_files crt/sel4_arch/${KernelSel4Arch}/crti.S crt/sel4_arch/${KernelSel4Arch}/crtn.S)
diff --git a/src/memcpy.c b/src/memcpy.c
index 672eaa1..757ab2a 100644
--- a/src/memcpy.c
+++ b/src/memcpy.c
@@ -22,10 +22,14 @@
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include <sel4runtime/gen_config.h>
 #include "util.h"
 
 void *__sel4runtime_memcpy(void *restrict dest, const void *restrict src, sel4runtime_size_t n)
 {
+#if CONFIG_SEL4RUNTIME_USE_BUILTINS
+    return __builtin_memcpy(dest, src, n);
+#else
     unsigned char *d = dest;
     const unsigned char *s = src;
 
@@ -172,4 +176,5 @@
         *d++ = *s++;
     }
     return dest;
+#endif  // CONFIG_SEL4RUNTIME_USE_BUILTINS
 }
diff --git a/src/memset.c b/src/memset.c
index 94ecdc0..66e42f3 100644
--- a/src/memset.c
+++ b/src/memset.c
@@ -22,10 +22,14 @@
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include <sel4runtime/gen_config.h>
 #include "util.h"
 
 void *__sel4runtime_memset(void *dest, int c, sel4runtime_size_t n)
 {
+#if CONFIG_SEL4RUNTIME_USE_BUILTINS
+    return __builtin_memset(dest, c, n);
+#else
     unsigned char *s = dest;
     sel4runtime_size_t k;
 
@@ -120,4 +124,5 @@
 #endif
 
     return dest;
+#endif  // CONFIG_SEL4RUNTIME_USE_BUILTINS
 }