about summary refs log tree commit diff
path: root/sysdeps/powerpc/powerpc64/sysdep.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/powerpc/powerpc64/sysdep.h')
-rw-r--r--sysdeps/powerpc/powerpc64/sysdep.h201
1 files changed, 112 insertions, 89 deletions
diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h
index 29c1c2c36c..4420a6dfac 100644
--- a/sysdeps/powerpc/powerpc64/sysdep.h
+++ b/sysdeps/powerpc/powerpc64/sysdep.h
@@ -1,5 +1,5 @@
 /* Assembly macros for 64-bit PowerPC.
-   Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004 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
@@ -19,9 +19,10 @@
 
 #include <sysdeps/powerpc/sysdep.h>
 
+#ifdef __ELF__
+
 #ifdef __ASSEMBLER__
 
-#ifdef __ELF__
 /* If compiled for profiling, call `_mcount' at the start of each function.
    see ppc-mcount.S for more details.  */
 #ifdef	PROF
@@ -29,48 +30,70 @@
    to locate our caller and so it can restore it; so store one just
    for its benefit.  */
 #ifdef SYSV_ELF_PROFILING
-#define CALL_MCOUNT      \
-  .pushsection;          \
-  .section ".data";      \
-  .align ALIGNARG(2);    \
-__mcount:            \
-  .long  0;            \
-  .previous;              \
-	.section	".toc","aw";  \
-.LC__mcount:; \
-	.tc __mcount[TC],__mcount; \
-  .previous;              \
-  mflr  r0;              \
-  std   r0,16(r1);        \
-  ld    r0,.LC__mcount@toc(r2);    \
+#define CALL_MCOUNT	\
+  .pushsection;			\
+  .section ".data";		\
+  .align ALIGNARG(2);		\
+__mcount:			\
+  .long  0;			\
+  .previous;			\
+  .section ".toc","aw";		\
+.LC__mcount:;			\
+  .tc __mcount[TC],__mcount;	\
+  .previous;			\
+  mflr  r0;			\
+  std   r0,16(r1);		\
+  ld    r0,.LC__mcount@toc(r2);	\
   bl    JUMPTARGET(_mcount);
 #else /* SYSV_ELF_PROFILING */
-#define CALL_MCOUNT      \
-  mflr  r0;              \
-  std   r0,16(r1);       \
+#define CALL_MCOUNT	\
+  mflr  r0;			\
+  std   r0,16(r1);		\
   bl    JUMPTARGET(_mcount);
 #endif /* SYSV_ELF_PROFILING */
 #else  /* PROF */
 #define CALL_MCOUNT		/* Do nothing.  */
 #endif /* PROF */
 
-#define DOT_LABEL(X) .##X
+#ifdef USE_PPC64_OVERLAPPING_OPD
+# define OPD_ENT(name)	.quad BODY_LABEL (name), .TOC.@tocbase
+#else
+# define OPD_ENT(name)	.quad BODY_LABEL (name), .TOC.@tocbase, 0
+#endif
 
-#define ENTRY(name)	\
-	.section	".text"; \
-	.align ALIGNARG(2); \
-	.globl DOT_LABEL(name); \
-	.type DOT_LABEL(name),@function ; \
-	.globl name; \
-	.section	".opd","aw"; \
-	.align 3; \
-	.size name,24; \
-name##: ; \
-	.quad DOT_LABEL(name) ; \
-	.quad .TOC.@tocbase, 0; \
-	.previous; \
-DOT_LABEL(name):
+#define ENTRY_1(name)	\
+	.section	".text";		\
+	.type BODY_LABEL(name),@function;	\
+	.globl name;				\
+	.section ".opd","aw";			\
+	.align 3;				\
+name##: OPD_ENT (name);				\
+	.previous;
+
+#ifdef HAVE_ASM_GLOBAL_DOT_NAME
+# define DOT_LABEL(X) .##X
+# define BODY_LABEL(X) .##X
+# define ENTRY_2(name)	\
+	.globl BODY_LABEL(name);		\
+	ENTRY_1(name)				\
+	.size name, 24;
+# define END_2(name)	\
+	.size BODY_LABEL(name),.-BODY_LABEL(name);
+#else
+# define DOT_LABEL(X) X
+# define BODY_LABEL(X) .LY##X
+# define ENTRY_2(name)	\
+	.type name,@function;			\
+	ENTRY_1(name)
+# define END_2(name)	\
+	.size name,.-BODY_LABEL(name);		\
+	.size BODY_LABEL(name),.-BODY_LABEL(name);
+#endif
 
