diff --git a/Zend/Zend.m4 b/Zend/Zend.m4 index 72bc116f7edb..fd8eee17f23f 100644 --- a/Zend/Zend.m4 +++ b/Zend/Zend.m4 @@ -330,6 +330,24 @@ AS_VAR_IF([php_cv_have_global_register_vars], [yes], ]) AC_MSG_CHECKING([whether to enable global register variables support]) AC_MSG_RESULT([$ZEND_GCC_GLOBAL_REGS]) + +dnl GCC doesn't propagate -ffixed-* from LTO objects. Reserve the VM registers +dnl before LTO code gen to avoid "global register variable follows a function definition" +AS_VAR_IF([ZEND_GCC_GLOBAL_REGS], [yes], [ + zend_lto=no + for zend_flag in $CC $CFLAGS $LDFLAGS; do + AS_CASE([$zend_flag], [-flto|-flto=*], [zend_lto=yes], [-fno-lto], [zend_lto=no]) + done + AS_VAR_IF([zend_lto], [yes], [ + AS_CASE([$host_cpu], + [x86_64*|amd64*], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-r14 -ffixed-r15"])], + [x86*|amd*|i?86*|pentium], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-esi -ffixed-edi"])], + [aarch64*|arm64*], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-x27 -ffixed-x28"])], + [ppc64*|powerpc64*], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-r14 -ffixed-r15"])], + [riscv64*], [AS_VAR_APPEND([LDFLAGS], [" -ffixed-x18 -ffixed-x19"])], + [AC_MSG_ERROR([Cannot reserve VM registers for LTO, disable LTO or use --disable-gcc-global-regs])]) + ]) +]) ]) dnl diff --git a/build/ltmain.sh b/build/ltmain.sh index 3c00e7915707..7cfa084920fc 100755 --- a/build/ltmain.sh +++ b/build/ltmain.sh @@ -1689,6 +1689,8 @@ EOF # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC # -F/path gives path to uninstalled frameworks, gcc on darwin # @file GCC response files + # -ffixed-*, -fno-lto GCC LTO register reservations and cancellation + -ffixed-*|-fno-lto| \ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)