Why are you not changing the gcc_AC_ macro and instead introducing duplicate code? Perhaps the right solution is to add a final argument to the AC_RUN_IFELSE macro (don't know, I should be on holiday and hence I do not have the source code at hand :)); in any case this is _not_ how you add tests that work for cross compilation.
Paolo On Wed, Jun 15, 2011 at 00:05, H.J. Lu <hjl.to...@gmail.com> wrote: > On Wed, Jun 8, 2011 at 9:49 AM, H.J. Lu <hongjiu...@intel.com> wrote: >> Hi, >> >> Target HAVE_INITFINI_ARRAY support was added by: >> >> http://gcc.gnu.org/ml/gcc-patches/2002-11/msg00387.html >> >> Unfortunately, it checks if host supports init_array/fini_array >> sections, not target. It will generate wrong result for cross compiler. >> >> This patch uses the target compiler instead of host compiler to check >> this feature. For ia64, we set HAVE_INITFINI_ARRAY to 1 if >> init_array/fini_array section can be used. For other targets, we >> set it only if we can mix init_array/fini_array sections with >> ctors/dtors sections. OK for trunk? >> >> Thanks. >> >> >> H.J. >> --- >> 2011-06-07 H.J. Lu <hongjiu...@intel.com> >> >> PR other/49325 >> * acinclude.m4 (gcc_AC_INITFINI_ARRAY): Removed. >> >> * configure.ac: Remove gcc_AC_INITFINI_ARRAY. Add >> --enable-initfini-array and check if .init_array can be used with >> .ctors. >> * configure: Regenerated. >> >> diff --git a/gcc/acinclude.m4 b/gcc/acinclude.m4 >> index 3eec559..0f5f686 100644 >> --- a/gcc/acinclude.m4 >> +++ b/gcc/acinclude.m4 >> @@ -369,26 +369,6 @@ else >> fi >> fi]) >> >> -AC_DEFUN([gcc_AC_INITFINI_ARRAY], >> -[AC_ARG_ENABLE(initfini-array, >> - [ --enable-initfini-array use .init_array/.fini_array >> sections], >> - [], [ >> -AC_CACHE_CHECK(for .preinit_array/.init_array/.fini_array support, >> - gcc_cv_initfini_array, [dnl >> - AC_RUN_IFELSE([AC_LANG_SOURCE([ >> -static int x = -1; >> -int main (void) { return x; } >> -int foo (void) { x = 0; } >> -int (*fp) (void) __attribute__ ((section (".init_array"))) = foo;])], >> - [gcc_cv_initfini_array=yes], [gcc_cv_initfini_array=no], >> - [gcc_cv_initfini_array=no])]) >> - enable_initfini_array=$gcc_cv_initfini_array >> -]) >> -if test $enable_initfini_array = yes; then >> - AC_DEFINE(HAVE_INITFINI_ARRAY, 1, >> - [Define .init_array/.fini_array sections are available and working.]) >> -fi]) >> - >> dnl # _gcc_COMPUTE_GAS_VERSION >> dnl # Used by gcc_GAS_VERSION_GTE_IFELSE >> dnl # >> diff --git a/gcc/configure b/gcc/configure >> index a373518..a23e2fa 100755 >> --- a/gcc/configure >> +++ b/gcc/configure >> @@ -10447,6 +10447,7 @@ fi >> # Restore CFLAGS from before the gcc_AC_NEED_DECLARATIONS tests. >> CFLAGS="$saved_CFLAGS" >> >> +# Check if .init_array can be used with .ctors. >> # Check whether --enable-initfini-array was given. >> if test "${enable_initfini_array+set}" = set; then : >> enableval=$enable_initfini_array; >> @@ -10457,16 +10458,114 @@ $as_echo_n "checking for >> .preinit_array/.init_array/.fini_array support... " >&6 >> if test "${gcc_cv_initfini_array+set}" = set; then : >> $as_echo_n "(cached) " >&6 >> else >> + if test "x${build}" = "x${target}" ; then >> if test "$cross_compiling" = yes; then : >> gcc_cv_initfini_array=no >> else >> cat confdefs.h - <<_ACEOF >conftest.$ac_ext >> /* end confdefs.h. */ >> >> +#ifdef __ia64__ >> +/* We turn on .preinit_array/.init_array/.fini_array support for ia64 >> + if it can be used. */ >> static int x = -1; >> int main (void) { return x; } >> int foo (void) { x = 0; } >> int (*fp) (void) __attribute__ ((section (".init_array"))) = foo; >> +#else >> +extern void abort (); >> +static int count; >> + >> +static void >> +init1005 () >> +{ >> + if (count != 0) >> + abort (); >> + count = 1005; >> +} >> +void (*const init_array1005) () >> + __attribute__ ((section (".init_array.01005"), aligned (sizeof (void *)))) >> + = { init1005 }; >> +static void >> +fini1005 () >> +{ >> + if (count != 1005) >> + abort (); >> +} >> +void (*const fini_array1005) () >> + __attribute__ ((section (".fini_array.01005"), aligned (sizeof (void *)))) >> + = { fini1005 }; >> + >> +static void >> +ctor1007 () >> +{ >> + if (count != 1005) >> + abort (); >> + count = 1007; >> +} >> +void (*const ctors1007) () >> + __attribute__ ((section (".ctors.64528"), aligned (sizeof (void *)))) >> + = { ctor1007 }; >> +static void >> +dtor1007 () >> +{ >> + if (count != 1007) >> + abort (); >> + count = 1005; >> +} >> +void (*const dtors1007) () >> + __attribute__ ((section (".dtors.64528"), aligned (sizeof (void *)))) >> + = { dtor1007 }; >> + >> +static void >> +init65530 () >> +{ >> + if (count != 1007) >> + abort (); >> + count = 65530; >> +} >> +void (*const init_array65530) () >> + __attribute__ ((section (".init_array.65530"), aligned (sizeof (void *)))) >> + = { init65530 }; >> +static void >> +fini65530 () >> +{ >> + if (count != 65530) >> + abort (); >> + count = 1007; >> +} >> +void (*const fini_array65530) () >> + __attribute__ ((section (".fini_array.65530"), aligned (sizeof (void *)))) >> + = { fini65530 }; >> + >> +static void >> +ctor65535 () >> +{ >> + if (count != 65530) >> + abort (); >> + count = 65535; >> +} >> +void (*const ctors65535) () >> + __attribute__ ((section (".ctors"), aligned (sizeof (void *)))) >> + = { ctor65535 }; >> +static void >> +dtor65535 () >> +{ >> + if (count != 65535) >> + abort (); >> + count = 65530; >> +} >> +void (*const dtors65535) () >> + __attribute__ ((section (".dtors"), aligned (sizeof (void *)))) >> + = { dtor65535 }; >> + >> +int >> +main () >> +{ >> + return 0; >> +} >> +#endif >> + >> _ACEOF >> if ac_fn_c_try_run "$LINENO"; then : >> gcc_cv_initfini_array=yes >> @@ -10477,6 +10576,9 @@ rm -f core *.core core.conftest.* gmon.out bb.out >> conftest$ac_exeext \ >> conftest.$ac_objext conftest.beam conftest.$ac_ext >> fi >> >> + else >> + gcc_cv_initfini_array=no >> + fi >> fi >> { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_initfini_array" >&5 >> $as_echo "$gcc_cv_initfini_array" >&6; } >> @@ -17517,7 +17619,7 @@ else >> lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 >> lt_status=$lt_dlunknown >> cat > conftest.$ac_ext <<_LT_EOF >> -#line 17520 "configure" >> +#line 17622 "configure" >> #include "confdefs.h" >> >> #if HAVE_DLFCN_H >> @@ -17623,7 +17725,7 @@ else >> lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 >> lt_status=$lt_dlunknown >> cat > conftest.$ac_ext <<_LT_EOF >> -#line 17626 "configure" >> +#line 17728 "configure" >> #include "confdefs.h" >> >> #if HAVE_DLFCN_H >> diff --git a/gcc/configure.ac b/gcc/configure.ac >> index 5e41479..0347b43 100644 >> --- a/gcc/configure.ac >> +++ b/gcc/configure.ac >> @@ -1134,7 +1134,126 @@ fi >> # Restore CFLAGS from before the gcc_AC_NEED_DECLARATIONS tests. >> CFLAGS="$saved_CFLAGS" >> >> -gcc_AC_INITFINI_ARRAY >> +# Check if .init_array can be used with .ctors. >> +AC_ARG_ENABLE(initfini-array, >> + [ --enable-initfini-array use .init_array/.fini_array >> sections], >> + [], [ >> +AC_CACHE_CHECK(for .preinit_array/.init_array/.fini_array support, >> + gcc_cv_initfini_array, [dnl >> + if test "x${build}" = "x${target}" ; then >> + AC_RUN_IFELSE([AC_LANG_SOURCE([ >> +#ifdef __ia64__ >> +/* We turn on .preinit_array/.init_array/.fini_array support for ia64 >> + if it can be used. */ >> +static int x = -1; >> +int main (void) { return x; } >> +int foo (void) { x = 0; } >> +int (*fp) (void) __attribute__ ((section (".init_array"))) = foo; >> +#else >> +extern void abort (); >> +static int count; >> + >> +static void >> +init1005 () >> +{ >> + if (count != 0) >> + abort (); >> + count = 1005; >> +} >> +void (*const init_array1005[]) () >> + __attribute__ ((section (".init_array.01005"), aligned (sizeof (void *)))) >> + = { init1005 }; >> +static void >> +fini1005 () >> +{ >> + if (count != 1005) >> + abort (); >> +} >> +void (*const fini_array1005[]) () >> + __attribute__ ((section (".fini_array.01005"), aligned (sizeof (void *)))) >> + = { fini1005 }; >> + >> +static void >> +ctor1007 () >> +{ >> + if (count != 1005) >> + abort (); >> + count = 1007; >> +} >> +void (*const ctors1007[]) () >> + __attribute__ ((section (".ctors.64528"), aligned (sizeof (void *)))) >> + = { ctor1007 }; >> +static void >> +dtor1007 () >> +{ >> + if (count != 1007) >> + abort (); >> + count = 1005; >> +} >> +void (*const dtors1007[]) () >> + __attribute__ ((section (".dtors.64528"), aligned (sizeof (void *)))) >> + = { dtor1007 }; >> + >> +static void >> +init65530 () >> +{ >> + if (count != 1007) >> + abort (); >> + count = 65530; >> +} >> +void (*const init_array65530[]) () >> + __attribute__ ((section (".init_array.65530"), aligned (sizeof (void *)))) >> + = { init65530 }; >> +static void >> +fini65530 () >> +{ >> + if (count != 65530) >> + abort (); >> + count = 1007; >> +} >> +void (*const fini_array65530[]) () >> + __attribute__ ((section (".fini_array.65530"), aligned (sizeof (void *)))) >> + = { fini65530 }; >> + >> +static void >> +ctor65535 () >> +{ >> + if (count != 65530) >> + abort (); >> + count = 65535; >> +} >> +void (*const ctors65535[]) () >> + __attribute__ ((section (".ctors"), aligned (sizeof (void *)))) >> + = { ctor65535 }; >> +static void >> +dtor65535 () >> +{ >> + if (count != 65535) >> + abort (); >> + count = 65530; >> +} >> +void (*const dtors65535[]) () >> + __attribute__ ((section (".dtors"), aligned (sizeof (void *)))) >> + = { dtor65535 }; >> + >> +int >> +main () >> +{ >> + return 0; >> +} >> +#endif >> +])], >> + [gcc_cv_initfini_array=yes], [gcc_cv_initfini_array=no], >> + [gcc_cv_initfini_array=no]) >> + else >> + gcc_cv_initfini_array=no >> + fi]) >> + enable_initfini_array=$gcc_cv_initfini_array >> +]) >> +if test $enable_initfini_array = yes; then >> + AC_DEFINE(HAVE_INITFINI_ARRAY, 1, >> + [Define .init_array/.fini_array sections are available and working.]) >> +fi >> >> # mkdir takes a single argument on some systems. >> gcc_AC_FUNC_MKDIR_TAKES_ONE_ARG >> > > PING. > > > -- > H.J. > >