summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authormeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>1996-05-31 19:02:31 +0000
committermeissner <meissner@138bc75d-0d04-0410-961f-82ee72b054a4>1996-05-31 19:02:31 +0000
commit5d05fbcfd59daa6b9f0a74dc2b5e8853787b7ed7 (patch)
tree4943398181330ced0a63da15711e85b125350878 /gcc
parent6c51b52b5d7c7cbfd73d0431f855ab885b491d17 (diff)
downloadgcc-5d05fbcfd59daa6b9f0a74dc2b5e8853787b7ed7.tar.gz
Solaris fixes
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@12132 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/rs6000/eabilesim.h8
-rw-r--r--gcc/config/rs6000/eabisim.h8
-rw-r--r--gcc/config/rs6000/linux.h8
-rw-r--r--gcc/config/rs6000/sol-c0.c58
-rw-r--r--gcc/config/rs6000/sol-ci.asm43
-rw-r--r--gcc/config/rs6000/sol-cn.asm26
-rw-r--r--gcc/config/rs6000/sol2.h19
-rw-r--r--gcc/config/rs6000/sysv4.h17
-rw-r--r--gcc/config/rs6000/t-ppc6
-rw-r--r--gcc/config/rs6000/t-ppcgas11
10 files changed, 147 insertions, 57 deletions
diff --git a/gcc/config/rs6000/eabilesim.h b/gcc/config/rs6000/eabilesim.h
index a0ba5c7c8a0..d826435145d 100644
--- a/gcc/config/rs6000/eabilesim.h
+++ b/gcc/config/rs6000/eabilesim.h
@@ -31,13 +31,13 @@ Boston, MA 02111-1307, USA. */
/* Make the simulator the default */
#undef LIB_DEFAULT_SPEC
-#define LIB_DEFAULT_SPEC LIB_SIM_SPEC
+#define LIB_DEFAULT_SPEC "%(lib_sim)"
#undef STARTFILE_DEFAULT_SPEC
-#define STARTFILE_DEFAULT_SPEC STARTFILE_SIM_SPEC
+#define STARTFILE_DEFAULT_SPEC "%(startfile_sim)"
#undef ENDFILE_DEFAULT_SPEC
-#define ENDFILE_DEFAULT_SPEC ENDFILE_SIM_SPEC
+#define ENDFILE_DEFAULT_SPEC "%(endfile_sim)"
#undef LINK_START_DEFAULT_SPEC
-#define LINK_START_DEFAULT_SPEC LINK_START_SIM_SPEC
+#define LINK_START_DEFAULT_SPEC "%(link_start_sim)"
diff --git a/gcc/config/rs6000/eabisim.h b/gcc/config/rs6000/eabisim.h
index 96b61c3df14..6a82244973f 100644
--- a/gcc/config/rs6000/eabisim.h
+++ b/gcc/config/rs6000/eabisim.h
@@ -31,13 +31,13 @@ Boston, MA 02111-1307, USA. */
/* Make the simulator the default */
#undef LIB_DEFAULT_SPEC
-#define LIB_DEFAULT_SPEC LIB_SIM_SPEC
+#define LIB_DEFAULT_SPEC "%(lib_sim)"
#undef STARTFILE_DEFAULT_SPEC
-#define STARTFILE_DEFAULT_SPEC STARTFILE_SIM_SPEC
+#define STARTFILE_DEFAULT_SPEC "%(startfile_sim)"
#undef ENDFILE_DEFAULT_SPEC
-#define ENDFILE_DEFAULT_SPEC ENDFILE_SIM_SPEC
+#define ENDFILE_DEFAULT_SPEC "%(endfile_sim)"
#undef LINK_START_DEFAULT_SPEC
-#define LINK_START_DEFAULT_SPEC LINK_START_SIM_SPEC
+#define LINK_START_DEFAULT_SPEC "%(link_start_sim)"
diff --git a/gcc/config/rs6000/linux.h b/gcc/config/rs6000/linux.h
index 618158cf225..79a115ded4b 100644
--- a/gcc/config/rs6000/linux.h
+++ b/gcc/config/rs6000/linux.h
@@ -30,16 +30,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define LINK_SPEC ""
#undef LIB_DEFAULT_SPEC
-#define LIB_DEFAULT_SPEC LIB_LINUX_SPEC
+#define LIB_DEFAULT_SPEC "%(lib_linux)"
#undef STARTFILE_DEFAULT_SPEC
-#define STARTFILE_DEFAULT_SPEC STARTFILE_LINUX_SPEC
+#define STARTFILE_DEFAULT_SPEC "%(startfile_linux)"
#undef ENDFILE_DEFAULT_SPEC
-#define ENDFILE_DEFAULT_SPEC ENDFILE_LINUX_SPEC
+#define ENDFILE_DEFAULT_SPEC "%(endfile_linux)"
#undef LINK_START_DEFAULT_SPEC
-#define LINK_START_DEFAULT_SPEC LINK_START_LINUX_SPEC
+#define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (PowerPC Linux)");
diff --git a/gcc/config/rs6000/sol-c0.c b/gcc/config/rs6000/sol-c0.c
index 1530fa75fc0..faa46c4bfbc 100644
--- a/gcc/config/rs6000/sol-c0.c
+++ b/gcc/config/rs6000/sol-c0.c
@@ -28,13 +28,52 @@ Boston, MA 02111-1307, USA. */
extern char **_environ;
extern int atexit (void (*__func) (void));
-extern void __init (void);
-extern void __fini (void);
-extern void __do_global_ctors (void);
+extern void __init (void) __attribute__ ((__longcall__));
+extern void __fini (void) __attribute__ ((__longcall__));
typedef void (*func_ptr) (void);
int (*__atexit)(func_ptr) = atexit;
+/* Exception handling */
+struct ex_shared1 {
+ void *prev;
+ void *next;
+ char *text_start;
+ char *range_start;
+ char *text_end;
+ char *range_end;
+};
+
+struct ex_shared {
+ void (*ex_register) (struct ex_shared1 *);
+ void (*ex_deregister) (struct ex_shared1 *);
+ struct ex_shared1 shared_info;
+};
+
+extern char _ex_text0[], _ex_text1[];
+extern char _ex_range0[], _ex_range1[];
+extern void _ex_register (struct ex_shared1 *);
+extern void _ex_deregister (struct ex_shared1 *);
+
+struct ex_shared shared __attribute__((section(".ex_shared"))) = {
+ _ex_register,
+ _ex_deregister,
+ {
+ (void *)0,
+ (void *)0,
+ _ex_text0,
+ _ex_range0,
+ _ex_text1,
+ _ex_range1
+ }
+};
+
+static void
+deregister (void)
+{
+ (* shared.ex_deregister) (&shared.shared_info);
+}
+
/* Start function. */
void
@@ -48,10 +87,17 @@ _start(int argc, char *argv[], char *envp[], void *auxp, void (*termfunc)())
if (termfunc)
atexit (termfunc);
-#if 0
+ /* Register exception handler if needed */
+ if (shared.ex_register)
+ (* shared.ex_register) (&shared.shared_info);
+
+ if (shared.ex_deregister)
+ atexit (deregister);
+
/* Call any global constructors and destructors. */
- __do_global_ctors ();
-#endif
+ __init ();
+
+ atexit (__fini);
/* Call the main program now */
ret = main (argc, argv, envp, auxp);
diff --git a/gcc/config/rs6000/sol-ci.asm b/gcc/config/rs6000/sol-ci.asm
index 71a3315aabd..e4ead3210e6 100644
--- a/gcc/config/rs6000/sol-ci.asm
+++ b/gcc/config/rs6000/sol-ci.asm
@@ -39,6 +39,16 @@
.file "scrti.s"
.ident "GNU C scrti.s"
+# Start of .text
+ .section ".text"
+ .globl _ex_text0
+_ex_text0:
+
+# Exception range
+ .section ".exception_ranges","aw"
+ .globl _ex_range0
+_ex_range0:
+
# List of C++ constructors
.section ".ctors","aw"
.globl __CTOR_LIST__
@@ -56,15 +66,36 @@ __DTOR_LIST__:
.align 2
.globl __init
.type __init,@function
-__init: stwu %r1,-16(%r1)
- mflr %r0
- stw %r0,12(%r1)
+__init: stwu %r1,-16(%r1)
+ mflr %r0
+# stw %r31,12(%r1)
+ stw %r0,16(%r1)
+
+# bl _GLOBAL_OFFSET_TABLE_-4 # get the GOT address
+# mflr %r31
+#
+# lwz %r3,_ex_shared0@got(%r31)
+# lwz %r4,-8(%r3) # _ex_register or 0
+# cmpi %cr0,%r4,0
+# beq .Lno_reg
+# mtlr %r4
+# blrl
+#.Lno_reg:
# Head of __fini function used for static destructors in Solaris
.section ".fini","ax"
.align 2
.globl __fini
.type __fini,@function
-__fini: stwu %r1,-16(%r1)
- mflr %r0
- stw %r0,12(%r1)
+__fini: stwu %r1,-16(%r1)
+ mflr %r0
+ stw %r31,12(%r1)
+ stw %r0,16(%r1)
+
+# bl _GLOBAL_OFFSET_TABLE_-4 # get the GOT address
+# mflr %r31
+
+# _environ and its evil twin environ, pointing to the environment
+ .comm _environ,4,4
+ .weak environ
+ .set environ,_environ
diff --git a/gcc/config/rs6000/sol-cn.asm b/gcc/config/rs6000/sol-cn.asm
index d3a60836466..b911b8f8533 100644
--- a/gcc/config/rs6000/sol-cn.asm
+++ b/gcc/config/rs6000/sol-cn.asm
@@ -39,6 +39,12 @@
.file "scrtn.s"
.ident "GNU C scrtn.s"
+# Default versions of exception handling register/deregister
+ .weak _ex_register
+ .weak _ex_deregister
+ .set _ex_register,0
+ .set _ex_deregister,0
+
# End list of C++ constructors
.section ".ctors","aw"
.globl __CTOR_END__
@@ -51,16 +57,24 @@ __CTOR_END__:
.type __DTOR_END__,@object
__DTOR_END__:
+ .section ".text"
+ .globl _ex_text1
+_ex_text1:
+
+ .section ".exception_ranges","aw"
+ .globl _ex_range1
+_ex_range1:
+
# Tail of __init used for static constructors in Solaris
.section ".init","ax"
- lwz %r0,12(%r1)
- mtlr %r0
- addi %r1,%r1,16
+ lwz %r0,16(%r1)
+ mtlr %r0
+ addi %r1,%r1,16
blr
# Tail of __fini used for static destructors in Solaris
.section ".fini","ax"
- lwz %r0,12(%r1)
- mtlr %r0
- addi %r1,%r1,16
+ lwz %r0,16(%r1)
+ mtlr %r0
+ addi %r1,%r1,16
blr
diff --git a/gcc/config/rs6000/sol2.h b/gcc/config/rs6000/sol2.h
index 357e21cbc33..5b0e29f81ab 100644
--- a/gcc/config/rs6000/sol2.h
+++ b/gcc/config/rs6000/sol2.h
@@ -25,11 +25,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#undef RS6000_ABI_NAME
#define RS6000_ABI_NAME "solaris"
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES \
- "-Dsun=1 -Dunix -D__svr4__ -DSVR4 -DPPC \
- -D__ppc -Asystem(unix) -Asystem(svr4) -Acpu(powerpc) -Amachine(prep)"
-
#undef ASM_CPU_SPEC
#define ASM_CPU_SPEC "%{fpic:-K PIC} %{fPIC:-K PIC} -le -s"
@@ -60,16 +55,19 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
MASK_REGNAMES)
#undef LIB_DEFAULT_SPEC
-#define LIB_DEFAULT_SPEC LIB_SOLARIS_SPEC
+#define LIB_DEFAULT_SPEC "%(lib_solaris)"
#undef STARTFILE_DEFAULT_SPEC
-#define STARTFILE_DEFAULT_SPEC STARTFILE_SOLARIS_SPEC
+#define STARTFILE_DEFAULT_SPEC "%(startfile_solaris)"
#undef ENDFILE_DEFAULT_SPEC
-#define ENDFILE_DEFAULT_SPEC ENDFILE_SOLARIS_SPEC
+#define ENDFILE_DEFAULT_SPEC "%(endfile_solaris)"
#undef LINK_START_DEFAULT_SPEC
-#define LINK_START_DEFAULT_SPEC LINK_START_SOLARIS_SPEC
+#define LINK_START_DEFAULT_SPEC "%(link_start_solaris)"
+
+#undef CPP_OS_DEFAULT_SPEC
+#define CPP_OS_DEFAULT_SPEC "%(cpp_os_solaris)"
/* Don't turn -B into -L if the argument specifies a relative file name. */
#undef RELATIVE_PREFIX_NOT_LINKDIR
@@ -171,6 +169,3 @@ while (0)
#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
sprintf ((OUTPUT), "%s_.%d", (NAME), (LABELNO)))
-
-#define ASM_RELOCATION_EXPRESSIONS 1
-
diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
index b6e4023a9c3..cf6740cd1e0 100644
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -96,6 +96,7 @@ extern enum rs6000_sdata_type rs6000_sdata;
{ "sim", 0 }, \
{ "mvme", 0 }, \
{ "emb", 0 }, \
+ { "solaris-cclib", 0 }, \
{ "newlib", 0 },
/* Default ABI to use */
@@ -185,8 +186,7 @@ do { \
} \
else if (TARGET_SDATA) \
rs6000_sdata = (TARGET_EABI) ? SDATA_EABI : SDATA_SYSV; \
- else if (!TARGET_RELOCATABLE && !flag_pic \
- && (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)) \
+ else if (!TARGET_RELOCATABLE && !flag_pic && DEFAULT_ABI == ABI_V4) \
{ \
rs6000_sdata = SDATA_DATA; \
target_flags |= MASK_SDATA; \
@@ -403,7 +403,8 @@ do { \
#define SDATA_SECTION_ASM_OP "\t.section \".sdata\",\"aw\""
#define SDATA2_SECTION_ASM_OP "\t.section \".sdata2\",\"a\""
-#define SBSS_SECTION_ASM_OP "\t.section \".sbss\",\"aw\",@nobits"
+#define SBSS_SECTION_ASM_OP \
+ ((DEFAULT_ABI == ABI_SOLARIS) ? "\t.section \".sbss\",\"aw\"" : "\t.section \".sbss\",\"aw\",@nobits")
/* Besides the usual ELF sections, we need a toc section. */
@@ -1091,11 +1092,15 @@ scrti.o%s"
#endif
#ifndef STARTFILE_SOLARIS_SPEC
-#define STARTFILE_SOLARIS_SPEC "scrti.o%s scrt0.o%s"
+#define STARTFILE_SOLARIS_SPEC "\
+%{!msolaris-cclib: scrti.o%s scrt0.o%s} \
+%{msolaris-cclib: crti.o%s crt1.o%s}"
#endif
#ifndef ENDFILE_SOLARIS_SPEC
-#define ENDFILE_SOLARIS_SPEC "scrtn.o%s"
+#define ENDFILE_SOLARIS_SPEC "\
+%{!msolaris-cclib: scrtn.o%s} \
+%{msolaris-cclib: crtn.o%s}"
#endif
#ifndef LINK_START_SOLARIS_SPEC
@@ -1109,7 +1114,7 @@ scrti.o%s"
#ifndef CPP_OS_SOLARIS_SPEC
#define CPP_OS_SOLARIS_SPEC "-D__ppc -D__sun__=1 -D__unix__ -D__svr4__ -D__SVR4__ \
%{!ansi: -Dsun=1 -Dunix -DSVR4 -D__EXTENSIONS__ } \
--Asystem(unix) -Asystem(svr4) -Amachine(prep)"
+-Amachine(prep)"
#endif
/* Define any extra SPECS that the compiler needs to generate. */
diff --git a/gcc/config/rs6000/t-ppc b/gcc/config/rs6000/t-ppc
index bee27ad5115..69c7e754de2 100644
--- a/gcc/config/rs6000/t-ppc
+++ b/gcc/config/rs6000/t-ppc
@@ -26,20 +26,18 @@ eabi-ctors.c: $(srcdir)/config/rs6000/eabi-ctors.c
# -mbig/-mlittle switches passed to gas. The -mrelocatable support also needs
# -mrelocatable passed to gas, so don't use it either.
MULTILIB_OPTIONS = msoft-float \
- mcall-sysv-noeabi/mcall-sysv-eabi/mcall-aix
+ mcall-sysv-noeabi/mcall-sysv-eabi/mcall-aix/mcall-solaris
MULTILIB_DIRNAMES = nof \
le be \
- cs ce ca
+ cs ce ca sol
MULTILIB_MATCHES = mlittle=mlittle-endian \
mbig=mbig-endian \
- mlittle=mcall-solaris \
mbig=mcall-linux \
msoft-float=mcpu?403 \
msoft-float=mcpu?821 \
msoft-float=mcpu?860 \
- mcall-sysv-noeabi=mcall-solaris \
mcall-sysv-noeabi=mcall-linux \
mcall-sysv-eabi=meabi \
mcall-sysv-noeabi=mno-eabi
diff --git a/gcc/config/rs6000/t-ppcgas b/gcc/config/rs6000/t-ppcgas
index 107ace913db..115323d96bb 100644
--- a/gcc/config/rs6000/t-ppcgas
+++ b/gcc/config/rs6000/t-ppcgas
@@ -26,26 +26,27 @@ eabi-ctors.c: $(srcdir)/config/rs6000/eabi-ctors.c
MULTILIB_OPTIONS = msoft-float \
mrelocatable \
mlittle/mbig \
- mcall-sysv-noeabi/mcall-sysv-eabi/mcall-aix
+ mcall-sysv-noeabi/mcall-sysv-eabi/mcall-aix/mcall-solaris
MULTILIB_DIRNAMES = nof \
rel \
le be \
- cs ce ca
+ cs ce ca sol
MULTILIB_MATCHES = mlittle=mlittle-endian \
mbig=mbig-endian \
- mlittle=mcall-solaris \
mbig=mcall-linux \
msoft-float=mcpu?403 \
msoft-float=mcpu?821 \
msoft-float=mcpu?860 \
- mcall-sysv-noeabi=mcall-solaris \
mcall-sysv-noeabi=mcall-linux \
mcall-sysv-eabi=meabi \
mcall-sysv-noeabi=mno-eabi
-MULTILIB_EXCEPTIONS = *mrelocatable*/*mcall-sysv-noeabi*
+MULTILIB_EXCEPTIONS = *mrelocatable*/*mcall-sysv-noeabi* \
+ *mrelocatable*/*mcall-solaris* \
+ *mbig*/*mcall-solaris* \
+ *mlittle*/*mcall-solaris*
LIBGCC = stmp-multilib stmp-crt
INSTALL_LIBGCC = install-multilib install-crt