This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: Darwin PPC trampolines


Hello,

Here's a patch to get trampolines working on darwin-ppc.

    * rs6000.c (rs6000_trampoline_size): Handle ABI_DARWIN case.
    (rs6000_initialize_trampoline): Call __trampoline_setup for
    ABI_DARWIN too.
    * darwin-tramp.asm: New file, implements __trampoline_setup.


*** rs6000.c    2001/12/04 23:23:19     1.251
--- rs6000.c    2001/12/05 16:41:14
*************** rs6000_trampoline_size ()
*** 9248,9253 ****
--- 9248,9254 ----
        ret = (TARGET_32BIT) ? 12 : 24;
        break;
  
+     case ABI_DARWIN:
      case ABI_V4:
      case ABI_AIX_NODESC:
        ret = (TARGET_32BIT) ? 40 : 48;
*************** rs6000_initialize_trampoline (addr, fnad
*** 9294,9300 ****
        }
        break;
  
!     /* Under V.4/eabi, call __trampoline_setup to do the real work.  */
      case ABI_V4:
      case ABI_AIX_NODESC:
        emit_library_call (gen_rtx_SYMBOL_REF (SImode,
"__trampoline_setup"),
--- 9295,9302 ----
        }
        break;
  
!     /* Under V.4/eabi/darwin, __trampoline_setup does the real work.  */
!     case ABI_DARWIN:
      case ABI_V4:
      case ABI_AIX_NODESC:
        emit_library_call (gen_rtx_SYMBOL_REF (SImode,
"__trampoline_setup"),
Index: t-darwin
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/t-darwin,v
retrieving revision 1.4
diff -c -3 -p -r1.4 t-darwin
*** t-darwin    2001/06/28 19:55:53     1.4
--- t-darwin    2001/12/05 16:41:14
***************
*** 1,3 ****
--- 1,6 ----
+ # Library code must include trampoline support
+ LIB2FUNCS_EXTRA = $(srcdir)/config/rs6000/darwin-tramp.asm
+ 
  # We want fine grained libraries, so use the new code to build the
  # floating point emulation libraries.
  FPBIT = fp-bit.c


*** darwin-tramp.asm

/*  Special support for trampolines
 *
 *   Copyright (C) 1996, 1997, 2000 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. */

.text
        .align  2
Ltrampoline_initial:
        mflr    r0
        bl      1f
Lfunc = .-Ltrampoline_initial
        .long   0               /* will be replaced with function address */
Lchain = .-Ltrampoline_initial
        .long   0               /* will be replaced with static chain */
1:      mflr    r11
        lwz     r12,0(r11)      /* function address */
        mtlr    r0
        mtctr   r12
        lwz     r11,4(r11)      /* static chain */
        bctr

trampoline_size = .-Ltrampoline_initial

/* R3 = stack address to store trampoline */
/* R4 = length of trampoline area */
/* R5 = function address */
/* R6 = static chain */

        .globl ___trampoline_setup
___trampoline_setup:
        mflr    r0              /* save return address */
        bcl 20,31,LCF0          /* load up __trampoline_initial into r7 */
LCF0:
        mflr    r11
        addi    r7,r11,ha16(LTRAMP-LCF0)
        lwz     r7,lo16(LTRAMP-LCF0)(r7)
        subi    r7,r7,4
        li      r8,trampoline_size      /* verify trampoline 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:
#ifdef __DYNAMIC__
        bl      L_abort$stub
.data
.picsymbol_stub
L_abort$stub:
        .indirect_symbol _abort
        mflr r0
        bcl 20,31,L0$_abort
L0$_abort:
        mflr r11
        addis r11,r11,ha16(L_abort$lazy_ptr-L0$_abort)
        mtlr r0
        lwz r12,lo16(L_abort$lazy_ptr-L0$_abort)(r11)
        mtctr r12
        addi r11,r11,lo16(L_abort$lazy_ptr-L0$_abort)
        bctr
.data
.lazy_symbol_pointer
L_abort$lazy_ptr:
        .indirect_symbol _abort
        .long dyld_stub_binding_helper
#else
        bl      _abort
#endif
.data
        .align 2
LTRAMP:
        .long Ltrampoline_initial


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]