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