[m-rev.] for review: Check for gcc generating PIC by default.
Mark Brown
mark at mercurylang.org
Fri Feb 25 14:32:35 AEDT 2022
Hi Peter,
This looks good to me.
Mark
On Fri, Feb 25, 2022 at 1:43 PM Peter Wang <novalazy at gmail.com> wrote:
>
> In configure, we try detect the non-working combination of gcc 5+,
> targeting x86, PIC, and non-local gotos. We assumed that PIC is only
> generated when creating shared libraries, but gcc may have been
> configured to generate PIC by default. This is very common on more
> recent Linux distributions.
>
> configure.ac:
> Extend the test mentioned above: if shared libraries are disabled,
> check whether gcc generates PIC anyway.
>
> Clean up the code a little.
>
> m4/mercury.m4:
> Add helper macros MERCURY_CC_TARGETS_X86 and
> MERCURY_CC_GENERATES_PIC.
>
> README.x86:
> Update this document.
>
> diff --git a/README.x86 b/README.x86
> index d5d361fc7..41009d722 100644
> --- a/README.x86
> +++ b/README.x86
> @@ -2,7 +2,7 @@ Due to improvements in GCC, the following combination is not supported:
>
> - GCC version 5 and above
> - x86
> - - PIC (position-independent code), i.e. dynamic linking
> + - PIC (position-independent code)
> - low-level C grades using non-local gotos, i.e. asm_fast.*
>
> The configure script will not select asm_fast grades when the above combination
> @@ -13,8 +13,8 @@ We recommend using high-level C grades (hlc.*) on x86. If you require a
> low-level C grade, e.g. for debugging, then you can use a reg.* grade.
>
> If you must use an asm_fast grade, you will need to tell the C compiler not to
> -generate position-independent code, and disable building of shared libraries.
> -Alternatively, you could downgrade to gcc 4.9.
> +generate position-independent code (which may be the default), *and* disable
> +building of shared libraries. Alternatively, you could downgrade to gcc 4.9.
>
> Note that Windows is unaffected by this issue as Windows does not use PIC,
> and we do not yet support shared libraries (DLLs) on Windows anyway.
> diff --git a/configure.ac b/configure.ac
> index f489ff8e1..fab0809cb 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -2,7 +2,7 @@
> # vim: ts=4 sw=4 expandtab
> #-----------------------------------------------------------------------------#
> # Copyright (C) 1995-2012 The University of Melbourne.
> -# Copyright (C) 2013-2021 The Mercury team.
> +# Copyright (C) 2013-2022 The Mercury team.
> # This file may only be copied under the terms of the GNU General
> # Public Licence - see the file COPYING in the Mercury distribution.
> #-----------------------------------------------------------------------------#
> @@ -2332,47 +2332,34 @@ case "$ac_cv_c_compiler_gnu" in yes)
>
> # An old hack allowing non-local gotos to work with PIC on x86
> # will no longer work with GCC 5+ (see mercury_goto.h).
> - # The following disables non-local gotos if dynamic linking
> - # is enabled, even though statically linked libraries (non-PIC)
> - # would still work.
> - # Alternatively, we may wish to consider using non-PIC in shared
> - # libraries, accepting whatever drawbacks that entails.
> - #
> - # XXX Not all platforms use PIC for dynamic linking, so this should
> - # be contingent on CFLAGS_FOR_PIC which is set further down.
> - #
> - allow_pic_nonlocal_gotos=no
> + pic_conflicts_with_nonlocal_gotos=no
> case $C_COMPILER_TYPE in
> gcc_3_*|gcc_4_*)
> - allow_pic_nonlocal_gotos=yes
> + ;;
> + gcc_*)
> + MERCURY_CC_TARGETS_X86
> + if test "$mercury_cv_cc_targets_x86" = yes
> + then
> + if test "$mercury_cv_enable_shared_libs" = yes
> + then
> + case "$host" in
> + *cygwin*|*mingw*)
> + # Windows DLLs do not use PIC, and
> + # we do not support DLLs yet anyway.
> + ;;
> + *)
> + # Assume shared libraries use PIC.
> + pic_conflicts_with_nonlocal_gotos=yes
> + ;;
> + esac
> + else
> + MERCURY_CC_GENERATES_PIC
> + pic_conflicts_with_nonlocal_gotos="$mercury_cv_cc_generates_pic"
> + fi
> + fi
> ;;
> esac
> - case "$host" in
> - *cygwin*|*mingw*)
> - # Windows doesn't use PIC and we don't yet support DLLs
> - # anyway.
> - allow_pic_nonlocal_gotos=yes
> - ;;
> - *)
> - # Run the compiler to check what it is targeting.
> - # Even if $host is x86_64, gcc -m32 or gcc -mx32
> - # may be used to target x86.
> - AC_MSG_CHECKING(whether C compiler targets x86_64)
> - AC_CACHE_VAL(mercury_cv_target_x86_64,
> - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
> - #ifndef __x86_64__
> - #error "Target is not x86_64"
> - #endif
> - ]])],
> - [mercury_cv_target_x86_64=yes],
> - [mercury_cv_target_x86_64=no])
> - )
> - AC_MSG_RESULT($mercury_cv_target_x86_64)
> - allow_pic_nonlocal_gotos="$mercury_cv_target_x86_64"
> - ;;
> - esac
> - if test "$mercury_cv_enable_shared_libs" = yes && \
> - test "$allow_pic_nonlocal_gotos" = no
> + if test "$pic_conflicts_with_nonlocal_gotos" = yes
> then
> MERCURY_MSG("gcc labels do not work with PIC on x86")
> mercury_cv_asm_labels=no
> diff --git a/m4/mercury.m4 b/m4/mercury.m4
> index 9b5da241d..7a350fbfb 100644
> --- a/m4/mercury.m4
> +++ b/m4/mercury.m4
> @@ -1,6 +1,6 @@
> #-----------------------------------------------------------------------------#
> # Copyright (C) 1999,2001-2004, 2006-2012 The University of Melbourne.
> -# Copyright (C) 2013-2020 The Mercury team.
> +# Copyright (C) 2013-2022 The Mercury team.
> # This file may only be copied under the terms of the GNU General
> # Public Licence - see the file COPYING in the Mercury distribution.
> #-----------------------------------------------------------------------------#
> @@ -767,6 +767,52 @@ else
> fi
> ])
>
> +#-----------------------------------------------------------------------------#
> +#
> +# Check if the C compiler targets x86.
> +# Note that checking $host is insufficient as we may be cross-compiling.
> +#
> +
> +AC_DEFUN([MERCURY_CC_TARGETS_X86], [
> +AC_MSG_CHECKING(whether C compiler targets x86)
> +
> +AC_CACHE_VAL(mercury_cv_cc_targets_x86,
> + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
> + #ifdef __i386__
> + #else
> + #error "target is not x86"
> + #endif
> + ]])],
> + [mercury_cv_cc_targets_x86=yes],
> + [mercury_cv_cc_targets_x86=no])
> +)
> +
> +AC_MSG_RESULT($mercury_cv_cc_targets_x86)
> +])
> +
> +#-----------------------------------------------------------------------------#
> +#
> +# Check if the C compiler is configured to generate position-independent code.
> +# This may be the case even when not creating shared libraries.
> +#
> +
> +AC_DEFUN([MERCURY_CC_GENERATES_PIC], [
> +AC_MSG_CHECKING(whether C compiler generates PIC)
> +
> +AC_CACHE_VAL(mercury_cv_cc_generates_pic,
> + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
> + #if defined(__PIC__) || defined(__pic__)
> + #else
> + #error "not PIC"
> + #endif
> + ]])],
> + [mercury_cv_cc_generates_pic=yes],
> + [mercury_cv_cc_generates_pic=no])
> +)
> +
> +AC_MSG_RESULT($mercury_cv_cc_generates_pic)
> +])
> +
> #-----------------------------------------------------------------------------#
> #
> # Check if the POSIX threads library is pthreads-win32.
> --
> 2.31.0
>
> _______________________________________________
> reviews mailing list
> reviews at lists.mercurylang.org
> https://lists.mercurylang.org/listinfo/reviews
More information about the reviews
mailing list