aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>2015-09-24 08:51:39 +0000
committerRainer Orth <ro@gcc.gnu.org>2015-09-24 08:51:39 +0000
commit2d11044217edd9168eafea1c8c60603f87b0e00d (patch)
tree025e93ec3292313d548bc0002efbee95ff405726 /libgcc
parentfcb901cdfac9321b0202d800621f06b2aafd5bee (diff)
downloadgcc-2d11044217edd9168eafea1c8c60603f87b0e00d.zip
gcc-2d11044217edd9168eafea1c8c60603f87b0e00d.tar.gz
gcc-2d11044217edd9168eafea1c8c60603f87b0e00d.tar.bz2
Use CRTs provided by Solaris
gcc: * configure.ac (gcc_cv_solaris_crts): New test. * configure. Regenerate. * config.in: Regenerate. * config/sol2.h (STARTFILE_SPEC): Simplify, provide HAVE_SOLARIS_CRTS variant. libgcc: * configure.ac (libgcc_cv_solaris_crts): New test. * configure: Regenerate. * config.in: Regenerate. * config/sol2/crtp.c, config/sol2/crtpg.c: New files. * config/gmon-sol2.c: Rename to ... * config/sol2/gmon.c: ... this. Include auto-target.h. (internal_mcount): Wrap setup handling in !HAVE_SOLARIS_CRTS. * config/t-sol2: Rename to ... * config/sol2/t-sol2: ... this. (gmon.o): Reflect renaming. (crtp.o, crtpg.o): New rules. * config.host (*-*-solaris2*): Reflect renaming. Use system CRTs if present. Remove default CRT case. From-SVN: r228077
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog18
-rw-r--r--libgcc/config.host31
-rw-r--r--libgcc/config.in3
-rw-r--r--libgcc/config/sol2/crtp.c33
-rw-r--r--libgcc/config/sol2/crtpg.c47
-rw-r--r--libgcc/config/sol2/gmon.c (renamed from libgcc/config/gmon-sol2.c)7
-rw-r--r--libgcc/config/sol2/t-sol2 (renamed from libgcc/config/t-sol2)10
-rw-r--r--libgcc/configure32
-rw-r--r--libgcc/configure.ac25
9 files changed, 190 insertions, 16 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index f4c13aa..559f772 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,21 @@
+2015-09-24 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * configure.ac (libgcc_cv_solaris_crts): New test.
+ * configure: Regenerate.
+ * config.in: Regenerate.
+ * config/sol2/crtp.c, config/sol2/crtpg.c: New files.
+ * config/gmon-sol2.c: Rename to ...
+ * config/sol2/gmon.c: ... this.
+ Include auto-target.h.
+ (internal_mcount): Wrap setup handling in !HAVE_SOLARIS_CRTS.
+ * config/t-sol2: Rename to ...
+ * config/sol2/t-sol2: ... this.
+ (gmon.o): Reflect renaming.
+ (crtp.o, crtpg.o): New rules.
+ * config.host (*-*-solaris2*): Reflect renaming.
+ Use system CRTs if present.
+ Remove default CRT case.
+
2015-09-23 John David Anglin <danglin@gcc.gnu.org>
* config/pa/linux-atomic.c (__kernel_cmpxchg2): Reorder error checks.
diff --git a/libgcc/config.host b/libgcc/config.host
index 140aa22..6c8b97b 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -267,7 +267,7 @@ case ${host} in
*-*-solaris2*)
# Unless linker support and dl_iterate_phdr are present,
# unwind-dw2-fde-dip.c automatically falls back to unwind-dw2-fde.c.
- tmake_file="$tmake_file t-sol2 t-eh-dw2-dip t-libgcc-pic t-slibgcc t-slibgcc-elf-ver"
+ tmake_file="$tmake_file sol2/t-sol2 t-eh-dw2-dip t-libgcc-pic t-slibgcc t-slibgcc-elf-ver"
if test $with_gnu_ld = yes; then
tmake_file="$tmake_file t-slibgcc-gld"
else
@@ -276,19 +276,22 @@ case ${host} in
# Add cpu-specific t-sol2 after t-slibgcc-* so it can augment SHLIB_MAPFILES.
tmake_file="$tmake_file $cpu_type/t-sol2"
extra_parts="gmon.o crtbegin.o crtend.o"
- case ${host} in
- i?86-*-solaris2.1[0-9]* | x86_64-*-solaris2.1[0-9]*)
- # Solaris 10+/x86 provides crt1.o, crti.o, crtn.o, and gcrt1.o as
- # part of the base system.
- ;;
- sparc*-*-solaris2.1[0-9]*)
- # Solaris 10+/SPARC lacks crt1.o and gcrt1.o.
- extra_parts="$extra_parts crt1.o gcrt1.o"
- ;;
- *)
- extra_parts="$extra_parts crt1.o crti.o crtn.o gcrt1.o"
- ;;
- esac
+ if test "${libgcc_cv_solaris_crts}" = yes; then
+ # Solaris 11.x and 12 provide crt1.o, crti.o, and crtn.o as part of the
+ # base system. crtp.o and crtpg.o implement the compiler-dependent parts.
+ extra_parts="$extra_parts crtp.o crtpg.o"
+ else
+ case ${host} in
+ i?86-*-solaris2.1[0-9]* | x86_64-*-solaris2.1[0-9]*)
+ # Solaris 10+/x86 provides crt1.o, crti.o, crtn.o, and gcrt1.o as
+ # part of the base system.
+ ;;
+ sparc*-*-solaris2.1[0-9]*)
+ # Solaris 10+/SPARC lacks crt1.o and gcrt1.o.
+ extra_parts="$extra_parts crt1.o gcrt1.o"
+ ;;
+ esac
+ fi
;;
*-*-uclinux*)
extra_parts="crtbegin.o crtend.o"
diff --git a/libgcc/config.in b/libgcc/config.in
index 59a7961..25aa0d9 100644
--- a/libgcc/config.in
+++ b/libgcc/config.in
@@ -18,6 +18,9 @@
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
+/* Define if the system-provided CRTs are present on Solaris. */
+#undef HAVE_SOLARIS_CRTS
+
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
diff --git a/libgcc/config/sol2/crtp.c b/libgcc/config/sol2/crtp.c
new file mode 100644
index 0000000..8b79c55e
--- /dev/null
+++ b/libgcc/config/sol2/crtp.c
@@ -0,0 +1,33 @@
+/* Dummy _mcount when mixing profiling and non-profiling objects.
+ Copyright (C) 2015 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+<http://www.gnu.org/licenses/>. */
+
+void _mcount (void);
+
+/* A dummy profiling support routine for non-profiling executables,
+ in case we link in some objects that have been compiled for profiling. */
+
+void __attribute__((weak))
+_mcount (void)
+{
+}
diff --git a/libgcc/config/sol2/crtpg.c b/libgcc/config/sol2/crtpg.c
new file mode 100644
index 0000000..e07a36a
--- /dev/null
+++ b/libgcc/config/sol2/crtpg.c
@@ -0,0 +1,47 @@
+/* Register profiling startup and cleanup with Solaris CRTs.
+ Copyright (C) 2015 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+<http://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+
+extern void monstartup (char *, char *);
+extern void _mcleanup (void);
+
+extern char _start[], _etext[];
+
+int __start_crt_compiler (int, char **);
+
+/* Since Solaris 11.x and Solaris 12, the system-provided CRTs provide a
+ hook to invoke initialization code early during process startup.
+ __start_crt_compiler is documented in crt1.o(5). We use it to perform
+ initialization for profiling as a substitute for the earlier separate
+ gcrt1.o. */
+
+int
+__start_crt_compiler (int argc __attribute__ ((unused)),
+ char **argv __attribute__ ((unused)))
+{
+ monstartup (_start, _etext);
+ atexit (_mcleanup);
+ return 0;
+}
diff --git a/libgcc/config/gmon-sol2.c b/libgcc/config/sol2/gmon.c
index 7d61496..f641958 100644
--- a/libgcc/config/gmon-sol2.c
+++ b/libgcc/config/sol2/gmon.c
@@ -39,6 +39,7 @@
#include "tconfig.h"
#include "tsystem.h"
+#include "auto-target.h"
#include <fcntl.h> /* For creat. */
extern void monstartup (char *, char *);
@@ -324,6 +325,11 @@ internal_mcount (char *selfpc, unsigned short *frompcindex)
frompcindex = (void *) __builtin_return_address (1);
#endif
+/* Only necessary without the Solaris CRTs or a proper gcrt1.o, otherwise
+ crtpg.o or gcrt1.o take care of that.
+
+ FIXME: What about _init vs. _start on sparc? */
+#ifndef HAVE_SOLARIS_CRTS
if(!already_setup) {
extern char etext[];
@@ -344,6 +350,7 @@ internal_mcount (char *selfpc, unsigned short *frompcindex)
#endif
atexit (_mcleanup);
}
+#endif /* !HAVE_SOLARIS_CRTS */
/* Check that we are profiling and that we aren't recursively invoked. */
if (profiling) {
goto out;
diff --git a/libgcc/config/t-sol2 b/libgcc/config/sol2/t-sol2
index 85eddb2..1f7324a 100644
--- a/libgcc/config/t-sol2
+++ b/libgcc/config/sol2/t-sol2
@@ -16,8 +16,14 @@
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
-# gmon build rule:
-gmon.o: $(srcdir)/config/gmon-sol2.c
+# crtp, crtpg build rules
+crtp.o: $(srcdir)/config/sol2/crtp.c
+ $(gcc_compile) -c $<
+crtpg.o: $(srcdir)/config/sol2/crtpg.c
+ $(gcc_compile) -c $<
+
+# gmon build rule
+gmon.o: $(srcdir)/config/sol2/gmon.c
$(gcc_compile) -c $<
# Assemble startup files.
diff --git a/libgcc/configure b/libgcc/configure
index e22cbcb..78708c7 100644
--- a/libgcc/configure
+++ b/libgcc/configure
@@ -4665,6 +4665,38 @@ fi
$as_echo "$libgcc_cv_mips_hard_float" >&6; }
esac
+case ${host} in
+*-*-solaris2*)
+ # Check for system-provided CRTs on Solaris 11.x and Solaris 12.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking system-provided CRTs on Solaris" >&5
+$as_echo_n "checking system-provided CRTs on Solaris... " >&6; }
+if test "${libgcc_cv_solaris_crts+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ libgcc_cv_solaris_crts=no
+ libgcc_sysroot="`${CC} -print-sysroot`"
+ libgcc_libdir="$libgcc_sysroot/usr/lib"
+ # At the time they were added, gcrt1.o became a symlink for backwards
+ # compatibility on x86, while crt1.o was added on sparc, so check for that.
+ case ${host} in
+ i?86-*-solaris2* | x86_64-*-solaris2*)
+ if test -h "$libgcc_libdir/gcrt1.o"; then libgcc_cv_solaris_crts=yes; fi
+ ;;
+ sparc*-*-solaris2*)
+ if test -f "$libgcc_libdir/crt1.o"; then libgcc_cv_solaris_crts=yes; fi
+ ;;
+ esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgcc_cv_solaris_crts" >&5
+$as_echo "$libgcc_cv_solaris_crts" >&6; }
+ if test $libgcc_cv_solaris_crts = yes; then
+
+$as_echo "#define HAVE_SOLARIS_CRTS 1" >>confdefs.h
+
+ fi
+ ;;
+esac
+
# Determine the version of glibc, if any, used on the target.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for target glibc version" >&5
$as_echo_n "checking for target glibc version... " >&6; }
diff --git a/libgcc/configure.ac b/libgcc/configure.ac
index dfabd80..9d831a7 100644
--- a/libgcc/configure.ac
+++ b/libgcc/configure.ac
@@ -292,6 +292,31 @@ mips*-*-*)
[libgcc_cv_mips_hard_float=no])])
esac
+case ${host} in
+*-*-solaris2*)
+ # Check for system-provided CRTs on Solaris 11.x and Solaris 12.
+ AC_CACHE_CHECK([system-provided CRTs on Solaris],
+ [libgcc_cv_solaris_crts],
+ [libgcc_cv_solaris_crts=no
+ libgcc_sysroot="`${CC} -print-sysroot`"
+ libgcc_libdir="$libgcc_sysroot/usr/lib"
+ # At the time they were added, gcrt1.o became a symlink for backwards
+ # compatibility on x86, while crt1.o was added on sparc, so check for that.
+ case ${host} in
+ i?86-*-solaris2* | x86_64-*-solaris2*)
+ if test -h "$libgcc_libdir/gcrt1.o"; then libgcc_cv_solaris_crts=yes; fi
+ ;;
+ sparc*-*-solaris2*)
+ if test -f "$libgcc_libdir/crt1.o"; then libgcc_cv_solaris_crts=yes; fi
+ ;;
+ esac])
+ if test $libgcc_cv_solaris_crts = yes; then
+ AC_DEFINE(HAVE_SOLARIS_CRTS, 1,
+ [Define if the system-provided CRTs are present on Solaris.])
+ fi
+ ;;
+esac
+
# Determine the version of glibc, if any, used on the target.
AC_MSG_CHECKING([for target glibc version])
AC_ARG_WITH([glibc-version],