From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CC027C433F5 for ; Wed, 27 Oct 2021 08:51:22 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D911D60F0F for ; Wed, 27 Oct 2021 08:51:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org D911D60F0F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id AEBDD834F2; Wed, 27 Oct 2021 10:51:19 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Gow62ekb"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id AB6FB834F2; Wed, 27 Oct 2021 10:51:17 +0200 (CEST) Received: from mail-yb1-xb2b.google.com (mail-yb1-xb2b.google.com [IPv6:2607:f8b0:4864:20::b2b]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id E274983542 for ; Wed, 27 Oct 2021 10:51:12 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ilias.apalodimas@linaro.org Received: by mail-yb1-xb2b.google.com with SMTP id y80so4413092ybe.12 for ; Wed, 27 Oct 2021 01:51:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=CEtd6T8HNJlMvmpKmljcY/40x+HyV+XzXI0iCyyHRyA=; b=Gow62ekbt8EgNbmjFrmnuFnkHhQrXl+sLrPEpOx0uBnUdGdTrWHCPi2JUoHSwgzpgQ L4VG1mghdvS4bE7QIXs0iyJaHOBUgp5LS++P9P+brZQH0w3nFsXdxWUVjvK1lbOXCQTu GF6ZNH/kCphcpvSL7BquAzN6Rf0nP/ELlf+RVGUisUnp6Hp9sZ6E/4vaNvWTigMnEYYX n633qjZEUun1ON/1IbLKQcKHf7FAiptFa0fDurR4WkqIeygmxue7z2jwdWesiWcu3wPh 1rs1Aoxs2cewkLdr4eqHbw/MPXgwLK2jjOeuSp/qMbNhvHZ0IphQbBUi2Wgo3un9yOgG cCfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=CEtd6T8HNJlMvmpKmljcY/40x+HyV+XzXI0iCyyHRyA=; b=pu8ikVJ7bSe4az8RpsteDFzv0GysK4VrHXL2X3NYNXz59Z5DVcYmDcKid8P4aQWHT6 LEk2s0h3y+rqE0XFZs3m2G/sZ+a0Eszx7RKnl9lFTlwRP2N8hdzOewXme/2lOu7SqNXi 7WOt57bKyUMi7UTsn9d8TzmHjAqzb5sErgX37+yQRY/KLERljEdhh1lnIrmnXlhMhFoZ rqiI38EjWF94iGmnAjFFzpvpOWbQ/hxP7WNeLkWid/5r+t7Ppb52k5iZm0LOXlAnuNao 8ox+aRK4+IADxgDwGPX6Yw4Te+lUvxSCH2A6R+L/Q8kivnQMXSOLVzwRBPZeaSQrJyb7 AtOg== X-Gm-Message-State: AOAM5303FEctgrfGdLrG8RnlTwiuhl11MsHdY0FPd6iJCxHD76x6p2RY GPkXINJXj5h/gtS2fLf4LnyHcn5Y/yVmp7ytbyR7jw== X-Google-Smtp-Source: ABdhPJxXMCPp43ULKaSlK0rWIUzeuS+acoosAKmnIZRlIx1ubQ3gXB44zAmg7uiEQoRwamWMS0F8//nMH/A5LUkxq9c= X-Received: by 2002:a25:585:: with SMTP id 127mr20144667ybf.133.1635324671673; Wed, 27 Oct 2021 01:51:11 -0700 (PDT) MIME-Version: 1.0 References: <20211023232635.9195-1-sjg@chromium.org> <20211023232635.9195-3-sjg@chromium.org> In-Reply-To: <20211023232635.9195-3-sjg@chromium.org> From: Ilias Apalodimas Date: Wed, 27 Oct 2021 11:50:35 +0300 Message-ID: Subject: Re: [PATCH v2 02/41] Makefile: Allow LTO to be disabled for a build To: Simon Glass Cc: U-Boot Mailing List , Michal Simek , Heinrich Schuchardt , Tom Rini , Daniel Schwierzeck , Steffen Jaeckel , =?UTF-8?B?TWFyZWsgQmVow7pu?= , Lukas Auer , Dennis Gilmore , Masahiro Yamada Content-Type: text/plain; charset="UTF-8" X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean Hi Simon How does this patch related to the standard boot series? Shouldn't this be a completely separate patch? Thanks /Ilias On Sun, 24 Oct 2021 at 02:26, Simon Glass wrote: > > LTO (Link-Time Optimisation) is an very useful feature which can > significantly reduce the size of U-Boot binaries. So far it has been > made available for selected ARM boards and sandbox. > > However, incremental builds are much slower when LTO is used. For example, > an incremental build of sandbox takes 2.1 seconds on my machine, but 6.7 > seconds with LTO enabled. > > Add a LTO_BUILD=n parameter to the build, so it can be disabled during > development if needed, for faster builds. > > Add some documentation about LTO while we are here. > > Signed-off-by: Simon Glass > --- > > (no changes since v1) > > Makefile | 18 +++++++++++++----- > arch/arm/config.mk | 4 ++-- > arch/arm/include/asm/global_data.h | 2 +- > doc/build/gcc.rst | 17 +++++++++++++++++ > 4 files changed, 33 insertions(+), 8 deletions(-) > > diff --git a/Makefile b/Makefile > index b79b2319ff6..7057723e046 100644 > --- a/Makefile > +++ b/Makefile > @@ -434,6 +434,9 @@ KBUILD_CFLAGS += -fshort-wchar -fno-strict-aliasing > KBUILD_AFLAGS := -D__ASSEMBLY__ > KBUILD_LDFLAGS := > > +# Set this to "n" use of LTO for this build, e.g. LTO_BUILD=n > +LTO_BUILD ?= y > + > ifeq ($(cc-name),clang) > ifneq ($(CROSS_COMPILE),) > CLANG_TARGET := --target=$(notdir $(CROSS_COMPILE:%-=%)) > @@ -641,6 +644,11 @@ export CFLAGS_EFI # Compiler flags to add when building EFI app > export CFLAGS_NON_EFI # Compiler flags to remove when building EFI app > export EFI_TARGET # binutils target if EFI is natively supported > > +export LTO_ENABLE > + > +# This is y if LTO is enabled for this build > +LTO_ENABLE=$(if $(CONFIG_LTO),$(LTO_BUILD),) > + > # If board code explicitly specified LDSCRIPT or CONFIG_SYS_LDSCRIPT, use > # that (or fail if absent). Otherwise, search for a linker script in a > # standard location. > @@ -688,16 +696,16 @@ endif > LTO_CFLAGS := > LTO_FINAL_LDFLAGS := > export LTO_CFLAGS LTO_FINAL_LDFLAGS > -ifdef CONFIG_LTO > +ifeq ($(LTO_ENABLE),y) > ifeq ($(cc-name),clang) > - LTO_CFLAGS += -flto > + LTO_CFLAGS += -DLTO_ENABLE -flto > LTO_FINAL_LDFLAGS += -flto > > AR = $(shell $(CC) -print-prog-name=llvm-ar) > NM = $(shell $(CC) -print-prog-name=llvm-nm) > else > NPROC := $(shell nproc 2>/dev/null || echo 1) > - LTO_CFLAGS += -flto=$(NPROC) > + LTO_CFLAGS += -DLTO_ENABLE -flto=$(NPROC) > LTO_FINAL_LDFLAGS += -fuse-linker-plugin -flto=$(NPROC) > > # use plugin aware tools > @@ -1717,7 +1725,7 @@ ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(ARCH)/Makefile.postlink) > > # Generate linker list symbols references to force compiler to not optimize > # them away when compiling with LTO > -ifdef CONFIG_LTO > +ifeq ($(LTO_ENABLE),y) > u-boot-keep-syms-lto := keep-syms-lto.o > u-boot-keep-syms-lto_c := $(patsubst %.o,%.c,$(u-boot-keep-syms-lto)) > > @@ -1739,7 +1747,7 @@ endif > > # Rule to link u-boot > # May be overridden by arch/$(ARCH)/config.mk > -ifdef CONFIG_LTO > +ifeq ($(LTO_ENABLE),y) > quiet_cmd_u-boot__ ?= LTO $@ > cmd_u-boot__ ?= \ > $(CC) -nostdlib -nostartfiles \ > diff --git a/arch/arm/config.mk b/arch/arm/config.mk > index b107b1af27a..065dbec4064 100644 > --- a/arch/arm/config.mk > +++ b/arch/arm/config.mk > @@ -15,11 +15,11 @@ CFLAGS_NON_EFI := -fno-pic -ffixed-r9 -ffunction-sections -fdata-sections \ > -fstack-protector-strong > CFLAGS_EFI := -fpic -fshort-wchar > > -ifneq ($(CONFIG_LTO)$(CONFIG_USE_PRIVATE_LIBGCC),yy) > +ifneq ($(LTO_ENABLE)$(CONFIG_USE_PRIVATE_LIBGCC),yy) > LDFLAGS_FINAL += --gc-sections > endif > > -ifndef CONFIG_LTO > +ifneq ($(LTO_ENABLE),y) > PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections > endif > > diff --git a/arch/arm/include/asm/global_data.h b/arch/arm/include/asm/global_data.h > index 085e12b5d4d..b255b195aa0 100644 > --- a/arch/arm/include/asm/global_data.h > +++ b/arch/arm/include/asm/global_data.h > @@ -98,7 +98,7 @@ struct arch_global_data { > > #include > > -#if defined(__clang__) || defined(CONFIG_LTO) > +#if defined(__clang__) || defined(LTO_ENABLE) > > #define DECLARE_GLOBAL_DATA_PTR > #define gd get_gd() > diff --git a/doc/build/gcc.rst b/doc/build/gcc.rst > index cdd79700326..136c318727d 100644 > --- a/doc/build/gcc.rst > +++ b/doc/build/gcc.rst > @@ -141,6 +141,23 @@ of dtc is new enough. It also makes sure that pylibfdt is present, if needed > Note that the :doc:`tools` are always built with the included version of libfdt > so it is not possible to build U-Boot tools with a system libfdt, at present. > > +Link-time optimisation (LTO) > +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > + > +U-Boot supports link-time optimisation which can reduce the size of the final > +U-Boot binaries, particularly with SPL. > + > +At present this can be enabled by ARM boards by adding `CONFIG_LTO=y` into the > +defconfig file. Other architectures are not supported. LTO is enabled by default > +for sandbox. > + > +This does incur a link-time penalty of several seconds. For faster incremental > +builds during development, you can disable it by setting `LTO_BUILD` to `n`. > + > +.. code-block:: bash > + > + LTO_BUILD=n make > + > Other build targets > ~~~~~~~~~~~~~~~~~~~ > > -- > 2.33.0.1079.g6e70778dc9-goog >