[PATCH u-boot v3 00/39] U-Boot LTO (Sandbox + Some ARM boards)

Marek Behún
2021-03-16T12:25:30Z

Hello,

this is version 3 of patches adding support for LTO to U-Boot.

This series was tested by Github/Azure CI at
https://github.com/u-boot/u-boot/pull/57

Code reduction is on average 4.23% for u-boot.bin and 13.58% for
u-boot-spl.bin.

Changes sinve v2:
- now linking with --build-id=none in order to avoid link failures with
some toolchains (thanks Herald Seiler)
- we don't use -flto=jobserver anymore, since it causes build errors for
some people. Instead we link with -flto=NPROC
- removed LTO exception for arch/arm/mach-omap2/omap3/clock.o, Adam Ford
says it is not needed
- added some Reviewed-by tags

Changes since v1:
- remove patches applied into u-boot-marvell
- added Reviewed-by tags
- addressed some issues discovered by Bin Meng, Marek Vasut,
Heinrich Schuchardt
- added more ARM boards (thanks to Adam Ford, Tim Harvey and Bin Meng)
- removed --gc-sections for ARM if internal libgcc is used
- remove -fwhole-program in final LTO LDFLAGS
- declared all 4 functions (memcpy, memset, memcmp, memmove) __used,
(these are mentioned in GCC man page for option -nodefaultlibs that
the compiler may generate; this seems to be a bug in GCC that linking
fails with LTO even if these functions are present, because the
symbols can be renamed on some targets by optimization)

Marek

Marek Beh?n (39):
regmap: fix a serious pointer casting bug
api: fix a potential serious bug caused by undef CONFIG_SYS_64BIT_LBA
checkpatch: require quotes around section name in the __section()
macro
treewide: Convert macro and uses of __section(foo) to __section("foo")
compiler.h: align the __ADDRESSABLE macro with Linux' version
linker_lists: prepare macros to avoid code repetition
test/py: improve regular expression for ut subtest symbol matcher
linker_lists: declare lists and entries as __ADDRESSABLE for LTO
string: make memcpy(), memset(), memcmp() and memmove() visible for
LTO
efi_loader: fix warning when linking with LTO
efi_loader: add Sphinx doc for __efi_runtime and __efi_runtime_data
efi_loader: add macro for const EFI runtime data
efi_selftest: compiler flags for efi_selftest_miniapp_exception.o
lib: crc32: put the crc_table variable into efi_runtime_rodata section
Makefile, Makefile.spl: cosmetic change
build: use thin archives instead of incremental linking
build: support building with Link Time Optimizations
build: link with --build-id=none
sandbox: errno: avoid conflict with libc's errno
sandbox: use sections instead of symbols for getopt array boundaries
sandbox: make LTO available
sandbox: enable LTO by default
ARM: global_data: make set_gd() work for armv5 and armv6
ARM: make gd a function call for LTO and set via set_gd()
ARM: fix LTO build for some thumb-interwork cases
ARM: fix LTO for imx28_xea
ARM: fix LTO for apf27
ARM: fix LTO for keystone
ARM: kona: fix clk_bsc_enable() type mismatch for LTO
ARM: imx8m: fix imx_eqos_txclk_set_rate() type mismatch for LTO
ARM: fix LTO for seaboard
ARM: fix LTO for rockchip and samsung
ARM: omap3: fix LTO for DM3730 (and possibly other omap3 boards)
armv8: SPL: discard relocation information
ata: ahci: fix ahci_link_up() type mismatch for LTO
ARM: make LTO available
ARM: don't use -ffunction-sections/-fdata-sections with LTO build
ARM: don't use --gc-sections with LTO when using private libgcc
ARM: enable LTO for some boards

