[PATCH u-boot v4 00/36] U-Boot LTO (Sandbox + Some ARM boards)
Tom Rini
trini at konsulko.com
Tue Jun 1 17:05:36 CEST 2021
On Tue, Jun 01, 2021 at 04:59:52PM +0200, Patrick DELAUNAY wrote:
> Hi Marek,
>
> On 5/20/21 1:23 PM, Marek Behún wrote:
> > Hello,
> >
> > this is version 4 of patches adding support for LTO to U-Boot.
> >
> > This series is being tested by Github/Azure CI at
> > https://github.com/u-boot/u-boot/pull/57
> >
> > There is a problem with sandbox_clang test scenario, which I was
> > unable to resolve yet, or even determine correctly whether the
> > problem is with my patches or was there before. (One of the
> > problems is with testing stack protector test_stackprotector.py,
> > but for some reason I could not make this work even with GCC on
> > my local machine.)
> > Nevertheless I am sending these patches now so that at least you
> > can review them. In the meantime I will try to resolve the issue
> > with sandbox_clang test scenario.
> >
> > Changes since v3:
> > - for some reason the mvneta driver does not work correctly when
> > U-Boot is compiled with LTO. I have not debugged this issue yet, so
> > for now I have removed Turris Omnia and Turris MOX from devices with
> > enabled LTO
> > - linker list entry symbols are now forced to emit by using the
> > __ADDRESSABLE macro in a generated C file (keep-syms-lto.c).
> > Previously this was done in the ll_entry_declare() macro, but this
> > was not flexible, since, for example, trying to declare an entry as
> > extern could not work that way. This came to attention now after
> > Simon's patches for dtoc were merged, and ll_entry_declare() is
> > being used with the extern keyword in include/generated/dt-decl.h
> > - when compiling LTO with Clang, use llvm-ar and llvm-nm for AR and NM
> > - several patches rebased
> > - removed patch "api: fix a potential serious bug caused by undef
> > CONFIG_SYS_64BIT_LBA"
> > - updated patch converting __attribute__((section(...))) to
> > __section(...)
> >
> > 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 (36):
> > regmap: fix a serious pointer casting bug
> > 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
> > test/py: improve regular expression for ut subtest symbol matcher
> > 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 | 81 ++++++++++++++++++++--
> > 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/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/am642_init.c | 2 +-
> > 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 | 14 +++-
> > 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/timestamp.c | 2 +-
> > arch/x86/lib/coreboot/cb_sysinfo.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 +
> > drivers/ata/ahci.c | 2 +-
> > drivers/bios_emulator/biosemu.c | 4 +-
> > drivers/clk/kendryte/clk.c | 4 +-
> > drivers/core/regmap.c | 59 +++++++++++++++-
> > 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/efi_loader.h | 54 +++++++++++++--
> > include/errno.h | 8 ++-
> > include/linker_lists.h | 24 +++----
> > 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 | 63 +++++++++++++++--
> > scripts/checkpatch.pl | 2 +-
> > scripts/gen_ll_addressable_symbols.sh | 12 ++++
> > test/py/conftest.py | 2 +-
> > 107 files changed, 513 insertions(+), 183 deletions(-)
> > create mode 100755 scripts/gen_ll_addressable_symbols.sh
> >
>
> I am trying to activate CONFIG_LTO for STMicroelectronics stm32mp15 platform
>
> (stm32mp15_trusted_defconfig and stm32mp15_basic_defconfig).
>
>
> The config stm32mp15_basic_defconfig, with SPL supported failed to boot
>
> with gcc-arm-9.2-2019.12.
>
> because a weak function is not correctly handle between
>
> 1/ ./arch/arm/lib/cache-cp15.c: 96
>
> __weak void dram_bank_mmu_setup(int bank);
>
> 2/ the stm32mp implementation in
>
> arch/arm/mach-stm32mp/cpu.c:62
>
> void dram_bank_mmu_setup(int bank)
>
> => The used function in SPL is the cache library, not the stm32mp function.
>
> and SPL boot it OK when I remove the function in the cache library...
Good work figuring that out. It might help lead to people figuring out
some other problems with LTO off/on. FWIW, I found using buildman's
size display options can also be useful.
> And the issue is also solved with I use a more recent version
>
> gcc-arm-10.2-2020.11 on my PC.
>
>
> Do you see the same kind of issue for old version of gcc ?
>
>
> Do you think CONFIG_LTO require a more recent version of gcc that
>
> the minimal version required by U-Boot because I don't see this information
>
> in the serie?
Note that we only test with gcc-9.2.x right now, moving up to gcc-11.
But that had its own problems I didn't get feedback on (grub+riscv32
just doesn't build, and that's an upstream problem that's been ignored
as of when I posted my patches at least).
--
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210601/a79ec559/attachment.sig>
More information about the U-Boot
mailing list