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

Patrick DELAUNAY patrick.delaunay at foss.st.com
Tue Jun 1 16:59:52 CEST 2021


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...


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?


Regards

Patrick



More information about the U-Boot mailing list