OSDN Git Service

* pa/pa32-linux.h (CRT_CALL_STATIC_FUNCTION): Define when CRTSTUFFS_O
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Mar 2006 23:22:57 +0000 (23:22 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Mar 2006 23:22:57 +0000 (23:22 +0000)
is defined.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112029 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/pa/pa32-linux.h

index 8325f0f..94aac10 100644 (file)
@@ -1,3 +1,8 @@
+2006-03-13  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+       * pa/pa32-linux.h (CRT_CALL_STATIC_FUNCTION): Define when CRTSTUFFS_O
+       is defined.
+
 2006-03-13  Richard Sandiford  <richard@codesourcery.com>
 
        * config/mips/mips.md (*branch_fp): Use %Z2 for the condition.
index 0df6305..69c73fc 100644 (file)
@@ -1,5 +1,5 @@
 /* Definitions for PA_RISC with ELF-32 format
-   Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2002, 2004, 2006 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -36,4 +36,26 @@ Boston, MA 02110-1301, USA.  */
                    aligned(sizeof(func_ptr))))                         \
     = { (func_ptr) (-1) }
 
+/* This is a PIC version of CRT_CALL_STATIC_FUNCTION.  The PIC
+   register has to be saved before the call and restored after
+   the call.  We assume that register %r4 is available for this
+   purpose.  The hack prevents GCC from deleting the restore.  */
+#ifdef CRTSTUFFS_O
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)     \
+static void __attribute__((__used__))                  \
+call_ ## FUNC (void)                                   \
+{                                                      \
+  asm (SECTION_OP);                                    \
+  asm volatile ("bl " #FUNC ",%%r2\n\t"                        \
+               "copy %%r19,%%r4\n\t"                   \
+               "copy %%r4,%%r19\n"                     \
+               :                                       \
+               :                                       \
+               : "r1", "r2", "r4", "r20", "r21",       \
+                 "r22", "r24", "r24", "r25", "r26",    \
+                 "r27", "r28", "r29", "r31");          \
+  asm (TEXT_SECTION_ASM_OP);                           \
+}
+#endif
+
 #define MD_UNWIND_SUPPORT "config/pa/linux-unwind.h"