Skip to content

Commit 15ab513

Browse files
committed
jit: Use -mno-outline-atomics for bitcode on ARM.
If the executable's .o files were produced by a compiler (probably gcc) not using -moutline-atomics, and the corresponding .bc files were produced by clang using -moutline-atomics (probably by default), then the generated bitcode functions would have the target attribute "+outline-atomics", and could fail at runtime when inlined. If the target ISA at bitcode generation time was armv8-a (the most conservative aarch64 target, no LSE), then LLVM IR atomic instructions would generate calls to functions in libgcc.a or libclang_rt.*.a that switch between LL/SC and faster LSE instructions depending on a runtime AT_HWCAP check. Since the corresponding .o files didn't need those functions, they wouldn't have been included in the executable, and resolution would fail. At least Debian and Ubuntu are known to ship gcc and clang compilers that target armv8-a but differ on the use of outline atomics by default. Fix, by suppressing the outline atomics attribute in bitcode explicitly. Inline LL/SC instructions will be generated for atomic operations in bitcode built for armv8-a. Only configure scripts are adjusted for now, because the meson build system doesn't generate bitcode yet. This doesn't seem to be a new phenomenon, so real cases of functions using atomics that are inlined by JIT must be rare in the wild given how long it took for a bug report to arrive. The reported case could be reduced to: postgres=# set jit_inline_above_cost = 0; SET postgres=# set jit_above_cost = 0; SET postgres=# select pg_last_wal_receive_lsn(); WARNING: failed to resolve name __aarch64_swp4_acq_rel FATAL: fatal llvm error: Program used external function '__aarch64_swp4_acq_rel' which could not be resolved! The change doesn't affect non-ARM systems or later target ISAs. Back-patch to all supported releases. Reported-by: Alexander Kozhemyakin <a.kozhemyakin@postgrespro.ru> Discussion: https://postgr.es/m/18610-37bf303f904fede3%40postgresql.org
1 parent 93d8d4f commit 15ab513

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

configure

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7409,6 +7409,111 @@ if test x"$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" = x"yes";
74097409
fi
74107410

74117411

7412+
# Ideally bitcode should perhaps match $CC's use, or not, of outline atomic
7413+
# functions, but for now we err on the side of suppressing them in bitcode,
7414+
# because we can't assume they're available at runtime. This affects aarch64
7415+
# builds using the basic armv8-a ISA without LSE support.
7416+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CFLAGS" >&5
7417+
$as_echo_n "checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CFLAGS... " >&6; }
7418+
if ${pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics+:} false; then :
7419+
$as_echo_n "(cached) " >&6
7420+
else
7421+
pgac_save_CXXFLAGS=$CXXFLAGS
7422+
pgac_save_CXX=$CXX
7423+
CXX=${CLANG}
7424+
CXXFLAGS="${BITCODE_CFLAGS} -mno-outline-atomics"
7425+
ac_save_cxx_werror_flag=$ac_cxx_werror_flag
7426+
ac_cxx_werror_flag=yes
7427+
ac_ext=cpp
7428+
ac_cpp='$CXXCPP $CPPFLAGS'
7429+
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
7430+
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
7431+
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
7432+
7433+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
7434+
/* end confdefs.h. */
7435+
7436+
int
7437+
main ()
7438+
{
7439+
7440+
;
7441+
return 0;
7442+
}
7443+
_ACEOF
7444+
if ac_fn_cxx_try_compile "$LINENO"; then :
7445+
pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=yes
7446+
else
7447+
pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=no
7448+
fi
7449+
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
7450+
ac_ext=c
7451+
ac_cpp='$CPP $CPPFLAGS'
7452+
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
7453+
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
7454+
ac_compiler_gnu=$ac_cv_c_compiler_gnu
7455+
7456+
ac_cxx_werror_flag=$ac_save_cxx_werror_flag
7457+
CXXFLAGS="$pgac_save_CXXFLAGS"
7458+
CXX="$pgac_save_CXX"
7459+
fi
7460+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&5
7461+
$as_echo "$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&6; }
7462+
if test x"$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" = x"yes"; then
7463+
BITCODE_CFLAGS="${BITCODE_CFLAGS} -mno-outline-atomics"
7464+
fi
7465+
7466+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CXXFLAGS" >&5
7467+
$as_echo_n "checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CXXFLAGS... " >&6; }
7468+
if ${pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics+:} false; then :
7469+
$as_echo_n "(cached) " >&6
7470+
else
7471+
pgac_save_CXXFLAGS=$CXXFLAGS
7472+
pgac_save_CXX=$CXX
7473+
CXX=${CLANG}
7474+
CXXFLAGS="${BITCODE_CXXFLAGS} -mno-outline-atomics"
7475+
ac_save_cxx_werror_flag=$ac_cxx_werror_flag
7476+
ac_cxx_werror_flag=yes
7477+
ac_ext=cpp
7478+
ac_cpp='$CXXCPP $CPPFLAGS'
7479+
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
7480+
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
7481+
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
7482+
7483+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
7484+
/* end confdefs.h. */
7485+
7486+
int
7487+
main ()
7488+
{
7489+
7490+
;
7491+
return 0;
7492+
}
7493+
_ACEOF
7494+
if ac_fn_cxx_try_compile "$LINENO"; then :
7495+
pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=yes
7496+
else
7497+
pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=no
7498+
fi
7499+
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
7500+
ac_ext=c
7501+
ac_cpp='$CPP $CPPFLAGS'
7502+
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
7503+
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
7504+
ac_compiler_gnu=$ac_cv_c_compiler_gnu
7505+
7506+
ac_cxx_werror_flag=$ac_save_cxx_werror_flag
7507+
CXXFLAGS="$pgac_save_CXXFLAGS"
7508+
CXX="$pgac_save_CXX"
7509+
fi
7510+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&5
7511+
$as_echo "$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&6; }
7512+
if test x"$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" = x"yes"; then
7513+
BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -mno-outline-atomics"
7514+
fi
7515+
7516+
74127517
NOT_THE_CFLAGS=""
74137518
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -Wunused-command-line-argument, for NOT_THE_CFLAGS" >&5
74147519
$as_echo_n "checking whether ${CLANG} supports -Wunused-command-line-argument, for NOT_THE_CFLAGS... " >&6; }

configure.ac

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,13 @@ if test "$with_llvm" = yes ; then
612612
PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-Xclang -no-opaque-pointers])
613613
PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANGXX, BITCODE_CXXFLAGS, [-Xclang -no-opaque-pointers])
614614

615+
# Ideally bitcode should perhaps match $CC's use, or not, of outline atomic
616+
# functions, but for now we err on the side of suppressing them in bitcode,
617+
# because we can't assume they're available at runtime. This affects aarch64
618+
# builds using the basic armv8-a ISA without LSE support.
619+
PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-mno-outline-atomics])
620+
PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANG, BITCODE_CXXFLAGS, [-mno-outline-atomics])
621+
615622
NOT_THE_CFLAGS=""
616623
PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, NOT_THE_CFLAGS, [-Wunused-command-line-argument])
617624
if test -n "$NOT_THE_CFLAGS"; then

0 commit comments

Comments
 (0)