public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: "H.J. Lu" <hjl.tools@gmail.com>
To: Paolo Bonzini <bonzini@gnu.org>
Cc: DJ Delorie <dj@redhat.com>, Alexandre Oliva <aoliva@redhat.com>,
	gcc-patches@gcc.gnu.org, 	Ralf.Wildenhues@gmx.de
Subject: Re: PING: PATCH: PR other/49325: Incorrect target HAVE_INITFINI_ARRAY check
Date: Sat, 18 Jun 2011 15:12:00 -0000	[thread overview]
Message-ID: <BANLkTikVC6BojnX=EBTxYW-qDdOuP=peAg@mail.gmail.com> (raw)
In-Reply-To: <BANLkTikMLbGYDzMuNn=Em8TBn+znSca+Rw@mail.gmail.com>

On Sat, Jun 18, 2011 at 6:29 AM, Paolo Bonzini <bonzini@gnu.org> wrote:
> On Sat, Jun 18, 2011 at 01:24, H.J. Lu <hjl.tools@gmail.com> wrote:
>>> 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.
>>
>> This target test needs run-time check.  I don't know how to properly
>> check it for cross compilation and I don't feel comfortable to change
>>  AC_RUN_IFELSE.
>>
>> Here is the updated patch to fix gcc_AC_INITFINI_ARRAY instead.
>
> Better.  However, the test needs to be $build = $target && $build =
> $host.  Should be okay with that change, but please repost.
>
> It is also better to change the cross compilation results (the new
> "else" branch and the final argument to AC_RUN_IFELSE) to "guessing
> no".
>
> Paolo
>

This is the patch I checked in.

Thanks.

-- 
H.J.
---
2011-06-18  H.J. Lu  <hongjiu.lu@intel.com>

	PR other/49325
	* acinclude.m4 (gcc_AC_INITFINI_ARRAY): Properly check if
	.init_array can be used with .ctors on targets.
	* configure: Regenerated.

diff --git a/gcc/acinclude.m4 b/gcc/acinclude.m4
index 3eec559..ff38682 100644
--- a/gcc/acinclude.m4
+++ b/gcc/acinclude.m4
@@ -375,13 +375,115 @@ AC_DEFUN([gcc_AC_INITFINI_ARRAY],
 	[], [
 AC_CACHE_CHECK(for .preinit_array/.init_array/.fini_array support,
 		 gcc_cv_initfini_array, [dnl
-  AC_RUN_IFELSE([AC_LANG_SOURCE([
+  if test "x${build}" = "x${target}" && test "x${build}" = "x${host}"; 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;])],
+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])])
+	     [gcc_cv_initfini_array=no])
+   else
+     AC_MSG_CHECKING(cross compile... guessing)
+     gcc_cv_initfini_array=no
+   fi])
   enable_initfini_array=$gcc_cv_initfini_array
 ])
 if test $enable_initfini_array = yes; then

      reply	other threads:[~2011-06-18 14:50 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-14 22:39 H.J. Lu
2011-06-17 10:55 ` Paolo Bonzini
2011-06-18  0:18   ` H.J. Lu
2011-06-18 14:21     ` Paolo Bonzini
2011-06-18 15:12       ` H.J. Lu [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='BANLkTikVC6BojnX=EBTxYW-qDdOuP=peAg@mail.gmail.com' \
    --to=hjl.tools@gmail.com \
    --cc=Ralf.Wildenhues@gmx.de \
    --cc=aoliva@redhat.com \
    --cc=bonzini@gnu.org \
    --cc=dj@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).