Kbuild | 2 +
Kconfig | 24 ++++++++
Makefile | 51 +++++++++++++++--
arch/Kconfig | 3 +
arch/arm/config.mk | 10 +++-
arch/arm/cpu/arm926ejs/Makefile | 2 +
arch/arm/cpu/arm926ejs/mxs/mxs.c | 2 +-
arch/arm/cpu/arm926ejs/mxs/spl_boot.c | 4 +-
arch/arm/cpu/arm926ejs/spear/spl.c | 2 +-
arch/arm/cpu/armv7/kona-common/clk-stubs.c | 2 +-
arch/arm/cpu/armv7/ls102xa/ls102xa_psci.c | 2 +-
arch/arm/cpu/armv8/fsl-layerscape/spl.c | 2 +-
arch/arm/cpu/armv8/spl_data.c | 4 +-
arch/arm/cpu/armv8/u-boot-spl.lds | 1 +
arch/arm/include/asm/global_data.h | 6 +-
arch/arm/include/asm/secure.h | 6 +-
arch/arm/include/asm/setup.h | 2 +-
arch/arm/lib/Makefile | 3 +
arch/arm/lib/sections.c | 31 +++++-----
arch/arm/lib/spl.c | 2 +-
arch/arm/mach-at91/spl.c | 2 +-
arch/arm/mach-exynos/spl_boot.c | 2 +-
arch/arm/mach-imx/imx8m/clock_imx8mm.c | 2 +-
arch/arm/mach-imx/imx8m/soc.c | 2 +-
arch/arm/mach-imx/spl_imx_romapi.c | 16 +++---
arch/arm/mach-k3/am6_init.c | 2 +-
arch/arm/mach-k3/j721e_init.c | 4 +-
arch/arm/mach-keystone/Makefile | 1 +
arch/arm/mach-mvebu/mbus.c | 4 +-
arch/arm/mach-mvebu/timer.c | 2 +-
arch/arm/mach-nexell/clock.c | 6 +-
arch/arm/mach-nexell/timer.c | 6 +-
arch/arm/mach-omap2/omap3/Makefile | 1 +
arch/arm/mach-rockchip/board.c | 2 +-
arch/arm/mach-socfpga/spl_a10.c | 2 +-
arch/arm/mach-sunxi/board.c | 2 +-
arch/arm/mach-tegra/board.c | 2 +-
arch/arm/mach-tegra/cboot.c | 8 +--
arch/arm/mach-tegra/tegra20/Makefile | 1 +
arch/mips/mach-jz47xx/jz4780/jz4780.c | 2 +-
arch/nds32/include/asm/setup.h | 6 +-
arch/powerpc/include/asm/cache.h | 4 +-
arch/riscv/cpu/cpu.c | 4 +-
arch/sandbox/config.mk | 12 +++-
arch/sandbox/cpu/os.c | 3 +-
arch/sandbox/cpu/start.c | 3 +-
arch/sandbox/cpu/u-boot-spl.lds | 8 ++-
arch/sandbox/cpu/u-boot.lds | 8 ++-
arch/sandbox/include/asm/getopt.h | 2 +-
arch/sandbox/include/asm/sections.h | 21 ++++++-
arch/sandbox/lib/sections.c | 9 +--
arch/x86/cpu/coreboot/tables.c | 2 +-
arch/x86/cpu/coreboot/timestamp.c | 2 +-
arch/x86/lib/sections.c | 9 +--
arch/xtensa/cpu/cpu.c | 2 +-
board/bosch/shc/board.c | 2 +-
board/broadcom/bcmstb/bcmstb.c | 2 +-
board/samsung/arndale/arndale_spl.c | 2 +-
board/samsung/common/exynos5-dt.c | 2 +-
board/samsung/smdk5250/smdk5250_spl.c | 2 +-
board/samsung/smdk5420/smdk5420_spl.c | 2 +-
board/siemens/draco/board.c | 2 +-
board/xilinx/common/fru_ops.c | 2 +-
configs/am3517_evm_defconfig | 1 +
configs/da850evm_defconfig | 1 +
configs/da850evm_direct_nor_defconfig | 1 +
configs/da850evm_nand_defconfig | 1 +
configs/imx6q_logic_defconfig | 1 +
configs/imx8mm_beacon_defconfig | 1 +
configs/imx8mm_venice_defconfig | 1 +
configs/imx8mn_beacon_2g_defconfig | 1 +
configs/imx8mn_beacon_defconfig | 1 +
configs/nokia_rx51_defconfig | 1 +
configs/omap3_logic_defconfig | 1 +
configs/r8a774a1_beacon_defconfig | 1 +
configs/r8a774b1_beacon_defconfig | 1 +
configs/r8a774e1_beacon_defconfig | 1 +
configs/turris_mox_defconfig | 1 +
configs/turris_omnia_defconfig | 1 +
drivers/ata/ahci.c | 2 +-
drivers/bios_emulator/biosemu.c | 4 +-
drivers/core/regmap.c | 13 ++++-
drivers/firmware/psci.c | 2 +-
drivers/mtd/nand/raw/mxc_nand_spl.c | 2 +-
drivers/pinctrl/nxp/pinctrl-imx5.c | 2 +-
drivers/pinctrl/nxp/pinctrl-imx7.c | 2 +-
drivers/pinctrl/nxp/pinctrl-imx8m.c | 2 +-
drivers/power/pmic/pmic_tps62362.c | 2 +-
drivers/power/pmic/pmic_tps65217.c | 2 +-
drivers/power/pmic/pmic_tps65218.c | 2 +-
drivers/power/pmic/pmic_tps65910.c | 2 +-
drivers/serial/serial_pl01x.c | 4 +-
include/api_public.h | 23 ++++++--
include/efi_loader.h | 54 +++++++++++++++---
include/errno.h | 8 ++-
include/linker_lists.h | 66 ++++++++++++++--------
include/linux/compiler.h | 10 ++--
include/linux/compiler_attributes.h | 2 +-
lib/crc32.c | 3 +-
lib/efi_selftest/Makefile | 2 +
lib/errno.c | 4 +-
lib/string.c | 9 +--
lib/trace.c | 4 +-
scripts/Makefile.build | 16 +++---
scripts/Makefile.lib | 3 +
scripts/Makefile.spl | 36 ++++++++++--
scripts/checkpatch.pl | 2 +-
test/py/conftest.py | 2 +-
108 files changed, 449 insertions(+), 193 deletions(-)

--
2.26.2