Commit 0bc25b2b by Michael Meissner

Solaris fixes

From-SVN: r12132
parent b2d8cf33
...@@ -31,13 +31,13 @@ Boston, MA 02111-1307, USA. */ ...@@ -31,13 +31,13 @@ Boston, MA 02111-1307, USA. */
/* Make the simulator the default */ /* Make the simulator the default */
#undef LIB_DEFAULT_SPEC #undef LIB_DEFAULT_SPEC
#define LIB_DEFAULT_SPEC LIB_SIM_SPEC #define LIB_DEFAULT_SPEC "%(lib_sim)"
#undef STARTFILE_DEFAULT_SPEC #undef STARTFILE_DEFAULT_SPEC
#define STARTFILE_DEFAULT_SPEC STARTFILE_SIM_SPEC #define STARTFILE_DEFAULT_SPEC "%(startfile_sim)"
#undef ENDFILE_DEFAULT_SPEC #undef ENDFILE_DEFAULT_SPEC
#define ENDFILE_DEFAULT_SPEC ENDFILE_SIM_SPEC #define ENDFILE_DEFAULT_SPEC "%(endfile_sim)"
#undef LINK_START_DEFAULT_SPEC #undef LINK_START_DEFAULT_SPEC
#define LINK_START_DEFAULT_SPEC LINK_START_SIM_SPEC #define LINK_START_DEFAULT_SPEC "%(link_start_sim)"
...@@ -31,13 +31,13 @@ Boston, MA 02111-1307, USA. */ ...@@ -31,13 +31,13 @@ Boston, MA 02111-1307, USA. */
/* Make the simulator the default */ /* Make the simulator the default */
#undef LIB_DEFAULT_SPEC #undef LIB_DEFAULT_SPEC
#define LIB_DEFAULT_SPEC LIB_SIM_SPEC #define LIB_DEFAULT_SPEC "%(lib_sim)"
#undef STARTFILE_DEFAULT_SPEC #undef STARTFILE_DEFAULT_SPEC
#define STARTFILE_DEFAULT_SPEC STARTFILE_SIM_SPEC #define STARTFILE_DEFAULT_SPEC "%(startfile_sim)"
#undef ENDFILE_DEFAULT_SPEC #undef ENDFILE_DEFAULT_SPEC
#define ENDFILE_DEFAULT_SPEC ENDFILE_SIM_SPEC #define ENDFILE_DEFAULT_SPEC "%(endfile_sim)"
#undef LINK_START_DEFAULT_SPEC #undef LINK_START_DEFAULT_SPEC
#define LINK_START_DEFAULT_SPEC LINK_START_SIM_SPEC #define LINK_START_DEFAULT_SPEC "%(link_start_sim)"
...@@ -30,16 +30,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -30,16 +30,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define LINK_SPEC "" #define LINK_SPEC ""
#undef LIB_DEFAULT_SPEC #undef LIB_DEFAULT_SPEC
#define LIB_DEFAULT_SPEC LIB_LINUX_SPEC #define LIB_DEFAULT_SPEC "%(lib_linux)"
#undef STARTFILE_DEFAULT_SPEC #undef STARTFILE_DEFAULT_SPEC
#define STARTFILE_DEFAULT_SPEC STARTFILE_LINUX_SPEC #define STARTFILE_DEFAULT_SPEC "%(startfile_linux)"
#undef ENDFILE_DEFAULT_SPEC #undef ENDFILE_DEFAULT_SPEC
#define ENDFILE_DEFAULT_SPEC ENDFILE_LINUX_SPEC #define ENDFILE_DEFAULT_SPEC "%(endfile_linux)"
#undef LINK_START_DEFAULT_SPEC #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 #undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (PowerPC Linux)"); #define TARGET_VERSION fprintf (stderr, " (PowerPC Linux)");
...@@ -28,13 +28,52 @@ Boston, MA 02111-1307, USA. */ ...@@ -28,13 +28,52 @@ Boston, MA 02111-1307, USA. */
extern char **_environ; extern char **_environ;
extern int atexit (void (*__func) (void)); extern int atexit (void (*__func) (void));
extern void __init (void); extern void __init (void) __attribute__ ((__longcall__));
extern void __fini (void); extern void __fini (void) __attribute__ ((__longcall__));
extern void __do_global_ctors (void);
typedef void (*func_ptr) (void); typedef void (*func_ptr) (void);
int (*__atexit)(func_ptr) = atexit; 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. */ /* Start function. */
void void
...@@ -48,10 +87,17 @@ _start(int argc, char *argv[], char *envp[], void *auxp, void (*termfunc)()) ...@@ -48,10 +87,17 @@ _start(int argc, char *argv[], char *envp[], void *auxp, void (*termfunc)())
if (termfunc) if (termfunc)
atexit (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. */ /* Call any global constructors and destructors. */
__do_global_ctors (); __init ();
#endif
atexit (__fini);
/* Call the main program now */ /* Call the main program now */
ret = main (argc, argv, envp, auxp); ret = main (argc, argv, envp, auxp);
......
...@@ -39,6 +39,16 @@ ...@@ -39,6 +39,16 @@
.file "scrti.s" .file "scrti.s"
.ident "GNU C 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 # List of C++ constructors
.section ".ctors","aw" .section ".ctors","aw"
.globl __CTOR_LIST__ .globl __CTOR_LIST__
...@@ -58,7 +68,19 @@ __DTOR_LIST__: ...@@ -58,7 +68,19 @@ __DTOR_LIST__:
.type __init,@function .type __init,@function
__init: stwu %r1,-16(%r1) __init: stwu %r1,-16(%r1)
mflr %r0 mflr %r0
stw %r0,12(%r1) # 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 # Head of __fini function used for static destructors in Solaris
.section ".fini","ax" .section ".fini","ax"
...@@ -67,4 +89,13 @@ __init: stwu %r1,-16(%r1) ...@@ -67,4 +89,13 @@ __init: stwu %r1,-16(%r1)
.type __fini,@function .type __fini,@function
__fini: stwu %r1,-16(%r1) __fini: stwu %r1,-16(%r1)
mflr %r0 mflr %r0
stw %r0,12(%r1) 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
...@@ -39,6 +39,12 @@ ...@@ -39,6 +39,12 @@
.file "scrtn.s" .file "scrtn.s"
.ident "GNU C 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 # End list of C++ constructors
.section ".ctors","aw" .section ".ctors","aw"
.globl __CTOR_END__ .globl __CTOR_END__
...@@ -51,16 +57,24 @@ __CTOR_END__: ...@@ -51,16 +57,24 @@ __CTOR_END__:
.type __DTOR_END__,@object .type __DTOR_END__,@object
__DTOR_END__: __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 # Tail of __init used for static constructors in Solaris
.section ".init","ax" .section ".init","ax"
lwz %r0,12(%r1) lwz %r0,16(%r1)
mtlr %r0 mtlr %r0
addi %r1,%r1,16 addi %r1,%r1,16
blr blr
# Tail of __fini used for static destructors in Solaris # Tail of __fini used for static destructors in Solaris
.section ".fini","ax" .section ".fini","ax"
lwz %r0,12(%r1) lwz %r0,16(%r1)
mtlr %r0 mtlr %r0
addi %r1,%r1,16 addi %r1,%r1,16
blr blr
...@@ -25,11 +25,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ...@@ -25,11 +25,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#undef RS6000_ABI_NAME #undef RS6000_ABI_NAME
#define RS6000_ABI_NAME "solaris" #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 #undef ASM_CPU_SPEC
#define ASM_CPU_SPEC "%{fpic:-K PIC} %{fPIC:-K PIC} -le -s" #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. */ ...@@ -60,16 +55,19 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
MASK_REGNAMES) MASK_REGNAMES)
#undef LIB_DEFAULT_SPEC #undef LIB_DEFAULT_SPEC
#define LIB_DEFAULT_SPEC LIB_SOLARIS_SPEC #define LIB_DEFAULT_SPEC "%(lib_solaris)"
#undef STARTFILE_DEFAULT_SPEC #undef STARTFILE_DEFAULT_SPEC
#define STARTFILE_DEFAULT_SPEC STARTFILE_SOLARIS_SPEC #define STARTFILE_DEFAULT_SPEC "%(startfile_solaris)"
#undef ENDFILE_DEFAULT_SPEC #undef ENDFILE_DEFAULT_SPEC
#define ENDFILE_DEFAULT_SPEC ENDFILE_SOLARIS_SPEC #define ENDFILE_DEFAULT_SPEC "%(endfile_solaris)"
#undef LINK_START_DEFAULT_SPEC #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. */ /* Don't turn -B into -L if the argument specifies a relative file name. */
#undef RELATIVE_PREFIX_NOT_LINKDIR #undef RELATIVE_PREFIX_NOT_LINKDIR
...@@ -171,6 +169,3 @@ while (0) ...@@ -171,6 +169,3 @@ while (0)
#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \ #define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \ ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \
sprintf ((OUTPUT), "%s_.%d", (NAME), (LABELNO))) sprintf ((OUTPUT), "%s_.%d", (NAME), (LABELNO)))
#define ASM_RELOCATION_EXPRESSIONS 1
...@@ -96,6 +96,7 @@ extern enum rs6000_sdata_type rs6000_sdata; ...@@ -96,6 +96,7 @@ extern enum rs6000_sdata_type rs6000_sdata;
{ "sim", 0 }, \ { "sim", 0 }, \
{ "mvme", 0 }, \ { "mvme", 0 }, \
{ "emb", 0 }, \ { "emb", 0 }, \
{ "solaris-cclib", 0 }, \
{ "newlib", 0 }, { "newlib", 0 },
/* Default ABI to use */ /* Default ABI to use */
...@@ -185,8 +186,7 @@ do { \ ...@@ -185,8 +186,7 @@ do { \
} \ } \
else if (TARGET_SDATA) \ else if (TARGET_SDATA) \
rs6000_sdata = (TARGET_EABI) ? SDATA_EABI : SDATA_SYSV; \ rs6000_sdata = (TARGET_EABI) ? SDATA_EABI : SDATA_SYSV; \
else if (!TARGET_RELOCATABLE && !flag_pic \ else if (!TARGET_RELOCATABLE && !flag_pic && DEFAULT_ABI == ABI_V4) \
&& (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)) \
{ \ { \
rs6000_sdata = SDATA_DATA; \ rs6000_sdata = SDATA_DATA; \
target_flags |= MASK_SDATA; \ target_flags |= MASK_SDATA; \
...@@ -403,7 +403,8 @@ do { \ ...@@ -403,7 +403,8 @@ do { \
#define SDATA_SECTION_ASM_OP "\t.section \".sdata\",\"aw\"" #define SDATA_SECTION_ASM_OP "\t.section \".sdata\",\"aw\""
#define SDATA2_SECTION_ASM_OP "\t.section \".sdata2\",\"a\"" #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. */ /* Besides the usual ELF sections, we need a toc section. */
...@@ -1091,11 +1092,15 @@ scrti.o%s" ...@@ -1091,11 +1092,15 @@ scrti.o%s"
#endif #endif
#ifndef STARTFILE_SOLARIS_SPEC #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 #endif
#ifndef ENDFILE_SOLARIS_SPEC #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 #endif
#ifndef LINK_START_SOLARIS_SPEC #ifndef LINK_START_SOLARIS_SPEC
...@@ -1109,7 +1114,7 @@ scrti.o%s" ...@@ -1109,7 +1114,7 @@ scrti.o%s"
#ifndef CPP_OS_SOLARIS_SPEC #ifndef CPP_OS_SOLARIS_SPEC
#define CPP_OS_SOLARIS_SPEC "-D__ppc -D__sun__=1 -D__unix__ -D__svr4__ -D__SVR4__ \ #define CPP_OS_SOLARIS_SPEC "-D__ppc -D__sun__=1 -D__unix__ -D__svr4__ -D__SVR4__ \
%{!ansi: -Dsun=1 -Dunix -DSVR4 -D__EXTENSIONS__ } \ %{!ansi: -Dsun=1 -Dunix -DSVR4 -D__EXTENSIONS__ } \
-Asystem(unix) -Asystem(svr4) -Amachine(prep)" -Amachine(prep)"
#endif #endif
/* Define any extra SPECS that the compiler needs to generate. */ /* Define any extra SPECS that the compiler needs to generate. */
......
...@@ -26,20 +26,18 @@ eabi-ctors.c: $(srcdir)/config/rs6000/eabi-ctors.c ...@@ -26,20 +26,18 @@ eabi-ctors.c: $(srcdir)/config/rs6000/eabi-ctors.c
# -mbig/-mlittle switches passed to gas. The -mrelocatable support also needs # -mbig/-mlittle switches passed to gas. The -mrelocatable support also needs
# -mrelocatable passed to gas, so don't use it either. # -mrelocatable passed to gas, so don't use it either.
MULTILIB_OPTIONS = msoft-float \ 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 \ MULTILIB_DIRNAMES = nof \
le be \ le be \
cs ce ca cs ce ca sol
MULTILIB_MATCHES = mlittle=mlittle-endian \ MULTILIB_MATCHES = mlittle=mlittle-endian \
mbig=mbig-endian \ mbig=mbig-endian \
mlittle=mcall-solaris \
mbig=mcall-linux \ mbig=mcall-linux \
msoft-float=mcpu?403 \ msoft-float=mcpu?403 \
msoft-float=mcpu?821 \ msoft-float=mcpu?821 \
msoft-float=mcpu?860 \ msoft-float=mcpu?860 \
mcall-sysv-noeabi=mcall-solaris \
mcall-sysv-noeabi=mcall-linux \ mcall-sysv-noeabi=mcall-linux \
mcall-sysv-eabi=meabi \ mcall-sysv-eabi=meabi \
mcall-sysv-noeabi=mno-eabi mcall-sysv-noeabi=mno-eabi
......
...@@ -26,26 +26,27 @@ eabi-ctors.c: $(srcdir)/config/rs6000/eabi-ctors.c ...@@ -26,26 +26,27 @@ eabi-ctors.c: $(srcdir)/config/rs6000/eabi-ctors.c
MULTILIB_OPTIONS = msoft-float \ MULTILIB_OPTIONS = msoft-float \
mrelocatable \ mrelocatable \
mlittle/mbig \ mlittle/mbig \
mcall-sysv-noeabi/mcall-sysv-eabi/mcall-aix mcall-sysv-noeabi/mcall-sysv-eabi/mcall-aix/mcall-solaris
MULTILIB_DIRNAMES = nof \ MULTILIB_DIRNAMES = nof \
rel \ rel \
le be \ le be \
cs ce ca cs ce ca sol
MULTILIB_MATCHES = mlittle=mlittle-endian \ MULTILIB_MATCHES = mlittle=mlittle-endian \
mbig=mbig-endian \ mbig=mbig-endian \
mlittle=mcall-solaris \
mbig=mcall-linux \ mbig=mcall-linux \
msoft-float=mcpu?403 \ msoft-float=mcpu?403 \
msoft-float=mcpu?821 \ msoft-float=mcpu?821 \
msoft-float=mcpu?860 \ msoft-float=mcpu?860 \
mcall-sysv-noeabi=mcall-solaris \
mcall-sysv-noeabi=mcall-linux \ mcall-sysv-noeabi=mcall-linux \
mcall-sysv-eabi=meabi \ mcall-sysv-eabi=meabi \
mcall-sysv-noeabi=mno-eabi 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 LIBGCC = stmp-multilib stmp-crt
INSTALL_LIBGCC = install-multilib install-crt INSTALL_LIBGCC = install-multilib install-crt
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment