mbox series

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

Message ID 20210520112425.25166-1-marek.behun@nic.cz
Headers show
Series U-Boot LTO (Sandbox + Some ARM boards) | expand

Message

Marek Behún May 20, 2021, 11:23 a.m. UTC
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

Comments

Patrick DELAUNAY June 1, 2021, 2:59 p.m. UTC | #1
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
Tom Rini June 1, 2021, 3:05 p.m. UTC | #2
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).
Marek Behún June 1, 2021, 4:22 p.m. UTC | #3
On Tue, 1 Jun 2021 16:59:52 +0200
Patrick DELAUNAY <patrick.delaunay@foss.st.com> wrote:

> Hi Marek,
> 
> 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?

I only tried compiling with older versions in the CI.

On the devices for which I tested it I only compiled with newer gcc
(10.2.0) since it is the stable version on my system.

But yeah, I suggest to use newer GCC for LTO.

Marek
Heinrich Schuchardt June 1, 2021, 4:55 p.m. UTC | #4
On 6/1/21 6:22 PM, Marek Behún wrote:
> On Tue, 1 Jun 2021 16:59:52 +0200
> Patrick DELAUNAY <patrick.delaunay@foss.st.com> wrote:
>
>> Hi Marek,
>>
>> 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?
>
> I only tried compiling with older versions in the CI.
>
> On the devices for which I tested it I only compiled with newer gcc
> (10.2.0) since it is the stable version on my system.
>
> But yeah, I suggest to use newer GCC for LTO.
>
> Marek
>

gcc (Debian 11-20210327-1) 11.0.1 compiles stm32mp15_basic_defconfig
with CONFIG_LTO=y.

Best regards

Heinrich
Tom Rini June 1, 2021, 5:23 p.m. UTC | #5
On Tue, Jun 01, 2021 at 06:55:52PM +0200, Heinrich Schuchardt wrote:
> On 6/1/21 6:22 PM, Marek Behún wrote:
> > On Tue, 1 Jun 2021 16:59:52 +0200
> > Patrick DELAUNAY <patrick.delaunay@foss.st.com> wrote:
> > 
> > > Hi Marek,
> > > 
> > > 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?
> > 
> > I only tried compiling with older versions in the CI.
> > 
> > On the devices for which I tested it I only compiled with newer gcc
> > (10.2.0) since it is the stable version on my system.
> > 
> > But yeah, I suggest to use newer GCC for LTO.
> > 
> > Marek
> > 
> 
> gcc (Debian 11-20210327-1) 11.0.1 compiles stm32mp15_basic_defconfig
> with CONFIG_LTO=y.

It's run-time not compile time that shows the problem however as gcc-9.x
sounds like it has a problem with LTO and weak functions.