ARM: make gd a function call for LTO and set via set_gd()
authorMarek Behún <marek.behun@nic.cz>
Thu, 20 May 2021 11:24:10 +0000 (13:24 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 24 May 2021 18:21:30 +0000 (14:21 -0400)
commit86c5e21013d5efd895de9905a19893b4403e4642
tree826e54e219b261f6d282c5f42d126276bc5af191
parent82b63e95410ebca0bbfd343ce163299a44a2d932
ARM: make gd a function call for LTO and set via set_gd()

On ARM, the gd pointer is stored in registers r9 / x18. For this the
-ffixed-r9 / -ffixed-x18 flag is used when compiling, but using global
register variables causes errors when building with LTO, and these
errors are very difficult to overcome.

Richard Biener says [1]:
  Note that global register vars shouldn't be used with LTO and if they
  are restricted to just a few compilation units the recommended fix is
  to build those CUs without -flto.

We cannot do this for U-Boot since all CUs use -ffixed-reg flag.

It seems that with LTO we could in fact store the gd pointer differently
and gain performance or size benefit by allowing the compiler to use
r9 / x18. But this would need more work.

So for now, when building with LTO, go the clang way, and instead of
declaring gd a global register variable, we make it a function call via
macro.

[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68384

Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/arm/cpu/arm926ejs/mxs/spl_boot.c
arch/arm/include/asm/global_data.h
arch/arm/mach-exynos/spl_boot.c
arch/arm/mach-imx/imx8m/soc.c
arch/arm/mach-imx/spl_imx_romapi.c