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 153df79ae7SBoyan Karatotevifeq (${ARM_ARCH_MAJOR},7) 16885ed9e0SBoyan Karatotev target-aarch32-llvm-clang := -target arm-none-eabi 173df79ae7SBoyan Karatotevelse 18885ed9e0SBoyan Karatotev target-aarch32-llvm-clang := -target armv8a-none-eabi 193df79ae7SBoyan Karatotevendif #(ARM_ARCH_MAJOR) 20885ed9e0SBoyan Karatotevtarget-aarch64-llvm-clang := -target aarch64-elf 213df79ae7SBoyan Karatotev 223df79ae7SBoyan Karatotevifneq (${DEBUG}, 0) 23885ed9e0SBoyan Karatotev cflags-common += -g -gdwarf-4 243df79ae7SBoyan Karatotevendif #(Debug) 253df79ae7SBoyan Karatotev 263df79ae7SBoyan Karatotevifeq (${AARCH32_INSTRUCTION_SET},A32) 27885ed9e0SBoyan Karatotev cflags-aarch32 := -marm 283df79ae7SBoyan Karatotevelse ifeq (${AARCH32_INSTRUCTION_SET},T32) 29885ed9e0SBoyan Karatotev cflags-aarch32 := -mthumb 303df79ae7SBoyan Karatotevendif #(AARCH32_INSTRUCTION_SET) 313df79ae7SBoyan Karatotev 32885ed9e0SBoyan Karatotevcflags-aarch32 += -mno-unaligned-access 33885ed9e0SBoyan Karatotevcflags-aarch64 := -mgeneral-regs-only -mstrict-align 34885ed9e0SBoyan Karatotev 35885ed9e0SBoyan Karatotevcflags-common += $(cflags-$(ARCH)) 363df79ae7SBoyan Karatotev 373df79ae7SBoyan Karatotev############################################################################## 383df79ae7SBoyan Karatotev# WARNINGS Configuration 393df79ae7SBoyan Karatotev############################################################################### 403df79ae7SBoyan Karatotev# General warnings 41885ed9e0SBoyan KaratotevWARNING0 := -Wall -Wmissing-include-dirs -Wunused \ 423df79ae7SBoyan Karatotev -Wdisabled-optimization -Wvla -Wshadow \ 433df79ae7SBoyan Karatotev -Wredundant-decls 443df79ae7SBoyan Karatotev# stricter warnings 45885ed9e0SBoyan KaratotevWARNING0 += -Wextra -Wno-trigraphs 463df79ae7SBoyan Karatotev# too verbose for generic build 47885ed9e0SBoyan 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 50885ed9e0SBoyan 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 55885ed9e0SBoyan 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 63885ed9e0SBoyan 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 73885ed9e0SBoyan KaratotevWARNING3 := $(WARNING2) 74885ed9e0SBoyan 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 84885ed9e0SBoyan Karatotevcflags-common += $(WARNING$(W)) 853df79ae7SBoyan Karatotevifneq (${E},0) 86885ed9e0SBoyan 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 95885ed9e0SBoyan KaratotevLTO_CFLAGS := $(if $(call bool,$(ENABLE_LTO)),-flto) 96885ed9e0SBoyan Karatotev 97885ed9e0SBoyan Karatotev# Compiler specific warnings 98885ed9e0SBoyan Karatotevcc-flags-gnu-gcc += -Wunused-but-set-variable -Wmaybe-uninitialized \ 993df79ae7SBoyan Karatotev -Wpacked-bitfield-compat -Wshift-overflow=2 \ 100885ed9e0SBoyan Karatotev -Wlogical-op $(TF_CFLAGS_MIN_PAGE_SIZE) $(TF_CFLAGS_MHARDEN_SLS) 101885ed9e0SBoyan Karatotevcc-flags-llvm-clang += -Wshift-overflow -Wshift-sign-overflow \ 1023df79ae7SBoyan Karatotev -Wlogical-op-parentheses 103885ed9e0SBoyan Karatotev# arm-clang has the same flags 104885ed9e0SBoyan Karatotevcc-flags-arm-clang += $(cc-flags-llvm-clang) 1053df79ae7SBoyan Karatotev 106885ed9e0SBoyan Karatotevcflags-common += ${DEFINES} ${INCLUDES} ${MBEDTLS_INC} -nostdinc 1073df79ae7SBoyan Karatotev 108885ed9e0SBoyan Karatotevcflags-common += -ffunction-sections -fdata-sections \ 1093df79ae7SBoyan Karatotev -ffreestanding -fno-common \ 1103df79ae7SBoyan Karatotev -Os -std=gnu99 1113df79ae7SBoyan Karatotev 1123df79ae7SBoyan Karatotevifneq (${BP_OPTION},none) 113885ed9e0SBoyan Karatotev cflags-common += -mbranch-protection=${BP_OPTION} 1143df79ae7SBoyan Karatotevendif #(BP_OPTION) 1153df79ae7SBoyan Karatotev 1163df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},on) 117885ed9e0SBoyan Karatotev cflags-common += -fsanitize=undefined -fno-sanitize-recover 1183df79ae7SBoyan Karatotevendif #(${SANITIZE_UB},on) 1193df79ae7SBoyan Karatotev 1203df79ae7SBoyan Karatotevifeq (${SANITIZE_UB},trap) 121885ed9e0SBoyan 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) 126885ed9e0SBoyan Karatotev cflags-common += -Wno-error=deprecated-declarations 127885ed9e0SBoyan 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 139885ed9e0SBoyan Karatotevcflags-common += $(march-directive) 1403df79ae7SBoyan Karatotev 1413df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),) 142885ed9e0SBoyan Karatotev cflags-common += -fno-PIE 1433df79ae7SBoyan Karatotevendif 1443df79ae7SBoyan Karatotev 145*6c2e5bf6SBoyan Karatotevifeq ($(ENABLE_LTO),1) 146*6c2e5bf6SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc) 147*6c2e5bf6SBoyan Karatotev cflags-common += -flto-partition=one 148*6c2e5bf6SBoyan Karatotevendif 149*6c2e5bf6SBoyan Karatotevendif 150*6c2e5bf6SBoyan Karatotev 151885ed9e0SBoyan Karatotevcflags-common += $(TF_CFLAGS_$(ARCH)) 152885ed9e0SBoyan Karatotevcflags-common += $(CPPFLAGS) $(CFLAGS) # some platforms set these 153885ed9e0SBoyan KaratotevTF_CFLAGS += $(cflags-common) 154885ed9e0SBoyan KaratotevTF_CFLAGS += $(target-$(ARCH)-$($(ARCH)-cc-id)) 155885ed9e0SBoyan KaratotevTF_CFLAGS += $(cc-flags-$($(ARCH)-cc-id)) 156885ed9e0SBoyan Karatotev 157885ed9e0SBoyan Karatotev# it's logical to give the same flags to the linker when it's invoked through 158885ed9e0SBoyan Karatotev# the compiler. This is requied for LTO to work correctly 159885ed9e0SBoyan Karatotevifeq ($($(ARCH)-ld-id),$($(ARCH)-cc-id)) 160885ed9e0SBoyan Karatotev TF_LDFLAGS += $(cflags-common) 161885ed9e0SBoyan Karatotev TF_LDFLAGS += $(cc-flags-$($(ARCH)-ld-id)) 162885ed9e0SBoyan Karatotev TF_LDFLAGS += $(LTO_CFLAGS) 163885ed9e0SBoyan Karatotevendif 164885ed9e0SBoyan Karatotev 165885ed9e0SBoyan KaratotevTF_LDFLAGS += $(target-$(ARCH)-$($(ARCH)-ld-id)) 166885ed9e0SBoyan Karatotev 1677416eb2fSBoyan KaratotevASFLAGS += -Wa,--fatal-warnings 1683df79ae7SBoyan KaratotevTF_LDFLAGS += -z noexecstack 1693df79ae7SBoyan Karatotev 1703df79ae7SBoyan Karatotev# LD = armlink 1713df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),arm-link) 1723df79ae7SBoyan Karatotev TF_LDFLAGS += --diag_error=warning --lto_level=O1 1733df79ae7SBoyan Karatotev TF_LDFLAGS += --remove --info=unused,unusedsymbols 1743df79ae7SBoyan Karatotev 175*6c2e5bf6SBoyan Karatotev# LD = gcc or clang 176*6c2e5bf6SBoyan Karatotevelse 177*6c2e5bf6SBoyan Karatotev ldflags-common := $(call ld_option,--no-warn-rwx-segments) 178*6c2e5bf6SBoyan Karatotev # ld.lld reports section type mismatch warnings, 179*6c2e5bf6SBoyan Karatotev # so don't add --fatal-warnings to it. 180*6c2e5bf6SBoyan Karatotev ifneq ($($(ARCH)-ld-id),$(filter $($(ARCH)-ld-id),llvm-clang llvm-lld)) 181*6c2e5bf6SBoyan Karatotev ldflags-common += $(call ld_prefix,--fatal-warnings) 182*6c2e5bf6SBoyan Karatotev endif 183*6c2e5bf6SBoyan Karatotev ldflags-common += $(call ld_prefix,--gc-sections) 184*6c2e5bf6SBoyan Karatotev ldflags-common += -z common-page-size=4096 # Configure page size constants 185*6c2e5bf6SBoyan Karatotev ldflags-common += -z max-page-size=4096 186*6c2e5bf6SBoyan Karatotev ldflags-common += $(call ld_prefix,--build-id=none) 1873df79ae7SBoyan Karatotev 1883df79ae7SBoyan Karatotev ifeq ($(ENABLE_LTO),1) 189*6c2e5bf6SBoyan Karatotev ldflags-common += -fuse-linker-plugin 1903df79ae7SBoyan Karatotev endif #(ENABLE_LTO) 1913df79ae7SBoyan Karatotev 192*6c2e5bf6SBoyan Karatotev ldflags-common += -nostdlib 1933df79ae7SBoyan Karatotev 194*6c2e5bf6SBoyan Karatotev ifeq ($($(ARCH)-ld-id),llvm-clang) 195*6c2e5bf6SBoyan Karatotev ldflags-common += -fuse-ld=lld 1963df79ae7SBoyan Karatotev endif 197*6c2e5bf6SBoyan Karatotevendif 1983df79ae7SBoyan Karatotev 1993df79ae7SBoyan Karatotevifneq ($(PIE_FOUND),) 2003df79ae7SBoyan Karatotevifeq ($($(ARCH)-ld-id),gnu-gcc) 201*6c2e5bf6SBoyan Karatotev ldflags-common += -no-pie 2023df79ae7SBoyan Karatotevendif 2033df79ae7SBoyan Karatotevendif #(PIE_FOUND) 204*6c2e5bf6SBoyan KaratotevTF_LDFLAGS += $(ldflags-common) 205*6c2e5bf6SBoyan KaratotevTF_LDFLAGS += $(ldflags-$(ARCH)) 2063df79ae7SBoyan Karatotev 207*6c2e5bf6SBoyan KaratotevPIE_LDFLAGS += $(call ld_prefix,-pie) 208*6c2e5bf6SBoyan KaratotevPIE_LDFLAGS += $(call ld_prefix,--no-dynamic-linker) 2093df79ae7SBoyan Karatotev 2103df79ae7SBoyan Karatotevifeq ($(ENABLE_PIE),1) 2113df79ae7SBoyan Karatotev ifeq ($(RESET_TO_BL2),1) 2123df79ae7SBoyan Karatotev ifneq ($(BL2_IN_XIP_MEM),1) 2133df79ae7SBoyan Karatotev BL2_CPPFLAGS += -fpie 2143df79ae7SBoyan Karatotev BL2_CFLAGS += -fpie 2153df79ae7SBoyan Karatotev BL2_LDFLAGS += $(PIE_LDFLAGS) 2163df79ae7SBoyan Karatotev endif #(BL2_IN_XIP_MEM) 2173df79ae7SBoyan Karatotev endif #(RESET_TO_BL2) 2183df79ae7SBoyan Karatotev BL31_CPPFLAGS += -fpie 2193df79ae7SBoyan Karatotev BL31_CFLAGS += -fpie 2203df79ae7SBoyan Karatotev BL31_LDFLAGS += $(PIE_LDFLAGS) 2213df79ae7SBoyan Karatotev 2223df79ae7SBoyan Karatotev BL32_CPPFLAGS += -fpie 2233df79ae7SBoyan Karatotev BL32_CFLAGS += -fpie 2243df79ae7SBoyan Karatotev BL32_LDFLAGS += $(PIE_LDFLAGS) 2253df79ae7SBoyan Karatotevendif #(ENABLE_PIE) 2263df79ae7SBoyan Karatotev 2273df79ae7SBoyan KaratotevBL1_CPPFLAGS += -DREPORT_ERRATA=${DEBUG} 2283df79ae7SBoyan KaratotevBL31_CPPFLAGS += -DREPORT_ERRATA=${DEBUG} 2293df79ae7SBoyan KaratotevBL32_CPPFLAGS += -DREPORT_ERRATA=${DEBUG} 2303df79ae7SBoyan Karatotev 2313df79ae7SBoyan KaratotevBL1_CPPFLAGS += -DIMAGE_AT_EL3 2323df79ae7SBoyan Karatotevifeq ($(RESET_TO_BL2),1) 2333df79ae7SBoyan Karatotev BL2_CPPFLAGS += -DIMAGE_AT_EL3 2343df79ae7SBoyan Karatotevelse 2353df79ae7SBoyan Karatotev BL2_CPPFLAGS += -DIMAGE_AT_EL1 2363df79ae7SBoyan Karatotevendif #(RESET_TO_BL2) 2373df79ae7SBoyan Karatotev 2383df79ae7SBoyan Karatotevifeq (${ARCH},aarch64) 2393df79ae7SBoyan Karatotev BL2U_CPPFLAGS += -DIMAGE_AT_EL1 2403df79ae7SBoyan Karatotev BL31_CPPFLAGS += -DIMAGE_AT_EL3 2413df79ae7SBoyan Karatotev BL32_CPPFLAGS += -DIMAGE_AT_EL1 2423df79ae7SBoyan Karatotevelse 2433df79ae7SBoyan Karatotev BL32_CPPFLAGS += -DIMAGE_AT_EL3 2443df79ae7SBoyan Karatotevendif 2453df79ae7SBoyan Karatotev 2463df79ae7SBoyan Karatotevifeq (${SPD},spmd) 2473df79ae7SBoyan Karatotev ifeq ($(findstring optee_sp,$(ARM_SPMC_MANIFEST_DTS)),optee_sp) 2483df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DOPTEE_SP_FW_CONFIG 2493df79ae7SBoyan Karatotev endif 2503df79ae7SBoyan Karatotev 2513df79ae7SBoyan Karatotev ifeq ($(findstring trusty_sp,$(ARM_SPMC_MANIFEST_DTS)),trusty_sp) 2523df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DTRUSTY_SP_FW_CONFIG 2533df79ae7SBoyan Karatotev endif 2543df79ae7SBoyan Karatotev 2553df79ae7SBoyan Karatotev ifeq ($(TS_SP_FW_CONFIG),1) 2563df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DTS_SP_FW_CONFIG 2573df79ae7SBoyan Karatotev endif 2583df79ae7SBoyan Karatotev 2593df79ae7SBoyan Karatotev ifneq ($(ARM_BL2_SP_LIST_DTS),) 2603df79ae7SBoyan Karatotev DTC_CPPFLAGS += -DARM_BL2_SP_LIST_DTS=$(ARM_BL2_SP_LIST_DTS) 2613df79ae7SBoyan Karatotev endif 2623df79ae7SBoyan Karatotevendif 2633df79ae7SBoyan Karatotev 2643df79ae7SBoyan Karatotev 2653df79ae7SBoyan KaratotevDTC_FLAGS += -I dts -O dtb 2661e8b5354SBoyan KaratotevDTC_CPPFLAGS += -Ifdts -undef 2673df79ae7SBoyan Karatotev 268