]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - gcc/config/rs6000/darwin-tramp.asm
Imported gcc-4.4.3
[msp430-gcc.git] / gcc / config / rs6000 / darwin-tramp.asm
index 02c7be67e6fe501dc13a24e281abc71cf7c603f0..5188c98ef05d7f21e7df219459044ae098979a9d 100644 (file)
@@ -1,54 +1,46 @@
 /*  Special support for trampolines
  *
- *   Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
+ *   Copyright (C) 1996, 1997, 2000, 2004, 2005, 2009 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
+ * Free Software Foundation; either version 3, 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.
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ * <http://www.gnu.org/licenses/>.
  */ 
 
+#include "darwin-asm.h"
+
 /* Set up trampolines.  */
 
 .text
-       .align  2
+       .align  LOG2_GPR_BYTES
 Ltrampoline_initial:
        mflr    r0
        bl      1f
 Lfunc = .-Ltrampoline_initial
-       .long   0               /* will be replaced with function address */
+       .g_long 0               /* will be replaced with function address */
 Lchain = .-Ltrampoline_initial
-       .long   0               /* will be replaced with static chain */
+       .g_long 0               /* will be replaced with static chain */
 1:     mflr    r11
-       lwz     r12,0(r11)      /* function address */
+       l     r12,0(r11)      /* function address */
        mtlr    r0
        mtctr   r12
-       lwz     r11,4(r11)      /* static chain */
+       lg      r11,GPR_BYTES(r11)      /* static chain */
        bctr
 
 trampoline_size = .-Ltrampoline_initial
@@ -64,13 +56,13 @@ ___trampoline_setup:
         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)
+        addis  r7,r11,ha16(LTRAMP-LCF0)
+       l     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 */
+       cmpg    cr1,r8,r4
+       srwi    r4,r4,2                 /* # words to move (insns always 4-byte) */
+       addi    r9,r3,-4        /* adjust pointer for lgu */
        mtctr   r4
        blt     cr1,Labort
 
@@ -83,8 +75,8 @@ Lmove:
        bdnz    Lmove
 
        /* Store correct function and static chain */
-       stw     r5,Lfunc(r3)
-       stw     r6,Lchain(r3)
+       stg     r5,Lfunc(r3)
+       stg     r6,Lchain(r3)
 
        /* Now flush both caches */
        mtctr   r4
@@ -94,16 +86,19 @@ Lcache:
        addi    r3,r3,4
        bdnz    Lcache
 
-       /* Finally synchronize things & return */
+       /* Ensure cache-flushing has finished.  */
        sync
        isync
-       blr
+
+       /* Make stack writeable.  */
+       b       ___enable_execute_stack
 
 Labort:
 #ifdef __DYNAMIC__
        bl      L_abort$stub
 .data
-.picsymbol_stub
+.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
+       .align 2
 L_abort$stub:
         .indirect_symbol _abort
         mflr r0
@@ -112,20 +107,19 @@ 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)
+       lgu 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
+       .g_long dyld_stub_binding_helper
 #else
        bl      _abort
 #endif
 .data
-       .align 2
+       .align LOG2_GPR_BYTES
 LTRAMP:
-       .long Ltrampoline_initial
+       .g_long Ltrampoline_initial