+#define ENTRY(name)	\
+	ENTRY_2(name)				\
+	.align ALIGNARG(2);			\
+BODY_LABEL(name):
 
 #define EALIGN_W_0  /* No words to insert.  */
 #define EALIGN_W_1  nop
@@ -82,44 +105,24 @@ DOT_LABEL(name):
 #define EALIGN_W_7  EALIGN_W_6;nop
 
 /* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
-   past a 2^align boundary.  */
+   past a 2^alignt boundary.  */
 #ifdef PROF
 #define EALIGN(name, alignt, words) \
-	.section	".text"; \
-	.globl DOT_LABEL(name); \
-	.type DOT_LABEL(name),@function ; \
-	.globl name; \
-	.section	".opd","aw"; \
-	.align 3; \
-	.size name,24; \
-name##: ; \
-	.quad DOT_LABEL(name) ; \
-	.quad .TOC.@tocbase, 0; \
-	.previous; \
-	.align ALIGNARG(alignt); \
-  EALIGN_W_##words;	\
-DOT_LABEL(name):		\
-  CALL_MCOUNT  \
-  b 0f; \
-  .align ALIGNARG(alignt); \
-  EALIGN_W_##words; \
-  0:
+	ENTRY_2(name)				\
+	.align ALIGNARG(alignt);		\
+	EALIGN_W_##words;			\
+BODY_LABEL(name):				\
+	CALL_MCOUNT				\
+	b 0f;					\
+	.align ALIGNARG(alignt);		\
+	EALIGN_W_##words;			\
+0:
 #else /* PROF */
 #define EALIGN(name, alignt, words) \
-	.section	".text"; \
-	.globl DOT_LABEL(name); \
-	.type DOT_LABEL(name),@function ; \
-	.globl name; \
-	.section	".opd","aw"; \
-	.align 3; \
-	.size name,24; \
-name##: ; \
-	.quad DOT_LABEL(name) ; \
-	.quad .TOC.@tocbase, 0; \
-	.previous; \
-	.align ALIGNARG(alignt); \
-  EALIGN_W_##words; \
-DOT_LABEL(name):
+	ENTRY_2(name)				\
+	.align ALIGNARG(alignt);		\
+	EALIGN_W_##words;			\
+BODY_LABEL(name):
 #endif
 
 /* Local labels stripped out by the linker.  */
@@ -135,35 +138,35 @@ DOT_LABEL(name):
 
 /* Support Traceback tables */
 #define TB_ASM			0x000c000000000000
-#define TB_GLOBALLINK	0x0000800000000000
+#define TB_GLOBALLINK		0x0000800000000000
 #define TB_IS_EPROL		0x0000400000000000
-#define TB_HAS_TBOFF	0x0000200000000000
+#define TB_HAS_TBOFF		0x0000200000000000
 #define TB_INT_PROC		0x0000100000000000
 #define TB_HAS_CTL		0x0000080000000000
 #define TB_TOCLESS		0x0000040000000000
-#define TB_FP_PRESENT	0x0000020000000000
-#define TB_LOG_ABORT	0x0000010000000000
-#define TB_INT_HANDL	0x0000008000000000
-#define TB_NAME_PRESENT	0x0000004000000000
-#define TB_USES_ALLOCA	0x0000002000000000
+#define TB_FP_PRESENT		0x0000020000000000
+#define TB_LOG_ABORT		0x0000010000000000
+#define TB_INT_HANDL		0x0000008000000000
+#define TB_NAME_PRESENT		0x0000004000000000
+#define TB_USES_ALLOCA		0x0000002000000000
 #define TB_SAVES_CR		0x0000000200000000
 #define TB_SAVES_LR		0x0000000100000000
