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################################################################################ 113df79ae7SBoyan Karatotev# Compiler Configuration based on ARCH_MAJOR and ARCH_MINOR flags 123df79ae7SBoyan Karatotev################################################################################ 133df79ae7SBoyan Karatotevifeq (${ARM_ARCH_MAJOR},7) 143df79ae7SBoyan Karatotev target32-directive = -target arm-none-eabi 153df79ae7SBoyan Karatotev# Will set march-directive from platform configuration 163df79ae7SBoyan Karatotevelse 173df79ae7SBoyan Karatotev target32-directive = -target armv8a-none-eabi 183df79ae7SBoyan Karatotevendif #(ARM_ARCH_MAJOR) 193df79ae7SBoyan Karatotev 203df79ae7SBoyan Karatotevifneq ($(filter %-clang,$($(ARCH)-cc-id)),) 213df79ae7SBoyan Karatotev ifeq ($($(ARCH)-cc-id),arm-clang) 223df79ae7SBoyan Karatotev TF_CFLAGS_aarch32 := -target arm-arm-none-eabi 233df79ae7SBoyan Karatotev TF_CFLAGS_aarch64 := -target aarch64-arm-none-eabi 243df79ae7SBoyan Karatotev else 253df79ae7SBoyan Karatotev TF_CFLAGS_aarch32 = $(target32-directive) 263df79ae7SBoyan Karatotev TF_CFLAGS_aarch64 := -target aarch64-elf 273df79ae7SBoyan Karatotev endif 283df79ae7SBoyan Karatotevendif #(clang) 293df79ae7SBoyan Karatotev 303df79ae7SBoyan Karatotev# Process Debug flag 313df79ae7SBoyan Karatotevifneq (${DEBUG}, 0) 323df79ae7SBoyan Karatotev TF_CFLAGS += -g -gdwarf-4 333df79ae7SBoyan Karatotevendif #(Debug) 343df79ae7SBoyan Karatotev 353df79ae7SBoyan Karatotevifeq (${AARCH32_INSTRUCTION_SET},A32) 363df79ae7SBoyan Karatotev TF_CFLAGS_aarch32 += -marm 373df79ae7SBoyan Karatotevelse ifeq (${AARCH32_INSTRUCTION_SET},T32) 383df79ae7SBoyan Karatotev TF_CFLAGS_aarch32 += -mthumb 393df79ae7SBoyan Karatotevendif #(AARCH32_INSTRUCTION_SET) 403df79ae7SBoyan Karatotev 413df79ae7SBoyan KaratotevTF_CFLAGS_aarch32 += -mno-unaligned-access 423df79ae7SBoyan KaratotevTF_CFLAGS_aarch64 += -mgeneral-regs-only -mstrict-align 433df79ae7SBoyan Karatotev 443df79ae7SBoyan Karatotev############################################################################## 453df79ae7SBoyan Karatotev# WARNINGS Configuration 463df79ae7SBoyan Karatotev############################################################################### 473df79ae7SBoyan Karatotev# General warnings 483df79ae7SBoyan KaratotevWARNINGS := -Wall -Wmissing-include-dirs -Wunused \ 493df79ae7SBoyan Karatotev -Wdisabled-optimization -Wvla -Wshadow \ 503df79ae7SBoyan Karatotev -Wredundant-decls 513df79ae7SBoyan Karatotev# stricter warnings 523df79ae7SBoyan KaratotevWARNINGS += -Wextra -Wno-trigraphs 533df79ae7SBoyan Karatotev# too verbose for generic build 543df79ae7SBoyan KaratotevWARNINGS += -Wno-missing-field-initializers \ 553df79ae7SBoyan Karatotev -Wno-type-limits -Wno-sign-compare \ 563df79ae7SBoyan Karatotev# on clang this flag gets reset if -Wextra is set after it. No difference on gcc 573df79ae7SBoyan KaratotevWARNINGS += -Wno-unused-parameter 583df79ae7SBoyan Karatotev 593df79ae7SBoyan Karatotev# Additional warnings 603df79ae7SBoyan Karatotev# Level 1 - infrequent warnings we should have none of 613df79ae7SBoyan Karatotev# full -Wextra 623df79ae7SBoyan KaratotevWARNING1 += -Wsign-compare 633df79ae7SBoyan KaratotevWARNING1 += -Wtype-limits 643df79ae7SBoyan KaratotevWARNING1 += -Wmissing-field-initializers 653df79ae7SBoyan Karatotev 663df79ae7SBoyan Karatotev# Level 2 - problematic warnings that we want 673df79ae7SBoyan Karatotev# zlib, compiler-rt, coreboot, and mbdedtls blow up with these 683df79ae7SBoyan Karatotev# TODO: disable just for them and move into default build 693df79ae7SBoyan KaratotevWARNING2 += -Wold-style-definition 703df79ae7SBoyan KaratotevWARNING2 += -Wmissing-prototypes 713df79ae7SBoyan KaratotevWARNING2 += -Wmissing-format-attribute 723df79ae7SBoyan Karatotev# TF-A aims to comply with this eventually. Effort too large at present 733df79ae7SBoyan KaratotevWARNING2 += -Wundef 743df79ae7SBoyan Karatotev# currently very involved and many platforms set this off 753df79ae7SBoyan KaratotevWARNING2 += -Wunused-const-variable=2 763df79ae7SBoyan Karatotev 773df79ae7SBoyan Karatotev# Level 3 - very pedantic, frequently ignored 783df79ae7SBoyan KaratotevWARNING3 := -Wbad-function-cast 793df79ae7SBoyan KaratotevWARNING3 += -Waggregate-return 803df79ae7SBoyan KaratotevWARNING3 += -Wnested-externs 813df79ae7SBoyan KaratotevWARNING3 += -Wcast-align 823df79ae7SBoyan KaratotevWARNING3 += -Wcast-qual 833df79ae7SBoyan KaratotevWARNING3 += -Wconversion 843df79ae7SBoyan KaratotevWARNING3 += -Wpacked 853df79ae7SBoyan KaratotevWARNING3 += -Wpointer-arith 863df79ae7SBoyan KaratotevWARNING3 += -Wswitch-default 873df79ae7SBoyan Karatotev 883df79ae7SBoyan Karatotevifeq (${W},1) 893df79ae7SBoyan Karatotev WARNINGS += $(WARNING1) 903df79ae7SBoyan Karatotevelse ifeq (${W},2) 913df79ae7SBoyan Karatotev WARNINGS += $(WARNING1) $(WARNING2) 923df79ae7SBoyan Karatotevelse ifeq (${W},3) 933df79ae7SBoyan Karatotev WARNINGS += $(WARNING1) $(WARNING2) $(WARNING3) 943df79ae7SBoyan Karatotevendif #(W) 953df79ae7SBoyan Karatotev 963df79ae7SBoyan Karatotevifneq (${E},0) 973df79ae7SBoyan Karatotev ERRORS := -Werror 983df79ae7SBoyan Karatotevendif #(E) 993df79ae7SBoyan Karatotev 1003df79ae7SBoyan Karatotev# Compiler specific warnings 1013df79ae7SBoyan Karatotevifeq ($(filter %-clang,$($(ARCH)-cc-id)),) 1023df79ae7SBoyan Karatotev# not using clang 1033df79ae7SBoyan Karatotev# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105523 1043df79ae7SBoyan KaratotevTF_CFLAGS_MIN_PAGE_SIZE := $(call cc_option, --param=min-pagesize=0) 1053df79ae7SBoyan KaratotevTF_CFLAGS += $(TF_CFLAGS_MIN_PAGE_SIZE) 1063df79ae7SBoyan Karatotev 1073df79ae7SBoyan Karatotevifeq ($(HARDEN_SLS), 1) 1083df79ae7SBoyan Karatotev TF_CFLAGS_MHARDEN_SLS := $(call cc_option, -mharden-sls=all) 1093df79ae7SBoyan Karatotev TF_CFLAGS_aarch64 += $(TF_CFLAGS_MHARDEN_SLS) 1103df79ae7SBoyan Karatotevendif 1113df79ae7SBoyan Karatotev 1123df79ae7SBoyan KaratotevWARNINGS += -Wunused-but-set-variable -Wmaybe-uninitialized \ 1133df79ae7SBoyan Karatotev -Wpacked-bitfield-compat -Wshift-overflow=2 \ 1143df79ae7SBoyan Karatotev -Wlogical-op 1153df79ae7SBoyan Karatotev 1163df79ae7SBoyan Karatotevelse 1173df79ae7SBoyan Karatotev# using clang 1183df79ae7SBoyan KaratotevWARNINGS += -Wshift-overflow -Wshift-sign-overflow \ 1193df79ae7SBoyan Karatotev -Wlogical-op-parentheses 1203df79ae7SBoyan Karatotevendif #(Clang Warning) 1213df79ae7SBoyan Karatotev 1223df79ae7SBoyan KaratotevCPPFLAGS = ${DEFINES} ${INCLUDES} ${MBEDTLS_INC} -nostdinc \ 1233df79ae7SBoyan Karatotev $(ERRORS) $(WARNINGS) 1243df79ae7SBoyan Karatotev 1253df79ae7SBoyan Karatotev 1263df79ae7SBoyan KaratotevTF_CFLAGS += -ffunction-sections -fdata-sections \ 1273df79ae7SBoyan Karatotev -ffreestanding -fno-common \ 1283df79ae7SBoyan Karatotev -Os -std=gnu99 1293df79ae7SBoyan Karatotev 1303df79ae7SBoyan Karatotevifneq (${BP_OPTION},none) 1313df79ae7SBoyan Karatotev TF_CFLAGS_aarch64 += -mbranch-protection=${BP_OPTION} 1323df79ae7SBoyan Karatotevendif #(BP_OPTION) 1333df79ae7SBoyan Karatotev 1343df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},on) 1353df79ae7SBoyan Karatotev TF_CFLAGS += -fsanitize=undefined -fno-sanitize-recover 1363df79ae7SBoyan Karatotevendif #(${SANITIZE_UB},on) 1373df79ae7SBoyan Karatotev 1383df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},trap) 1393df79ae7SBoyan Karatotev TF_CFLAGS += -fsanitize=undefined -fno-sanitize-recover \ 1403df79ae7SBoyan Karatotev -fsanitize-undefined-trap-on-error 1413df79ae7SBoyan Karatotevendif #(${SANITIZE_UB},trap) 1423df79ae7SBoyan Karatotev 1433df79ae7SBoyan Karatotevifeq ($($(ARCH)-cc-id),gnu-gcc) 1443df79ae7SBoyan Karatotev # Enable LTO only for aarch64 1453df79ae7SBoyan Karatotev LTO_CFLAGS = $(if $(filter-out 0,$(ENABLE_LTO)),-flto) 1463df79ae7SBoyan Karatotevendif #(gnu-gcc) 1473df79ae7SBoyan Karatotev 1483df79ae7SBoyan Karatotevifeq (${ERROR_DEPRECATED},0) 1493df79ae7SBoyan Karatotev# Check if deprecated declarations and cpp warnings should be treated as error or not. 1503df79ae7SBoyan Karatotevifneq ($(filter %-clang,$($(ARCH)-cc-id)),) 1513df79ae7SBoyan Karatotev CPPFLAGS += -Wno-error=deprecated-declarations 1523df79ae7SBoyan Karatotevelse 1533df79ae7SBoyan Karatotev CPPFLAGS += -Wno-error=deprecated-declarations -Wno-error=cpp 1543df79ae7SBoyan Karatotevendif 1553df79ae7SBoyan Karatotevendif #(!ERROR_DEPRECATED) 1563df79ae7SBoyan Karatotev 1573df79ae7SBoyan Karatotev################################################################################ 1583df79ae7SBoyan Karatotev# Platform specific Makefile might provide us ARCH_MAJOR/MINOR use that to come 1593df79ae7SBoyan Karatotev# up with appropriate march values for compiler. 1603df79ae7SBoyan Karatotev################################################################################ 1613df79ae7SBoyan Karatotevinclude ${MAKE_HELPERS_DIRECTORY}march.mk 1623df79ae7SBoyan Karatotevifeq (${ARM_ARCH_MAJOR},7) 1633df79ae7SBoyan Karatotevinclude make_helpers/armv7-a-cpus.mk 1643df79ae7SBoyan Karatotevendif 1653df79ae7SBoyan Karatotev 1663df79ae7SBoyan KaratotevTF_CFLAGS += $(march-directive) 1673df79ae7SBoyan Karatotev 1683df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),) 1693df79ae7SBoyan Karatotev TF_CFLAGS += -fno-PIE 1703df79ae7SBoyan Karatotevendif 1713df79ae7SBoyan Karatotev 1723df79ae7SBoyan KaratotevTF_CFLAGS += $(CPPFLAGS) $(TF_CFLAGS_$(ARCH)) 1736bb9f053SBoyan KaratotevTF_CFLAGS += $(CFLAGS) 174*7416eb2fSBoyan KaratotevASFLAGS += -Wa,--fatal-warnings 1753df79ae7SBoyan KaratotevTF_LDFLAGS += -z noexecstack 1763df79ae7SBoyan Karatotev 1773df79ae7SBoyan Karatotev# LD = armlink 1783df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),arm-link) 1793df79ae7SBoyan Karatotev TF_LDFLAGS += --diag_error=warning --lto_level=O1 1803df79ae7SBoyan Karatotev TF_LDFLAGS += --remove --info=unused,unusedsymbols 1813df79ae7SBoyan Karatotev TF_LDFLAGS += $(TF_LDFLAGS_$(ARCH)) 1823df79ae7SBoyan Karatotev 1833df79ae7SBoyan Karatotev# LD = gcc (used when GCC LTO is enabled) 1843df79ae7SBoyan Karatotevelse ifeq ($($(ARCH)-ld-id),gnu-gcc) 1853df79ae7SBoyan Karatotev # Pass ld options with Wl or Xlinker switches 1863df79ae7SBoyan Karatotev TF_LDFLAGS += $(call ld_option,-Xlinker --no-warn-rwx-segments) 1873df79ae7SBoyan Karatotev TF_LDFLAGS += -Wl,--fatal-warnings -O1 1883df79ae7SBoyan Karatotev TF_LDFLAGS += -Wl,--gc-sections 1893df79ae7SBoyan Karatotev 1903df79ae7SBoyan Karatotev TF_LDFLAGS += -Wl,-z,common-page-size=4096 #Configure page size constants 1913df79ae7SBoyan Karatotev TF_LDFLAGS += -Wl,-z,max-page-size=4096 1923df79ae7SBoyan Karatotev TF_LDFLAGS += -Wl,--build-id=none 1933df79ae7SBoyan Karatotev 1943df79ae7SBoyan Karatotev ifeq ($(ENABLE_LTO),1) 1953df79ae7SBoyan Karatotev TF_LDFLAGS += -flto -fuse-linker-plugin 1963df79ae7SBoyan Karatotev TF_LDFLAGS += -flto-partition=one 1973df79ae7SBoyan Karatotev endif #(ENABLE_LTO) 1983df79ae7SBoyan Karatotev 1993df79ae7SBoyan Karatotev# GCC automatically adds fix-cortex-a53-843419 flag when used to link 2003df79ae7SBoyan Karatotev# which breaks some builds, so disable if errata fix is not explicitly enabled 2013df79ae7SBoyan Karatotev ifeq (${ARCH},aarch64) 2023df79ae7SBoyan Karatotev ifneq (${ERRATA_A53_843419},1) 2033df79ae7SBoyan Karatotev TF_LDFLAGS += -mno-fix-cortex-a53-843419 2043df79ae7SBoyan Karatotev endif 2053df79ae7SBoyan Karatotev endif 2063df79ae7SBoyan Karatotev TF_LDFLAGS += -nostdlib 2073df79ae7SBoyan Karatotev TF_LDFLAGS += $(subst --,-Xlinker --,$(TF_LDFLAGS_$(ARCH))) 2083df79ae7SBoyan Karatotev 2093df79ae7SBoyan Karatotev# LD = gcc-ld (ld) or llvm-ld (ld.lld) or other 2103df79ae7SBoyan Karatotevelse 2113df79ae7SBoyan Karatotev# With ld.bfd version 2.39 and newer new warnings are added. Skip those since we 2123df79ae7SBoyan Karatotev# are not loaded by a elf loader. 2133df79ae7SBoyan Karatotev TF_LDFLAGS += $(call ld_option, --no-warn-rwx-segments) 2143df79ae7SBoyan Karatotev TF_LDFLAGS += -O1 2153df79ae7SBoyan Karatotev TF_LDFLAGS += --gc-sections 2163df79ae7SBoyan Karatotev 2173df79ae7SBoyan Karatotev TF_LDFLAGS += -z common-page-size=4096 # Configure page size constants 2183df79ae7SBoyan Karatotev TF_LDFLAGS += -z max-page-size=4096 2193df79ae7SBoyan Karatotev TF_LDFLAGS += --build-id=none 2203df79ae7SBoyan Karatotev 2213df79ae7SBoyan Karatotev# ld.lld doesn't recognize the errata flags, 2223df79ae7SBoyan Karatotev# therefore don't add those in that case. 2233df79ae7SBoyan Karatotev# ld.lld reports section type mismatch warnings, 2243df79ae7SBoyan Karatotev# therefore don't add --fatal-warnings to it. 2253df79ae7SBoyan Karatotev ifneq ($($(ARCH)-ld-id),llvm-lld) 2263df79ae7SBoyan Karatotev TF_LDFLAGS += $(TF_LDFLAGS_$(ARCH)) --fatal-warnings 2273df79ae7SBoyan Karatotev endif 2283df79ae7SBoyan Karatotev 2293df79ae7SBoyan Karatotevendif #(LD = armlink) 2303df79ae7SBoyan Karatotev 2313df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),) 2323df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc) 2333df79ae7SBoyan Karatotev TF_LDFLAGS += -no-pie 2343df79ae7SBoyan Karatotevendif 2353df79ae7SBoyan Karatotevendif #(PIE_FOUND) 2363df79ae7SBoyan Karatotev 2373df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc) 2383df79ae7SBoyan Karatotev PIE_LDFLAGS += -Wl,-pie -Wl,--no-dynamic-linker 2393df79ae7SBoyan Karatotevelse 2403df79ae7SBoyan Karatotev PIE_LDFLAGS += -pie --no-dynamic-linker 2413df79ae7SBoyan Karatotevendif 2423df79ae7SBoyan Karatotev 2433df79ae7SBoyan Karatotevifeq ($(ENABLE_PIE),1) 2443df79ae7SBoyan Karatotev ifeq ($(RESET_TO_BL2),1) 2453df79ae7SBoyan Karatotev ifneq ($(BL2_IN_XIP_MEM),1) 2463df79ae7SBoyan Karatotev BL2_CPPFLAGS += -fpie 2473df79ae7SBoyan Karatotev BL2_CFLAGS += -fpie 2483df79ae7SBoyan Karatotev BL2_LDFLAGS += $(PIE_LDFLAGS) 2493df79ae7SBoyan Karatotev endif #(BL2_IN_XIP_MEM) 2503df79ae7SBoyan Karatotev endif #(RESET_TO_BL2) 2513df79ae7SBoyan Karatotev BL31_CPPFLAGS += -fpie 2523df79ae7SBoyan Karatotev BL31_CFLAGS += -fpie 2533df79ae7SBoyan Karatotev BL31_LDFLAGS += $(PIE_LDFLAGS) 2543df79ae7SBoyan Karatotev 2553df79ae7SBoyan Karatotev BL32_CPPFLAGS += -fpie 2563df79ae7SBoyan Karatotev BL32_CFLAGS += -fpie 2573df79ae7SBoyan Karatotev BL32_LDFLAGS += $(PIE_LDFLAGS) 2583df79ae7SBoyan Karatotevendif #(ENABLE_PIE) 2593df79ae7SBoyan Karatotev 2603df79ae7SBoyan KaratotevBL1_CPPFLAGS += -DREPORT_ERRATA=${DEBUG} 2613df79ae7SBoyan KaratotevBL31_CPPFLAGS += -DREPORT_ERRATA=${DEBUG} 2623df79ae7SBoyan KaratotevBL32_CPPFLAGS += -DREPORT_ERRATA=${DEBUG} 2633df79ae7SBoyan Karatotev 2643df79ae7SBoyan KaratotevBL1_CPPFLAGS += -DIMAGE_AT_EL3 2653df79ae7SBoyan Karatotevifeq ($(RESET_TO_BL2),1) 2663df79ae7SBoyan Karatotev BL2_CPPFLAGS += -DIMAGE_AT_EL3 2673df79ae7SBoyan Karatotevelse 2683df79ae7SBoyan Karatotev BL2_CPPFLAGS += -DIMAGE_AT_EL1 2693df79ae7SBoyan Karatotevendif #(RESET_TO_BL2) 2703df79ae7SBoyan Karatotev 2713df79ae7SBoyan Karatotevifeq (${ARCH},aarch64) 2723df79ae7SBoyan Karatotev BL2U_CPPFLAGS += -DIMAGE_AT_EL1 2733df79ae7SBoyan Karatotev BL31_CPPFLAGS += -DIMAGE_AT_EL3 2743df79ae7SBoyan Karatotev BL32_CPPFLAGS += -DIMAGE_AT_EL1 2753df79ae7SBoyan Karatotevelse 2763df79ae7SBoyan Karatotev BL32_CPPFLAGS += -DIMAGE_AT_EL3 2773df79ae7SBoyan Karatotevendif 2783df79ae7SBoyan Karatotev 2793df79ae7SBoyan Karatotevifeq (${SPD},spmd) 2803df79ae7SBoyan Karatotev ifeq ($(findstring optee_sp,$(ARM_SPMC_MANIFEST_DTS)),optee_sp) 2813df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DOPTEE_SP_FW_CONFIG 2823df79ae7SBoyan Karatotev endif 2833df79ae7SBoyan Karatotev 2843df79ae7SBoyan Karatotev ifeq ($(findstring trusty_sp,$(ARM_SPMC_MANIFEST_DTS)),trusty_sp) 2853df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DTRUSTY_SP_FW_CONFIG 2863df79ae7SBoyan Karatotev endif 2873df79ae7SBoyan Karatotev 2883df79ae7SBoyan Karatotev ifeq ($(TS_SP_FW_CONFIG),1) 2893df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DTS_SP_FW_CONFIG 2903df79ae7SBoyan Karatotev endif 2913df79ae7SBoyan Karatotev 2923df79ae7SBoyan Karatotev ifneq ($(ARM_BL2_SP_LIST_DTS),) 2933df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DARM_BL2_SP_LIST_DTS=$(ARM_BL2_SP_LIST_DTS) 2943df79ae7SBoyan Karatotev endif 2953df79ae7SBoyan Karatotevendif 2963df79ae7SBoyan Karatotev 2973df79ae7SBoyan Karatotev 2983df79ae7SBoyan KaratotevDTC_FLAGS += -I dts -O dtb 2991e8b5354SBoyan KaratotevDTC_CPPFLAGS += -Ifdts -undef 3003df79ae7SBoyan Karatotev 301