This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new e174d73cd9 clang:libclang_rt.builtins-xxx.a supports builtin
e174d73cd9 is described below

commit e174d73cd9a4f3d1fc9543cd655818fc109b9f69
Author: wangmingrong1 <[email protected]>
AuthorDate: Mon Oct 14 21:09:58 2024 +0800

    clang:libclang_rt.builtins-xxx.a supports builtin
    
    1. enable CONFIG_BUILTIN_COMPILER_RT  to built libclang_rt.builtins-xxx.a 
and no longer use the compiler's built-in
    2. Modify clang version acquisition to get two decimal points
    3. It has been ported to support four architectures: ARM, ARM64, RISCV, and 
x86_64, among which ARM has been validated
    
    Signed-off-by: wangmingrong1 <[email protected]>
---
 Kconfig                                    |   1 +
 arch/arm/src/cmake/clang.cmake             |  33 ++-
 arch/arm/src/common/Toolchain.defs         |  20 +-
 libs/libbuiltin/.gitignore                 |   3 +
 libs/libbuiltin/CMakeLists.txt             |  30 ++
 libs/libbuiltin/Kconfig                    |  36 +++
 libs/libbuiltin/Makefile                   |  83 ++++++
 libs/libbuiltin/bin/Makefile               |  35 +++
 libs/libbuiltin/compiler-rt/.gitignore     |   1 +
 libs/libbuiltin/compiler-rt/CMakeLists.txt | 438 +++++++++++++++++++++++++++++
 libs/libbuiltin/compiler-rt/Make.defs      | 162 +++++++++++
 libs/libbuiltin/kbin/Makefile              |  35 +++
 tools/Directories.mk                       |  12 +
 tools/FlatLibs.mk                          |   6 +
 tools/KernelLibs.mk                        |   7 +
 tools/LibTargets.mk                        |  16 ++
 tools/ProtectedLibs.mk                     |   7 +
 17 files changed, 907 insertions(+), 18 deletions(-)

diff --git a/Kconfig b/Kconfig
index 17aa39e3aa..5938852151 100644
--- a/Kconfig
+++ b/Kconfig
@@ -2774,6 +2774,7 @@ source "libs/libc/Kconfig"
 source "libs/libm/Kconfig"
 source "libs/libxx/Kconfig"
 source "libs/libdsp/Kconfig"
+source "libs/libbuiltin/Kconfig"
 endmenu
 
 menu "Open Asymmetric Multi Processing"
diff --git a/arch/arm/src/cmake/clang.cmake b/arch/arm/src/cmake/clang.cmake
index b0e7f1221f..4065512778 100644
--- a/arch/arm/src/cmake/clang.cmake
+++ b/arch/arm/src/cmake/clang.cmake
@@ -45,8 +45,8 @@ if(TOOLCHAIN_CLANG_CONFIG)
   execute_process(COMMAND clang --version
                   OUTPUT_VARIABLE clang_full_version_string)
 
-  string(REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" CLANGVER
-                       ${clang_full_version_string})
+  string(REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+\.[0-9]+).*" "\\1"
+                       CLANGVER ${clang_full_version_string})
 
   if(CLANGVER STREQUAL "14.0")
     set(TOOLCHAIN_CLANG_CONFIG ${TOOLCHAIN_CLANG_CONFIG}_nosys)
@@ -237,11 +237,24 @@ set(PREPROCESS ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} 
-E -P -x c)
 
 set(NUTTX_FIND_TOOLCHAIN_LIB_DEFINED true)
 
-function(nuttx_find_toolchain_lib)
-  execute_process(
-    COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} ${NUTTX_EXTRA_FLAGS}
-            --print-file-name
-    OUTPUT_STRIP_TRAILING_WHITESPACE
-    OUTPUT_VARIABLE extra_lib_path)
-  nuttx_add_extra_library(${extra_lib_path})
-endfunction()
+if(CONFIG_BUILTIN_TOOLCHAIN)
+  function(nuttx_find_toolchain_lib)
+    execute_process(
+      COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} ${NUTTX_EXTRA_FLAGS}
+              --print-file-name
+      OUTPUT_STRIP_TRAILING_WHITESPACE
+      OUTPUT_VARIABLE extra_lib_path)
+    nuttx_add_extra_library(${extra_lib_path})
+  endfunction()
+else()
+  function(nuttx_find_toolchain_lib)
+    if(ARGN)
+      execute_process(
+        COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_FLAG_ARGS} ${NUTTX_EXTRA_FLAGS}
+                --print-file-name=${ARGN}
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+        OUTPUT_VARIABLE extra_lib_path)
+    endif()
+    nuttx_add_extra_library(${extra_lib_path})
+  endfunction()
+endif()
diff --git a/arch/arm/src/common/Toolchain.defs 
b/arch/arm/src/common/Toolchain.defs
index e5f7fd923c..a5df3d7fab 100644
--- a/arch/arm/src/common/Toolchain.defs
+++ b/arch/arm/src/common/Toolchain.defs
@@ -206,7 +206,7 @@ ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
 
   ifneq ($(TOOLCHAIN_CLANG_CONFIG),)
     ifeq ($(CLANGVER),)
-      export CLANGVER := $(shell $(CC) --version | grep "clang version" | sed 
-E "s/.* ([0-9]+\.[0-9]+).*/\1/")
+      export CLANGVER := $(shell $(CC) --version | grep "clang version" | sed 
-E "s/.* ([0-9]+\.[0-9]+\.[0-9]+).*/\1/")
     endif
 
     ifeq ($(CLANGVER),14.0)
@@ -448,14 +448,18 @@ endif
 
 # Add the builtin library
 
-COMPILER_RT_LIB = $(shell $(CC) $(ARCHCPUFLAGS) --print-libgcc-file-name)
-ifeq ($(CONFIG_ARCH_TOOLCHAIN_CLANG),y)
-  ifeq ($(wildcard $(COMPILER_RT_LIB)),)
-    # if "--print-libgcc-file-name" unable to find the correct libgcc PATH
-    # then go ahead and try "--print-file-name"
-    COMPILER_RT_LIB := $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) 
--print-file-name $(notdir $(COMPILER_RT_LIB))))
+ifeq ($(CONFIG_BUILTIN_TOOLCHAIN),y)
+  COMPILER_RT_LIB = $(shell $(CC) $(ARCHCPUFLAGS) --print-libgcc-file-name)
+  ifeq ($(CONFIG_ARCH_TOOLCHAIN_CLANG),y)
+    ifeq ($(wildcard $(COMPILER_RT_LIB)),)
+      # if "--print-libgcc-file-name" unable to find the correct libgcc PATH
+      # then go ahead and try "--print-file-name"
+      COMPILER_RT_LIB := $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) 
--print-file-name $(notdir $(COMPILER_RT_LIB))))
+    endif
   endif
-else ifeq ($(CONFIG_ARCH_TOOLCHAIN_GHS),y)
+endif
+
+ifeq ($(CONFIG_ARCH_TOOLCHAIN_GHS),y)
   GHS_ROOT_PATH = $(shell which $(CC) | awk -F '/[^/]*$$' '{print $$1}')
   COMPILER_RT_LIB := -l$(GHS_ROOT_PATH)/lib/thumb2/libarch
   ifeq ($(CONFIG_ARCH_FPU),y)
