8000 Disable -faggressive-loop-optimizations in gcc 4.8+ for pre-9.2 branc… · hackingwu/postgres@649839d · GitHub
[go: up one dir, main page]

Skip to content

Commit 649839d

Browse files
committed
Disable -faggressive-loop-optimizations in gcc 4.8+ for pre-9.2 branches.
With this optimization flag enabled, recent versions of gcc can generate incorrect code that assumes variable-length arrays (such as oidvector) are actually fixed-length because they're embedded in some larger struct. The known instance of this problem was fixed in 9.2 and up by commit 8137f2c and followon work, which hides actually-variable-length catalog fields from the compiler altogether. And we plan to gradually convert variable-length fields to official "flexible array member" notation over time, which should prevent this type of bug from reappearing as gcc gets smarter. We're not going to try to back-port those changes into older branches, though, so apply this band-aid instead. Andres Freund
1 parent a2e66c0 commit 649839d

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

configure

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4367,6 +4367,68 @@ if test x"$pgac_cv_prog_cc_cflags__fexcess_precision_standard" = x"yes"; then
43674367
CFLAGS="$CFLAGS -fexcess-precision=standard"
43684368
fi
43694369

4370+
# Disable loop optimizations that get confused by variable-length struct
4371+
# declarations in gcc 4.8+
4372+
{ $as_echo "$as_me:$LINENO: checking whether $CC supports -fno-aggressive-loop-optimizations" >&5
4373+
$as_echo_n "checking whether $CC supports -fno-aggressive-loop-optimizations... " >&6; }
4374+
if test "${pgac_cv_prog_cc_cflags__fno_aggressive_loop_optimizations+set}" = set; then
4375+
$as_echo_n "(cached) " >&6
4376+
else
4377+
pgac_save_CFLAGS=$CFLAGS
4378+
CFLAGS="$pgac_save_CFLAGS -fno-aggressive-loop-optimizations"
4379+
ac_save_c_werror_flag=$ac_c_werror_flag
4380+
ac_c_werror_flag=yes
4381+
cat >conftest.$ac_ext <<_ACEOF
4382+
/* confdefs.h. */
4383+
_ACEOF
4384+
cat confdefs.h >>conftest.$ac_ext
4385+
cat >>conftest.$ac_ext <<_ACEOF
4386+
/* end confdefs.h. */
4387+
4388+
int
4389+
main ()
4390+
{
4391+
4392+
;
4393+
return 0;
4394+
}
4395+
_ACEOF
4396+
rm -f conftest.$ac_objext
4397+
if { (ac_try="$ac_compile"
4398+
case "(($ac_try" in
4399+
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
4400+
*) ac_try_echo=$ac_try;;
4401+
esac
4402+
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
4403+
$as_echo "$ac_try_echo") >&5
4404+
(eval "$ac_compile") 2>conftest.er1
4405+
ac_status=$?
4406+
grep -v '^ *+' conftest.er1 >conftest.err
4407+
rm -f conftest.er1
4408+
cat conftest.err >&5
4409+
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
4410+
(exit $ac_status); } && {
4411+
test -z "$ac_c_werror_flag" ||
4412+
test ! -s conftest.err
4413+
} && test -s conftest.$ac_objext; then
4414+
pgac_cv_prog_cc_cflags__fno_aggressive_loop_optimizations=yes
4415+
else
4416+
$as_echo "$as_me: failed program was:" >&5
4417+
sed 's/^/| /' conftest.$ac_ext >&5
4418+
4419+
pgac_cv_prog_cc_cflags__fno_aggressive_loop_optimizations=no
4420+
fi
4421+
4422+
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
4423+
ac_c_werror_flag=$ac_save_c_werror_flag
4424+
CFLAGS="$pgac_save_CFLAGS"
4425+
fi
4426+
{ $as_echo "$as_me:$LINENO: result: $pgac_cv_prog_cc_cflags__fno_aggressive_loop_optimizations" >&5
4427+
$as_echo "$pgac_cv_prog_cc_cflags__fno_aggressive_loop_optimizations" >&6; }
4428+
if test x"$pgac_cv_prog_cc_cflags__fno_aggressive_loop_optimizations" = x"yes"; then
4429+
CFLAGS="$CFLAGS -fno-aggressive-loop-optimizations"
4430+
fi
4431+
43704432
elif test "$ICC" = yes; then
43714433
# Intel's compiler has a bug/misoptimization in checking for
43724434
# division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS.

configure.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,9 @@ if test "$GCC" = yes -a "$ICC" = no; then
438438
PGAC_PROG_CC_CFLAGS_OPT([-fwrapv])
439439
# Disable FP optimizations that cause various errors on gcc 4.5+ or maybe 4.6+
440440
PGAC_PROG_CC_CFLAGS_OPT([-fexcess-precision=standard])
441+
# Disable loop optimizations that get confused by variable-length struct
442+
# declarations in gcc 4.8+
443+
PGAC_PROG_CC_CFLAGS_OPT([-fno-aggressive-loop-optimizations])
441444
elif test "$ICC" = yes; then
442445
# Intel's compiler has a bug/misoptimization in checking for
443446
# division by NAN (NaN == 0), -mp1 fixes it, so add it to the CFLAGS.

0 commit comments

Comments
 (0)
0