From 641f16e75648d5cad3b21ce7c744bb7a2bc5a729 Mon Sep 17 00:00:00 2001 From: Ambroise Vincent Date: Wed, 17 Jul 2019 11:08:38 +0100 Subject: [PATCH] Set lld as the default linker for Clang builds The LLVM linker replaces the GNU linker as default for the link on Clang builds. It is possible to override the default linker by setting the LD build flag. The patch also updates the TF-A doc. Change-Id: Ic08552b9994d4fa8f0d4863e67a2726c1dce2e35 Signed-off-by: Ambroise Vincent Signed-off-by: Zelalem Aweke --- Makefile | 16 ++++++++++++++-- docs/getting_started/initial-build.rst | 9 +++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 42fdb7326..640b1206e 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved. +# Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause # @@ -209,7 +209,10 @@ PP = $(CC) -E $(TF_CFLAGS_$(ARCH)) else ifneq ($(findstring clang,$(notdir $(CC))),) TF_CFLAGS_aarch32 = $(target32-directive) $(march32-directive) TF_CFLAGS_aarch64 = -target aarch64-elf $(march64-directive) -LD = $(LINKER) +LD = ld.lld +ifeq (, $(shell which $(LD))) +$(error "No $(LD) in PATH, make sure it is installed or set LD to a different linker") +endif AS = $(CC) -c -x assembler-with-cpp $(TF_CFLAGS_$(ARCH)) CPP = $(CC) -E PP = $(CC) -E @@ -317,10 +320,13 @@ endif GCC_V_OUTPUT := $(shell $(CC) -v 2>&1) +# LD = armlink ifneq ($(findstring armlink,$(notdir $(LD))),) TF_LDFLAGS += --diag_error=warning --lto_level=O1 TF_LDFLAGS += --remove --info=unused,unusedsymbols TF_LDFLAGS += $(TF_LDFLAGS_$(ARCH)) + +# LD = gcc (used when GCC LTO is enabled) else ifneq ($(findstring gcc,$(notdir $(LD))),) # Pass ld options with Wl or Xlinker switches TF_LDFLAGS += -Wl,--fatal-warnings -O1 @@ -337,11 +343,17 @@ ifneq (${ERRATA_A53_843419},1) endif TF_LDFLAGS += -nostdlib TF_LDFLAGS += $(subst --,-Xlinker --,$(TF_LDFLAGS_$(ARCH))) + +# LD = gcc-ld (ld) or llvm-ld (ld.lld) or other else TF_LDFLAGS += --fatal-warnings -O1 TF_LDFLAGS += --gc-sections +# ld.lld doesn't recognize the errata flags, +# therefore don't add those in that case +ifeq ($(findstring ld.lld,$(notdir $(LD))),) TF_LDFLAGS += $(TF_LDFLAGS_$(ARCH)) endif +endif DTC_FLAGS += -I dts -O dtb DTC_CPPFLAGS += -nostdinc -Iinclude -undef -x assembler-with-cpp diff --git a/docs/getting_started/initial-build.rst b/docs/getting_started/initial-build.rst index 893aba245..d4a8f0114 100644 --- a/docs/getting_started/initial-build.rst +++ b/docs/getting_started/initial-build.rst @@ -18,9 +18,10 @@ Performing an Initial Build It is possible to build TF-A using Clang or Arm Compiler 6. To do so ``CC`` needs to point to the clang or armclang binary, which will - also select the clang or armclang assembler. Be aware that the - GNU linker is used by default. In case of being needed the linker - can be overridden using the ``LD`` variable. Clang linker version 6 is + also select the clang or armclang assembler. Be aware that for Arm Compiler, + the GNU linker is used by default. However for Clang LLVM linker (LLD) + is used by default. In case of being needed the linker can be overridden + using the ``LD`` variable. LLVM linker (LLD) version 9 is known to work with TF-A. In both cases ``CROSS_COMPILE`` should be set as described above. @@ -114,4 +115,4 @@ Performing an Initial Build -------------- -*Copyright (c) 2019, Arm Limited. All rights reserved.* +*Copyright (c) 2020, Arm Limited. All rights reserved.*