xref: /rk3399_ARM-atf/make_helpers/cflags.mk (revision 97ac9d1caa065ad24ec9cca822aa435d98ed09fa)
13df79ae7SBoyan Karatotev#
23df79ae7SBoyan Karatotev# Copyright (c) 2025, Arm Limited. All rights reserved.
33df79ae7SBoyan Karatotev#
43df79ae7SBoyan Karatotev# SPDX-License-Identifier: BSD-3-Clause
53df79ae7SBoyan Karatotev#
63df79ae7SBoyan Karatotev
73df79ae7SBoyan KaratotevGCC_V_OUTPUT		:=	$(if $($(ARCH)-cc),$(shell $($(ARCH)-cc) -v 2>&1))
83df79ae7SBoyan KaratotevPIE_FOUND		:=	$(findstring --enable-default-pie,${GCC_V_OUTPUT})
93df79ae7SBoyan Karatotev
103df79ae7SBoyan Karatotevifneq (${DEBUG}, 0)
11885ed9e0SBoyan Karatotev	cflags-common		+=	-g -gdwarf-4
123df79ae7SBoyan Karatotevendif #(Debug)
133df79ae7SBoyan Karatotev
143df79ae7SBoyan Karatotevifeq (${AARCH32_INSTRUCTION_SET},A32)
15885ed9e0SBoyan Karatotev	cflags-aarch32		:=	-marm
163df79ae7SBoyan Karatotevelse ifeq (${AARCH32_INSTRUCTION_SET},T32)
17885ed9e0SBoyan Karatotev	cflags-aarch32		:=	-mthumb
183df79ae7SBoyan Karatotevendif #(AARCH32_INSTRUCTION_SET)
193df79ae7SBoyan Karatotev
20885ed9e0SBoyan Karatotevcflags-aarch32			+=	-mno-unaligned-access
21885ed9e0SBoyan Karatotevcflags-aarch64			:=	-mgeneral-regs-only -mstrict-align
22885ed9e0SBoyan Karatotev
23885ed9e0SBoyan Karatotevcflags-common			+=	$(cflags-$(ARCH))
243df79ae7SBoyan Karatotev
253df79ae7SBoyan Karatotev##############################################################################
263df79ae7SBoyan Karatotev# WARNINGS Configuration
273df79ae7SBoyan Karatotev###############################################################################
283df79ae7SBoyan Karatotev# General warnings
29885ed9e0SBoyan KaratotevWARNING0		:=	-Wall -Wmissing-include-dirs -Wunused	\
303df79ae7SBoyan Karatotev				-Wdisabled-optimization -Wvla -Wshadow	\
313df79ae7SBoyan Karatotev				-Wredundant-decls
323df79ae7SBoyan Karatotev# stricter warnings
33885ed9e0SBoyan KaratotevWARNING0		+=	-Wextra -Wno-trigraphs
343df79ae7SBoyan Karatotev# too verbose for generic build
35885ed9e0SBoyan KaratotevWARNING0		+=	-Wno-missing-field-initializers \
363df79ae7SBoyan Karatotev				-Wno-type-limits -Wno-sign-compare \
373df79ae7SBoyan Karatotev# on clang this flag gets reset if -Wextra is set after it. No difference on gcc
38885ed9e0SBoyan KaratotevWARNING0		+=	-Wno-unused-parameter
393df79ae7SBoyan Karatotev
403df79ae7SBoyan Karatotev# Additional warnings
413df79ae7SBoyan Karatotev# Level 1 - infrequent warnings we should have none of
423df79ae7SBoyan Karatotev# full -Wextra
43885ed9e0SBoyan KaratotevWARNING1 := $(WARNING0)
443df79ae7SBoyan KaratotevWARNING1 += -Wsign-compare
453df79ae7SBoyan KaratotevWARNING1 += -Wtype-limits
463df79ae7SBoyan KaratotevWARNING1 += -Wmissing-field-initializers
473df79ae7SBoyan Karatotev
483df79ae7SBoyan Karatotev# Level 2 - problematic warnings that we want
493df79ae7SBoyan Karatotev# zlib, compiler-rt, coreboot, and mbdedtls blow up with these
503df79ae7SBoyan Karatotev# TODO: disable just for them and move into default build
51885ed9e0SBoyan KaratotevWARNING2 := $(WARNING1)
523df79ae7SBoyan KaratotevWARNING2 += -Wold-style-definition
533df79ae7SBoyan KaratotevWARNING2 += -Wmissing-prototypes
543df79ae7SBoyan KaratotevWARNING2 += -Wmissing-format-attribute
553df79ae7SBoyan Karatotev# TF-A aims to comply with this eventually. Effort too large at present
563df79ae7SBoyan KaratotevWARNING2 += -Wundef
573df79ae7SBoyan Karatotev# currently very involved and many platforms set this off
583df79ae7SBoyan KaratotevWARNING2 += -Wunused-const-variable=2
593df79ae7SBoyan Karatotev
603df79ae7SBoyan Karatotev# Level 3 - very pedantic, frequently ignored
61885ed9e0SBoyan KaratotevWARNING3 := $(WARNING2)
62885ed9e0SBoyan KaratotevWARNING3 += -Wbad-function-cast
633df79ae7SBoyan KaratotevWARNING3 += -Waggregate-return
643df79ae7SBoyan KaratotevWARNING3 += -Wnested-externs
653df79ae7SBoyan KaratotevWARNING3 += -Wcast-align
663df79ae7SBoyan KaratotevWARNING3 += -Wcast-qual
673df79ae7SBoyan KaratotevWARNING3 += -Wconversion
683df79ae7SBoyan KaratotevWARNING3 += -Wpacked
693df79ae7SBoyan KaratotevWARNING3 += -Wpointer-arith
703df79ae7SBoyan KaratotevWARNING3 += -Wswitch-default
713df79ae7SBoyan Karatotev
72885ed9e0SBoyan Karatotevcflags-common	+=	$(WARNING$(W))
733df79ae7SBoyan Karatotevifneq (${E},0)
74885ed9e0SBoyan Karatotev	cflags-common	+= -Werror
753df79ae7SBoyan Karatotevendif #(E)
763df79ae7SBoyan Karatotev
773df79ae7SBoyan Karatotev# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105523
783df79ae7SBoyan KaratotevTF_CFLAGS_MIN_PAGE_SIZE	:=	$(call cc_option, --param=min-pagesize=0)
793df79ae7SBoyan Karatotevifeq ($(HARDEN_SLS), 1)
803df79ae7SBoyan Karatotev        TF_CFLAGS_MHARDEN_SLS	:=      $(call cc_option, -mharden-sls=all)
813df79ae7SBoyan Karatotevendif
823df79ae7SBoyan Karatotev
83885ed9e0SBoyan KaratotevLTO_CFLAGS		:=	$(if $(call bool,$(ENABLE_LTO)),-flto)
84885ed9e0SBoyan Karatotev
85885ed9e0SBoyan Karatotev# Compiler specific warnings
86885ed9e0SBoyan Karatotevcc-flags-gnu-gcc	+=	-Wunused-but-set-variable -Wmaybe-uninitialized	\
873df79ae7SBoyan Karatotev				-Wpacked-bitfield-compat -Wshift-overflow=2 \
88885ed9e0SBoyan Karatotev				-Wlogical-op $(TF_CFLAGS_MIN_PAGE_SIZE) $(TF_CFLAGS_MHARDEN_SLS)
89885ed9e0SBoyan Karatotevcc-flags-llvm-clang	+=	-Wshift-overflow -Wshift-sign-overflow \
903df79ae7SBoyan Karatotev				-Wlogical-op-parentheses
91ddc918b1SBoyan Karatotev# TODO: some day GCC will be able to LTO __builtin functions (i.e. the libc and
92ddc918b1SBoyan Karatotev# with it all libs). When this happens, this should become generic. This can
93ddc918b1SBoyan Karatotev# also happen when GCC14 is the oldest reasonable version we support, then this
94ddc918b1SBoyan Karatotev# can work with -ffat-lto-objects.
95ddc918b1SBoyan Karatotevcc-flags-llvm-clang	+=	$(LTO_CFLAGS)
96ddc918b1SBoyan Karatotev
97885ed9e0SBoyan Karatotev# arm-clang has the same flags
98885ed9e0SBoyan Karatotevcc-flags-arm-clang	+=	$(cc-flags-llvm-clang)
993df79ae7SBoyan Karatotev
100885ed9e0SBoyan Karatotevcflags-common		+=	${DEFINES} ${INCLUDES} ${MBEDTLS_INC} -nostdinc
1013df79ae7SBoyan Karatotev
102885ed9e0SBoyan Karatotevcflags-common		+=	-ffunction-sections -fdata-sections		\
1033df79ae7SBoyan Karatotev				-ffreestanding -fno-common			\
1043df79ae7SBoyan Karatotev				-Os -std=gnu99
1053df79ae7SBoyan Karatotev
1063df79ae7SBoyan Karatotevifneq (${BP_OPTION},none)
107885ed9e0SBoyan Karatotev	cflags-common	+=	-mbranch-protection=${BP_OPTION}
1083df79ae7SBoyan Karatotevendif #(BP_OPTION)
1093df79ae7SBoyan Karatotev
1103df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},on)
111885ed9e0SBoyan Karatotev	cflags-common	+=	-fsanitize=undefined -fno-sanitize-recover
1123df79ae7SBoyan Karatotevendif #(${SANITIZE_UB},on)
1133df79ae7SBoyan Karatotev
1143df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},trap)
115885ed9e0SBoyan Karatotev	cflags-common	+=	-fsanitize=undefined -fno-sanitize-recover	\
1163df79ae7SBoyan Karatotev				-fsanitize-undefined-trap-on-error
1173df79ae7SBoyan Karatotevendif #(${SANITIZE_UB},trap)
1183df79ae7SBoyan Karatotev
1193df79ae7SBoyan Karatotevifeq (${ERROR_DEPRECATED},0)
120885ed9e0SBoyan Karatotev        cflags-common	+= 	-Wno-error=deprecated-declarations
121885ed9e0SBoyan Karatotev        cflags-common	+= 	-Wno-error=cpp
1223df79ae7SBoyan Karatotevendif #(!ERROR_DEPRECATED)
1233df79ae7SBoyan Karatotev
1243df79ae7SBoyan Karatotev################################################################################
1253df79ae7SBoyan Karatotev# Platform specific Makefile might provide us ARCH_MAJOR/MINOR use that to come
1263df79ae7SBoyan Karatotev# up with appropriate march values for compiler.
1273df79ae7SBoyan Karatotev################################################################################
1283df79ae7SBoyan Karatotevinclude ${MAKE_HELPERS_DIRECTORY}march.mk
1293df79ae7SBoyan Karatotevifeq (${ARM_ARCH_MAJOR},7)
1303df79ae7SBoyan Karatotevinclude make_helpers/armv7-a-cpus.mk
1313df79ae7SBoyan Karatotevendif
1323df79ae7SBoyan Karatotev
133885ed9e0SBoyan Karatotevcflags-common		+=	$(march-directive)
1343df79ae7SBoyan Karatotev
1353df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),)
136885ed9e0SBoyan Karatotev        cflags-common	+=	-fno-PIE
1373df79ae7SBoyan Karatotevendif
1383df79ae7SBoyan Karatotev
1396c2e5bf6SBoyan Karatotevifeq ($(ENABLE_LTO),1)
1406c2e5bf6SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc)
1416c2e5bf6SBoyan Karatotev        cflags-common	+=	-flto-partition=one
1426c2e5bf6SBoyan Karatotevendif
1436c2e5bf6SBoyan Karatotevendif
1446c2e5bf6SBoyan Karatotev
145885ed9e0SBoyan Karatotevcflags-common		+=	$(TF_CFLAGS_$(ARCH))
146885ed9e0SBoyan Karatotevcflags-common		+=	$(CPPFLAGS) $(CFLAGS) # some platforms set these
147885ed9e0SBoyan KaratotevTF_CFLAGS		+=	$(cflags-common)
148aa6edba3SBoyan KaratotevTF_CFLAGS		+=	$(target-flag-$(ARCH)-$($(ARCH)-cc-id))
149885ed9e0SBoyan KaratotevTF_CFLAGS		+=	$(cc-flags-$($(ARCH)-cc-id))
150885ed9e0SBoyan Karatotev
151885ed9e0SBoyan Karatotev# it's logical to give the same flags to the linker when it's invoked through
152885ed9e0SBoyan Karatotev# the compiler. This is requied for LTO to work correctly
153885ed9e0SBoyan Karatotevifeq ($($(ARCH)-ld-id),$($(ARCH)-cc-id))
154885ed9e0SBoyan Karatotev        TF_LDFLAGS	+= 	$(cflags-common)
155885ed9e0SBoyan Karatotev        TF_LDFLAGS	+=	$(cc-flags-$($(ARCH)-ld-id))
156885ed9e0SBoyan Karatotev        TF_LDFLAGS	+=	$(LTO_CFLAGS)
157885ed9e0SBoyan Karatotevendif
158885ed9e0SBoyan Karatotev
159aa6edba3SBoyan KaratotevTF_LDFLAGS		+= 	$(target-flag-$(ARCH)-$($(ARCH)-ld-id))
160885ed9e0SBoyan Karatotev
1617416eb2fSBoyan KaratotevASFLAGS			+=	-Wa,--fatal-warnings
1623df79ae7SBoyan KaratotevTF_LDFLAGS		+=	-z noexecstack
1633df79ae7SBoyan Karatotev
1643df79ae7SBoyan Karatotev# LD = armlink
1653df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),arm-link)
1663df79ae7SBoyan Karatotev	TF_LDFLAGS		+=	--diag_error=warning --lto_level=O1
1673df79ae7SBoyan Karatotev	TF_LDFLAGS		+=	--remove --info=unused,unusedsymbols
1683df79ae7SBoyan Karatotev
1696c2e5bf6SBoyan Karatotev# LD = gcc or clang
1706c2e5bf6SBoyan Karatotevelse
171*5ecae951SDmitrii Sharshakov        ifeq ($($(ARCH)-ld-id),llvm-clang)
172*5ecae951SDmitrii Sharshakov                ldflags-common		+=	-fuse-ld=lld
173*5ecae951SDmitrii Sharshakov        endif
174*5ecae951SDmitrii Sharshakov
1756c2e5bf6SBoyan Karatotev        ldflags-common		:=	$(call ld_option,--no-warn-rwx-segments)
1766c2e5bf6SBoyan Karatotev        # ld.lld reports section type mismatch warnings,
1776c2e5bf6SBoyan Karatotev        # so don't add --fatal-warnings to it.
1786c2e5bf6SBoyan Karatotev        ifneq ($($(ARCH)-ld-id),$(filter $($(ARCH)-ld-id),llvm-clang llvm-lld))
1796c2e5bf6SBoyan Karatotev                ldflags-common	+=	$(call ld_prefix,--fatal-warnings)
1806c2e5bf6SBoyan Karatotev        endif
1816c2e5bf6SBoyan Karatotev        ldflags-common		+=	$(call ld_prefix,--gc-sections)
1826c2e5bf6SBoyan Karatotev        ldflags-common		+=	-z common-page-size=4096 # Configure page size constants
1836c2e5bf6SBoyan Karatotev        ldflags-common		+=	-z max-page-size=4096
1846c2e5bf6SBoyan Karatotev        ldflags-common		+=	$(call ld_prefix,--build-id=none)
18505d22c30SBoyan Karatotev        ldflags-common		+=	$(call ld_option,--sort-section=alignment)
1863df79ae7SBoyan Karatotev
1873df79ae7SBoyan Karatotev        ifeq ($(ENABLE_LTO),1)
1886c2e5bf6SBoyan Karatotev                ldflags-common	+=	-fuse-linker-plugin
1893df79ae7SBoyan Karatotev        endif #(ENABLE_LTO)
1903df79ae7SBoyan Karatotev
1916c2e5bf6SBoyan Karatotev        ldflags-common		+= 	-nostdlib
1923df79ae7SBoyan Karatotev
1937cdbbea4SBoyan Karatotev        ifneq ($(call bool,$(USE_ROMLIB)),)
1947cdbbea4SBoyan Karatotev                ldflags-common	+= @${BUILD_PLAT}/romlib/romlib.ldflags
1957cdbbea4SBoyan Karatotev        endif
1966c2e5bf6SBoyan Karatotevendif
1973df79ae7SBoyan Karatotev
19828973741SBoyan Karatotev# Errata build flags
19928973741SBoyan Karatotevifneq ($(call bool,$(ERRATA_A53_843419)),)
20028973741SBoyan Karatotevldflags-aarch64		+= $(call ld_option,--fix-cortex-a53-843419)
20128973741SBoyan Karatotevelse
20228973741SBoyan Karatotev# GCC automatically adds fix-cortex-a53-843419 flag when used to link
20328973741SBoyan Karatotev# which breaks some builds, so disable if errata fix is not explicitly enabled
20428973741SBoyan Karatotevldflags-aarch64		+= $(call ld_option,--no-fix-cortex-a53-843419)
20528973741SBoyan Karatotevendif
20628973741SBoyan Karatotev
20728973741SBoyan Karatotevifneq ($(call bool,$(ERRATA_A53_835769)),)
20828973741SBoyan Karatotevcflags-aarch64		+= -mfix-cortex-a53-835769
20928973741SBoyan Karatotevldflags-aarch64		+= $(call ld_option,--fix-cortex-a53-835769)
21028973741SBoyan Karatotevendif
21128973741SBoyan Karatotev
2123df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),)
2133df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc)
2146c2e5bf6SBoyan Karatotev        ldflags-common	+=	-no-pie
2153df79ae7SBoyan Karatotevendif
2163df79ae7SBoyan Karatotevendif #(PIE_FOUND)
2176c2e5bf6SBoyan KaratotevTF_LDFLAGS	+=	$(ldflags-common)
2186c2e5bf6SBoyan KaratotevTF_LDFLAGS	+=	$(ldflags-$(ARCH))
2193df79ae7SBoyan Karatotev
2206c2e5bf6SBoyan KaratotevPIE_LDFLAGS	+=	$(call ld_prefix,-pie)
2216c2e5bf6SBoyan KaratotevPIE_LDFLAGS	+=	$(call ld_prefix,--no-dynamic-linker)
2223df79ae7SBoyan Karatotev
2233df79ae7SBoyan Karatotevifeq ($(ENABLE_PIE),1)
2243df79ae7SBoyan Karatotev	ifeq ($(RESET_TO_BL2),1)
2253df79ae7SBoyan Karatotev		ifneq ($(BL2_IN_XIP_MEM),1)
2263df79ae7SBoyan Karatotev			BL2_CPPFLAGS	+=	-fpie
2273df79ae7SBoyan Karatotev			BL2_CFLAGS	+=	-fpie
2283df79ae7SBoyan Karatotev			BL2_LDFLAGS	+=	$(PIE_LDFLAGS)
2293df79ae7SBoyan Karatotev		endif #(BL2_IN_XIP_MEM)
2303df79ae7SBoyan Karatotev	endif #(RESET_TO_BL2)
2313df79ae7SBoyan Karatotev	BL31_CPPFLAGS	+=	-fpie
2323df79ae7SBoyan Karatotev	BL31_CFLAGS 	+=	-fpie
2333df79ae7SBoyan Karatotev	BL31_LDFLAGS	+=	$(PIE_LDFLAGS)
2343df79ae7SBoyan Karatotev
2353df79ae7SBoyan Karatotev	BL32_CPPFLAGS	+=	-fpie
2363df79ae7SBoyan Karatotev	BL32_CFLAGS	+=	-fpie
2373df79ae7SBoyan Karatotev	BL32_LDFLAGS	+=	$(PIE_LDFLAGS)
2383df79ae7SBoyan Karatotevendif #(ENABLE_PIE)
2393df79ae7SBoyan Karatotev
2403df79ae7SBoyan KaratotevBL1_CPPFLAGS  += -DREPORT_ERRATA=${DEBUG}
2413df79ae7SBoyan KaratotevBL31_CPPFLAGS += -DREPORT_ERRATA=${DEBUG}
2423df79ae7SBoyan KaratotevBL32_CPPFLAGS += -DREPORT_ERRATA=${DEBUG}
2433df79ae7SBoyan Karatotev
2443df79ae7SBoyan KaratotevBL1_CPPFLAGS += -DIMAGE_AT_EL3
2453df79ae7SBoyan Karatotevifeq ($(RESET_TO_BL2),1)
2463df79ae7SBoyan Karatotev	BL2_CPPFLAGS += -DIMAGE_AT_EL3
2473df79ae7SBoyan Karatotevelse
2483df79ae7SBoyan Karatotev	BL2_CPPFLAGS += -DIMAGE_AT_EL1
2493df79ae7SBoyan Karatotevendif #(RESET_TO_BL2)
2503df79ae7SBoyan Karatotev
2513df79ae7SBoyan Karatotevifeq (${ARCH},aarch64)
2523df79ae7SBoyan Karatotev	BL2U_CPPFLAGS += -DIMAGE_AT_EL1
2533df79ae7SBoyan Karatotev	BL31_CPPFLAGS += -DIMAGE_AT_EL3
2543df79ae7SBoyan Karatotev	BL32_CPPFLAGS += -DIMAGE_AT_EL1
2553df79ae7SBoyan Karatotevelse
2563df79ae7SBoyan Karatotev	BL32_CPPFLAGS += -DIMAGE_AT_EL3
2573df79ae7SBoyan Karatotevendif
2583df79ae7SBoyan Karatotev
2593df79ae7SBoyan Karatotevifeq (${SPD},spmd)
2603df79ae7SBoyan Karatotev	ifeq ($(findstring optee_sp,$(ARM_SPMC_MANIFEST_DTS)),optee_sp)
2613df79ae7SBoyan Karatotev		DTC_CPPFLAGS	+=	-DOPTEE_SP_FW_CONFIG
2623df79ae7SBoyan Karatotev	endif
2633df79ae7SBoyan Karatotev
2643df79ae7SBoyan Karatotev	ifeq ($(findstring trusty_sp,$(ARM_SPMC_MANIFEST_DTS)),trusty_sp)
2653df79ae7SBoyan Karatotev		DTC_CPPFLAGS	+=	-DTRUSTY_SP_FW_CONFIG
2663df79ae7SBoyan Karatotev	endif
2673df79ae7SBoyan Karatotev
2683df79ae7SBoyan Karatotev	ifeq ($(TS_SP_FW_CONFIG),1)
2693df79ae7SBoyan Karatotev		DTC_CPPFLAGS	+=	-DTS_SP_FW_CONFIG
2703df79ae7SBoyan Karatotev	endif
2713df79ae7SBoyan Karatotev
2723df79ae7SBoyan Karatotev	ifneq ($(ARM_BL2_SP_LIST_DTS),)
2733df79ae7SBoyan Karatotev		DTC_CPPFLAGS += -DARM_BL2_SP_LIST_DTS=$(ARM_BL2_SP_LIST_DTS)
2743df79ae7SBoyan Karatotev	endif
2753df79ae7SBoyan Karatotevendif
2763df79ae7SBoyan Karatotev
2773df79ae7SBoyan Karatotev
2783df79ae7SBoyan KaratotevDTC_FLAGS		+=	-I dts -O dtb
2791e8b5354SBoyan KaratotevDTC_CPPFLAGS		+=	-Ifdts -undef
2803df79ae7SBoyan Karatotev
281