]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/powerpc/powerpc32/sysdep.h
Update copyright notices with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / powerpc / powerpc32 / sysdep.h
index bc201a80bdf380182b4e1aa0051d2d2322704a97..47d02a8048da1cbc58d3fa6e59a83267e2ec340a 100644 (file)
@@ -1,5 +1,5 @@
 /* Assembly macros for 32-bit PowerPC.
-   Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1999-2013 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#ifdef __ASSEMBLER__
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include <sysdeps/powerpc/sysdep.h>
 
-#ifdef __ELF__
+#ifdef __ASSEMBLER__
 
 /* If compiled for profiling, call `_mcount' at the start of each
    function.  */
 /* The mcount code relies on a the return address being on the stack
    to locate our caller and so it can restore it; so store one just
    for its benefit.  */
-# ifdef PIC
-#  define CALL_MCOUNT                                                        \
-  .pushsection;                                                                      \
-  .section ".data";                                                                  \
-  .align ALIGNARG(2);                                                        \
-0:.long 0;                                                                   \
-  .previous;                                                                 \
-  mflr  r0;                                                                  \
-  stw   r0,4(r1);                                                            \
-  bl    _GLOBAL_OFFSET_TABLE_@local-4;                                       \
-  mflr  r11;                                                                 \
-  lwz   r0,0b@got(r11);                                                              \
-  bl    JUMPTARGET(_mcount);
-# else  /* PIC */
-#  define CALL_MCOUNT                                                        \
-  .section ".data";                                                          \
-  .align ALIGNARG(2);                                                        \
-0:.long 0;                                                                   \
-  .previous;                                                                 \
+# define CALL_MCOUNT                                                         \
   mflr  r0;                                                                  \
-  lis   r11,0b@ha;                                                           \
-  stw   r0,4(r1);                                                            \
-  addi  r0,r11,0b@l;                                                         \
+  stw   r0,4(r1);                                                            \
+  cfi_offset (lr, 4);                                                        \
   bl    JUMPTARGET(_mcount);
-# endif /* PIC */
 #else  /* PROF */
 # define CALL_MCOUNT           /* Do nothing.  */
 #endif /* PROF */
 
 #define        ENTRY(name)                                                           \
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);                                  \
-  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)                         \
+  .globl C_SYMBOL_NAME(name);                                                \
+  .type C_SYMBOL_NAME(name),@function;                                       \
   .align ALIGNARG(2);                                                        \
   C_LABEL(name)                                                                      \
+  cfi_startproc;                                                             \
   CALL_MCOUNT
 
+/* helper macro for accessing the 32-bit powerpc GOT. */
+
+#define        SETUP_GOT_ACCESS(regname,GOT_LABEL)                                   \
+       bcl     20,31,GOT_LABEL ;                                             \
+GOT_LABEL:                     ;                                             \
+       mflr    (regname)
+
 #define EALIGN_W_0  /* No words to insert.  */
 #define EALIGN_W_1  nop
 #define EALIGN_W_2  nop;nop
    past a 2^align boundary.  */
 #ifdef PROF
 # define EALIGN(name, alignt, words)                                         \
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);                                  \
-  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)                         \
+  .globl C_SYMBOL_NAME(name);                                                \
+  .type C_SYMBOL_NAME(name),@function;                                       \
   .align ALIGNARG(2);                                                        \
   C_LABEL(name)                                                                      \
+  cfi_startproc;                                                             \
   CALL_MCOUNT                                                                \
   b 0f;                                                                              \
   .align ALIGNARG(alignt);                                                   \
   0:
 #else /* PROF */
 # define EALIGN(name, alignt, words)                                         \
-  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);                                  \
-  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)                         \
+  .globl C_SYMBOL_NAME(name);                                                \
+  .type C_SYMBOL_NAME(name),@function;                                       \
   .align ALIGNARG(alignt);                                                   \
   EALIGN_W_##words;                                                          \
-  C_LABEL(name)
+  C_LABEL(name)                                                                      \
+  cfi_startproc;
 #endif
 
 #undef END
 #define END(name)                                                            \
+  cfi_endproc;                                                               \
   ASM_SIZE_DIRECTIVE(name)
 
-#define DO_CALL(syscall)                                                     \
-    li 0,syscall;                                                            \
+#define DO_CALL(syscall)                                                     \
+    li 0,syscall;                                                            \
     sc
 
 #undef JUMPTARGET
 #endif
 
 #if defined SHARED && defined DO_VERSIONING && defined PIC \
-    && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE && !defined NO_HIDDEN
+    && !defined NO_HIDDEN
 # undef HIDDEN_JUMPTARGET
 # define HIDDEN_JUMPTARGET(name) __GI_##name##@local
 #endif
 
 #define PSEUDO_RET                                                           \
     bnslr+;                                                                  \
-    b JUMPTARGET(__syscall_error)
+    b __syscall_error@local
 #define ret PSEUDO_RET
 
 #undef PSEUDO_END
 #define        PSEUDO_END(name)                                                      \
   END (name)
 
+#define PSEUDO_NOERRNO(name, syscall_name, args)                             \
+  .section ".text";                                                          \
+  ENTRY (name)                                                               \
+    DO_CALL (SYS_ify (syscall_name));
+
+#define PSEUDO_RET_NOERRNO                                                   \
+    blr
+#define ret_NOERRNO PSEUDO_RET_NOERRNO
+
+#undef PSEUDO_END_NOERRNO
+#define        PSEUDO_END_NOERRNO(name)                                              \
+  END (name)
+
+#define PSEUDO_ERRVAL(name, syscall_name, args)                                      \
+  .section ".text";                                                          \
+  ENTRY (name)                                                               \
+    DO_CALL (SYS_ify (syscall_name));
+
+#define PSEUDO_RET_ERRVAL                                                    \
+    blr
+#define ret_ERRVAL PSEUDO_RET_ERRVAL
+
+#undef PSEUDO_END_ERRVAL
+#define        PSEUDO_END_ERRVAL(name)                                               \
+  END (name)
+
 /* Local labels stripped out by the linker.  */
 #undef L
 #define L(x) .L##x
 
+#define XGLUE(a,b) a##b
+#define GLUE(a,b) XGLUE (a,b)
+#define GENERATE_GOT_LABEL(name) GLUE (.got_label, name)
+
 /* Label in text section.  */
 #define C_TEXT(name) name
 
-#endif /* __ELF__ */
-
 #endif /* __ASSEMBLER__ */