This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[build, ada] Allow Solaris bootstrap with C++ (PR bootstrap/49794)


As partially described in the PR, Solaris 10 bootstrap is broken with C++:

* In both libcpp and gcc, ICONV_CONST is misdetected since the configure
  test is run with gcc, but the actual compilation performed with g++.
  Unlike the former, the latter defines _XOPEN_SOURCE=600 (for the
  benefit of libstdc++, among others), exposing a different iconv()
  prototype.

  I've hacked around this by wrapping the AM_ICONV calls in
  AC_LANG_{PUSH, POP}(C++), but I think this exposes a fundamental
  issue: the configure tests must be performed with the compiler used
  for the build.  That this works without is pure luck IMO.

* Also, the definition of HAVE_DESIGNATED_INITIALIZERS was wrong for g++
  on Solaris which again defines __STDC_VERSION__ 199901L.  To fix this,
  I never define H_D_I if __cplusplus.

* Similarly to IRIX 6, there was a mismatch in ada/init.c for the type
  of the signal handler installed with sigaction.  g++ also doesn't like
  arithmetic on void * ;-)

* The last issue I don't understand at all, not being a C++ person:
  initially, const format_kind_info solaris_format_types[] from
  config/sol2-c.c wasn't even emitted into the object file.  With
  __attribute__((used)) added, it was at least present in the .o file,
  but still LOCL.  Only declaring it extern fixed this, no idea why this
  is necessary.

With those fixes, an i386-pc-solaris2.10 bootstrap has just completed
the build and is running the testsuite.

I suppose the Ada and libcpp/system.h parts might be ok as is, but for
the iconv() issue we certainly need a clean solution, not a hack like
this.

	Rainer


2011-07-20  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	gcc:
	PR bootstrap/49794
	* configure.ac: Test AM_ICONV with CXX.
	* configure: Regenerate.
	* config/sol2-c.c (solaris_format_types): Declare extern.

	gcc/ada:
	PR bootstrap/49794
	* init.c [sun && __SVR4 && !__vxworks] (__gnat_install_handler):
	Assign to act.sa_sigaction.
	* tracebak.c [USE_GENERIC_UNWINDER] (__gnat_backtrace): Cast
	current->return_address to char * before arithmetic.

	libcpp:
	PR bootstrap/49794
	* configure.ac: Test AM_ICONV with CXX.
	* configure: Regenerate.
	* system.h (HAVE_DESIGNATED_INITIALIZERS): Never define for C++.

diff --git a/gcc/ada/init.c b/gcc/ada/init.c
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -1031,7 +1031,7 @@ __gnat_install_handler (void)
      exceptions.  Make sure that the handler isn't interrupted by another
      signal that might cause a scheduling event!  */
 
-  act.sa_handler = __gnat_error_handler;
+  act.sa_sigaction = __gnat_error_handler;
   act.sa_flags = SA_NODEFER | SA_RESTART | SA_SIGINFO;
   sigemptyset (&act.sa_mask);
 
diff --git a/gcc/ada/tracebak.c b/gcc/ada/tracebak.c
--- a/gcc/ada/tracebak.c
+++ b/gcc/ada/tracebak.c
@@ -482,12 +482,12 @@ __gnat_backtrace (void **array,
   while (cnt < size)
     {
       if (STOP_FRAME (current, top_stack) ||
-	  !VALID_STACK_FRAME((char *)(current->return_address + PC_ADJUST)))
+	  !VALID_STACK_FRAME(((char *) current->return_address) + PC_ADJUST))
         break;
 
       if (current->return_address < exclude_min
 	  || current->return_address > exclude_max)
-        array[cnt++] = current->return_address + PC_ADJUST;
+        array[cnt++] = ((char *) current->return_address) + PC_ADJUST;
 
       current = (struct layout *) ((size_t) current->next + FRAME_OFFSET (1));
     }
diff --git a/gcc/config/sol2-c.c b/gcc/config/sol2-c.c
--- a/gcc/config/sol2-c.c
+++ b/gcc/config/sol2-c.c
@@ -68,7 +68,7 @@ static const format_char_info cmn_err_ch
   { NULL,  0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
 };
 
-const format_kind_info solaris_format_types[] = {
+extern const format_kind_info solaris_format_types[] = {
   { "cmn_err",  cmn_err_length_specs,  cmn_err_char_table, "", NULL,
     cmn_err_flag_specs, cmn_err_flag_pairs,
     FMT_FLAG_ARG_CONVERT|FMT_FLAG_EMPTY_PREC_OK,
diff --git a/gcc/configure.ac b/gcc/configure.ac
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -1041,7 +1041,16 @@ case "${host}" in
 esac
 AC_FUNC_FORK
 
+# FIXME: g++ on Solaris 10+ defines _XOPEN_SOURCE=600, which exposes a
+# different iconv() prototype.
+if test "$ENABLE_BUILD_WITH_CXX" = "yes"; then
+AC_LANG_PUSH([C++])
+fi
 AM_ICONV
+if test "$ENABLE_BUILD_WITH_CXX" = "yes"; then
+AC_LANG_POP([C++])
+fi
+
 # Until we have in-tree GNU iconv:
 LIBICONV_DEP=
 AC_SUBST(LIBICONV_DEP)
diff --git a/libcpp/configure.ac b/libcpp/configure.ac
--- a/libcpp/configure.ac
+++ b/libcpp/configure.ac
@@ -102,7 +102,15 @@ if test $ac_cv_type_uchar = yes; then
   [Define if <sys/types.h> defines \`uchar'.])
 fi
 
+# FIXME: g++ on Solaris 10+ defines _XOPEN_SOURCE=600, which exposes a
+# different iconv() prototype.
+if test "$ENABLE_BUILD_WITH_CXX" = "yes"; then
+AC_LANG_PUSH([C++])
+fi
 AM_ICONV
+if test "$ENABLE_BUILD_WITH_CXX" = "yes"; then
+AC_LANG_POP([C++])
+fi
 
 # More defines and substitutions.
 PACKAGE="$PACKAGE_TARNAME"
diff --git a/libcpp/system.h b/libcpp/system.h
--- a/libcpp/system.h
+++ b/libcpp/system.h
@@ -1,6 +1,6 @@
 /* Get common system includes and various definitions and declarations based
    on autoconf macros.
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2009, 2010
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -353,8 +353,8 @@ extern void abort (void);
    compilers, including G++.  -- gdr, 2005-05-18  */
 #if !defined(HAVE_DESIGNATED_INITIALIZERS)
 #define HAVE_DESIGNATED_INITIALIZERS \
-  ((!defined(__cplusplus) && (GCC_VERSION >= 2007)) \
-   || (__STDC_VERSION__ >= 199901L))
+  (!defined(__cplusplus) \
+   && ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)))
 #endif
 
 #ifndef offsetof


-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]