Hello, so after the RFC I am now sending first version 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 and also by Pali Rohar and Adam Ford for some boards. There is one test that fails and one that did not complete after 60 minutes, but these seem to be related to an issue regarding a race condition with GNU Make's jobserver - I am using -flto=jobserver. We could remove the jobserver option, but the linking is then painfully slow, so I don't know. Anyway the code size decrease is nice, approximately 15% for SPL. It's lower on the main binary, only about 5%, but this is still nice and needed for some boards, such as Nokia RX-51 (N900), because the binary is otherwise on the boundary already. I am satisfied with how even clang now links with LTO, at least for sandbox, and passing all CI tests. For sandbox I have added a patch that enables LTO by default. For ARM, there is one patch that enables LTO for several boards - these are tested to work (thanks Pali and Adam). The last patch, which enables LTO for all ARM boards by default, is prefixed "DO NOT MERGE!" This patch series therefore should not (hopefully) cause regression when applied. Marek Marek Behún (39): ddr: marvell: axp: align signature of mv_xor_mem_init() with a38x ddr: marvell: axp: fix array types have different bounds warning 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 binman: declare symbols externally visible string: make memcpy() and memset() visible to fix LTO linking errors efi_loader: fix warning when linking with LTO lib: crc32: make the crc_table variable non-const Makefile, Makefile.spl: cosmetic change build: use thin archives instead of incremental linking build: support building with Link Time Optimizations build: LTO: move platform libs into --start-group list 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: imx6m: 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: enable LTO for some boards ARM: enable LTO by default Kbuild | 2 + Kconfig | 19 +++++++ Makefile | 49 ++++++++++++++-- arch/Kconfig | 4 ++ arch/arm/config.mk | 8 ++- 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 | 2 + 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/da850evm_defconfig | 1 + configs/da850evm_direct_nor_defconfig | 1 + configs/da850evm_nand_defconfig | 1 + configs/imx6q_logic_defconfig | 1 + configs/imx8mn_beacon_2g_defconfig | 1 + configs/imx8mn_beacon_defconfig | 1 + configs/nokia_rx51_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/ddr/marvell/axp/ddr3_dfs.c | 4 +- drivers/ddr/marvell/axp/ddr3_sdram.c | 2 +- drivers/ddr/marvell/axp/xor.c | 4 +- drivers/ddr/marvell/axp/xor.h | 4 +- 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/binman_sym.h | 5 +- include/efi_loader.h | 8 +-- include/errno.h | 8 ++- include/linker_lists.h | 66 ++++++++++++++-------- include/linux/compiler.h | 10 ++-- include/linux/compiler_attributes.h | 2 +- lib/crc32.c | 2 +- lib/errno.c | 4 +- lib/string.c | 5 +- lib/trace.c | 4 +- scripts/Makefile.build | 16 +++--- scripts/Makefile.lib | 3 + scripts/Makefile.spl | 30 ++++++++-- scripts/checkpatch.pl | 2 +- test/py/conftest.py | 2 +- 105 files changed, 391 insertions(+), 197 deletions(-) -- 2.26.2