aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Meissner <meissner@gcc.gnu.org>1996-06-11 18:43:19 +0000
committerMichael Meissner <meissner@gcc.gnu.org>1996-06-11 18:43:19 +0000
commit68ea97b42a700cd439a25ce9cf6352780fb3202a (patch)
treedfeb12e41ecbea3e3afe7c3eaca8cd9220a4f335 /gcc
parent8bc6cf9b63a738d80e8ed52cb8f1d494bff1bed2 (diff)
downloadgcc-68ea97b42a700cd439a25ce9cf6352780fb3202a.zip
gcc-68ea97b42a700cd439a25ce9cf6352780fb3202a.tar.gz
gcc-68ea97b42a700cd439a25ce9cf6352780fb3202a.tar.bz2
Fix -msdata init code; Make sure correct endian flag is defined
From-SVN: r12274
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/rs6000/eabi.asm22
-rw-r--r--gcc/config/rs6000/sysv4.h2
2 files changed, 14 insertions, 10 deletions
diff --git a/gcc/config/rs6000/eabi.asm b/gcc/config/rs6000/eabi.asm
index b09d142..62c483c 100644
--- a/gcc/config/rs6000/eabi.asm
+++ b/gcc/config/rs6000/eabi.asm
@@ -126,26 +126,30 @@ FUNC_START(__eabi)
lwz 12,.Ltable(11) /* get linker's idea of where .Laddr is */
lwz 10,.Linit(11) /* address of init flag */
subf. 12,12,11 /* calculate difference */
- mtlr 0 /* restore link register */
lwzx 9,10,12 /* done flag */
+ mtlr 0 /* restore link register */
+ cmplwi 2,9,0 /* init flag != 0? */
+ bnelr 2 /* return now, if we've been called already */
+ stwx 1,10,12 /* store a non-zero value in the done flag */
+ bne- 0,.Lreloc /* skip if we need to relocate */
#else /* !-mrelocatable */
+ addis 10,0,.Linit_p@ha /* init flag */
addis 11,0,.LCTOC1@ha /* load address of .LCTOC1 */
+ lwz 9,.Linit_p@l(10) /* init flag */
addi 11,11,.LCTOC1@l
- lwz 10,.Linit(11) /* init flag */
-#endif /* !-mrelocatable */
-
cmplwi 2,9,0 /* init flag != 0? */
bnelr 2 /* return now, if we've been called already */
- stwx 1,10,12 /* store a non-zero value in the done flag */
- bne 0,.Lreloc /* skip if we need to relocate */
+ stw 1,.Linit_p@l(10) /* store a non-zero value in the done flag */
+
+#endif /* !-mrelocatable */
/* Only load up register 13 if there is a .sdata and/or .sbss section */
lwz 3,.Lsdas(11) /* start of .sdata/.sbss section */
lwz 4,.Lsdae(11) /* end of .sdata/.sbss section */
cmpw 1,3,4 /* .sdata/.sbss section non-empty? */
- beq 1,.Lsda2l /* skip loading r13 */
+ beq- 1,.Lsda2l /* skip loading r13 */
lwz 13,.Lsda(11) /* load r13 with _SDA_BASE address */
@@ -155,14 +159,14 @@ FUNC_START(__eabi)
lwz 3,.Lsda2s(11) /* start of .sdata/.sbss section */
lwz 4,.Lsda2e(11) /* end of .sdata/.sbss section */
cmpw 1,3,4 /* .sdata/.sbss section non-empty? */
- beq 1,.Ldone /* skip loading r2 */
+ beq+ 1,.Ldone /* skip loading r2 */
lwz 2,.Lsda2(11) /* load r2 with _SDA2_BASE address */
b FUNC_NAME(__do_global_ctors) /* do any C++ global constructors (which returns to caller) */
-.Lreloc:
#ifdef _RELOCATABLE
+.Lreloc:
/* We need to relocate the .got2 pointers. Don't load registers 2 or 13 */
lwz 3,.Lgot2s(11) /* GOT pointers start */
diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
index 3106785..e6b79dd 100644
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -1059,7 +1059,7 @@ do { \
%{mcall-nt: -D_LITTLE_ENDIAN -Amachine(littleendian)} \
%{mcall-linux: -D_BIG_ENDIAN -Amachine(bigendian)} \
%{mcall-aixdesc: -D_BIG_ENDIAN -Amachine(bigendian)} \
- %{!mcall-solaris: %{!mcall-linux: %{!mcall-nt: %{!mcall-aixdesc: %(cpp_endian_default_spec) }}}}}}}}"
+ %{!mcall-solaris: %{!mcall-linux: %{!mcall-nt: %{!mcall-aixdesc: %(cpp_endian_default) }}}}}}}}"
#undef CPP_ENDIAN_DEFAULT_SPEC
#define CPP_ENDIAN_DEFAULT_SPEC "-D_BIG_ENDIAN -Amachine(bigendian)"