You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/09/16 06:47:37 UTC
[incubator-nuttx] 03/03: arch/arm: add support for armclang compiler(AC6)
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/incubator-nuttx.git
commit 7dbaa4f4c4c8fee064df9308d7239f199f05d94f
Author: chao an <an...@xiaomi.com>
AuthorDate: Thu Sep 15 22:16:36 2022 +0800
arch/arm: add support for armclang compiler(AC6)
Reference:
https://developer.arm.com/Tools%20and%20Software/Arm%20Compiler%20for%20Embedded
Signed-off-by: chao an <an...@xiaomi.com>
Signed-off-by: sheyunhu <sh...@xiaomi.com>
---
arch/arm/Kconfig | 4 ++++
arch/arm/src/Makefile | 38 +++++++++++++++++------------
arch/arm/src/armv6-m/Toolchain.defs | 2 ++
arch/arm/src/armv7-a/Toolchain.defs | 22 +++++++++++++++++
arch/arm/src/armv7-m/Toolchain.defs | 22 +++++++++++++++++
arch/arm/src/armv7-r/Toolchain.defs | 20 ++++++++++++++++
arch/arm/src/armv8-m/Toolchain.defs | 32 +++++++++++++++++++++++++
arch/arm/src/common/Toolchain.defs | 48 +++++++++++++++++++++++++++++++++----
8 files changed, 168 insertions(+), 20 deletions(-)
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index c54e25f61b..19721ae34a 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -42,6 +42,10 @@ config ARM_TOOLCHAIN_CLANG
bool "Generic Clang toolchain"
select ARCH_TOOLCHAIN_CLANG
+config ARM_TOOLCHAIN_ARMCLANG
+ bool "ARM Compiler Clang toolchain"
+ select ARCH_TOOLCHAIN_CLANG
+
endchoice
choice
diff --git a/arch/arm/src/Makefile b/arch/arm/src/Makefile
index b84db3f744..a3e401c85a 100644
--- a/arch/arm/src/Makefile
+++ b/arch/arm/src/Makefile
@@ -85,37 +85,45 @@ UOBJS = $(UAOBJS) $(UCOBJS)
KBIN = libkarch$(LIBEXT)
BIN = libarch$(LIBEXT)
-LDFLAGS += $(addprefix -T,$(call CONVERT_PATH,$(ARCHSCRIPT))) $(EXTRALINKCMDS)
-
# Override in Make.defs if linker is not 'ld'
-ifeq ($(LD),$(CC))
- LDSTARTGROUP ?= -Wl,--start-group
- LDENDGROUP ?= -Wl,--end-group
- LDFLAGS := $(addprefix -Xlinker ,$(LDFLAGS))
- LDFLAGS += $(CFLAGS)
+ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),)
+ ifeq ($(LD),$(CC))
+ LDSTARTGROUP ?= -Wl,--start-group
+ LDENDGROUP ?= -Wl,--end-group
+ LDFLAGS := $(addprefix -Xlinker ,$(LDFLAGS))
+ LDFLAGS += $(CFLAGS)
+ else
+ LDSTARTGROUP ?= --start-group
+ LDENDGROUP ?= --end-group
+ endif
+
+ LIBPATH_OPT = -L
+ SCRIPT_OPT = -T
else
- LDSTARTGROUP ?= --start-group
- LDENDGROUP ?= --end-group
+ LIBPATH_OPT = --userlibpath
+ EXTRA_LIBS += arm_vectors.o
+ SCRIPT_OPT = --scatter=
endif
-BOARDMAKE = $(if $(wildcard board$(DELIM)Makefile),y,)
+LDFLAGS += $(addprefix $(SCRIPT_OPT),$(call CONVERT_PATH,$(ARCHSCRIPT))) $(EXTRALINKCMDS)
+LIBPATHS += $(LIBPATH_OPT) $(call CONVERT_PATH,$(TOPDIR)$(DELIM)staging)
-LIBPATHS += -L $(call CONVERT_PATH,$(TOPDIR)$(DELIM)staging)
+BOARDMAKE = $(if $(wildcard board$(DELIM)Makefile),y,)
ifeq ($(BOARDMAKE),y)
- LIBPATHS += -L $(call CONVERT_PATH,$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board)
+ LIBPATHS += $(LIBPATH_OPT) $(call CONVERT_PATH,$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board)
endif
-LDLIBS = $(patsubst %.a,%,$(patsubst lib%,-l%,$(LINKLIBS)))
+LDLIBS = $(patsubst %.a,%,$(patsubst lib%,--library=%,$(LINKLIBS)))
ifeq ($(BOARDMAKE),y)
- LDLIBS += -lboard
+ LDLIBS += --library=board
endif
VPATH += chip
VPATH += common
VPATH += $(ARCH_SUBDIR)
-ifeq ($(CONFIG_ARCH_TOOLCHAIN_IAR),y)
+ifeq ($(CONFIG_ARM_TOOLCHAIN_IAR),y)
VPATH += common$(DELIM)iar
else # ifeq ($(CONFIG_ARCH_TOOLCHAIN_GNU),y)
VPATH += common$(DELIM)gnu
diff --git a/arch/arm/src/armv6-m/Toolchain.defs b/arch/arm/src/armv6-m/Toolchain.defs
index e3bcd7daef..c18787a736 100644
--- a/arch/arm/src/armv6-m/Toolchain.defs
+++ b/arch/arm/src/armv6-m/Toolchain.defs
@@ -27,6 +27,8 @@ TOOLCHAIN_MFLOAT := -mfloat-abi=soft
ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
TOOLCHAIN_MARCH := --config armv6m_soft_nofp_nosys
+else ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),y)
+ LDFLAGS += --cpu=Cortex-M0
endif
include $(TOPDIR)/arch/arm/src/common/Toolchain.defs
diff --git a/arch/arm/src/armv7-a/Toolchain.defs b/arch/arm/src/armv7-a/Toolchain.defs
index 1d44918a10..0968fa1727 100644
--- a/arch/arm/src/armv7-a/Toolchain.defs
+++ b/arch/arm/src/armv7-a/Toolchain.defs
@@ -61,4 +61,26 @@ else
ARCHCPUFLAGS += -mfloat-abi=soft
endif
+ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),y)
+
+ ifeq ($(CONFIG_ARCH_CORTEXA5),y)
+ LDCPUFLAGS = Cortex-A5
+ else ifeq ($(CONFIG_ARCH_CORTEXA7),y)
+ LDCPUFLAGS = Cortex-A7
+ else ifeq ($(CONFIG_ARCH_CORTEXA8),y)
+ LDCPUFLAGS = Cortex-A8
+ else ifeq ($(CONFIG_ARCH_CORTEXA9),y)
+ LDCPUFLAGS = Cortex-A9
+ endif
+
+ ifeq ($(CONFIG_ARCH_FPU),)
+ LDFLAGS += --cpu=$(LDCPUFLAGS).no_neon.no_vfp
+ else ifeq ($(CONFIG_ARM_NEON),)
+ LDFLAGS += --cpu=$(LDCPUFLAGS).no_neon
+ else
+ LDFLAGS += --cpu=$(LDCPUFLAGS)
+ endif
+
+endif
+
include $(TOPDIR)/arch/arm/src/common/Toolchain.defs
diff --git a/arch/arm/src/armv7-m/Toolchain.defs b/arch/arm/src/armv7-m/Toolchain.defs
index 07f939ec38..07c942c38b 100644
--- a/arch/arm/src/armv7-m/Toolchain.defs
+++ b/arch/arm/src/armv7-m/Toolchain.defs
@@ -75,6 +75,28 @@ ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
TOOLCHAIN_MARCH += --config armv7m_soft_nofp_nosys
endif
+else ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),y)
+
+ ifeq ($(CONFIG_ARCH_CORTEXM4),y)
+ ifeq ($(CONFIG_ARCH_FPU),y)
+ LDFLAGS += --cpu=Cortex-M4
+ else
+ LDFLAGS += --cpu=Cortex-M4.no_fp
+ endif
+ else ifeq ($(CONFIG_ARCH_CORTEXM7),y)
+ ifeq ($(CONFIG_ARCH_FPU),y)
+ ifeq ($(CONFIG_ARCH_DPFPU),y)
+ LDFLAGS += --cpu=Cortex-M7
+ else
+ LDFLAGS += --cpu=Cortex-M7.fp.sp
+ endif
+ else
+ LDFLAGS += --cpu=Cortex-M7.no_fp
+ endif
+ else # ifeq ($(CONFIG_ARCH_CORTEXM3),y)
+ LDFLAGS += --cpu=Cortex-M3
+ endif
+
endif
ifeq ($(CONFIG_ARMV7M_STACKCHECK),y)
diff --git a/arch/arm/src/armv7-r/Toolchain.defs b/arch/arm/src/armv7-r/Toolchain.defs
index 6ee10178f3..ba3ff79eca 100644
--- a/arch/arm/src/armv7-r/Toolchain.defs
+++ b/arch/arm/src/armv7-r/Toolchain.defs
@@ -37,4 +37,24 @@ else
ARCHCPUFLAGS += -mfloat-abi=soft
endif
+ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),y)
+
+ ifeq ($(CONFIG_ARCH_CORTEXR4),y)
+ LDFLAGS += --cpu=Cortex-R4
+ else ifeq ($(CONFIG_ARCH_CORTEXR5),y)
+ ifeq ($(CONFIG_ARCH_FPU),y)
+ LDFLAGS += --cpu=Cortex-R5
+ else
+ LDFLAGS += --cpu=Cortex-R5.no_vfp
+ endif
+ else ifeq ($(CONFIG_ARCH_CORTEXR7),y)
+ ifeq ($(CONFIG_ARCH_FPU),y)
+ LDFLAGS += --cpu=Cortex-R7
+ else
+ LDFLAGS += --cpu=Cortex-R7.no_vfp
+ endif
+ endif
+
+endif
+
include $(TOPDIR)/arch/arm/src/common/Toolchain.defs
diff --git a/arch/arm/src/armv8-m/Toolchain.defs b/arch/arm/src/armv8-m/Toolchain.defs
index 8ad07e0def..8407e7cd8c 100644
--- a/arch/arm/src/armv8-m/Toolchain.defs
+++ b/arch/arm/src/armv8-m/Toolchain.defs
@@ -84,6 +84,38 @@ ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
endif
endif
+else ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),y)
+
+ ifeq ($(CONFIG_ARCH_CORTEXM23),y)
+ LDFLAGS += --cpu=Cortex-M23
+ else ifeq ($(CONFIG_ARCH_CORTEXM33),y)
+ ifeq ($(CONFIG_ARCH_FPU),y)
+ LDFLAGS += --cpu=Cortex-M33
+ else
+ LDFLAGS += --cpu=Cortex-M33.no_fp
+ endif
+ else ifeq ($(CONFIG_ARCH_CORTEXM35P),y)
+ ifeq ($(CONFIG_ARCH_FPU),y)
+ LDFLAGS += --cpu=Cortex-M35P
+ else
+ LDFLAGS += --cpu=Cortex-M35P.no_fp
+ endif
+ else ifeq ($(CONFIG_ARCH_CORTEXM55),y)
+ ifeq ($(CONFIG_ARM_HAVE_MVE),y)
+ ifeq ($(CONFIG_ARCH_FPU),y)
+ LDFLAGS += --cpu=Cortex-M55
+ else
+ LDFLAGS += --cpu=Cortex-M55.no_fp
+ endif
+ else
+ ifeq ($(CONFIG_ARCH_FPU),y)
+ LDFLAGS += --cpu=Cortex-M55.no_mve
+ else
+ LDFLAGS += --cpu=Cortex-M55.no_mve.no_fp
+ endif
+ endif
+ endif
+
endif
ifeq ($(CONFIG_ARMV8M_STACKCHECK),y)
diff --git a/arch/arm/src/common/Toolchain.defs b/arch/arm/src/common/Toolchain.defs
index 29ad342faa..fb2b45ecf1 100644
--- a/arch/arm/src/common/Toolchain.defs
+++ b/arch/arm/src/common/Toolchain.defs
@@ -131,6 +131,32 @@ ifeq ($(CONFIG_ARM_TOOLCHAIN_CLANG),y)
ARCHOPTIMIZATION += -fno-builtin
+# ARM Compiler Clang toolchain
+
+else ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),y)
+
+ CC = armclang
+ CXX = armclang
+ CPP = armclang -E -P -x c
+ LD = armlink
+ STRIP = llvm-strip --strip-unneeded
+ AR = armar -rcs
+ NM = llvm-nm
+ OBJCOPY = llvm-objcopy
+ OBJDUMP = llvm-objdump
+
+ # Since the no_builtin attribute is not fully supported on Clang
+ # disable the built-in functions, refer:
+ # https://github.com/apache/incubator-nuttx/pull/5971
+
+ ARCHOPTIMIZATION += -fno-builtin
+ ARCHOPTIMIZATION += --target=arm-arm-none-eabi
+
+ # Suppress license warning
+
+ ARCHCPUFLAGS += -Wno-license-management
+ LDFLAGS += --diag_suppress=9931
+
# Default toolchain
else
@@ -174,23 +200,35 @@ endif
ARCHOPTIMIZATION += -fno-common -Wall -Wshadow -Wundef
ARCHOPTIMIZATION += -nostdlib
-LDFLAGS += -nostdlib
+ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),)
+ LDFLAGS += -nostdlib
+endif
# Optimization of unused sections
-ifeq ($(CONFIG_DEBUG_OPT_UNUSED_SECTIONS),y)
- LDFLAGS += --gc-sections
- ARCHOPTIMIZATION += -ffunction-sections -fdata-sections
+ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),)
+ ifeq ($(CONFIG_DEBUG_OPT_UNUSED_SECTIONS),y)
+ LDFLAGS += --gc-sections
+ ARCHOPTIMIZATION += -ffunction-sections -fdata-sections
+ endif
endif
# Debug link map
ifeq ($(CONFIG_DEBUG_LINK_MAP),y)
- LDFLAGS += --cref -Map=$(call CONVERT_PATH,$(TOPDIR)$(DELIM)nuttx.map)
+ ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),)
+ LDFLAGS += --cref -Map=$(call CONVERT_PATH,$(TOPDIR)$(DELIM)nuttx.map)
+ else
+ LDFLAGS += --strict --map --xref --symbols --info=unused --info=veneers
+ LDFLAGS += --info=summarysizes --info=summarystack
+ endif
endif
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
ARCHOPTIMIZATION += -g
+ ifeq ($(CONFIG_ARM_TOOLCHAIN_ARMCLANG),y)
+ LDFLAGS += --debug
+ endif
endif
# Add the builtin library