OSDN Git Service

* darwin-tramp.asm: New file, implements __trampoline_setup.
authorturly <turly@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Dec 2001 17:35:03 +0000 (17:35 +0000)
committerturly <turly@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 7 Dec 2001 17:35:03 +0000 (17:35 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47760 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/config/rs6000/darwin-tramp.asm [new file with mode: 0644]

diff --git a/gcc/config/rs6000/darwin-tramp.asm b/gcc/config/rs6000/darwin-tramp.asm
new file mode 100644 (file)
index 0000000..9715e11
--- /dev/null
@@ -0,0 +1,131 @@
+/*  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
+