diff --git a/libs/libbuiltin/.gitignore b/libs/libbuiltin/.gitignore
new file mode 100644
index 0000000000..988243ab26
--- /dev/null
+++ b/libs/libbuiltin/.gitignore
@@ -0,0 +1,3 @@
+compiler-rt-*.src.tar.xz
+*.o
+.depend
diff --git a/libs/libbuiltin/CMakeLists.txt b/libs/libbuiltin/CMakeLists.txt
new file mode 100644
index 0000000000..1999192132
--- /dev/null
+++ b/libs/libbuiltin/CMakeLists.txt
@@ -0,0 +1,30 @@
+# 
##############################################################################
+# libs/libbuiltin/CMakeLists.txt
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for
+# additional information regarding copyright ownership.  The ASF licenses this
+# file to you under the Apache License, Version 2.0 (the "License"); you may 
not
+# use this file except in compliance with the License.  You may obtain a copy 
of
+# the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations under
+# the License.
+#
+# 
##############################################################################
+
+# Include the uClibc++ Make.defs file if selected.  If it is included, the
+# uClibc++/Make.defs file will add its files to the source file list, add its
+# DEPPATH info, and will add the appropriate paths to the VPATH variable
+#
+# Note that an error will occur if you select CONFIG_LIBXX_UCLIBCXX without
+# installing the uClibc++ package.  This is intentional to let you know about
+# the configuration problem.  Refer to the README.txt file in the NuttX 
uClibc++
+# GIT repository for more information
+
+nuttx_add_subdirectory()
diff --git a/libs/libbuiltin/Kconfig b/libs/libbuiltin/Kconfig
new file mode 100644
index 0000000000..eab6c96d1f
--- /dev/null
+++ b/libs/libbuiltin/Kconfig
@@ -0,0 +1,36 @@
+#
+# For a description of the syntax of this configuration file,
+# see the file kconfig-language.txt in the NuttX tools repository.
+#
+
+comment "Toolchain Library Support"
+
+choice
+       prompt "Builtin toolchain support"
+       default BUILTIN_TOOLCHAIN
+       ---help---
+               Choose to compile libraries related to toolchain into the OS
+
+config BUILTIN_COMPILER_RT
+       bool "Builtin LLVM Compiler-rt"
+       ---help---
+               Compile the LLVM Compiler-rt library into the OS.
+
+config BUILTIN_TOOLCHAIN
+       bool "Link the toolchain library"
+       ---help---
+               Use the toolchain library that comes with the compiler
+
+endchoice
+
+if BUILTIN_COMPILER_RT
+
+config COMPILER_RT_VERSION
+       string "Select LLVM Compiler-rt version"
+       default "17.0.1"
+
+config COMPILER_RT_HAS_BFLOAT16
+       bool "Enable support for bfloat16 in Compiler-rt"
+       default n
+
+endif # BUILTIN_COMPILER_RT
diff --git a/libs/libbuiltin/Makefile b/libs/libbuiltin/Makefile
new file mode 100644
index 0000000000..7d1ca2f61e
--- /dev/null
+++ b/libs/libbuiltin/Makefile
@@ -0,0 +1,83 @@
+############################################################################
+# libs/libbuiltin/Makefile
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+###########################################################################
+
+include $(TOPDIR)/Make.defs
+
+ifeq ($(CONFIG_BUILTIN_COMPILER_RT),y)
+include compiler-rt/Make.defs
+endif
+
+BIN ?= libbuiltin$(LIBEXT)
+BINDIR ?= bin
+
+KBIN = libkbuiltin$(LIBEXT)
+KBINDIR = kbin
+
+AOBJS = $(addprefix $(BINDIR)$(DELIM), $(ASRCS:.S=$(OBJEXT)))
+COBJS = $(addprefix $(BINDIR)$(DELIM), $(CSRCS:.c=$(OBJEXT)))
+CXXOBJS = $(addprefix $(BINDIR)$(DELIM), $(CXXSRCS:.cxx=$(OBJEXT)))
+CPPOBJS = $(addprefix $(BINDIR)$(DELIM), $(CPPSRCS:.cpp=$(OBJEXT)))
+
+SRCS = $(ASRCS) $(CSRCS) $(CXXSRCS) $(CPPSRCS)
+OBJS = $(AOBJS) $(COBJS) $(CXXOBJS) $(CPPOBJS)
+
+all: $(OBJS)
+       $(call ARCHIVE, $(BIN), $(OBJS))
+
+.PHONY: depend clean distclean context $(LIBBUILTIN)
+
+$(AOBJS): $(BINDIR)$(DELIM)%$(OBJEXT): %.S
+       $(call ASSEMBLE, $<, $@)
+
+$(COBJS): $(BINDIR)$(DELIM)%$(OBJEXT): %.c
+       $(call COMPILE, $<, $@)
+
+$(CXXOBJS): $(BINDIR)$(DELIM)%$(OBJEXT): %.cxx
+       $(call COMPILEXX, $<, $@)
+
+$(CPPOBJS): $(BINDIR)$(DELIM)%$(OBJEXT): %.cpp
+       $(call COMPILEXX, $<, $@)
+
+context::
+
+.depend: $(LIBBUILTIN)
+       $(Q) touch $@
+
+depend: .depend
+
+$(BIN): depend
+       $(Q) $(MAKE) all EXTRAFLAGS="$(EXTRAFLAGS)"
+
+# C library for the kernel phase of the two-pass kernel build
+
+ifneq ($(BIN),$(KBIN))
+$(KBIN): $(OBJS)
+       $(Q) $(MAKE) $(KBIN) BIN=$(KBIN) BINDIR=$(KBINDIR) 
EXTRAFLAGS="$(EXTRAFLAGS)"
+endif
+
+clean:
+       $(call DELFILE, $(BIN))
+       $(Q) $(MAKE) -C bin  clean
+       $(Q) $(MAKE) -C kbin clean
+
+distclean: clean
+       $(Q) $(MAKE) -C bin  distclean
+       $(Q) $(MAKE) -C kbin distclean
+       $(call DELFILE, .depend)
diff --git a/libs/libbuiltin/bin/Makefile b/libs/libbuiltin/bin/Makefile
new file mode 100644
index 0000000000..d60aef150e
--- /dev/null
+++ b/libs/libbuiltin/bin/Makefile
@@ -0,0 +1,35 @@
+############################################################################
+# libs/libbuiltin/bin/Makefile
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+###########################################################################
+
+include $(TOPDIR)/Make.defs
+
+all:
+.PHONY: clean distclean
+
+# Clean Targets:
+
+clean:
+       $(call DELFILE, *.o)
+
+# Deep clean -- removes all traces of the configuration
+
+distclean: clean
+       $(call DELFILE, *.dep)
+       $(call DELFILE, .depend)
diff --git a/libs/libbuiltin/compiler-rt/.gitignore 
b/libs/libbuiltin/compiler-rt/.gitignore
new file mode 100644
index 0000000000..180d5c2ac0
--- /dev/null
+++ b/libs/libbuiltin/compiler-rt/.gitignore
@@ -0,0 +1 @@
+/compiler-rt
diff --git a/libs/libbuiltin/compiler-rt/CMakeLists.txt 
b/libs/libbuiltin/compiler-rt/CMakeLists.txt
new file mode 100644
index 0000000000..d5620669d1
--- /dev/null
+++ b/libs/libbuiltin/compiler-rt/CMakeLists.txt
@@ -0,0 +1,438 @@
+# 
##############################################################################
+# libs/libbuiltin/compiler-rt/CMakeLists.txt
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more 
contributor
+# license agreements.  See the NOTICE file distributed with this work for
+# additional information regarding copyright ownership.  The ASF licenses this
+# file to you under the Apache License, Version 2.0 (the "License"); you may 
not
+# use this file except in compliance with the License.  You may obtain a copy 
of
+# the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations under
+# the License.
+#
+# 
##############################################################################
+
+if(CONFIG_BUILTIN_COMPILER_RT)
+
+  if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/compiler-rt)
+
+    set(COMPILER_RT_VERSION ${CONFIG_COMPILER_RT_VERSION})
+
+    FetchContent_Declare(
+      compiler-rt
+      DOWNLOAD_NAME "compiler-rt-${COMPILER_RT_VERSION}.src.tar.xz"
+      DOWNLOAD_DIR ${CMAKE_CURRENT_LIST_DIR}
+      URL 
"https://github.com/llvm/llvm-project/releases/download/llvmorg-${COMPILER_RT_VERSION}/compiler-rt-${COMPILER_RT_VERSION}.src.tar.xz";
+          SOURCE_DIR
+          ${CMAKE_CURRENT_LIST_DIR}/compiler-rt
+          BINARY_DIR
+          ${CMAKE_BINARY_DIR}/libs/libbuiltin/compiler-rt
+          CONFIGURE_COMMAND
+          ""
+          BUILD_COMMAND
+          ""
+          INSTALL_COMMAND
+          ""
+          TEST_COMMAND
+          ""
+      DOWNLOAD_NO_PROGRESS true
+      TIMEOUT 100)
+
+    FetchContent_GetProperties(compiler-rt)
+
+    if(NOT compiler-rt_POPULATED)
+      FetchContent_Populate(compiler-rt)
+    endif()
+
+  endif()
+
+  nuttx_add_system_library(compiler-rt)
+
+  list(APPEND INCDIR ${CMAKE_CURRENT_LIST_DIR}/compiler-rt/include)
+  list(APPEND INCDIR ${CMAKE_CURRENT_LIST_DIR}/compiler-rt/lib/builtins)
+
+  # Arithmetic operations
+  set(RT_BUILTIN_SRCS
+      absvdi2.c
+      absvsi2.c
+      absvti2.c
+      adddf3.c
+      addtf3.c
+      addvdi3.c
+      addvsi3.c
+      addvti3.c
+      muldc3.c
+      muldf3.c
+      muldi3.c
+      mulodi4.c
+      mulosi4.c
+      muloti4.c
+      mulsc3.c
+      mulsf3.c
+      multc3.c
+      multf3.c
+      multi3.c
+      mulvdi3.c
+      mulvsi3.c
+      mulvti3.c
+      mulxc3.c
+      negdf2.c
+      negdi2.c
+      negsf2.c
+      negti2.c
+      negvdi2.c
+      negvsi2.c
+      negvti2.c
+      subdf3.c
+      subsf3.c
+      subtf3.c
+      subvdi3.c
+      subvsi3.c
+      subvti3.c)
+
+  # Floating point operations
+  list(
+    APPEND
+    RT_BUILTIN_SRCS
+    floatdidf.c
+    floatdisf.c
+    floatditf.c
+    floatdixf.c
+    floatsidf.c
+    floatsisf.c
+    floatsitf.c
+    floattidf.c
+    floattisf.c
+    floattitf.c
+    floattixf.c
+    floatundidf.c
+    floatundisf.c
+    floatunditf.c
+    floatundixf.c
+    floatunsidf.c
+    floatunsisf.c
+    floatunsitf.c
+    floatuntidf.c
+    floatuntisf.c
+    floatuntitf.c
+    floatuntixf.c)
+
+  # Conversion and expansion operations
+  list(
+    APPEND
+    RT_BUILTIN_SRCS
+    fixtfdi.c
+    fixtfsi.c
+    fixtfti.c
+    fixunsdfdi.c
+    fixunsdfsi.c
+    fixunsdfti.c
+    fixunssfdi.c
+    fixunssfsi.c
+    fixunssfti.c
+    fixunstfdi.c
+    fixunstfsi.c
+    fixunstfti.c
+    fixunsxfdi.c
+    fixunsxfsi.c
+    fixunsxfti.c
+    fixxfdi.c
+    fixxfti.c
+    extenddftf2.c
+    extendhfsf2.c
+    extendhftf2.c
+    extendsfdf2.c
+    extendsftf2.c
+    truncdfhf2.c
+    truncdfsf2.c
+    truncsfhf2.c
+    trunctfdf2.c
+    trunctfhf2.c
+    trunctfsf2.c)
+
+  # Bit manipulation operations
+  list(
+    APPEND
+    RT_BUILTIN_SRCS
+    ashldi3.c
+    ashlti3.c
+    ashrdi3.c
+    ashrti3.c
+    clzti2.c
+    ctzdi2.c
+    ctzsi2.c
+    ctzti2.c
+    lshrdi3.c
+    lshrti3.c
+    popcountdi2.c
+    popcountsi2.c
+    popcountti2.c
+    paritydi2.c
+    paritysi2.c
+    parityti2.c)
+
+  # Division and modulo operations
+  list(
+    APPEND
+    RT_BUILTIN_SRCS
+    divdc3.c
+    divdf3.c
+    divdi3.c
+    divmoddi4.c
+    divmodti4.c
+    divsc3.c
+    divsf3.c
+    divtc3.c
+    divtf3.c
+    divti3.c
+    divxc3.c
+    moddi3.c
+    modti3.c
+    udivdi3.c
+    udivmoddi4.c
+    udivmodti4.c
+    udivti3.c
+    umoddi3.c
+    umodti3.c)
+
+  # Atomic operations
+  list(
+    APPEND
+    RT_BUILTIN_SRCS
+    atomic.c
+    atomic_flag_clear.c
+    atomic_flag_clear_explicit.c
+    atomic_flag_test_and_set.c
+    atomic_flag_test_and_set_explicit.c
+    atomic_signal_fence.c
+    atomic_thread_fence.c)
+
+  # Other function related files
+  list(
+    APPEND
+    RT_BUILTIN_SRCS
+    apple_versioning.c
+    clear_cache.c
+    cmpdi2.c
+    cmpti2.c
+    comparedf2.c
+    comparetf2.c
+    cpu_model.c
+    emutls.c
+    enable_execute_stack.c
+    eprintf.c
+    fp_mode.c
+    gcc_personality_v0.c
+    int_util.c
+    os_version_check.c
+    trampoline_setup.c
+    ucmpdi2.c
+    ucmpti2.c
+    powidf2.c
+    powisf2.c
+    powitf2.c
+    powixf2.c)
+
+  set(RT_BUILTIN_ARCH_SRCS)
+  # ARM-specific assembly files
+  if(CONFIG_ARCH_ARM)
+    set(RT_BUILTIN_ARCH arm)
+    list(
+      APPEND
+      RT_BUILTIN_ARCH_SRCS
+      adddf3vfp.S
+      addsf3.S
+      addsf3vfp.S
+      divmodsi4.S
+      divsi3.S
+      modsi3.S
+      subdf3vfp.S
+      subsf3vfp.S
+      muldf3vfp.S
+      mulsf3vfp.S
+      negdf2vfp.S
+      negsf2vfp.S)
+
+    # Floating-Point Operations
+    list(
+      APPEND
+      RT_BUILTIN_ARCH_SRCS
+      comparesf2.S
+      eqdf2vfp.S
+      eqsf2vfp.S
+      extendsfdf2vfp.S
+      fixdfsivfp.S
+      fixsfsivfp.S
+      fixunsdfsivfp.S
+      fixunssfsivfp.S
+      floatsidfvfp.S
+      floatsisfvfp.S
+      floatunssidfvfp.S
+      floatunssisfvfp.S
+      gedf2vfp.S
+      gesf2vfp.S
+      gtdf2vfp.S
+      gtsf2vfp.S
+      ledf2vfp.S
+      lesf2vfp.S
+      ltdf2vfp.S
+      ltsf2vfp.S
+      nedf2vfp.S
+      nesf2vfp.S
+      truncdfsf2vfp.S
+      unorddf2vfp.S
+      unordsf2vfp.S)
+
+    # Synchronization operations
+    list(
+      APPEND
+      RT_BUILTIN_ARCH_SRCS
+      sync_fetch_and_add_4.S
+      sync_fetch_and_add_8.S
+      sync_fetch_and_and_4.S
+      sync_fetch_and_and_8.S
+      sync_fetch_and_max_4.S
+      sync_fetch_and_max_8.S
+      sync_fetch_and_min_4.S
+      sync_fetch_and_min_8.S
+      sync_fetch_and_nand_4.S
+      sync_fetch_and_nand_8.S
+      sync_fetch_and_or_4.S
+      sync_fetch_and_or_8.S
+      sync_fetch_and_sub_4.S
+      sync_fetch_and_sub_8.S
+      sync_fetch_and_umax_4.S
+      sync_fetch_and_umax_8.S
+      sync_fetch_and_umin_4.S
+      sync_fetch_and_umin_8.S
+      sync_fetch_and_xor_4.S
+      sync_fetch_and_xor_8.S
+      sync_synchronize.S)
+
+    # Memory operations
+    list(
+      APPEND
+      RT_BUILTIN_ARCH_SRCS
+      aeabi_memcmp.S
+      aeabi_memcpy.S
+      aeabi_memmove.S
+      aeabi_memset.S
+      restore_vfp_d8_d15_regs.S
+      save_vfp_d8_d15_regs.S)
+
+    # Division and Modulus Operations
+    list(
+      APPEND
+      RT_BUILTIN_ARCH_SRCS
+      aeabi_idivmod.S
+      aeabi_ldivmod.S
+      aeabi_uidivmod.S
+      aeabi_uldivmod.S
+      udivmodsi4.S
+      udivsi3.S
+      umodsi3.S)
+
+    # Bitwise and Other Operations
+    list(
+      APPEND
+      RT_BUILTIN_ARCH_SRCS
+      bswapdi2.S
+      bswapsi2.S
+      chkstk.S
+      clzdi2.S
+      clzsi2.S)
+
+    # Branch and Control Flow
+    list(APPEND RT_BUILTIN_ARCH_SRCS switch16.S switch32.S switch8.S 
switchu8.S)
+
+  else()
+
+    # Other architectures
+    list(
+      APPEND
+      RT_BUILTIN_SRCS
+      addsf3.c
+      divsi3.c
+      modsi3.c
+      bswapdi2.c
+      bswapsi2.c
+      clzdi2.c
+      clzsi2.c
+      divmodsi4.c
+      udivmodsi4.c
+      udivsi3.c
+      umodsi3.c
+      comparesf2.c)
+
+  endif()
+
+  if(CONFIG_ARCH_ARM64)
+    set(ARCH "aarch64")
+    list(APPEND RT_BUILTIN_ARCH_SRCS chkstk.S lse.S fp_mode.c)
+  elseif(CONFIG_ARCH_RISCV)
+    set(ARCH "riscv")
+    list(
+      APPEND
+      RT_BUILTIN_ARCH_SRCS
+      muldi3.S
+      mulsi3.S
+      restore.S
+      save.S
+      fp_mode.c)
+  else()
+    list(APPEND RT_BUILTIN_SRCS muldi3.c)
+  endif()
+
+  if(CONFIG_ARCH_X86_64)
+    set(ARCH "x86_64")
+    list(
+      APPEND
+      RT_BUILTIN_ARCH_SRCS
+      chkstk2.S
+      chkstk.S
+      floatundidf.S
+      floatundisf.S
+      floatundixf.S
+      floatdidf.c
+      floatdisf.c
+      floatdixf.c)
+  else()
+    list(APPEND RT_BUILTIN_SRCS floatundidf.c floatundisf.c floatundixf.c)
+  endif()
+
+  list(APPEND INCDIR
+       ${CMAKE_CURRENT_LIST_DIR}/compiler-rt/lib/builtins/${RT_BUILTIN_ARCH})
+
+  foreach(src ${RT_BUILTIN_SRCS})
+    string(PREPEND src ${CMAKE_CURRENT_LIST_DIR}/compiler-rt/lib/builtins/)
+    list(APPEND COMPILER_RT_SRCS ${src})
+  endforeach()
+
+  foreach(src ${RT_BUILTIN_ARCH_SRCS})
+    string(
+      PREPEND src
+      ${CMAKE_CURRENT_LIST_DIR}/compiler-rt/lib/builtins/${RT_BUILTIN_ARCH}/)
+    list(APPEND COMPILER_RT_SRCS ${src})
+  endforeach()
+
+  # Add the sources to the target
+  target_sources(compiler-rt PRIVATE ${COMPILER_RT_SRCS})
+
+  target_compile_options(
+    compiler-rt
+    PRIVATE -Wno-shift-count-negative
+            -Wno-constant-conversion
+            -Wshift-count-overflow
+            -Wno-undef
+            -Wno-incompatible-pointer-types
+            -Wno-visibility
+            -Wno-macro-redefined)
+
+  target_include_directories(compiler-rt PRIVATE ${INCDIR})
+endif()
diff --git a/libs/libbuiltin/compiler-rt/Make.defs 
b/libs/libbuiltin/compiler-rt/Make.defs
new file mode 100644
index 0000000000..d8d504eb95
--- /dev/null
+++ b/libs/libbuiltin/compiler-rt/Make.defs
@@ -0,0 +1,162 @@
+############################################################################
+# libs/libbuiltin/compiler-rt/Make.defs
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+############################################################################
+
+include $(TOPDIR)/Make.defs
+
+LIBBUILTIN += compiler-rt
+
+COMPILER_RT_VERSION=$(CONFIG_COMPILER_RT_VERSION)
+
+ifeq ($(wildcard compiler-rt/compiler-rt/lib),)
+compiler-rt-$(COMPILER_RT_VERSION).src.tar.xz:
+       $(call 
DOWNLOAD,https://github.com/llvm/llvm-project/releases/download/llvmorg-$(COMPILER_RT_VERSION),$@)
+
+compiler-rt/compiler-rt: compiler-rt-$(COMPILER_RT_VERSION).src.tar.xz
+       $(Q) tar -xf $<
+       $(Q) mv compiler-rt-$(COMPILER_RT_VERSION).src $@
+       $(call DELDIR, $<)
+
+compiler-rt: compiler-rt/compiler-rt
+endif
+
+FLAGS += ${INCDIR_PREFIX}$(CURDIR)/compiler-rt/compiler-rt/include
+FLAGS += ${INCDIR_PREFIX}$(CURDIR)/compiler-rt/compiler-rt/lib/builtins
+FLAGS += -Wno-shift-count-negative -Wno-constant-conversion 
-Wshift-count-overflow
+FLAGS += -Wno-undef -Wno-incompatible-pointer-types -Wno-visibility 
-Wno-macro-redefined
+
+################# Builtin Library #################
+
+# Files related to arithmetic operations
+CSRCS += absvdi2.c absvsi2.c absvti2.c adddf3.c addtf3.c addvdi3.c addvsi3.c 
addvti3.c \
+         muldc3.c muldf3.c mulodi4.c mulosi4.c muloti4.c mulsc3.c mulsf3.c 
multc3.c multf3.c \
+         multi3.c mulvdi3.c mulvsi3.c mulvti3.c mulxc3.c negdf2.c negdi2.c 
negsf2.c negti2.c \
+         negvdi2.c negvsi2.c negvti2.c subdf3.c subsf3.c subtf3.c subvdi3.c 
subvsi3.c subvti3.c
+
+# Floating point processing related files
+CSRCS += floatdidf.c floatdisf.c floatditf.c floatdixf.c floatsidf.c 
floatsisf.c floatsitf.c \
+         floattidf.c floattisf.c floattitf.c floattixf.c floatunditf.c \
+         floatunsidf.c floatunsisf.c floatunsitf.c floatuntidf.c floatuntisf.c 
\
+         floatuntitf.c floatuntixf.c
+
+# Convert and expand related files
+CSRCS += fixtfdi.c fixtfsi.c fixtfti.c fixunsdfdi.c fixunsdfsi.c fixunsdfti.c 
fixunssfdi.c \
+         fixunssfsi.c fixunssfti.c fixunstfdi.c fixunstfsi.c fixunstfti.c 
fixunsxfdi.c fixunsxfsi.c \
+         fixunsxfti.c fixxfdi.c fixxfti.c extenddftf2.c extendhfsf2.c 
extendhftf2.c extendsfdf2.c \
+         extendsftf2.c truncdfhf2.c truncdfsf2.c truncsfhf2.c \
+         trunctfdf2.c trunctfhf2.c trunctfsf2.c
+
+ifeq ($(CONFIG_COMPILER_RT_HAS_BFLOAT16),y)
+  CSRCS += truncdfbf2.c truncsfbf2.c
+endif
+
+# Bit manipulation related files
+CSRCS += ashldi3.c ashlti3.c ashrdi3.c ashrti3.c \
+         clzti2.c ctzdi2.c ctzsi2.c ctzti2.c lshrdi3.c lshrti3.c popcountdi2.c 
popcountsi2.c \
+         popcountti2.c paritydi2.c paritysi2.c parityti2.c
+
+# Files related to division and modulo operations
+CSRCS += divdc3.c divdf3.c divdi3.c divmoddi4.c divmodti4.c divsc3.c divsf3.c \
+         divtc3.c divtf3.c divti3.c divxc3.c moddi3.c modti3.c udivdi3.c 
udivmoddi4.c \
+         udivmodti4.c udivti3.c umoddi3.c umodti3.c
+
+# Files related to atomic operations
+CSRCS += atomic.c atomic_flag_clear.c atomic_flag_clear_explicit.c 
atomic_flag_test_and_set.c \
+         atomic_flag_test_and_set_explicit.c atomic_signal_fence.c 
atomic_thread_fence.c
+
+# Other function related files
+CSRCS += apple_versioning.c clear_cache.c cmpdi2.c cmpti2.c comparedf2.c 
comparetf2.c \
+         cpu_model.c emutls.c enable_execute_stack.c eprintf.c fp_mode.c 
gcc_personality_v0.c \
+         int_util.c os_version_check.c trampoline_setup.c ucmpdi2.c ucmpti2.c 
powidf2.c powisf2.c \
+         powitf2.c powixf2.c
+
+# Bit manipulation related arch
+ifeq ($(CONFIG_ARCH_ARM),y)
+  ARCH = arm
+  # Arithmetic Operations
+  ASRCS += adddf3vfp.S addsf3.S addsf3vfp.S divmodsi4.S divsi3.S modsi3.S 
subdf3vfp.S subsf3vfp.S \
+           muldf3vfp.S mulsf3vfp.S negdf2vfp.S negsf2vfp.S
+
+  # Floating-Point Operations
+  ASRCS += comparesf2.S eqdf2vfp.S eqsf2vfp.S extendsfdf2vfp.S fixdfsivfp.S 
fixsfsivfp.S \
+           fixunsdfsivfp.S fixunssfsivfp.S floatsidfvfp.S floatsisfvfp.S 
floatunssidfvfp.S \
+           floatunssisfvfp.S gedf2vfp.S gesf2vfp.S gtdf2vfp.S gtsf2vfp.S 
ledf2vfp.S lesf2vfp.S \
+           ltdf2vfp.S ltsf2vfp.S nedf2vfp.S nesf2vfp.S truncdfsf2vfp.S 
unorddf2vfp.S unordsf2vfp.S
+
+  # Synchronization Operations
+  ASRCS += sync_fetch_and_add_4.S sync_fetch_and_add_8.S 
sync_fetch_and_and_4.S sync_fetch_and_and_8.S \
+         sync_fetch_and_max_4.S sync_fetch_and_max_8.S sync_fetch_and_min_4.S 
sync_fetch_and_min_8.S \
+         sync_fetch_and_nand_4.S sync_fetch_and_nand_8.S sync_fetch_and_or_4.S 
sync_fetch_and_or_8.S \
+         sync_fetch_and_sub_4.S sync_fetch_and_sub_8.S sync_fetch_and_umax_4.S 
sync_fetch_and_umax_8.S \
+         sync_fetch_and_umin_4.S sync_fetch_and_umin_8.S 
sync_fetch_and_xor_4.S sync_fetch_and_xor_8.S \
+         sync_synchronize.S
+  # Memory Operations
+  ASRCS += aeabi_memcmp.S aeabi_memcpy.S aeabi_memmove.S aeabi_memset.S 
restore_vfp_d8_d15_regs.S \
+         save_vfp_d8_d15_regs.S
+
+  # Division and Modulus Operations
+  ASRCS += aeabi_idivmod.S aeabi_ldivmod.S aeabi_uidivmod.S aeabi_uldivmod.S 
udivmodsi4.S udivsi3.S umodsi3.S
+
+  # Bitwise and Other Operations
+  ASRCS += bswapdi2.S bswapsi2.S chkstk.S clzdi2.S clzsi2.S
+
+  # Branch and Control Flow
+  ASRCS += switch16.S switch32.S switch8.S switchu8.S
+
+  CSRCS += aeabi_cdcmpeq_check_nan.c aeabi_cfcmpeq_check_nan.c aeabi_div0.c 
aeabi_drsub.c aeabi_frsub.c
+else
+  CSRCS += addsf3.c divsi3.c modsi3.c
+  CSRCS += bswapdi2.c bswapsi2.c clzdi2.c clzsi2.c
+  CSRCS += divmodsi4.c udivmodsi4.c udivsi3.c umodsi3.c
+  CSRCS += comparesf2.c
+endif
+
+ifeq ($(CONFIG_ARCH_ARM64),y)
+  ARCH = aarch64
+  ASRCS += chkstk.S lse.S
+  CSRCS += fp_mode.c
+endif
+
+ifeq ($(CONFIG_ARCH_RISCV),y)
+  ARCH = riscv
+  ASRCS += muldi3.S mulsi3.S restore.S save.S
+  CSRCS += fp_mode.c
+else
+  CSRCS += muldi3.c
+endif
+
+ifeq ($(CONFIG_ARCH_X86_64),y)
+  ARCH = x86_64
+  ASRCS += chkstk2.S chkstk.S floatundidf.S floatundisf.S floatundixf.S
+  CSRCS += floatdidf.c floatdisf.c floatdixf.c
+else
+  CSRCS += floatundidf.c floatundisf.c floatundixf.c
+endif
+
+FLAGS += ${INCDIR_PREFIX}$(CURDIR)/compiler-rt/compiler-rt/lib/builtins/${ARCH}
+
+AFLAGS += $(FLAGS)
+CFLAGS += $(FLAGS)
+CXXFLAGS += $(FLAGS)
+
+DEPPATH += --dep-path compiler-rt/compiler-rt/lib/builtins/${ARCH}
+VPATH += :compiler-rt/compiler-rt/lib/builtins/${ARCH}
+
+DEPPATH += --dep-path compiler-rt/compiler-rt/lib/builtins
+VPATH += :compiler-rt/compiler-rt/lib/builtins
diff --git a/libs/libbuiltin/kbin/Makefile b/libs/libbuiltin/kbin/Makefile
new file mode 100644
index 0000000000..2703454c79
--- /dev/null
+++ b/libs/libbuiltin/kbin/Makefile
@@ -0,0 +1,35 @@
+############################################################################
+# libs/libbuiltin/kbin/Makefile
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+###########################################################################
+
+include $(TOPDIR)/Make.defs
+
+all:
+.PHONY: clean distclean
+
+# Clean Targets:
+
+clean:
+       $(call DELFILE, *.o)
+
+# Deep clean -- removes all traces of the configuration
+
+distclean: clean
+       $(call DELFILE, *.dep)
+       $(call DELFILE, .depend)
diff --git a/tools/Directories.mk b/tools/Directories.mk
index 0b587f8e8c..672c4a48eb 100644
--- a/tools/Directories.mk
+++ b/tools/Directories.mk
@@ -68,6 +68,12 @@ ifeq ($(CONFIG_BUILD_FLAT),y)
 
 KERNDEPDIRS += libs$(DELIM)libc mm
 
+ifeq ($(CONFIG_BUILTIN_TOOLCHAIN),)
+KERNDEPDIRS += libs$(DELIM)libbuiltin
+else
+CLEANDIRS += libs$(DELIM)libbuiltin
+endif
+
 ifeq ($(CONFIG_LIBM_TOOLCHAIN)$(CONFIG_LIBM_NONE),)
 KERNDEPDIRS += libs$(DELIM)libm
 else
@@ -84,6 +90,12 @@ else
 
 USERDEPDIRS += libs$(DELIM)libc mm
 
+ifeq ($(CONFIG_BUILTIN_TOOLCHAIN),)
+USERDEPDIRS += libs$(DELIM)libbuiltin
+else
+CLEANDIRS += libs$(DELIM)libbuiltin
+endif
+
 ifeq ($(CONFIG_LIBM_TOOLCHAIN)$(CONFIG_LIBM_NONE),)
 USERDEPDIRS += libs$(DELIM)libm
 else
diff --git a/tools/FlatLibs.mk b/tools/FlatLibs.mk
index 514017f893..0f0851ba7b 100644
--- a/tools/FlatLibs.mk
+++ b/tools/FlatLibs.mk
@@ -50,6 +50,12 @@ NUTTXLIBS += staging$(DELIM)libc$(LIBEXT)
 NUTTXLIBS += staging$(DELIM)libmm$(LIBEXT)
 NUTTXLIBS += staging$(DELIM)libarch$(LIBEXT)
 
+# Add toolchain library support
+
+ifeq ($(CONFIG_BUILTIN_TOOLCHAIN),)
+NUTTXLIBS += staging$(DELIM)libbuiltin$(LIBEXT)
+endif
+
 # Add libraries for math support.
 
 ifeq ($(CONFIG_LIBM_TOOLCHAIN)$(CONFIG_LIBM_NONE),)
diff --git a/tools/KernelLibs.mk b/tools/KernelLibs.mk
index 59e49463ef..bc47a1f556 100644
--- a/tools/KernelLibs.mk
+++ b/tools/KernelLibs.mk
@@ -52,6 +52,13 @@ NUTTXLIBS += staging$(DELIM)libkmm$(LIBEXT) 
staging$(DELIM)libkarch$(LIBEXT)
 USERLIBS  += staging$(DELIM)libproxies$(LIBEXT) staging$(DELIM)libc$(LIBEXT)
 USERLIBS  += staging$(DELIM)libmm$(LIBEXT) staging$(DELIM)libarch$(LIBEXT)
 
+# Add toolchain library support
+
+ifeq ($(CONFIG_BUILTIN_TOOLCHAIN),)
+NUTTXLIBS += staging$(DELIM)libkbuiltin$(LIBEXT)
+USERLIBS += staging$(DELIM)libbuiltin$(LIBEXT)
+endif
+
 # Add libraries for math support.
 
 ifeq ($(CONFIG_LIBM_TOOLCHAIN)$(CONFIG_LIBM_NONE),)
diff --git a/tools/LibTargets.mk b/tools/LibTargets.mk
index 94d8a49657..5cfc2e9793 100644
--- a/tools/LibTargets.mk
+++ b/tools/LibTargets.mk
@@ -25,6 +25,12 @@
 #
 # Possible kernel-mode builds
 
+libs$(DELIM)libbuiltin$(DELIM)libkbuiltin$(LIBEXT): pass2dep
+       $(Q) $(MAKE) -C libs$(DELIM)libbuiltin libkbuiltin$(LIBEXT) BINDIR=kbin 
EXTRAFLAGS="$(KDEFINE) $(EXTRAFLAGS)"
+
+staging$(DELIM)libkbuiltin$(LIBEXT): 
libs$(DELIM)libbuiltin$(DELIM)libkbuiltin$(LIBEXT)
+       $(Q) $(call INSTALL_LIB,$<,$@)
+
 libs$(DELIM)libc$(DELIM)libkc$(LIBEXT): pass2dep
        $(Q) $(MAKE) -C libs$(DELIM)libc libkc$(LIBEXT) BINDIR=kbin 
EXTRAFLAGS="$(KDEFINE) $(EXTRAFLAGS)"
 
@@ -170,6 +176,16 @@ endif
 staging$(DELIM)libarch$(LIBEXT): $(ARCH_SRC)$(DELIM)libarch$(LIBEXT)
        $(Q) $(call INSTALL_LIB,$<,$@)
 
+ifeq ($(CONFIG_BUILD_FLAT),y)
+libs$(DELIM)libbuiltin$(DELIM)libbuiltin$(LIBEXT): pass2dep
+else
+libs$(DELIM)libbuiltin$(DELIM)libbuiltin$(LIBEXT): pass1dep
+endif
+       $(Q) $(MAKE) -C libs$(DELIM)libbuiltin libbuiltin$(LIBEXT) 
EXTRAFLAGS="$(EXTRAFLAGS)"
+
+staging$(DELIM)libbuiltin$(LIBEXT): 
libs$(DELIM)libbuiltin$(DELIM)libbuiltin$(LIBEXT)
+       $(Q) $(call INSTALL_LIB,$<,$@)
+
 # Possible user-mode builds
 
 ifeq ($(CONFIG_BUILD_FLAT),y)
diff --git a/tools/ProtectedLibs.mk b/tools/ProtectedLibs.mk
index 8fd531d14f..df57611873 100644
--- a/tools/ProtectedLibs.mk
+++ b/tools/ProtectedLibs.mk
@@ -52,6 +52,13 @@ NUTTXLIBS += staging$(DELIM)libkmm$(LIBEXT) 
staging$(DELIM)libkarch$(LIBEXT)
 USERLIBS  += staging$(DELIM)libproxies$(LIBEXT) staging$(DELIM)libc$(LIBEXT)
 USERLIBS  += staging$(DELIM)libmm$(LIBEXT) staging$(DELIM)libarch$(LIBEXT)
 
+# Add toolchain library support
+
+ifeq ($(CONFIG_BUILTIN_TOOLCHAIN),)
+NUTTXLIBS += staging$(DELIM)libkbuiltin$(LIBEXT)
+USERLIBS += staging$(DELIM)libbuiltin$(LIBEXT)
+endif
+
 # Add libraries for math support.
 
 ifeq ($(CONFIG_LIBM_TOOLCHAIN)$(CONFIG_LIBM_NONE),)


Reply via email to