From eaf1bcf15bd8600a10e9f874caf4e6439d0a4bbc Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Thu, 12 Dec 1996 20:55:56 +0000 Subject: [PATCH] Add @plt if -fpic; Fix double->int conversions if stack > 32k; Redo t-* files; Fix trampolines on System V systems From-SVN: r13298 --- gcc/config/rs6000/rs6000.c | 176 ++---------------------------------- gcc/config/rs6000/rs6000.h | 8 +- gcc/config/rs6000/rs6000.md | 37 +------- gcc/config/rs6000/sol-c0.c | 11 ++- gcc/config/rs6000/sysv4.h | 2 +- gcc/config/rs6000/t-ppc | 64 +------------ gcc/config/rs6000/t-ppccomm | 69 ++++++++++++++ gcc/config/rs6000/t-ppcgas | 71 +-------------- gcc/config/rs6000/t-ppcos | 11 +++ gcc/config/rs6000/tramp.asm | 122 +++++++++++++++++++++++++ gcc/config/rs6000/win-nt.h | 7 ++ gcc/ginclude/ppc-asm.h | 42 +++++++++ 12 files changed, 279 insertions(+), 341 deletions(-) create mode 100644 gcc/config/rs6000/t-ppccomm create mode 100644 gcc/config/rs6000/t-ppcos create mode 100644 gcc/config/rs6000/tramp.asm diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 244dc2e54c9..d5e1210f673 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -4381,65 +4381,6 @@ int get_issue_rate() } } - -/* Output insns to flush the {data|instruction} caches after building a - trampoline. */ - -static void -rs6000_sync_trampoline (addr) - rtx addr; -{ - enum machine_mode pmode = Pmode; - rtx reg = gen_reg_rtx (pmode); - rtx mem2; - rtx mem1; - int size = rs6000_trampoline_size (); - rtx (*sub_fcn) PROTO ((rtx, rtx, rtx)); - rtx (*cmp_fcn) PROTO ((rtx, rtx)); - rtx label; - - if (TARGET_32BIT) - { - sub_fcn = gen_subsi3; - cmp_fcn = gen_cmpsi; - } - else - { - sub_fcn = gen_subdi3; - cmp_fcn = gen_cmpdi; - } - - addr = force_reg (pmode, addr); - mem2 = gen_rtx (MEM, pmode, gen_rtx (PLUS, pmode, addr, reg)); - mem1 = gen_rtx (MEM, pmode, addr); - - /* Issue a loop of dcbst's to flush the data cache */ - emit_move_insn (reg, GEN_INT (size-4)); - label = gen_label_rtx (); - emit_label (label); - emit_insn (gen_dcbst (mem2, addr, reg)); - emit_insn ((*sub_fcn) (reg, reg, GEN_INT (4))); - emit_insn ((*cmp_fcn) (reg, const0_rtx)); - emit_jump_insn (gen_bgt (label)); - - /* Issue a sync after the dcbst's to let things settle down */ - emit_insn (gen_sync (mem1)); - - /* Issue a loop of icbi's to flush the instruction cache */ - emit_move_insn (reg, GEN_INT (size-4)); - label = gen_label_rtx (); - emit_label (label); - emit_insn (gen_icbi (mem2, addr, reg)); - emit_insn ((*sub_fcn) (reg, reg, GEN_INT (4))); - emit_insn ((*cmp_fcn) (reg, const0_rtx)); - emit_jump_insn (gen_bgt (label)); - - /* Issue a sync after the icbi's to let things settle down */ - emit_insn (gen_sync (mem1)); - - /* Finally issue an isync to synchronize the icache */ - emit_insn (gen_isync (mem1)); -} /* Output assembler code for a block containing the constant parts @@ -4466,7 +4407,6 @@ rs6000_trampoline_template (file) the address of the function, the second word is the TOC pointer (r2), and the third word is the static chain value. */ case ABI_AIX: - fprintf (file, "\t.long %s\n", (TARGET_32BIT) ? "0,0,0" : "0,0,0,0,0,0"); break; @@ -4475,35 +4415,6 @@ rs6000_trampoline_template (file) case ABI_V4: case ABI_SOLARIS: case ABI_AIX_NODESC: - if (STATIC_CHAIN_REGNUM == 0 || !TARGET_NEW_MNEMONICS) - abort (); - - if (TARGET_32BIT) - { - fprintf (file, "\tmflr %s\n", r0); /* offset 0 */ - fprintf (file, "\tbl .LTRAMP1\n"); /* offset 4 */ - fprintf (file, "\t.long 0,0\n"); /* offset 8 */ - fprintf (file, ".LTRAMP1:\n"); - fprintf (file, "\tmflr %s\n", sc); /* offset 20 */ - fprintf (file, "\tmtlr %s\n", r0); /* offset 24 */ - fprintf (file, "\tlwz %s,0(%s)\n", r0, sc); /* offset 28 */ - fprintf (file, "\tlwz %s,4(%s)\n", sc, sc); /* offset 32 */ - fprintf (file, "\tmtctr %s\n", r0); /* offset 36 */ - fprintf (file, "\tbctr\n"); /* offset 40 */ - } - else - { - fprintf (file, "\tmflr %s\n", r0); /* offset 0 */ - fprintf (file, "\tbl .LTRAMP1\n"); /* offset 4 */ - fprintf (file, "\t.long 0,0,0,0\n"); /* offset 8 */ - fprintf (file, ".LTRAMP1:\n"); - fprintf (file, "\tmflr %s\n", sc); /* offset 28 */ - fprintf (file, "\tmtlr %s\n", r0); /* offset 32 */ - fprintf (file, "\tld %s,0(%s)\n", r0, sc); /* offset 36 */ - fprintf (file, "\tld %s,8(%s)\n", sc, sc); /* offset 40 */ - fprintf (file, "\tmtctr %s\n", r0); /* offset 44 */ - fprintf (file, "\tbctr\n"); /* offset 48 */ - } break; /* NT function pointers point to a two word area (real address, TOC) @@ -4600,18 +4511,16 @@ rs6000_initialize_trampoline (addr, fnaddr, cxt) } break; - /* Under V.4/eabi, update the two words after the bl to have the real - function address and the static chain. */ + /* Under V.4/eabi, call __trampoline_setup to do the real work. */ case ABI_V4: case ABI_SOLARIS: case ABI_AIX_NODESC: - { - rtx reg = gen_reg_rtx (pmode); - emit_move_insn (reg, fnaddr); - emit_move_insn (MEM_PLUS (addr, 8), reg); - emit_move_insn (MEM_PLUS (addr, 8 + regsize), ctx_reg); - rs6000_sync_trampoline (addr); - } + emit_library_call (gen_rtx (SYMBOL_REF, SImode, "__trampoline_setup"), + FALSE, VOIDmode, 4, + addr, pmode, + GEN_INT (rs6000_trampoline_size ()), SImode, + fnaddr, pmode, + ctx_reg, pmode); break; /* Under NT, update the first word to point to the ..LTRAMP1..0 header, @@ -4944,74 +4853,3 @@ rs6000_encode_section_info (decl) } #endif /* USING_SVR4_H */ - - -/* CYGNUS LOCAL mac */ - -/* Whether we are using m68k-compatible alignment. */ - -int mac68k_aligned; - -/* Most Mac compiler pragmas are unimportant, but we must recognize - the m68k alignment pragma, because that is crucial to transitions - to and from the m68k emulator on PowerMacs. */ - -int -handle_mac_pragma (finput, t) - FILE *finput; - tree t; -{ - int retval = 0; - register char *pname; - char pbuf[200]; - int c, psize = 0; - - if (TREE_CODE (t) != IDENTIFIER_NODE) - return 0; - - pname = IDENTIFIER_POINTER (t); - if (strcmp (pname, "segment") == 0) - { - /* (should collect pbuf + 8 into a segment name) */ - } - else if (strcmp (pname, "options") == 0) - { - c = getc (finput); - /* Skip over initial whitespace. */ - while (c == ' ' || c == '\t') - c = getc (finput); - - /* Return without doing anything if no content. */ - if (c == '\n' || c == EOF) - { - ungetc (c, finput); - return 0; - } - - /* Collect the rest of the line. */ - while (psize < sizeof (pbuf) - 1 && c != '\n') - { - pbuf[psize++] = c; - c = getc (finput); - } - - if (strncmp (pbuf, "align=mac68k", 12) == 0) - { - mac68k_aligned = 1; - retval = 1; - } - else if (strncmp (pbuf, "align=power", 11) == 0) - { - mac68k_aligned = 0; - retval = 1; - } - else if (strncmp (pbuf, "align=reset", 11) == 0) - { - mac68k_aligned = 0; - retval = 1; - } - } - - return retval; -} -/* END CYGNUS LOCAL mac */ diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 9e983446fb0..691facecb1c 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -441,7 +441,6 @@ struct rs6000_cpu_select extern struct rs6000_cpu_select rs6000_select[]; - /* Sometimes certain combinations of command options do not make sense on a particular target machine. You can define a macro `OVERRIDE_OPTIONS' to take account of this. This macro, if @@ -1520,12 +1519,7 @@ typedef struct rs6000_args #define FUNCTION_EPILOGUE(FILE, SIZE) output_epilog (FILE, SIZE) -/* Output assembler code for a block containing the constant parts - of a trampoline, leaving space for the variable parts. - - The trampoline should set the static chain pointer to value placed - into the trampoline and should branch to the specified routine. */ -#define TRAMPOLINE_TEMPLATE(FILE) rs6000_trampoline_template (FILE) +/* TRAMPOLINE_TEMPLATE deleted */ /* Length in units of the trampoline for entering a nested function. */ diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 480e0ba7cca..5752d2328c9 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -3836,7 +3836,8 @@ operands[2] = gen_rtx (MEM, DFmode, gen_rtx (PLUS, Pmode, indx, - GEN_INT (rs6000_fpmem_offset))); + GEN_INT ((((rs6000_fpmem_offset & 0xffff) + ^ 0x8000) - 0x8000)))); return \"stfd %0,%w2\"; }" @@ -7359,7 +7360,7 @@ else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS) output_asm_insn (\"creqv 6,6,6\", operands); - return \"bl %z0\"; + return (flag_pic) ? \"bl %z0@plt\" : \"bl %z0\"; }" [(set_attr "type" "branch") (set_attr "length" "4,8")]) @@ -7429,7 +7430,7 @@ else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS) output_asm_insn (\"creqv 6,6,6\", operands); - return \"bl %z1\"; + return (flag_pic) ? \"bl %z1@plt\" : \"bl %z1\"; }" [(set_attr "type" "branch") (set_attr "length" "4,8")]) @@ -7470,41 +7471,13 @@ "" "") -;; Synchronize instructions/data caches for V.4 trampolines -;; The extra memory_operand is to prevent the optimizer from -;; deleting insns with "no" effect. -(define_insn "icbi" - [(unspec [(match_operand 0 "memory_operand" "=m") - (match_operand 1 "register_operand" "b") - (match_operand 2 "register_operand" "r")] 3)] - "TARGET_POWERPC" - "icbi %1,%2") - -(define_insn "dcbst" - [(unspec [(match_operand 0 "memory_operand" "=m") - (match_operand 1 "register_operand" "b") - (match_operand 2 "register_operand" "r")] 4)] - "TARGET_POWERPC" - "dcbst %1,%2") - -(define_insn "sync" - [(unspec [(match_operand 0 "memory_operand" "=m")] 5)] - "" - "{dcs|sync}") - -(define_insn "isync" - [(unspec [(match_operand 0 "memory_operand" "=m")] 6)] - "" - "{ics|isync}") - - ;; V.4 specific code to initialize the PIC register (define_insn "init_v4_pic" [(set (match_operand:SI 0 "register_operand" "=l") (unspec [(const_int 0)] 7))] "DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS" - "bl _GLOBAL_OFFSET_TABLE_-4" + "bl _GLOBAL_OFFSET_TABLE_@local-4" [(set_attr "type" "branch")]) diff --git a/gcc/config/rs6000/sol-c0.c b/gcc/config/rs6000/sol-c0.c index 7fa322708a3..6829d85a292 100644 --- a/gcc/config/rs6000/sol-c0.c +++ b/gcc/config/rs6000/sol-c0.c @@ -84,12 +84,13 @@ _start(int argc, char *argv[], char *envp[], void *auxp, void (*termfunc)()) int ret; int dummy = 0; - /* Load up r13 before we do anything else. */ - __asm__ volatile ("mr %%r13,%0;mr %%r2,%1" : "=r" (dummy) : "r" (&_SDA_BASE_[0]), "r" (&_SDA2_BASE_[0])); - _environ = envp; + /* Load up r13/r2 before we do anything else. */ + __asm__ volatile ("mr %%r13,%0;mr %%r2,%1" : "=r" (dummy) : "r" (&_SDA_BASE_[0]), "r" (&_SDA2_BASE_[0]), "r" (dummy)); + _environ = envp + dummy; - /* Register loader termination function */ - if (termfunc || dummy) + /* Register loader termination function (the || dummy is to make sure the above asm + is not optimized away). */ + if (termfunc) atexit (termfunc); /* Register exception handler if needed */ diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index 9ce1d080d35..867b32868a5 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -967,7 +967,7 @@ do { \ %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} \ %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} \ %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \ - %{mcall-solaris: -mlittle} %{mcall-linux: -mbig} }}}}" + %{mcall-solaris: -mlittle -msolaris} %{mcall-linux: -mbig} }}}}" #undef CC1_SPEC /* Pass -G xxx to the compiler and set correct endian mode */ diff --git a/gcc/config/rs6000/t-ppc b/gcc/config/rs6000/t-ppc index fbcc9fe8ecc..0b5bea99b51 100644 --- a/gcc/config/rs6000/t-ppc +++ b/gcc/config/rs6000/t-ppc @@ -1,68 +1,12 @@ -# Do not build libgcc1. -LIBGCC1 = -CROSS_LIBGCC1 = - -# These are really part of libgcc1, but this will cause them to be -# built correctly, so... [taken from t-sparclite] -LIB2FUNCS_EXTRA = fp-bit.c dp-bit.c eabi.S eabi-ctors.c - -dp-bit.c: $(srcdir)/config/fp-bit.c - cat $(srcdir)/config/fp-bit.c > dp-bit.c - -fp-bit.c: $(srcdir)/config/fp-bit.c - echo '#define FLOAT' > fp-bit.c - cat $(srcdir)/config/fp-bit.c >> fp-bit.c - -eabi.S: $(srcdir)/config/rs6000/eabi.asm - cat $(srcdir)/config/rs6000/eabi.asm > eabi.S - -eabi-ctors.c: $(srcdir)/config/rs6000/eabi-ctors.c - cat $(srcdir)/config/rs6000/eabi-ctors.c > eabi-ctors.c +# PowerPC support without gas # Build libgcc.a with different options. If no gas support, don't build # explicit little endian or big endian libraries, since it depends on the # -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 MULTILIB_DIRNAMES = nof -MULTILIB_MATCHES = MULTILIB_EXCEPTIONS = - -LIBGCC = stmp-multilib -INSTALL_LIBGCC = install-multilib -EXTRA_MULTILIB_PARTS = ecrti$(objext) ecrtn$(objext) scrt0$(objext) scrti$(objext) scrtn$(objext) - -# For eabigas we build {e,s}crti.o and {e,s}crtn.o which serve to add begin and -# end labels to all of the special sections used when we link using gcc. - -# Assemble startup files. -ecrti.S: $(srcdir)/config/rs6000/eabi-ci.asm - cat $(srcdir)/config/rs6000/eabi-ci.asm >ecrti.S - -ecrtn.S: $(srcdir)/config/rs6000/eabi-cn.asm - cat $(srcdir)/config/rs6000/eabi-cn.asm >ecrtn.S - -scrti.S: $(srcdir)/config/rs6000/sol-ci.asm - cat $(srcdir)/config/rs6000/sol-ci.asm >scrti.S - -scrtn.S: $(srcdir)/config/rs6000/sol-cn.asm - cat $(srcdir)/config/rs6000/sol-cn.asm >scrtn.S - -scrt0.c: $(srcdir)/config/rs6000/sol-c0.c - cat $(srcdir)/config/rs6000/sol-c0.c >scrt0.c - -# Build multiple copies of ?crt{i,n}.o, one for each target switch. -$(T)ecrti$(objext): ecrti.S - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)ecrti$(objext) - -$(T)ecrtn$(objext): ecrtn.S - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrtn.S -o $(T)ecrtn$(objext) - -$(T)scrti$(objext): scrti.S - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)scrti$(objext) - -$(T)scrtn$(objext): scrtn.S - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)scrtn$(objext) - -$(T)scrt0$(objext): scrt0.c - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)scrt0$(objext) +MULTILIB_EXTRA_OPTS = +MULTILIB_MATCHES = ${MULTILIB_MATCHES_FLOAT} diff --git a/gcc/config/rs6000/t-ppccomm b/gcc/config/rs6000/t-ppccomm new file mode 100644 index 00000000000..145fcaede22 --- /dev/null +++ b/gcc/config/rs6000/t-ppccomm @@ -0,0 +1,69 @@ +# Common support for PowerPC eabi, System V targets. + +# Do not build libgcc1. +LIBGCC1 = +CROSS_LIBGCC1 = + +# These are really part of libgcc1, but this will cause them to be +# built correctly, so... [taken from t-sparclite] +LIB2FUNCS_EXTRA = fp-bit.c dp-bit.c eabi.S eabi-ctors.c tramp.S + +dp-bit.c: $(srcdir)/config/fp-bit.c + cat $(srcdir)/config/fp-bit.c > dp-bit.c + +fp-bit.c: $(srcdir)/config/fp-bit.c + echo '#define FLOAT' > fp-bit.c + cat $(srcdir)/config/fp-bit.c >> fp-bit.c + +eabi.S: $(srcdir)/config/rs6000/eabi.asm + cat $(srcdir)/config/rs6000/eabi.asm > eabi.S + +eabi-ctors.c: $(srcdir)/config/rs6000/eabi-ctors.c + cat $(srcdir)/config/rs6000/eabi-ctors.c > eabi-ctors.c + +tramp.S: $(srcdir)/config/rs6000/tramp.asm + cat $(srcdir)/config/rs6000/tramp.asm > tramp.S + +# Switch synonyms +MULTILIB_MATCHES_FLOAT = msoft-float=mcpu?403 msoft-float=mcpu?821 msoft-float=mcpu?860 +MULTILIB_MATCHES_ENDIAN = mlittle=mlittle-endian mbig=mbig-endian +MULTILIB_MATCHES_SYSV = mcall-sysv=mcall-sysv-eabi mcall-sysv=mcall-sysv-noeabi + +LIBGCC = stmp-multilib +INSTALL_LIBGCC = install-multilib +EXTRA_MULTILIB_PARTS = ecrti$(objext) ecrtn$(objext) scrt0$(objext) scrti$(objext) scrtn$(objext) + +# We build {e,s}crti.o, {e,s}crtn.o, and scrt0.o which serve to add begin and +# end labels to all of the special sections used when we link using gcc. + +# Assemble startup files. +ecrti.S: $(srcdir)/config/rs6000/eabi-ci.asm + cat $(srcdir)/config/rs6000/eabi-ci.asm >ecrti.S + +ecrtn.S: $(srcdir)/config/rs6000/eabi-cn.asm + cat $(srcdir)/config/rs6000/eabi-cn.asm >ecrtn.S + +scrti.S: $(srcdir)/config/rs6000/sol-ci.asm + cat $(srcdir)/config/rs6000/sol-ci.asm >scrti.S + +scrtn.S: $(srcdir)/config/rs6000/sol-cn.asm + cat $(srcdir)/config/rs6000/sol-cn.asm >scrtn.S + +scrt0.c: $(srcdir)/config/rs6000/sol-c0.c + cat $(srcdir)/config/rs6000/sol-c0.c >scrt0.c + +# Build multiple copies of ?crt{i,n}.o, one for each target switch. +$(T)ecrti$(objext): ecrti.S + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)ecrti$(objext) + +$(T)ecrtn$(objext): ecrtn.S + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrtn.S -o $(T)ecrtn$(objext) + +$(T)scrti$(objext): scrti.S + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c scrti.S -o $(T)scrti$(objext) + +$(T)scrtn$(objext): scrtn.S + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c scrtn.S -o $(T)scrtn$(objext) + +$(T)scrt0$(objext): scrt0.c + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c scrt0.c -o $(T)scrt0$(objext) diff --git a/gcc/config/rs6000/t-ppcgas b/gcc/config/rs6000/t-ppcgas index ef29b09a746..da4e87fa4a3 100644 --- a/gcc/config/rs6000/t-ppcgas +++ b/gcc/config/rs6000/t-ppcgas @@ -1,24 +1,4 @@ -# Do not build libgcc1. -LIBGCC1 = -CROSS_LIBGCC1 = - -# These are really part of libgcc1, but this will cause them to be -# built correctly, so... [taken from t-sparclite] -LIB2FUNCS_EXTRA = fp-bit.c dp-bit.c eabi.S eabi-ctors.c - -dp-bit.c: $(srcdir)/config/fp-bit.c - cat $(srcdir)/config/fp-bit.c > dp-bit.c - -fp-bit.c: $(srcdir)/config/fp-bit.c - echo '#define FLOAT' > fp-bit.c - cat $(srcdir)/config/fp-bit.c >> fp-bit.c - -eabi.S: $(srcdir)/config/rs6000/eabi.asm - cat $(srcdir)/config/rs6000/eabi.asm > eabi.S - -eabi-ctors.c: $(srcdir)/config/rs6000/eabi-ctors.c - cat $(srcdir)/config/rs6000/eabi-ctors.c > eabi-ctors.c - +# PowerPC embedded support with gas. # Build libgcc.a with different options. MULTILIB_OPTIONS = msoft-float \ @@ -29,14 +9,6 @@ MULTILIB_DIRNAMES = nof \ le be \ cs ca sol lin -MULTILIB_MATCHES = mlittle=mlittle-endian \ - mbig=mbig-endian \ - msoft-float=mcpu?403 \ - msoft-float=mcpu?821 \ - msoft-float=mcpu?860 \ - mcall-sysv=mcall-sysv-eabi \ - mcall-sysv=mcall-sysv-noeabi - MULTILIB_EXTRA_OPTS = mrelocatable-lib mno-eabi MULTILIB_EXCEPTIONS = *mbig/*mcall-solaris* \ *mlittle/*mcall-solaris* \ @@ -45,41 +17,6 @@ MULTILIB_EXCEPTIONS = *mbig/*mcall-solaris* \ *mlittle/*mcall-linux* \ *msoft-float/*mcall-linux* -LIBGCC = stmp-multilib -INSTALL_LIBGCC = install-multilib -EXTRA_MULTILIB_PARTS = ecrti$(objext) ecrtn$(objext) scrt0$(objext) scrti$(objext) scrtn$(objext) - -# For eabigas we build {e,s}crti.o and {e,s}crtn.o which serve to add begin and -# end labels to all of the special sections used when we link using gcc. - -# Assemble startup files. -ecrti.S: $(srcdir)/config/rs6000/eabi-ci.asm - cat $(srcdir)/config/rs6000/eabi-ci.asm >ecrti.S - -ecrtn.S: $(srcdir)/config/rs6000/eabi-cn.asm - cat $(srcdir)/config/rs6000/eabi-cn.asm >ecrtn.S - -scrti.S: $(srcdir)/config/rs6000/sol-ci.asm - cat $(srcdir)/config/rs6000/sol-ci.asm >scrti.S - -scrtn.S: $(srcdir)/config/rs6000/sol-cn.asm - cat $(srcdir)/config/rs6000/sol-cn.asm >scrtn.S - -scrt0.c: $(srcdir)/config/rs6000/sol-c0.c - cat $(srcdir)/config/rs6000/sol-c0.c >scrt0.c - -# Build multiple copies of ?crt{i,n}.o, one for each target switch. -$(T)ecrti$(objext): ecrti.S - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)ecrti$(objext) - -$(T)ecrtn$(objext): ecrtn.S - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrtn.S -o $(T)ecrtn$(objext) - -$(T)scrti$(objext): scrti.S - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)scrti$(objext) - -$(T)scrtn$(objext): scrtn.S - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)scrtn$(objext) - -$(T)scrt0$(objext): scrt0.c - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -c ecrti.S -o $(T)scrt0$(objext) +MULTILIB_MATCHES = ${MULTILIB_MATCHES_FLOAT} \ + ${MULTILIB_MATCHES_ENDIAN} \ + ${MULTILIB_MATCHES_SYSV} diff --git a/gcc/config/rs6000/t-ppcos b/gcc/config/rs6000/t-ppcos new file mode 100644 index 00000000000..fe1d6ad64c1 --- /dev/null +++ b/gcc/config/rs6000/t-ppcos @@ -0,0 +1,11 @@ +# Target config file for a System V based system (Solaris, Linux, Netbsd) with gas + +# Build libgcc.a with different options. With gas, build pic libraries +# as well no floating point +MULTILIB_OPTIONS = msoft-float fPIC +MULTILIB_DIRNAMES = nof pic +MULTILIB_EXCEPTIONS = +MULTILIB_MATCHES = ${MULTILIB_MATCHES_FLOAT} \ + fPIC=mrelocatable-lib \ + fPIC=mrelocatable \ + fPIC=fpic diff --git a/gcc/config/rs6000/tramp.asm b/gcc/config/rs6000/tramp.asm new file mode 100644 index 00000000000..57b47013748 --- /dev/null +++ b/gcc/config/rs6000/tramp.asm @@ -0,0 +1,122 @@ +/* CYGNUS LOCAL -- waiting for FSF sources to be restored/meissner */ +/* + * special support for trampolines + * + * Copyright (C) 1996 Free Software Foundation, Inc. + * Written By Michael Meissner + * + * This file 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 2, or (at your option) any + * later version. + * + * In addition to the permissions in the GNU General Public License, the + * Free Software Foundation gives you unlimited permission to link the + * compiled version of this file with other programs, and to distribute + * those programs without any restriction coming from the use of this + * file. (The General Public License restrictions do apply in other + * respects; for example, they cover modification of the file, and + * distribution when not linked into another program.) + * + * This file 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * As a special exception, if you link this library with files + * compiled with GCC to produce an executable, this does not cause + * the resulting executable to be covered by the GNU General Public License. + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + */ + +/* Set up trampolines */ + + .file "tramp.asm" + .section ".text" + #include "ppc-asm.h" + + .globl __trampoline_initial + .type __trampoline_initial,@object + .align 2 +__trampoline_initial: + mflr r0 + bl 1f +.Lfunc = .-__trampoline_initial + .long 0 /* will be replaced with function address */ +.Lchain = .-__trampoline_initial + .long 0 /* will be replaced with static chain */ +1: mflr r11 + mtlr r0 + lwz r0,0(r11) /* function address */ + lwz r11,4(r11) /* static chain */ + mtctr r0 + bctr + +__trampoline_size = .-__trampoline_initial + .size __trampoline_initial,__trampoline_size + + .section ".got2","aw" +.LCTOC1 = .+32768 +.Ltramp = .-.LCTOC1 + .long __trampoline_initial-4 + + .section ".text" +.LCL0: + .long .LCTOC1-.LCF0 + +/* R3 = stack address to store trampoline */ +/* R4 = length of trampoline area */ +/* R5 = function address */ +/* R6 = static chain */ + +FUNC_START(__trampoline_setup) + mflr r0 /* save return address */ + bl .LCF0 /* load up __trampoline_initial into r7 */ +.LCF0: + mflr r11 + lwz r12,(.LCL0-.LCF0)(r11) + add r11,r12,r11 + lwz r7,.Ltramp(r11) /* trampoline addres -4 */ + + li r8,__trampoline_size /* verify that the trampoline is big enough */ + cmpw cr1,r8,r4 + srwi r4,r4,2 /* # words to move */ + addi r9,r3,-4 /* adjust pointer for lwzu */ + mtctr r4 + blt cr1,.Labort + + mtlr r0 + + /* Copy the instructions to the stack */ +.Lmove: + lwzu r10,4(r7) + stwu r10,4(r9) + bdnz .Lmove + + /* Store correct function and static chain */ + stw r5,.Lfunc(r3) + stw r6,.Lchain(r3) + + /* Now flush both caches */ + mtctr r4 +.Lcache: + icbi 0,r3 + dcbf 0,r3 + addi r3,r3,4 + bdnz .Lcache + + /* Finally synchronize things & return */ + sync + isync + blr + +.Labort: + bl abort +FUNC_END(__trampoline_setup) +/* END CYGNUS LOCAL -- waiting for FSF sources to be restored/meissner */ diff --git a/gcc/config/rs6000/win-nt.h b/gcc/config/rs6000/win-nt.h index 00357d357c5..bf29f7ab5b7 100644 --- a/gcc/config/rs6000/win-nt.h +++ b/gcc/config/rs6000/win-nt.h @@ -472,3 +472,10 @@ dtors_section () \ #undef HAS_INIT_SECTION #define HAS_INIT_SECTION + +/* Output assembler code for a block containing the constant parts + of a trampoline, leaving space for the variable parts. + + The trampoline should set the static chain pointer to value placed + into the trampoline and should branch to the specified routine. */ +#define TRAMPOLINE_TEMPLATE(FILE) rs6000_trampoline_template (FILE) diff --git a/gcc/ginclude/ppc-asm.h b/gcc/ginclude/ppc-asm.h index 6b065040201..9e830dcc6eb 100644 --- a/gcc/ginclude/ppc-asm.h +++ b/gcc/ginclude/ppc-asm.h @@ -35,6 +35,48 @@ #define r29 29 #define r30 30 #define r31 31 + +#define cr0 0 +#define cr1 1 +#define cr2 2 +#define cr3 3 +#define cr4 4 +#define cr5 5 +#define cr6 6 +#define cr7 7 + +#define f0 0 +#define f1 1 +#define f2 2 +#define f3 3 +#define f4 4 +#define f5 5 +#define f6 6 +#define f7 7 +#define f8 8 +#define f9 9 +#define f10 10 +#define f11 11 +#define f12 12 +#define f13 13 +#define f14 14 +#define f15 15 +#define f16 16 +#define f17 17 +#define f18 18 +#define f19 19 +#define f20 20 +#define f21 21 +#define f22 22 +#define f23 23 +#define f24 24 +#define f25 25 +#define f26 26 +#define f27 27 +#define f28 28 +#define f29 29 +#define f30 30 +#define f31 31 #endif /*