xref: /rk3399_ARM-atf/make_helpers/cflags.mk (revision 6bb9f053a156ffffe92f67b1b4fa0538ba5def85)
1#
2# Copyright (c) 2025, Arm Limited. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6
7GCC_V_OUTPUT		:=	$(if $($(ARCH)-cc),$(shell $($(ARCH)-cc) -v 2>&1))
8PIE_FOUND		:=	$(findstring --enable-default-pie,${GCC_V_OUTPUT})
9
10################################################################################
11# Compiler Configuration based on ARCH_MAJOR and ARCH_MINOR flags
12################################################################################
13ifeq (${ARM_ARCH_MAJOR},7)
14	target32-directive	= 	-target arm-none-eabi
15# Will set march-directive from platform configuration
16else
17	target32-directive	= 	-target armv8a-none-eabi
18endif #(ARM_ARCH_MAJOR)
19
20ifneq ($(filter %-clang,$($(ARCH)-cc-id)),)
21	ifeq ($($(ARCH)-cc-id),arm-clang)
22		TF_CFLAGS_aarch32	:=	-target arm-arm-none-eabi
23		TF_CFLAGS_aarch64	:=	-target aarch64-arm-none-eabi
24	else
25		TF_CFLAGS_aarch32	=	$(target32-directive)
26		TF_CFLAGS_aarch64	:=	-target aarch64-elf
27	endif
28endif #(clang)
29
30# Process Debug flag
31ifneq (${DEBUG}, 0)
32	TF_CFLAGS	+=	-g -gdwarf-4
33	ASFLAGS		+=	-g -Wa,-gdwarf-4
34endif #(Debug)
35
36ifeq (${AARCH32_INSTRUCTION_SET},A32)
37	TF_CFLAGS_aarch32	+=	-marm
38else ifeq (${AARCH32_INSTRUCTION_SET},T32)
39	TF_CFLAGS_aarch32	+=	-mthumb
40endif #(AARCH32_INSTRUCTION_SET)
41
42TF_CFLAGS_aarch32	+=	-mno-unaligned-access
43TF_CFLAGS_aarch64	+=	-mgeneral-regs-only -mstrict-align
44
45##############################################################################
46# WARNINGS Configuration
47###############################################################################
48# General warnings
49WARNINGS		:=	-Wall -Wmissing-include-dirs -Wunused	\
50				-Wdisabled-optimization -Wvla -Wshadow	\
51				-Wredundant-decls
52# stricter warnings
53WARNINGS		+=	-Wextra -Wno-trigraphs
54# too verbose for generic build
55WARNINGS		+=	-Wno-missing-field-initializers \
56				-Wno-type-limits -Wno-sign-compare \
57# on clang this flag gets reset if -Wextra is set after it. No difference on gcc
58WARNINGS		+=	-Wno-unused-parameter
59
60# Additional warnings
61# Level 1 - infrequent warnings we should have none of
62# full -Wextra
63WARNING1 += -Wsign-compare
64WARNING1 += -Wtype-limits
65WARNING1 += -Wmissing-field-initializers
66
67# Level 2 - problematic warnings that we want
68# zlib, compiler-rt, coreboot, and mbdedtls blow up with these
69# TODO: disable just for them and move into default build
70WARNING2 += -Wold-style-definition
71WARNING2 += -Wmissing-prototypes
72WARNING2 += -Wmissing-format-attribute
73# TF-A aims to comply with this eventually. Effort too large at present
74WARNING2 += -Wundef
75# currently very involved and many platforms set this off
76WARNING2 += -Wunused-const-variable=2
77
78# Level 3 - very pedantic, frequently ignored
79WARNING3 := -Wbad-function-cast
80WARNING3 += -Waggregate-return
81WARNING3 += -Wnested-externs
82WARNING3 += -Wcast-align
83WARNING3 += -Wcast-qual
84WARNING3 += -Wconversion
85WARNING3 += -Wpacked
86WARNING3 += -Wpointer-arith
87WARNING3 += -Wswitch-default
88
89ifeq (${W},1)
90	WARNINGS += $(WARNING1)
91else ifeq (${W},2)
92	WARNINGS += $(WARNING1) $(WARNING2)
93else ifeq (${W},3)
94	WARNINGS += $(WARNING1) $(WARNING2) $(WARNING3)
95endif #(W)
96
97ifneq (${E},0)
98	ERRORS := -Werror
99endif #(E)
100
101# Compiler specific warnings
102ifeq ($(filter %-clang,$($(ARCH)-cc-id)),)
103# not using clang
104# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105523
105TF_CFLAGS_MIN_PAGE_SIZE	:=	$(call cc_option, --param=min-pagesize=0)
106TF_CFLAGS		+=	$(TF_CFLAGS_MIN_PAGE_SIZE)
107
108ifeq ($(HARDEN_SLS), 1)
109        TF_CFLAGS_MHARDEN_SLS	:=      $(call cc_option, -mharden-sls=all)
110        TF_CFLAGS_aarch64	+=      $(TF_CFLAGS_MHARDEN_SLS)
111endif
112
113WARNINGS	+=		-Wunused-but-set-variable -Wmaybe-uninitialized	\
114				-Wpacked-bitfield-compat -Wshift-overflow=2 \
115				-Wlogical-op
116
117else
118# using clang
119WARNINGS	+=		-Wshift-overflow -Wshift-sign-overflow \
120				-Wlogical-op-parentheses
121endif #(Clang Warning)
122
123CPPFLAGS		=	${DEFINES} ${INCLUDES} ${MBEDTLS_INC} -nostdinc	\
124				$(ERRORS) $(WARNINGS)
125
126
127TF_CFLAGS		+=	-ffunction-sections -fdata-sections		\
128				-ffreestanding -fno-common			\
129				-Os -std=gnu99
130
131ifneq (${BP_OPTION},none)
132	TF_CFLAGS_aarch64	+=	-mbranch-protection=${BP_OPTION}
133endif #(BP_OPTION)
134
135ifeq (${SANITIZE_UB},on)
136	TF_CFLAGS	+=	-fsanitize=undefined -fno-sanitize-recover
137endif #(${SANITIZE_UB},on)
138
139ifeq (${SANITIZE_UB},trap)
140	TF_CFLAGS	+=	-fsanitize=undefined -fno-sanitize-recover	\
141				-fsanitize-undefined-trap-on-error
142endif #(${SANITIZE_UB},trap)
143
144ifeq ($($(ARCH)-cc-id),gnu-gcc)
145	# Enable LTO only for aarch64
146	LTO_CFLAGS	=	$(if $(filter-out 0,$(ENABLE_LTO)),-flto)
147endif #(gnu-gcc)
148
149ifeq (${ERROR_DEPRECATED},0)
150# Check if deprecated declarations and cpp warnings should be treated as error or not.
151ifneq ($(filter %-clang,$($(ARCH)-cc-id)),)
152    CPPFLAGS		+= 	-Wno-error=deprecated-declarations
153else
154    CPPFLAGS		+= 	-Wno-error=deprecated-declarations -Wno-error=cpp
155endif
156endif #(!ERROR_DEPRECATED)
157
158################################################################################
159# Platform specific Makefile might provide us ARCH_MAJOR/MINOR use that to come
160# up with appropriate march values for compiler.
161################################################################################
162include ${MAKE_HELPERS_DIRECTORY}march.mk
163ifeq (${ARM_ARCH_MAJOR},7)
164include make_helpers/armv7-a-cpus.mk
165endif
166
167TF_CFLAGS	+=	$(march-directive)
168ASFLAGS		+=	$(march-directive)
169
170ifneq ($(PIE_FOUND),)
171	TF_CFLAGS	+=	-fno-PIE
172endif
173
174TF_CFLAGS		+=	$(CPPFLAGS) $(TF_CFLAGS_$(ARCH))
175TF_CFLAGS		+=	$(CFLAGS)
176ASFLAGS			+=	$(CPPFLAGS)                 			\
177				-ffreestanding -Wa,--fatal-warnings
178TF_LDFLAGS		+=	-z noexecstack
179
180# LD = armlink
181ifeq ($($(ARCH)-ld-id),arm-link)
182	TF_LDFLAGS		+=	--diag_error=warning --lto_level=O1
183	TF_LDFLAGS		+=	--remove --info=unused,unusedsymbols
184	TF_LDFLAGS		+=	$(TF_LDFLAGS_$(ARCH))
185
186# LD = gcc (used when GCC LTO is enabled)
187else ifeq ($($(ARCH)-ld-id),gnu-gcc)
188	# Pass ld options with Wl or Xlinker switches
189	TF_LDFLAGS		+=	$(call ld_option,-Xlinker --no-warn-rwx-segments)
190	TF_LDFLAGS		+=	-Wl,--fatal-warnings -O1
191	TF_LDFLAGS		+=	-Wl,--gc-sections
192
193	TF_LDFLAGS		+=	-Wl,-z,common-page-size=4096 #Configure page size constants
194	TF_LDFLAGS		+=	-Wl,-z,max-page-size=4096
195	TF_LDFLAGS		+=	-Wl,--build-id=none
196
197	ifeq ($(ENABLE_LTO),1)
198		TF_LDFLAGS	+=	-flto -fuse-linker-plugin
199		TF_LDFLAGS      +=	-flto-partition=one
200	endif #(ENABLE_LTO)
201
202# GCC automatically adds fix-cortex-a53-843419 flag when used to link
203# which breaks some builds, so disable if errata fix is not explicitly enabled
204	ifeq (${ARCH},aarch64)
205		ifneq (${ERRATA_A53_843419},1)
206			TF_LDFLAGS	+= 	-mno-fix-cortex-a53-843419
207		endif
208	endif
209	TF_LDFLAGS		+= 	-nostdlib
210	TF_LDFLAGS		+=	$(subst --,-Xlinker --,$(TF_LDFLAGS_$(ARCH)))
211
212# LD = gcc-ld (ld) or llvm-ld (ld.lld) or other
213else
214# With ld.bfd version 2.39 and newer new warnings are added. Skip those since we
215# are not loaded by a elf loader.
216	TF_LDFLAGS		+=	$(call ld_option, --no-warn-rwx-segments)
217	TF_LDFLAGS		+=	-O1
218	TF_LDFLAGS		+=	--gc-sections
219
220	TF_LDFLAGS		+=	-z common-page-size=4096 # Configure page size constants
221	TF_LDFLAGS		+=	-z max-page-size=4096
222	TF_LDFLAGS		+=	--build-id=none
223
224# ld.lld doesn't recognize the errata flags,
225# therefore don't add those in that case.
226# ld.lld reports section type mismatch warnings,
227# therefore don't add --fatal-warnings to it.
228	ifneq ($($(ARCH)-ld-id),llvm-lld)
229		TF_LDFLAGS	+=	$(TF_LDFLAGS_$(ARCH)) --fatal-warnings
230	endif
231
232endif #(LD = armlink)
233
234ifneq ($(PIE_FOUND),)
235ifeq ($($(ARCH)-ld-id),gnu-gcc)
236	TF_LDFLAGS	+=	-no-pie
237endif
238endif #(PIE_FOUND)
239
240ifeq ($($(ARCH)-ld-id),gnu-gcc)
241	PIE_LDFLAGS	+=	-Wl,-pie -Wl,--no-dynamic-linker
242else
243	PIE_LDFLAGS	+=	-pie --no-dynamic-linker
244endif
245
246ifeq ($(ENABLE_PIE),1)
247	ifeq ($(RESET_TO_BL2),1)
248		ifneq ($(BL2_IN_XIP_MEM),1)
249			BL2_CPPFLAGS	+=	-fpie
250			BL2_CFLAGS	+=	-fpie
251			BL2_LDFLAGS	+=	$(PIE_LDFLAGS)
252		endif #(BL2_IN_XIP_MEM)
253	endif #(RESET_TO_BL2)
254	BL31_CPPFLAGS	+=	-fpie
255	BL31_CFLAGS 	+=	-fpie
256	BL31_LDFLAGS	+=	$(PIE_LDFLAGS)
257
258	BL32_CPPFLAGS	+=	-fpie
259	BL32_CFLAGS	+=	-fpie
260	BL32_LDFLAGS	+=	$(PIE_LDFLAGS)
261endif #(ENABLE_PIE)
262
263BL1_CPPFLAGS  += -DREPORT_ERRATA=${DEBUG}
264BL31_CPPFLAGS += -DREPORT_ERRATA=${DEBUG}
265BL32_CPPFLAGS += -DREPORT_ERRATA=${DEBUG}
266
267BL1_CPPFLAGS += -DIMAGE_AT_EL3
268ifeq ($(RESET_TO_BL2),1)
269	BL2_CPPFLAGS += -DIMAGE_AT_EL3
270else
271	BL2_CPPFLAGS += -DIMAGE_AT_EL1
272endif #(RESET_TO_BL2)
273
274ifeq (${ARCH},aarch64)
275	BL2U_CPPFLAGS += -DIMAGE_AT_EL1
276	BL31_CPPFLAGS += -DIMAGE_AT_EL3
277	BL32_CPPFLAGS += -DIMAGE_AT_EL1
278else
279	BL32_CPPFLAGS += -DIMAGE_AT_EL3
280endif
281
282ifeq (${SPD},spmd)
283	ifeq ($(findstring optee_sp,$(ARM_SPMC_MANIFEST_DTS)),optee_sp)
284		DTC_CPPFLAGS	+=	-DOPTEE_SP_FW_CONFIG
285	endif
286
287	ifeq ($(findstring trusty_sp,$(ARM_SPMC_MANIFEST_DTS)),trusty_sp)
288		DTC_CPPFLAGS	+=	-DTRUSTY_SP_FW_CONFIG
289	endif
290
291	ifeq ($(TS_SP_FW_CONFIG),1)
292		DTC_CPPFLAGS	+=	-DTS_SP_FW_CONFIG
293	endif
294
295	ifneq ($(ARM_BL2_SP_LIST_DTS),)
296		DTC_CPPFLAGS += -DARM_BL2_SP_LIST_DTS=$(ARM_BL2_SP_LIST_DTS)
297	endif
298endif
299
300
301DTC_FLAGS		+=	-I dts -O dtb
302DTC_CPPFLAGS		+=	-Ifdts -undef
303
304