-#define TB_STORES_BC	0x0000000080000000
+#define TB_STORES_BC		0x0000000080000000
 #define TB_FIXUP		0x0000000040000000
 #define TB_FP_SAVED(fprs)	(((fprs) & 0x3f) << 24)
 #define TB_GPR_SAVED(gprs)	(((fprs) & 0x3f) << 16)
 #define TB_FIXEDPARMS(parms)	(((parms) & 0xff) << 8)
 #define TB_FLOATPARMS(parms)	(((parms) & 0x7f) << 1)
-#define TB_PARMSONSTK	0x0000000000000001
+#define TB_PARMSONSTK		0x0000000000000001
 
-#define PPC_HIGHER(v) (((v) >> 32) & 0xffff)
-#define TB_DEFAULT	TB_ASM | TB_HAS_TBOFF | TB_NAME_PRESENT
+#define PPC_HIGHER(v) 		(((v) >> 32) & 0xffff)
+#define TB_DEFAULT		TB_ASM | TB_HAS_TBOFF | TB_NAME_PRESENT
 
 #define TRACEBACK(name) \
 LT_LABEL(name): ; \
 	.long	0 ; \
 	.quad	TB_DEFAULT ; \
-	.long	LT_LABEL(name)-DOT_LABEL(name) ; \
+	.long	LT_LABEL(name)-BODY_LABEL(name) ; \
 	.short	LT_LABELSUFFIX(name,_name_end)-LT_LABELSUFFIX(name,_name_start) ; \
 LT_LABELSUFFIX(name,_name_start): ;\
 	.ascii	stringify(name) ; \
@@ -174,7 +177,7 @@ LT_LABELSUFFIX(name,_name_end): ; \
 LT_LABEL(name): ; \
 	.long	0 ; \
 	.quad	TB_DEFAULT | mask ; \
-	.long	LT_LABEL(name)-DOT_LABEL(name) ; \
+	.long	LT_LABEL(name)-BODY_LABEL(name) ; \
 	.short	LT_LABELSUFFIX(name,_name_end)-LT_LABELSUFFIX(name,_name_start) ; \
 LT_LABELSUFFIX(name,_name_start): ;\
 	.ascii	stringify(name) ; \
@@ -184,14 +187,13 @@ LT_LABELSUFFIX(name,_name_end): ; \
 /* END generates Traceback tables */
 #undef	END
 #define END(name) \
-  TRACEBACK(name)	\
-  ASM_SIZE_DIRECTIVE(DOT_LABEL(name))
+  TRACEBACK(name)		\
+  END_2(name)
 
 /* This form supports more informative traceback tables */
 #define END_GEN_TB(name,mask)	\
   TRACEBACK_MASK(name,mask)	\
-  ASM_SIZE_DIRECTIVE(DOT_LABEL(name))
-
+  END_2(name)
 
 #define DO_CALL(syscall) \
     li 0,syscall; \
@@ -244,10 +246,31 @@ LT_LABELSUFFIX(name,_name_end): ; \
 #define	PSEUDO_END_ERRVAL(name) \
   END (name)
 
-/* Label in text section.  */
-/* ppc64 function descriptors which requires . notation */
-#define C_TEXT(name) .##name
+#else /* !__ASSEMBLER__ */
 
-#endif /* __ELF__ */
+#ifdef USE_PPC64_OVERLAPPING_OPD
+# define OPD_ENT(name)	".quad " BODY_PREFIX #name ", .TOC.@tocbase;"
+#else
+# define OPD_ENT(name)	".quad " BODY_PREFIX #name ", .TOC.@tocbase, 0;"
+#endif
+
+#ifdef HAVE_ASM_GLOBAL_DOT_NAME
+# define DOT_PREFIX "."
+# define BODY_PREFIX "."
+# define ENTRY_2(name)	\
+	".globl " BODY_PREFIX #name ";\n"				\
+	".size  " #name ", 24;"
+# define END_2(name)	\
+	".size " BODY_PREFIX #name ",.-" BODY_PREFIX #name ";"
+#else
+# define DOT_PREFIX ""
+# define BODY_PREFIX ".LY"
+# define ENTRY_2(name) ".type " #name ",@function;"
+# define END_2(name)	\
+	".size " #name ",.-" BODY_PREFIX #name ";\n"			\
+	".size " BODY_PREFIX #name ",.-" BODY_PREFIX #name ";"
+#endif
 
 #endif	/* __ASSEMBLER__ */
+
+#endif /* __ELF__ */