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 Karatotev################################################################################ 11885ed9e0SBoyan Karatotev# Compiler Configuration for the correct ARCH 123df79ae7SBoyan Karatotev################################################################################ 13885ed9e0SBoyan Karatotevtarget-aarch32-arm-clang := -target arm-arm-none-eabi 14885ed9e0SBoyan Karatotevtarget-aarch64-arm-clang := -target aarch64-arm-none-eabi 15*b9260173SBoyan Karatotevtarget-aarch32-llvm-clang := -target arm-arm-none-eabi 16*b9260173SBoyan Karatotevtarget-aarch64-llvm-clang := -target aarch64-arm-none-elf 173df79ae7SBoyan Karatotev 183df79ae7SBoyan Karatotevifneq (${DEBUG}, 0) 19885ed9e0SBoyan Karatotev cflags-common += -g -gdwarf-4 203df79ae7SBoyan Karatotevendif #(Debug) 213df79ae7SBoyan Karatotev 223df79ae7SBoyan Karatotevifeq (${AARCH32_INSTRUCTION_SET},A32) 23885ed9e0SBoyan Karatotev cflags-aarch32 := -marm 243df79ae7SBoyan Karatotevelse ifeq (${AARCH32_INSTRUCTION_SET},T32) 25885ed9e0SBoyan Karatotev cflags-aarch32 := -mthumb 263df79ae7SBoyan Karatotevendif #(AARCH32_INSTRUCTION_SET) 273df79ae7SBoyan Karatotev 28885ed9e0SBoyan Karatotevcflags-aarch32 += -mno-unaligned-access 29885ed9e0SBoyan Karatotevcflags-aarch64 := -mgeneral-regs-only -mstrict-align 30885ed9e0SBoyan Karatotev 31885ed9e0SBoyan Karatotevcflags-common += $(cflags-$(ARCH)) 323df79ae7SBoyan Karatotev 333df79ae7SBoyan Karatotev############################################################################## 343df79ae7SBoyan Karatotev# WARNINGS Configuration 353df79ae7SBoyan Karatotev############################################################################### 363df79ae7SBoyan Karatotev# General warnings 37885ed9e0SBoyan KaratotevWARNING0 := -Wall -Wmissing-include-dirs -Wunused \ 383df79ae7SBoyan Karatotev -Wdisabled-optimization -Wvla -Wshadow \ 393df79ae7SBoyan Karatotev -Wredundant-decls 403df79ae7SBoyan Karatotev# stricter warnings 41885ed9e0SBoyan KaratotevWARNING0 += -Wextra -Wno-trigraphs 423df79ae7SBoyan Karatotev# too verbose for generic build 43885ed9e0SBoyan KaratotevWARNING0 += -Wno-missing-field-initializers \ 443df79ae7SBoyan Karatotev -Wno-type-limits -Wno-sign-compare \ 453df79ae7SBoyan Karatotev# on clang this flag gets reset if -Wextra is set after it. No difference on gcc 46885ed9e0SBoyan KaratotevWARNING0 += -Wno-unused-parameter 473df79ae7SBoyan Karatotev 483df79ae7SBoyan Karatotev# Additional warnings 493df79ae7SBoyan Karatotev# Level 1 - infrequent warnings we should have none of 503df79ae7SBoyan Karatotev# full -Wextra 51885ed9e0SBoyan KaratotevWARNING1 := $(WARNING0) 523df79ae7SBoyan KaratotevWARNING1 += -Wsign-compare 533df79ae7SBoyan KaratotevWARNING1 += -Wtype-limits 543df79ae7SBoyan KaratotevWARNING1 += -Wmissing-field-initializers 553df79ae7SBoyan Karatotev 563df79ae7SBoyan Karatotev# Level 2 - problematic warnings that we want 573df79ae7SBoyan Karatotev# zlib, compiler-rt, coreboot, and mbdedtls blow up with these 583df79ae7SBoyan Karatotev# TODO: disable just for them and move into default build 59885ed9e0SBoyan KaratotevWARNING2 := $(WARNING1) 603df79ae7SBoyan KaratotevWARNING2 += -Wold-style-definition 613df79ae7SBoyan KaratotevWARNING2 += -Wmissing-prototypes 623df79ae7SBoyan KaratotevWARNING2 += -Wmissing-format-attribute 633df79ae7SBoyan Karatotev# TF-A aims to comply with this eventually. Effort too large at present 643df79ae7SBoyan KaratotevWARNING2 += -Wundef 653df79ae7SBoyan Karatotev# currently very involved and many platforms set this off 663df79ae7SBoyan KaratotevWARNING2 += -Wunused-const-variable=2 673df79ae7SBoyan Karatotev 683df79ae7SBoyan Karatotev# Level 3 - very pedantic, frequently ignored 69885ed9e0SBoyan KaratotevWARNING3 := $(WARNING2) 70885ed9e0SBoyan KaratotevWARNING3 += -Wbad-function-cast 713df79ae7SBoyan KaratotevWARNING3 += -Waggregate-return 723df79ae7SBoyan KaratotevWARNING3 += -Wnested-externs 733df79ae7SBoyan KaratotevWARNING3 += -Wcast-align 743df79ae7SBoyan KaratotevWARNING3 += -Wcast-qual 753df79ae7SBoyan KaratotevWARNING3 += -Wconversion 763df79ae7SBoyan KaratotevWARNING3 += -Wpacked 773df79ae7SBoyan KaratotevWARNING3 += -Wpointer-arith 783df79ae7SBoyan KaratotevWARNING3 += -Wswitch-default 793df79ae7SBoyan Karatotev 80885ed9e0SBoyan Karatotevcflags-common += $(WARNING$(W)) 813df79ae7SBoyan Karatotevifneq (${E},0) 82885ed9e0SBoyan Karatotev cflags-common += -Werror 833df79ae7SBoyan Karatotevendif #(E) 843df79ae7SBoyan Karatotev 853df79ae7SBoyan Karatotev# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105523 863df79ae7SBoyan KaratotevTF_CFLAGS_MIN_PAGE_SIZE := $(call cc_option, --param=min-pagesize=0) 873df79ae7SBoyan Karatotevifeq ($(HARDEN_SLS), 1) 883df79ae7SBoyan Karatotev TF_CFLAGS_MHARDEN_SLS := $(call cc_option, -mharden-sls=all) 893df79ae7SBoyan Karatotevendif 903df79ae7SBoyan Karatotev 91885ed9e0SBoyan KaratotevLTO_CFLAGS := $(if $(call bool,$(ENABLE_LTO)),-flto) 92885ed9e0SBoyan Karatotev 93885ed9e0SBoyan Karatotev# Compiler specific warnings 94885ed9e0SBoyan Karatotevcc-flags-gnu-gcc += -Wunused-but-set-variable -Wmaybe-uninitialized \ 953df79ae7SBoyan Karatotev -Wpacked-bitfield-compat -Wshift-overflow=2 \ 96885ed9e0SBoyan Karatotev -Wlogical-op $(TF_CFLAGS_MIN_PAGE_SIZE) $(TF_CFLAGS_MHARDEN_SLS) 97885ed9e0SBoyan Karatotevcc-flags-llvm-clang += -Wshift-overflow -Wshift-sign-overflow \ 983df79ae7SBoyan Karatotev -Wlogical-op-parentheses 99ddc918b1SBoyan Karatotev# TODO: some day GCC will be able to LTO __builtin functions (i.e. the libc and 100ddc918b1SBoyan Karatotev# with it all libs). When this happens, this should become generic. This can 101ddc918b1SBoyan Karatotev# also happen when GCC14 is the oldest reasonable version we support, then this 102ddc918b1SBoyan Karatotev# can work with -ffat-lto-objects. 103ddc918b1SBoyan Karatotevcc-flags-llvm-clang += $(LTO_CFLAGS) 104ddc918b1SBoyan Karatotev 105885ed9e0SBoyan Karatotev# arm-clang has the same flags 106885ed9e0SBoyan Karatotevcc-flags-arm-clang += $(cc-flags-llvm-clang) 1073df79ae7SBoyan Karatotev 108885ed9e0SBoyan Karatotevcflags-common += ${DEFINES} ${INCLUDES} ${MBEDTLS_INC} -nostdinc 1093df79ae7SBoyan Karatotev 110885ed9e0SBoyan Karatotevcflags-common += -ffunction-sections -fdata-sections \ 1113df79ae7SBoyan Karatotev -ffreestanding -fno-common \ 1123df79ae7SBoyan Karatotev -Os -std=gnu99 1133df79ae7SBoyan Karatotev 1143df79ae7SBoyan Karatotevifneq (${BP_OPTION},none) 115885ed9e0SBoyan Karatotev cflags-common += -mbranch-protection=${BP_OPTION} 1163df79ae7SBoyan Karatotevendif #(BP_OPTION) 1173df79ae7SBoyan Karatotev 1183df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},on) 119885ed9e0SBoyan Karatotev cflags-common += -fsanitize=undefined -fno-sanitize-recover 1203df79ae7SBoyan Karatotevendif #(${SANITIZE_UB},on) 1213df79ae7SBoyan Karatotev 1223df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},trap) 123885ed9e0SBoyan Karatotev cflags-common += -fsanitize=undefined -fno-sanitize-recover \ 1243df79ae7SBoyan Karatotev -fsanitize-undefined-trap-on-error 1253df79ae7SBoyan Karatotevendif #(${SANITIZE_UB},trap) 1263df79ae7SBoyan Karatotev 1273df79ae7SBoyan Karatotevifeq (${ERROR_DEPRECATED},0) 128885ed9e0SBoyan Karatotev cflags-common += -Wno-error=deprecated-declarations 129885ed9e0SBoyan Karatotev cflags-common += -Wno-error=cpp 1303df79ae7SBoyan Karatotevendif #(!ERROR_DEPRECATED) 1313df79ae7SBoyan Karatotev 1323df79ae7SBoyan Karatotev################################################################################ 1333df79ae7SBoyan Karatotev# Platform specific Makefile might provide us ARCH_MAJOR/MINOR use that to come 1343df79ae7SBoyan Karatotev# up with appropriate march values for compiler. 1353df79ae7SBoyan Karatotev################################################################################ 1363df79ae7SBoyan Karatotevinclude ${MAKE_HELPERS_DIRECTORY}march.mk 1373df79ae7SBoyan Karatotevifeq (${ARM_ARCH_MAJOR},7) 1383df79ae7SBoyan Karatotevinclude make_helpers/armv7-a-cpus.mk 1393df79ae7SBoyan Karatotevendif 1403df79ae7SBoyan Karatotev 141885ed9e0SBoyan Karatotevcflags-common += $(march-directive) 1423df79ae7SBoyan Karatotev 1433df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),) 144885ed9e0SBoyan Karatotev cflags-common += -fno-PIE 1453df79ae7SBoyan Karatotevendif 1463df79ae7SBoyan Karatotev 1476c2e5bf6SBoyan Karatotevifeq ($(ENABLE_LTO),1) 1486c2e5bf6SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc) 1496c2e5bf6SBoyan Karatotev cflags-common += -flto-partition=one 1506c2e5bf6SBoyan Karatotevendif 1516c2e5bf6SBoyan Karatotevendif 1526c2e5bf6SBoyan Karatotev 153885ed9e0SBoyan Karatotevcflags-common += $(TF_CFLAGS_$(ARCH)) 154885ed9e0SBoyan Karatotevcflags-common += $(CPPFLAGS) $(CFLAGS) # some platforms set these 155885ed9e0SBoyan KaratotevTF_CFLAGS += $(cflags-common) 156885ed9e0SBoyan KaratotevTF_CFLAGS += $(target-$(ARCH)-$($(ARCH)-cc-id)) 157885ed9e0SBoyan KaratotevTF_CFLAGS += $(cc-flags-$($(ARCH)-cc-id)) 158885ed9e0SBoyan Karatotev 159885ed9e0SBoyan Karatotev# it's logical to give the same flags to the linker when it's invoked through 160885ed9e0SBoyan Karatotev# the compiler. This is requied for LTO to work correctly 161885ed9e0SBoyan Karatotevifeq ($($(ARCH)-ld-id),$($(ARCH)-cc-id)) 162885ed9e0SBoyan Karatotev TF_LDFLAGS += $(cflags-common) 163885ed9e0SBoyan Karatotev TF_LDFLAGS += $(cc-flags-$($(ARCH)-ld-id)) 164885ed9e0SBoyan Karatotev TF_LDFLAGS += $(LTO_CFLAGS) 165885ed9e0SBoyan Karatotevendif 166885ed9e0SBoyan Karatotev 167885ed9e0SBoyan KaratotevTF_LDFLAGS += $(target-$(ARCH)-$($(ARCH)-ld-id)) 168885ed9e0SBoyan Karatotev 1697416eb2fSBoyan KaratotevASFLAGS += -Wa,--fatal-warnings 1703df79ae7SBoyan KaratotevTF_LDFLAGS += -z noexecstack 1713df79ae7SBoyan Karatotev 1723df79ae7SBoyan Karatotev# LD = armlink 1733df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),arm-link) 1743df79ae7SBoyan Karatotev TF_LDFLAGS += --diag_error=warning --lto_level=O1 1753df79ae7SBoyan Karatotev TF_LDFLAGS += --remove --info=unused,unusedsymbols 1763df79ae7SBoyan Karatotev 1776c2e5bf6SBoyan Karatotev# LD = gcc or clang 1786c2e5bf6SBoyan Karatotevelse 1796c2e5bf6SBoyan Karatotev ldflags-common := $(call ld_option,--no-warn-rwx-segments) 1806c2e5bf6SBoyan Karatotev # ld.lld reports section type mismatch warnings, 1816c2e5bf6SBoyan Karatotev # so don't add --fatal-warnings to it. 1826c2e5bf6SBoyan Karatotev ifneq ($($(ARCH)-ld-id),$(filter $($(ARCH)-ld-id),llvm-clang llvm-lld)) 1836c2e5bf6SBoyan Karatotev ldflags-common += $(call ld_prefix,--fatal-warnings) 1846c2e5bf6SBoyan Karatotev endif 1856c2e5bf6SBoyan Karatotev ldflags-common += $(call ld_prefix,--gc-sections) 1866c2e5bf6SBoyan Karatotev ldflags-common += -z common-page-size=4096 # Configure page size constants 1876c2e5bf6SBoyan Karatotev ldflags-common += -z max-page-size=4096 1886c2e5bf6SBoyan Karatotev ldflags-common += $(call ld_prefix,--build-id=none) 18905d22c30SBoyan Karatotev ldflags-common += $(call ld_option,--sort-section=alignment) 1903df79ae7SBoyan Karatotev 1913df79ae7SBoyan Karatotev ifeq ($(ENABLE_LTO),1) 1926c2e5bf6SBoyan Karatotev ldflags-common += -fuse-linker-plugin 1933df79ae7SBoyan Karatotev endif #(ENABLE_LTO) 1943df79ae7SBoyan Karatotev 1956c2e5bf6SBoyan Karatotev ldflags-common += -nostdlib 1963df79ae7SBoyan Karatotev 1976c2e5bf6SBoyan Karatotev ifeq ($($(ARCH)-ld-id),llvm-clang) 1986c2e5bf6SBoyan Karatotev ldflags-common += -fuse-ld=lld 1993df79ae7SBoyan Karatotev endif 2006c2e5bf6SBoyan Karatotevendif 2013df79ae7SBoyan Karatotev 2023df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),) 2033df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc) 2046c2e5bf6SBoyan Karatotev ldflags-common += -no-pie 2053df79ae7SBoyan Karatotevendif 2063df79ae7SBoyan Karatotevendif #(PIE_FOUND) 2076c2e5bf6SBoyan KaratotevTF_LDFLAGS += $(ldflags-common) 2086c2e5bf6SBoyan KaratotevTF_LDFLAGS += $(ldflags-$(ARCH)) 2093df79ae7SBoyan Karatotev 2106c2e5bf6SBoyan KaratotevPIE_LDFLAGS += $(call ld_prefix,-pie) 2116c2e5bf6SBoyan KaratotevPIE_LDFLAGS += $(call ld_prefix,--no-dynamic-linker) 2123df79ae7SBoyan Karatotev 2133df79ae7SBoyan Karatotevifeq ($(ENABLE_PIE),1) 2143df79ae7SBoyan Karatotev ifeq ($(RESET_TO_BL2),1) 2153df79ae7SBoyan Karatotev ifneq ($(BL2_IN_XIP_MEM),1) 2163df79ae7SBoyan Karatotev BL2_CPPFLAGS += -fpie 2173df79ae7SBoyan Karatotev BL2_CFLAGS += -fpie 2183df79ae7SBoyan Karatotev BL2_LDFLAGS += $(PIE_LDFLAGS) 2193df79ae7SBoyan Karatotev endif #(BL2_IN_XIP_MEM) 2203df79ae7SBoyan Karatotev endif #(RESET_TO_BL2) 2213df79ae7SBoyan Karatotev BL31_CPPFLAGS += -fpie 2223df79ae7SBoyan Karatotev BL31_CFLAGS += -fpie 2233df79ae7SBoyan Karatotev BL31_LDFLAGS += $(PIE_LDFLAGS) 2243df79ae7SBoyan Karatotev 2253df79ae7SBoyan Karatotev BL32_CPPFLAGS += -fpie 2263df79ae7SBoyan Karatotev BL32_CFLAGS += -fpie 2273df79ae7SBoyan Karatotev BL32_LDFLAGS += $(PIE_LDFLAGS) 2283df79ae7SBoyan Karatotevendif #(ENABLE_PIE) 2293df79ae7SBoyan Karatotev 2303df79ae7SBoyan KaratotevBL1_CPPFLAGS += -DREPORT_ERRATA=${DEBUG} 2313df79ae7SBoyan KaratotevBL31_CPPFLAGS += -DREPORT_ERRATA=${DEBUG} 2323df79ae7SBoyan KaratotevBL32_CPPFLAGS += -DREPORT_ERRATA=${DEBUG} 2333df79ae7SBoyan Karatotev 2343df79ae7SBoyan KaratotevBL1_CPPFLAGS += -DIMAGE_AT_EL3 2353df79ae7SBoyan Karatotevifeq ($(RESET_TO_BL2),1) 2363df79ae7SBoyan Karatotev BL2_CPPFLAGS += -DIMAGE_AT_EL3 2373df79ae7SBoyan Karatotevelse 2383df79ae7SBoyan Karatotev BL2_CPPFLAGS += -DIMAGE_AT_EL1 2393df79ae7SBoyan Karatotevendif #(RESET_TO_BL2) 2403df79ae7SBoyan Karatotev 2413df79ae7SBoyan Karatotevifeq (${ARCH},aarch64) 2423df79ae7SBoyan Karatotev BL2U_CPPFLAGS += -DIMAGE_AT_EL1 2433df79ae7SBoyan Karatotev BL31_CPPFLAGS += -DIMAGE_AT_EL3 2443df79ae7SBoyan Karatotev BL32_CPPFLAGS += -DIMAGE_AT_EL1 2453df79ae7SBoyan Karatotevelse 2463df79ae7SBoyan Karatotev BL32_CPPFLAGS += -DIMAGE_AT_EL3 2473df79ae7SBoyan Karatotevendif 2483df79ae7SBoyan Karatotev 2493df79ae7SBoyan Karatotevifeq (${SPD},spmd) 2503df79ae7SBoyan Karatotev ifeq ($(findstring optee_sp,$(ARM_SPMC_MANIFEST_DTS)),optee_sp) 2513df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DOPTEE_SP_FW_CONFIG 2523df79ae7SBoyan Karatotev endif 2533df79ae7SBoyan Karatotev 2543df79ae7SBoyan Karatotev ifeq ($(findstring trusty_sp,$(ARM_SPMC_MANIFEST_DTS)),trusty_sp) 2553df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DTRUSTY_SP_FW_CONFIG 2563df79ae7SBoyan Karatotev endif 2573df79ae7SBoyan Karatotev 2583df79ae7SBoyan Karatotev ifeq ($(TS_SP_FW_CONFIG),1) 2593df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DTS_SP_FW_CONFIG 2603df79ae7SBoyan Karatotev endif 2613df79ae7SBoyan Karatotev 2623df79ae7SBoyan Karatotev ifneq ($(ARM_BL2_SP_LIST_DTS),) 2633df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DARM_BL2_SP_LIST_DTS=$(ARM_BL2_SP_LIST_DTS) 2643df79ae7SBoyan Karatotev endif 2653df79ae7SBoyan Karatotevendif 2663df79ae7SBoyan Karatotev 2673df79ae7SBoyan Karatotev 2683df79ae7SBoyan KaratotevDTC_FLAGS += -I dts -O dtb 2691e8b5354SBoyan KaratotevDTC_CPPFLAGS += -Ifdts -undef 2703df79ae7SBoyan Karatotev 271