From c6eea4ad8b80dcbc5c517ae2d3f6d59ba7db99d0 Mon Sep 17 00:00:00 2001 From: Matheus Catarino Date: Wed, 5 Jun 2024 14:04:34 -0300 Subject: [PATCH] add LDC2 (dlang) support *Note:* ldmd2 is ldc2-wrapper, allow using dmd frontend flags. This support may be extended to gdc (gnu) if nuttx developers demand it or are interested in it. --- arch/arm/src/common/Toolchain.defs | 4 ++ arch/risc-v/src/common/Toolchain.defs | 4 ++ boards/sim/sim/sim/scripts/Make.defs | 4 ++ tools/Config.mk | 19 +++++++++ tools/D.defs | 58 +++++++++++++++++++++++++++ tools/mkexport.sh | 2 + 6 files changed, 91 insertions(+) create mode 100644 tools/D.defs diff --git a/arch/arm/src/common/Toolchain.defs b/arch/arm/src/common/Toolchain.defs index e96aa55f02..c78a14a01b 100644 --- a/arch/arm/src/common/Toolchain.defs +++ b/arch/arm/src/common/Toolchain.defs @@ -405,3 +405,7 @@ include $(TOPDIR)/tools/Zig.defs # Rust toolchain include $(TOPDIR)/tools/Rust.defs + +# LDC (LLVM D Compiler) toolchain + +include $(TOPDIR)/tools/D.defs \ No newline at end of file diff --git a/arch/risc-v/src/common/Toolchain.defs b/arch/risc-v/src/common/Toolchain.defs index c9e09c2261..0d1f279f4a 100644 --- a/arch/risc-v/src/common/Toolchain.defs +++ b/arch/risc-v/src/common/Toolchain.defs @@ -399,3 +399,7 @@ include $(TOPDIR)/tools/Zig.defs # Rust toolchain include $(TOPDIR)/tools/Rust.defs + +# LDC (LLVM D Compiler) toolchain + +include $(TOPDIR)/tools/D.defs \ No newline at end of file diff --git a/boards/sim/sim/sim/scripts/Make.defs b/boards/sim/sim/sim/scripts/Make.defs index 457298f8d4..faf72f58e5 100644 --- a/boards/sim/sim/sim/scripts/Make.defs +++ b/boards/sim/sim/sim/scripts/Make.defs @@ -192,6 +192,10 @@ include $(TOPDIR)/tools/Zig.defs include $(TOPDIR)/tools/Rust.defs +# LDC (LLVM D Compiler) toolchain + +include $(TOPDIR)/tools/D.defs + CFLAGS := $(ARCHOPTIMIZATION) $(ARCHCFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe CXXFLAGS := $(ARCHOPTIMIZATION) $(ARCHCXXFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) diff --git a/tools/Config.mk b/tools/Config.mk index a49dc6a6d6..82cc57ced1 100644 --- a/tools/Config.mk +++ b/tools/Config.mk @@ -362,6 +362,25 @@ define COMPILEZIG $(ECHO_END) endef +# COMPILED - Default macro to compile one D file +# Example: $(call COMPILED, in-file, out-file) +# +# Depends on these settings defined in board-specific Make.defs file +# installed at $(TOPDIR)/Make.defs: +# +# DC - The command to invoke the D compiler +# DFLAGS - Options to pass to the D compiler +# +# '.d_DFLAGS += ' may also be used, as an example, to +# change the options used with the single file .d. The same +# applies mutatis mutandis. + +define COMPILED + $(ECHO_BEGIN)"DC: $1 " + $(Q) $(DC) -c $(DFLAGS) $($(strip $1)_DFLAGS) $1 -of $2 + $(ECHO_END) +endef + # ASSEMBLE - Default macro to assemble one assembly language file # Example: $(call ASSEMBLE, in-file, out-file) # diff --git a/tools/D.defs b/tools/D.defs new file mode 100644 index 0000000000..5f64a79cdf --- /dev/null +++ b/tools/D.defs @@ -0,0 +1,58 @@ +############################################################################ +# tools/D.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. +# +############################################################################ + +DC := ldmd2 + +DFLAGS := -i + +ifeq ($(CONFIG_DEBUG_SYMBOLS),y) + DFLAGS += -g +endif + +ifeq ($(CONFIG_DEBUG_NOOPT),y) + DFLAGS += -O +endif + +# Special handling for the SIM + +ifeq ($(CONFIG_ARCH_SIM),y) + ifeq ($(CONFIG_HOST_LINUX),y) + ifeq ($(LLVM_ARCHTYPE),x86) + # Only for x86 based host or x64 but m32 build + DFLAGS += -mtriple=i686-unknown-linux-$(LLVM_ABITYPE) + else + # For other archs, such as aarch64, arm etc + DFLAGS += -mtriple=$(LLVM_ARCHTYPE)-unknown-linux-$(LLVM_ABITYPE) + DFLAGS += -mcpu=$(LLVM_CPUTYPE) + endif + else ifeq ($(CONFIG_HOST_MACOS),y) + DFLAGS += -mtriple=$(LLVM_ARCHTYPE)-apple-$(LLVM_ABITYPE) + endif +else ifeq ($(CONFIG_ARCH_RISCV),y) + # Traget triple is riscv[32|64][isa]-unknown-none-elf + DFLAGS += -mtriple=$(LLVM_ARCHTYPE)$(ARCHRVISAM)$(ARCHRVISAA)$(ARCHRVISAF)$(ARCHRVISAD)$(ARCHRVISAC)-unknown-none-elf + DFLAGS += -mattr=+m,+a,+f,+d,+c -mabi=ilp32d + DFLAGS += -mcpu=generic-rv32 +else + # For arm, but there are some other archs not support yet, + # such as xtensa, x86 bare metal, etc. + DFLAGS += -mtriple=$(LLVM_ARCHTYPE)-none-$(LLVM_ABITYPE) + DFLAGS += -mcpu=$(LLVM_CPUTYPE) +endif diff --git a/tools/mkexport.sh b/tools/mkexport.sh index 01fe771ef4..60af60a3e2 100755 --- a/tools/mkexport.sh +++ b/tools/mkexport.sh @@ -250,6 +250,8 @@ echo "OBJCOPY = ${OBJCOPY}" >>"${EXPORTDIR}/scripts/Make.defs" echo "OBJDUMP = ${OBJDUMP}" >>"${EXPORTDIR}/scripts/Make.defs" echo "ZIG = ${ZIG}" >>"${EXPORTDIR}/scripts/Make.defs" echo "ZIGFLAGS = ${ZIGFLAGS}" >>"${EXPORTDIR}/scripts/Make.defs" +echo "DC = ${DC}" >>"${EXPORTDIR}/scripts/Make.defs" +echo "DFLAGS = ${DFLAGS}" >>"${EXPORTDIR}/scripts/Make.defs" echo "NXFLATLDFLAGS1 = ${NXFLATLDFLAGS1}" >>"${EXPORTDIR}/scripts/Make.defs" echo "NXFLATLDFLAGS2 = ${NXFLATLDFLAGS2}" >>"${EXPORTDIR}/scripts/Make.defs" echo "OBJEXT = ${OBJEXT}" >>"${EXPORTDIR}/scripts/Make.defs"