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################################################################################ 11*885ed9e0SBoyan Karatotev# Compiler Configuration for the correct ARCH 123df79ae7SBoyan Karatotev################################################################################ 13*885ed9e0SBoyan Karatotevtarget-aarch32-arm-clang := -target arm-arm-none-eabi 14*885ed9e0SBoyan Karatotevtarget-aarch64-arm-clang := -target aarch64-arm-none-eabi 153df79ae7SBoyan Karatotevifeq (${ARM_ARCH_MAJOR},7) 16*885ed9e0SBoyan Karatotev target-aarch32-llvm-clang := -target arm-none-eabi 173df79ae7SBoyan Karatotevelse 18*885ed9e0SBoyan Karatotev target-aarch32-llvm-clang := -target armv8a-none-eabi 193df79ae7SBoyan Karatotevendif #(ARM_ARCH_MAJOR) 20*885ed9e0SBoyan Karatotevtarget-aarch64-llvm-clang := -target aarch64-elf 213df79ae7SBoyan Karatotev 223df79ae7SBoyan Karatotevifneq (${DEBUG}, 0) 23*885ed9e0SBoyan Karatotev cflags-common += -g -gdwarf-4 243df79ae7SBoyan Karatotevendif #(Debug) 253df79ae7SBoyan Karatotev 263df79ae7SBoyan Karatotevifeq (${AARCH32_INSTRUCTION_SET},A32) 27*885ed9e0SBoyan Karatotev cflags-aarch32 := -marm 283df79ae7SBoyan Karatotevelse ifeq (${AARCH32_INSTRUCTION_SET},T32) 29*885ed9e0SBoyan Karatotev cflags-aarch32 := -mthumb 303df79ae7SBoyan Karatotevendif #(AARCH32_INSTRUCTION_SET) 313df79ae7SBoyan Karatotev 32*885ed9e0SBoyan Karatotevcflags-aarch32 += -mno-unaligned-access 33*885ed9e0SBoyan Karatotevcflags-aarch64 := -mgeneral-regs-only -mstrict-align 34*885ed9e0SBoyan Karatotev 35*885ed9e0SBoyan Karatotevcflags-common += $(cflags-$(ARCH)) 363df79ae7SBoyan Karatotev 373df79ae7SBoyan Karatotev############################################################################## 383df79ae7SBoyan Karatotev# WARNINGS Configuration 393df79ae7SBoyan Karatotev############################################################################### 403df79ae7SBoyan Karatotev# General warnings 41*885ed9e0SBoyan KaratotevWARNING0 := -Wall -Wmissing-include-dirs -Wunused \ 423df79ae7SBoyan Karatotev -Wdisabled-optimization -Wvla -Wshadow \ 433df79ae7SBoyan Karatotev -Wredundant-decls 443df79ae7SBoyan Karatotev# stricter warnings 45*885ed9e0SBoyan KaratotevWARNING0 += -Wextra -Wno-trigraphs 463df79ae7SBoyan Karatotev# too verbose for generic build 47*885ed9e0SBoyan KaratotevWARNING0 += -Wno-missing-field-initializers \ 483df79ae7SBoyan Karatotev -Wno-type-limits -Wno-sign-compare \ 493df79ae7SBoyan Karatotev# on clang this flag gets reset if -Wextra is set after it. No difference on gcc 50*885ed9e0SBoyan KaratotevWARNING0 += -Wno-unused-parameter 513df79ae7SBoyan Karatotev 523df79ae7SBoyan Karatotev# Additional warnings 533df79ae7SBoyan Karatotev# Level 1 - infrequent warnings we should have none of 543df79ae7SBoyan Karatotev# full -Wextra 55*885ed9e0SBoyan KaratotevWARNING1 := $(WARNING0) 563df79ae7SBoyan KaratotevWARNING1 += -Wsign-compare 573df79ae7SBoyan KaratotevWARNING1 += -Wtype-limits 583df79ae7SBoyan KaratotevWARNING1 += -Wmissing-field-initializers 593df79ae7SBoyan Karatotev 603df79ae7SBoyan Karatotev# Level 2 - problematic warnings that we want 613df79ae7SBoyan Karatotev# zlib, compiler-rt, coreboot, and mbdedtls blow up with these 623df79ae7SBoyan Karatotev# TODO: disable just for them and move into default build 63*885ed9e0SBoyan KaratotevWARNING2 := $(WARNING1) 643df79ae7SBoyan KaratotevWARNING2 += -Wold-style-definition 653df79ae7SBoyan KaratotevWARNING2 += -Wmissing-prototypes 663df79ae7SBoyan KaratotevWARNING2 += -Wmissing-format-attribute 673df79ae7SBoyan Karatotev# TF-A aims to comply with this eventually. Effort too large at present 683df79ae7SBoyan KaratotevWARNING2 += -Wundef 693df79ae7SBoyan Karatotev# currently very involved and many platforms set this off 703df79ae7SBoyan KaratotevWARNING2 += -Wunused-const-variable=2 713df79ae7SBoyan Karatotev 723df79ae7SBoyan Karatotev# Level 3 - very pedantic, frequently ignored 73*885ed9e0SBoyan KaratotevWARNING3 := $(WARNING2) 74*885ed9e0SBoyan KaratotevWARNING3 += -Wbad-function-cast 753df79ae7SBoyan KaratotevWARNING3 += -Waggregate-return 763df79ae7SBoyan KaratotevWARNING3 += -Wnested-externs 773df79ae7SBoyan KaratotevWARNING3 += -Wcast-align 783df79ae7SBoyan KaratotevWARNING3 += -Wcast-qual 793df79ae7SBoyan KaratotevWARNING3 += -Wconversion 803df79ae7SBoyan KaratotevWARNING3 += -Wpacked 813df79ae7SBoyan KaratotevWARNING3 += -Wpointer-arith 823df79ae7SBoyan KaratotevWARNING3 += -Wswitch-default 833df79ae7SBoyan Karatotev 84*885ed9e0SBoyan Karatotevcflags-common += $(WARNING$(W)) 853df79ae7SBoyan Karatotevifneq (${E},0) 86*885ed9e0SBoyan Karatotev cflags-common += -Werror 873df79ae7SBoyan Karatotevendif #(E) 883df79ae7SBoyan Karatotev 893df79ae7SBoyan Karatotev# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105523 903df79ae7SBoyan KaratotevTF_CFLAGS_MIN_PAGE_SIZE := $(call cc_option, --param=min-pagesize=0) 913df79ae7SBoyan Karatotevifeq ($(HARDEN_SLS), 1) 923df79ae7SBoyan Karatotev TF_CFLAGS_MHARDEN_SLS := $(call cc_option, -mharden-sls=all) 933df79ae7SBoyan Karatotevendif 943df79ae7SBoyan Karatotev 95*885ed9e0SBoyan KaratotevLTO_CFLAGS := $(if $(call bool,$(ENABLE_LTO)),-flto) 96*885ed9e0SBoyan Karatotev 97*885ed9e0SBoyan Karatotev# Compiler specific warnings 98*885ed9e0SBoyan Karatotevcc-flags-gnu-gcc += -Wunused-but-set-variable -Wmaybe-uninitialized \ 993df79ae7SBoyan Karatotev -Wpacked-bitfield-compat -Wshift-overflow=2 \ 100*885ed9e0SBoyan Karatotev -Wlogical-op $(TF_CFLAGS_MIN_PAGE_SIZE) $(TF_CFLAGS_MHARDEN_SLS) 101*885ed9e0SBoyan Karatotevcc-flags-llvm-clang += -Wshift-overflow -Wshift-sign-overflow \ 1023df79ae7SBoyan Karatotev -Wlogical-op-parentheses 103*885ed9e0SBoyan Karatotev# arm-clang has the same flags 104*885ed9e0SBoyan Karatotevcc-flags-arm-clang += $(cc-flags-llvm-clang) 1053df79ae7SBoyan Karatotev 106*885ed9e0SBoyan Karatotevcflags-common += ${DEFINES} ${INCLUDES} ${MBEDTLS_INC} -nostdinc 1073df79ae7SBoyan Karatotev 108*885ed9e0SBoyan Karatotevcflags-common += -ffunction-sections -fdata-sections \ 1093df79ae7SBoyan Karatotev -ffreestanding -fno-common \ 1103df79ae7SBoyan Karatotev -Os -std=gnu99 1113df79ae7SBoyan Karatotev 1123df79ae7SBoyan Karatotevifneq (${BP_OPTION},none) 113*885ed9e0SBoyan Karatotev cflags-common += -mbranch-protection=${BP_OPTION} 1143df79ae7SBoyan Karatotevendif #(BP_OPTION) 1153df79ae7SBoyan Karatotev 1163df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},on) 117*885ed9e0SBoyan Karatotev cflags-common += -fsanitize=undefined -fno-sanitize-recover 1183df79ae7SBoyan Karatotevendif #(${SANITIZE_UB},on) 1193df79ae7SBoyan Karatotev 1203df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},trap) 121*885ed9e0SBoyan Karatotev cflags-common += -fsanitize=undefined -fno-sanitize-recover \ 1223df79ae7SBoyan Karatotev -fsanitize-undefined-trap-on-error 1233df79ae7SBoyan Karatotevendif #(${SANITIZE_UB},trap) 1243df79ae7SBoyan Karatotev 1253df79ae7SBoyan Karatotevifeq (${ERROR_DEPRECATED},0) 126*885ed9e0SBoyan Karatotev cflags-common += -Wno-error=deprecated-declarations 127*885ed9e0SBoyan Karatotev cflags-common += -Wno-error=cpp 1283df79ae7SBoyan Karatotevendif #(!ERROR_DEPRECATED) 1293df79ae7SBoyan Karatotev 1303df79ae7SBoyan Karatotev################################################################################ 1313df79ae7SBoyan Karatotev# Platform specific Makefile might provide us ARCH_MAJOR/MINOR use that to come 1323df79ae7SBoyan Karatotev# up with appropriate march values for compiler. 1333df79ae7SBoyan Karatotev################################################################################ 1343df79ae7SBoyan Karatotevinclude ${MAKE_HELPERS_DIRECTORY}march.mk 1353df79ae7SBoyan Karatotevifeq (${ARM_ARCH_MAJOR},7) 1363df79ae7SBoyan Karatotevinclude make_helpers/armv7-a-cpus.mk 1373df79ae7SBoyan Karatotevendif 1383df79ae7SBoyan Karatotev 139*885ed9e0SBoyan Karatotevcflags-common += $(march-directive) 1403df79ae7SBoyan Karatotev 1413df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),) 142*885ed9e0SBoyan Karatotev cflags-common += -fno-PIE 1433df79ae7SBoyan Karatotevendif 1443df79ae7SBoyan Karatotev 145*885ed9e0SBoyan Karatotevcflags-common += $(TF_CFLAGS_$(ARCH)) 146*885ed9e0SBoyan Karatotevcflags-common += $(CPPFLAGS) $(CFLAGS) # some platforms set these 147*885ed9e0SBoyan KaratotevTF_CFLAGS += $(cflags-common) 148*885ed9e0SBoyan KaratotevTF_CFLAGS += $(target-$(ARCH)-$($(ARCH)-cc-id)) 149*885ed9e0SBoyan KaratotevTF_CFLAGS += $(cc-flags-$($(ARCH)-cc-id)) 150*885ed9e0SBoyan Karatotev 151*885ed9e0SBoyan Karatotev# it's logical to give the same flags to the linker when it's invoked through 152*885ed9e0SBoyan Karatotev# the compiler. This is requied for LTO to work correctly 153*885ed9e0SBoyan Karatotevifeq ($($(ARCH)-ld-id),$($(ARCH)-cc-id)) 154*885ed9e0SBoyan Karatotev TF_LDFLAGS += $(cflags-common) 155*885ed9e0SBoyan Karatotev TF_LDFLAGS += $(cc-flags-$($(ARCH)-ld-id)) 156*885ed9e0SBoyan Karatotev TF_LDFLAGS += $(LTO_CFLAGS) 157*885ed9e0SBoyan Karatotevendif 158*885ed9e0SBoyan Karatotev 159*885ed9e0SBoyan KaratotevTF_LDFLAGS += $(target-$(ARCH)-$($(ARCH)-ld-id)) 160*885ed9e0SBoyan 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 TF_LDFLAGS += $(TF_LDFLAGS_$(ARCH)) 1693df79ae7SBoyan Karatotev 1703df79ae7SBoyan Karatotev# LD = gcc (used when GCC LTO is enabled) 1713df79ae7SBoyan Karatotevelse ifeq ($($(ARCH)-ld-id),gnu-gcc) 1723df79ae7SBoyan Karatotev # Pass ld options with Wl or Xlinker switches 1733df79ae7SBoyan Karatotev TF_LDFLAGS += $(call ld_option,-Xlinker --no-warn-rwx-segments) 174*885ed9e0SBoyan Karatotev TF_LDFLAGS += -Wl,--fatal-warnings 1753df79ae7SBoyan Karatotev TF_LDFLAGS += -Wl,--gc-sections 1763df79ae7SBoyan Karatotev 1773df79ae7SBoyan Karatotev TF_LDFLAGS += -Wl,-z,common-page-size=4096 #Configure page size constants 1783df79ae7SBoyan Karatotev TF_LDFLAGS += -Wl,-z,max-page-size=4096 1793df79ae7SBoyan Karatotev TF_LDFLAGS += -Wl,--build-id=none 1803df79ae7SBoyan Karatotev 1813df79ae7SBoyan Karatotev ifeq ($(ENABLE_LTO),1) 182*885ed9e0SBoyan Karatotev TF_LDFLAGS += -fuse-linker-plugin 1833df79ae7SBoyan Karatotev TF_LDFLAGS += -flto-partition=one 1843df79ae7SBoyan Karatotev endif #(ENABLE_LTO) 1853df79ae7SBoyan Karatotev 1863df79ae7SBoyan Karatotev TF_LDFLAGS += -nostdlib 1873df79ae7SBoyan Karatotev TF_LDFLAGS += $(subst --,-Xlinker --,$(TF_LDFLAGS_$(ARCH))) 1883df79ae7SBoyan Karatotev 1893df79ae7SBoyan Karatotev# LD = gcc-ld (ld) or llvm-ld (ld.lld) or other 1903df79ae7SBoyan Karatotevelse 1913df79ae7SBoyan Karatotev# With ld.bfd version 2.39 and newer new warnings are added. Skip those since we 1923df79ae7SBoyan Karatotev# are not loaded by a elf loader. 1933df79ae7SBoyan Karatotev TF_LDFLAGS += $(call ld_option, --no-warn-rwx-segments) 1943df79ae7SBoyan Karatotev TF_LDFLAGS += -O1 1953df79ae7SBoyan Karatotev TF_LDFLAGS += --gc-sections 1963df79ae7SBoyan Karatotev 1973df79ae7SBoyan Karatotev TF_LDFLAGS += -z common-page-size=4096 # Configure page size constants 1983df79ae7SBoyan Karatotev TF_LDFLAGS += -z max-page-size=4096 1993df79ae7SBoyan Karatotev TF_LDFLAGS += --build-id=none 2003df79ae7SBoyan Karatotev 2013df79ae7SBoyan Karatotev# ld.lld doesn't recognize the errata flags, 2023df79ae7SBoyan Karatotev# therefore don't add those in that case. 2033df79ae7SBoyan Karatotev# ld.lld reports section type mismatch warnings, 2043df79ae7SBoyan Karatotev# therefore don't add --fatal-warnings to it. 2053df79ae7SBoyan Karatotev ifneq ($($(ARCH)-ld-id),llvm-lld) 2063df79ae7SBoyan Karatotev TF_LDFLAGS += $(TF_LDFLAGS_$(ARCH)) --fatal-warnings 2073df79ae7SBoyan Karatotev endif 2083df79ae7SBoyan Karatotev 2093df79ae7SBoyan Karatotevendif #(LD = armlink) 2103df79ae7SBoyan Karatotev 2113df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),) 2123df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc) 2133df79ae7SBoyan Karatotev TF_LDFLAGS += -no-pie 2143df79ae7SBoyan Karatotevendif 2153df79ae7SBoyan Karatotevendif #(PIE_FOUND) 2163df79ae7SBoyan Karatotev 2173df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc) 2183df79ae7SBoyan Karatotev PIE_LDFLAGS += -Wl,-pie -Wl,--no-dynamic-linker 2193df79ae7SBoyan Karatotevelse 2203df79ae7SBoyan Karatotev PIE_LDFLAGS += -pie --no-dynamic-linker 2213df79ae7SBoyan Karatotevendif 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