250 lines
6.4 KiB
Text
250 lines
6.4 KiB
Text
# Each toolchain definition should set:
|
|
#
|
|
# CROSSDEV The GNU toolchain triple (command prefix)
|
|
# ARCHCPUFLAGS CPU-specific flags selecting the instruction set
|
|
# FPU options, etc.
|
|
# ARCHOPTIMIZATION The optimization level that results in
|
|
# reliable code generation.
|
|
#
|
|
|
|
CROSSDEV = arm-none-eabi-
|
|
|
|
CC = $(CROSSDEV)gcc
|
|
CXX = $(CROSSDEV)g++
|
|
CPP = $(CROSSDEV)gcc -E -P -x c
|
|
STRIP = $(CROSSDEV)strip --strip-unneeded
|
|
OBJCOPY = $(CROSSDEV)objcopy
|
|
OBJDUMP = $(CROSSDEV)objdump
|
|
|
|
ifeq ($(CONFIG_LTO_FULL),y)
|
|
LD := $(CROSSDEV)gcc
|
|
AR := $(CROSSDEV)gcc-ar rcs
|
|
NM := $(CROSSDEV)gcc-nm
|
|
ARCHOPTIMIZATION += -fno-builtin
|
|
else
|
|
LD := $(CROSSDEV)ld
|
|
AR := $(CROSSDEV)ar rcs
|
|
NM := $(CROSSDEV)nm
|
|
endif
|
|
|
|
# The default C/C++ search path
|
|
ARCHINCLUDES += -isystem ${NXBASE}/include
|
|
ARCHXXINCLUDES += -isystem ${NXBASE}/include
|
|
|
|
INCDIR_PREFIX = -I
|
|
DEFINE_PREFIX = -D
|
|
|
|
include $(dir ${TOOLCHAIN})/gcc.${ARCH_FAMILY}.defs
|
|
|
|
ifeq ($(CONFIG_DEBUG_CUSTOMOPT),y)
|
|
ARCHOPTIMIZATION += $(CONFIG_DEBUG_OPTLEVEL)
|
|
else ifeq ($(CONFIG_DEBUG_FULLOPT),y)
|
|
ARCHOPTIMIZATION += -Os
|
|
endif
|
|
|
|
ifeq ($(CONFIG_NDEBUG),y)
|
|
ARCHOPTIMIZATION += -DNDEBUG
|
|
endif
|
|
|
|
ifneq ($(CONFIG_DEBUG_NOOPT),y)
|
|
ARCHOPTIMIZATION += -fno-strict-aliasing
|
|
endif
|
|
|
|
ifeq ($(CONFIG_FRAME_POINTER),y)
|
|
ARCHOPTIMIZATION += -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
|
else
|
|
ARCHOPTIMIZATION += -fomit-frame-pointer
|
|
endif
|
|
|
|
ifeq ($(CONFIG_STACK_CANARIES),y)
|
|
ARCHOPTIMIZATION += -fstack-protector-all
|
|
endif
|
|
|
|
ifeq ($(CONFIG_STACK_USAGE),y)
|
|
ARCHOPTIMIZATION += -fstack-usage
|
|
endif
|
|
|
|
ifneq ($(CONFIG_STACK_USAGE_WARNING),0)
|
|
ARCHOPTIMIZATION += -Wstack-usage=$(CONFIG_STACK_USAGE_WARNING)
|
|
endif
|
|
|
|
ifeq ($(CONFIG_COVERAGE_ALL),y)
|
|
ARCHOPTIMIZATION += -fprofile-arcs -ftest-coverage -fno-inline
|
|
endif
|
|
|
|
ifeq ($(CONFIG_PROFILE_ALL),y)
|
|
ARCHOPTIMIZATION += -pg
|
|
endif
|
|
|
|
ifeq ($(CONFIG_MM_UBSAN_ALL),y)
|
|
ARCHOPTIMIZATION += $(CONFIG_MM_UBSAN_OPTION)
|
|
endif
|
|
|
|
ifeq ($(CONFIG_MM_UBSAN_TRAP_ON_ERROR),y)
|
|
ARCHOPTIMIZATION += -fsanitize-undefined-trap-on-error
|
|
endif
|
|
|
|
ifeq ($(CONFIG_MM_KASAN_INSTRUMENT_ALL),y)
|
|
ARCHOPTIMIZATION += -fsanitize=kernel-address
|
|
endif
|
|
|
|
ifeq ($(CONFIG_MM_KASAN_GLOBAL),y)
|
|
ARCHOPTIMIZATION += --param asan-globals=1
|
|
endif
|
|
|
|
ifeq ($(CONFIG_MM_KASAN_DISABLE_READS_CHECK),y)
|
|
ARCHOPTIMIZATION += --param asan-instrument-reads=0
|
|
endif
|
|
|
|
ifeq ($(CONFIG_MM_KASAN_DISABLE_WRITES_CHECK),y)
|
|
ARCHOPTIMIZATION += --param asan-instrument-writes=0
|
|
endif
|
|
|
|
# Instrumentation options
|
|
|
|
ifeq ($(CONFIG_ARCH_INSTRUMENT_ALL),y)
|
|
ARCHOPTIMIZATION += -finstrument-functions
|
|
endif
|
|
|
|
ifeq ($(CONFIG_UNWINDER_ARM),y)
|
|
ARCHOPTIMIZATION += -funwind-tables -fasynchronous-unwind-tables
|
|
endif
|
|
|
|
# Link Time Optimization
|
|
|
|
ifeq ($(CONFIG_LTO_THIN),y)
|
|
ARCHOPTIMIZATION += -flto=thin
|
|
else ifeq ($(CONFIG_LTO_FULL),y)
|
|
ARCHOPTIMIZATION += -flto
|
|
ARCHOPTIMIZATION += -fuse-linker-plugin
|
|
endif
|
|
|
|
ifeq ($(CONFIG_ARM_THUMB),y)
|
|
ARCHCPUFLAGS += -mthumb
|
|
|
|
# GCC Manual:
|
|
# -mthumb
|
|
# ... If you want to force assembler files to be interpreted as Thumb
|
|
# code, either add a `.thumb' directive to the source or pass the
|
|
# -mthumb option directly to the assembler by prefixing it with -Wa.
|
|
|
|
ARCHCPUFLAGS += -Wa,-mthumb
|
|
|
|
# Outputs an implicit IT block when there is a conditional instruction
|
|
# without an enclosing IT block.
|
|
|
|
ARCHCPUFLAGS += -Wa,-mimplicit-it=always
|
|
endif
|
|
|
|
# Workaround to skip -Warray-bounds check due to bug of GCC-12:
|
|
# Wrong warning array subscript [0] is outside array bounds:
|
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105523
|
|
|
|
ifeq ($(GCCVER),)
|
|
export GCCVER := $(shell $(CC) --version | grep gcc | sed -E "s/.* ([0-9]+\.[0-9]+).*/\1/" | cut -d'.' -f1)
|
|
endif
|
|
|
|
ifeq ($(shell expr "$(GCCVER)" \>= 12), 1)
|
|
ARCHOPTIMIZATION += --param=min-pagesize=0
|
|
LDFLAGS += --print-memory-usage
|
|
ifeq ($(CONFIG_ARCH_RAMFUNCS),y)
|
|
LDFLAGS += --no-warn-rwx-segments
|
|
else ifeq ($(CONFIG_BOOT_RUNFROMFLASH),)
|
|
LDFLAGS += --no-warn-rwx-segments
|
|
endif
|
|
endif
|
|
|
|
LDFLAGS += --entry=__start
|
|
|
|
ifneq ($(CONFIG_LIBCXXTOOLCHAIN),y)
|
|
ARCHCXXFLAGS += -nostdinc++
|
|
endif
|
|
|
|
ifneq ($(CONFIG_CXX_STANDARD),)
|
|
ARCHCXXFLAGS += -std=$(CONFIG_CXX_STANDARD)
|
|
endif
|
|
|
|
ifneq ($(CONFIG_CXX_EXCEPTION),y)
|
|
ARCHCXXFLAGS += -fno-exceptions -fcheck-new
|
|
endif
|
|
|
|
ifneq ($(CONFIG_CXX_RTTI),y)
|
|
ARCHCXXFLAGS += -fno-rtti
|
|
endif
|
|
|
|
ARCHOPTIMIZATION += -fno-common
|
|
ARCHOPTIMIZATION += -Wall -Wshadow -Wundef
|
|
|
|
LDFLAGS += -nostdlib
|
|
LDFLAGS += --gc-sections
|
|
ARCHOPTIMIZATION += -ffunction-sections -fdata-sections
|
|
|
|
ifeq ($(CONFIG_DEBUG_LINK_WHOLE_ARCHIVE),y)
|
|
LDFLAGS += --whole-archive
|
|
endif
|
|
|
|
# Debug link map
|
|
|
|
ifeq ($(CONFIG_DEBUG_LINK_MAP),y)
|
|
LDFLAGS += --strict --map --xref --symbols --info=unused --info=veneers
|
|
LDFLAGS += --info=summarysizes --info=summarystack
|
|
endif
|
|
|
|
ifeq ($(CONFIG_DEBUG_SYMBOLS),y)
|
|
ARCHOPTIMIZATION += ${CONFIG_DEBUG_SYMBOLS_LEVEL}
|
|
endif
|
|
|
|
ifeq ($(CONFIG_BUILTIN_TOOLCHAIN),y)
|
|
COMPILER_RT_LIB = $(shell $(CC) $(ARCHCPUFLAGS) --print-libgcc-file-name)
|
|
EXTRA_LIBS += $(COMPILER_RT_LIB)
|
|
endif
|
|
|
|
ifeq ($(CONFIG_LIBSUPCXX_TOOLCHAIN),y)
|
|
EXTRA_LIBS += $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-file-name=libsupc++.a))
|
|
endif
|
|
|
|
ifeq ($(CONFIG_COVERAGE_TOOLCHAIN),y)
|
|
EXTRA_LIBS += $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-file-name=libgcov.a))
|
|
endif
|
|
|
|
ifeq ($(CONFIG_LIBCXXTOOLCHAIN),y)
|
|
EXTRA_LIBS += $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-file-name=libstdc++.a))
|
|
endif
|
|
|
|
PICFLAGS = -fpic -fPIE -mno-pic-data-is-text-relative -msingle-pic-base
|
|
|
|
ifneq ($(CONFIG_BUILD_PIC),)
|
|
ARCHCFLAGS += $(PICFLAGS) -mpic-register=r9
|
|
ARCHCXXFLAGS += $(PICFLAGS) -mpic-register=r9
|
|
LDFLAGS += --emit-relocs
|
|
endif
|
|
|
|
# Loadable module definitions
|
|
|
|
CMODULEFLAGS = $(CFLAGS) -fvisibility=hidden -mlong-calls # --target1-abs
|
|
LDMODULEFLAGS = -r -T $(call CONVERT_PATH,$(TOPDIR)/libs/libc/elf/gnu-elf.ld)
|
|
|
|
# ELF module definitions
|
|
|
|
CELFFLAGS = $(CFLAGS) -fvisibility=hidden -mlong-calls # --target1-abs
|
|
CXXELFFLAGS = $(CXXFLAGS)-fvisibility=hidden -mlong-calls
|
|
|
|
ifeq ($(CONFIG_PIC),y)
|
|
CFLAGS += --fixed-r10
|
|
CELFFLAGS += $(PICFLAGS) -mpic-register=r10
|
|
CXXELFFLAGS += $(PICFLAGS) -mpic-register=r10
|
|
|
|
# Generate an executable elf, need to ignore undefined symbols
|
|
LDELFFLAGS += --unresolved-symbols=ignore-in-object-files --emit-relocs
|
|
else
|
|
ifneq ($(CONFIG_BINFMT_ELF_EXECUTABLE),y)
|
|
LDELFFLAGS += -r
|
|
endif
|
|
endif
|
|
|
|
LDELFFLAGS += -e __start -T ${NXBASE}/libs/libc/elf/gnu-elf.ld
|
|
|
|
SHCCFLAGS = -fPIC -fPIE -fvisibility=default
|
|
SHLDFLAGS = -shared -Bsymbolic -Bdynamic
|
|
|
|
ARCHCPUFLAGS += $(TOOLCHAIN_MARCH) $(TOOLCHAIN_MTUNE) $(TOOLCHAIN_MFLOAT)
|