This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[build, ada] Allow Solaris bootstrap with C++ (PR bootstrap/49794)
- From: Rainer Orth <ro at CeBiTec dot Uni-Bielefeld dot DE>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Paolo Bonzini <bonzini at gnu dot org>, Ralf Wildenhues <Ralf dot Wildenhues at gmx dot de>, Ian Lance Taylor <iant at google dot com>, Tom Tromey <tromey at redhat dot com>, Arnaud Charlet <charlet at adacore dot com>
- Date: Wed, 20 Jul 2011 18:35:55 +0200
- Subject: [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