diff options
author | Michael Meissner <meissner@gcc.gnu.org> | 1996-06-11 18:43:19 +0000 |
---|---|---|
committer | Michael Meissner <meissner@gcc.gnu.org> | 1996-06-11 18:43:19 +0000 |
commit | 68ea97b42a700cd439a25ce9cf6352780fb3202a (patch) | |
tree | dfeb12e41ecbea3e3afe7c3eaca8cd9220a4f335 /gcc | |
parent | 8bc6cf9b63a738d80e8ed52cb8f1d494bff1bed2 (diff) | |
download | gcc-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.asm | 22 | ||||
-rw-r--r-- | gcc/config/rs6000/sysv4.h | 2 |
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)" |