> On May 1, 2015, at 8:30 PM, tbsaunde+...@tbsaunde.org wrote:
>
> From: Trevor Saunders <tbsaunde+...@tbsaunde.org>
>
> Hi,
>
> This adds a configure check to libobjc to find out if types of bitfields
> effect
> their layout, and uses it to replace the rather broken usage of
> PCC_BITFIELD_TYPE_MATTERS.
>
> bootstrapped + regtested x86_64-linux-gnu, bootstrapped on ppc64le-linux-gnu
> and ran check-objc there without failures, and checked the correct part of the
> ifdef is used on a cross to m68k-linux-elf. ok? I'm sure I've gotten
> something wrong since this is a bunch of auto tools ;-)
This is ok. I have been meaning to try to get rid of all uses of the target
headers but never got around to finishing it.
Thanks,
Andrew
>
> Trev
>
> libobjc/ChangeLog:
>
> 2015-05-01 Trevor Saunders <tbsaunde+...@tbsaunde.org>
>
> * acinclude.m4: Include bitfields.m4.
> * config.h.in: Regenerate.
> * configure: Likewise.
> * configure.ac: Invoke gt_BITFIELD_TYPE_MATTERS.
> * encoding.c: Check HAVE_BITFIELD_TYPE_MATTERS.
>
> config/ChangeLog:
>
> 2015-05-01 Trevor Saunders <tbsaunde+...@tbsaunde.org>
>
> * bitfields.m4: New file.
> ---
> config/bitfields.m4 | 26 ++++++++++++++++++++++++++
> libobjc/acinclude.m4 | 1 +
> libobjc/config.h.in | 3 +++
> libobjc/configure | 38 ++++++++++++++++++++++++++++++++++++++
> libobjc/configure.ac | 2 ++
> libobjc/encoding.c | 3 ++-
> 6 files changed, 72 insertions(+), 1 deletion(-)
> create mode 100644 config/bitfields.m4
>
> diff --git a/config/bitfields.m4 b/config/bitfields.m4
> new file mode 100644
> index 0000000..ee8f3b5
> --- /dev/null
> +++ b/config/bitfields.m4
> @@ -0,0 +1,26 @@
> +dnl Copyright (C) 2015 Free Software Foundation, Inc.
> +dnl This file is free software, distributed under the terms of the GNU
> +dnl General Public License. As a special exception to the GNU General
> +dnl Public License, this file may be distributed as part of a program
> +dnl that contains a configuration script generated by Autoconf, under
> +dnl the same distribution terms as the rest of that program.
> +
> +# Define HAVE_BITFIELD_TYPE_MATTERS if the type of bitfields effects their
> +# alignment.
> +
> +AC_DEFUN([gt_BITFIELD_TYPE_MATTERS],
> +[
> + AC_CACHE_CHECK([if the type of bitfields matters],
> gt_cv_bitfield_type_matters,
> + [
> + AC_TRY_COMPILE(
> + [struct foo1 { char x; char :0; char y; };
> +struct foo2 { char x; int :0; char y; };
> +int foo1test[ sizeof (struct foo1) == 2 ? 1 : -1 ];
> +int foo2test[ sizeof (struct foo2) == 5 ? 1 : -1]; ],
> + [], gt_cv_bitfield_type_matters=yes, gt_cv_bitfield_type_matters=no)
> + ])
> + if test $gt_cv_bitfield_type_matters = yes; then
> + AC_DEFINE(HAVE_BITFIELD_TYPE_MATTERS, 1,
> + [Define if the type of bitfields effects alignment.])
> + fi
> +])
> diff --git a/libobjc/acinclude.m4 b/libobjc/acinclude.m4
> index bf78dbe..4193018 100644
> --- a/libobjc/acinclude.m4
> +++ b/libobjc/acinclude.m4
> @@ -12,6 +12,7 @@ m4_include(../config/acx.m4)
> m4_include(../config/no-executables.m4)
> m4_include(../config/enable.m4)
> m4_include(../config/tls.m4)
> +m4_include(../config/bitfields.m4)
>
> m4_include(../libtool.m4)
> dnl The lines below arrange for aclocal not to bring an installed
> diff --git a/libobjc/config.h.in b/libobjc/config.h.in
> index c055e7c..20d1fca 100644
> --- a/libobjc/config.h.in
> +++ b/libobjc/config.h.in
> @@ -1,5 +1,8 @@
> /* config.h.in. Generated from configure.ac by autoheader. */
>
> +/* Define if the type of bitfields effects alignment. */
> +#undef HAVE_BITFIELD_TYPE_MATTERS
> +
> /* Define to 1 if the target assembler supports thread-local storage. */
> #undef HAVE_CC_TLS
>
> diff --git a/libobjc/configure b/libobjc/configure
> index 642eb9c..0547f91 100755
> --- a/libobjc/configure
> +++ b/libobjc/configure
> @@ -11530,6 +11530,44 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
> { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_exception_model_name" >&5
> $as_echo "$ac_exception_model_name" >&6; }
>
> +
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the type of bitfields
> matters" >&5
> +$as_echo_n "checking if the type of bitfields matters... " >&6; }
> +if test "${gt_cv_bitfield_type_matters+set}" = set; then :
> + $as_echo_n "(cached) " >&6
> +else
> +
> + cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h. */
> +struct foo1 { char x; char :0; char y; };
> +struct foo2 { char x; int :0; char y; };
> +int foo1test[ sizeof (struct foo1) == 2 ? 1 : -1 ];
> +int foo2test[ sizeof (struct foo2) == 5 ? 1 : -1];
> +int
> +main ()
> +{
> +
> + ;
> + return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"; then :
> + gt_cv_bitfield_type_matters=yes
> +else
> + gt_cv_bitfield_type_matters=no
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
> $gt_cv_bitfield_type_matters" >&5
> +$as_echo "$gt_cv_bitfield_type_matters" >&6; }
> + if test $gt_cv_bitfield_type_matters = yes; then
> +
> +$as_echo "#define HAVE_BITFIELD_TYPE_MATTERS 1" >>confdefs.h
> +
> + fi
> +
> +
> # ------
> # Output
> # ------
> diff --git a/libobjc/configure.ac b/libobjc/configure.ac
> index c794a80..2d88519 100644
> --- a/libobjc/configure.ac
> +++ b/libobjc/configure.ac
> @@ -266,6 +266,8 @@ fi
> AC_LANG_POP(C)
> AC_MSG_RESULT($ac_exception_model_name)
>
> +gt_BITFIELD_TYPE_MATTERS
> +
> # ------
> # Output
> # ------
> diff --git a/libobjc/encoding.c b/libobjc/encoding.c
> index 20ace46..abb6145 100644
> --- a/libobjc/encoding.c
> +++ b/libobjc/encoding.c
> @@ -29,6 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.
> If not, see
> /* FIXME: This file contains functions that will abort the entire
> program if they fail. Is that really needed ? */
>
> +#include "config.h"
> #include "objc-private/common.h"
> #include "objc-private/error.h"
> #include "tconfig.h"
> @@ -1167,7 +1168,7 @@ objc_layout_structure_next_member (struct
> objc_struct_layout *layout)
> /* Record must have at least as much alignment as any field.
> Otherwise, the alignment of the field within the record
> is meaningless. */
> -#if !PCC_BITFIELD_TYPE_MATTERS
> +#ifndef HAVE_BITFIELD_TYPE_MATTERS
> layout->record_align = MAX (layout->record_align, desired_align);
> #else /* PCC_BITFIELD_TYPE_MATTERS */
> if (*type == _C_BFLD)
> --
> 2.3.0.80.g18d0fec.dirty
>