From 929d11c7cf81f4b7cfabc1910a583e6fa5897fd5 Mon Sep 17 00:00:00 2001 From: Will Schmidt Date: Thu, 12 Jan 2012 17:05:03 -0500 Subject: Powerpc: correct duplicate label issue with multiple passes through context code --- sysdeps/powerpc/powerpc32/sysdep.h | 8 ++++++-- .../unix/sysv/linux/powerpc/powerpc32/getcontext-common.S | 14 +++++++------- .../unix/sysv/linux/powerpc/powerpc32/setcontext-common.S | 3 ++- .../unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S | 3 ++- 4 files changed, 17 insertions(+), 11 deletions(-) (limited to 'sysdeps') diff --git a/sysdeps/powerpc/powerpc32/sysdep.h b/sysdeps/powerpc/powerpc32/sysdep.h index c824c0a85d..eb04afbcd6 100644 --- a/sysdeps/powerpc/powerpc32/sysdep.h +++ b/sysdeps/powerpc/powerpc32/sysdep.h @@ -1,5 +1,5 @@ /* Assembly macros for 32-bit PowerPC. - Copyright (C) 1999, 2001, 2002, 2003, 2006, 2011 + Copyright (C) 1999, 2001, 2002, 2003, 2006, 2011, 2012 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -93,7 +93,7 @@ GOT_LABEL: ; \ ASM_SIZE_DIRECTIVE(name) #define DO_CALL(syscall) \ - li 0,syscall; \ + li 0,syscall; \ sc #undef JUMPTARGET @@ -153,6 +153,10 @@ GOT_LABEL: ; \ #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 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S index f55c0730f1..e609f802e3 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext-common.S @@ -1,5 +1,5 @@ /* Save current context, powerpc32 common. - Copyright (C) 2005, 2006, 2011 Free Software Foundation, Inc. + Copyright (C) 2005, 2006, 2011, 2012 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 @@ -18,13 +18,13 @@ 02110-1301 USA. */ /* This is the common implementation of getcontext for powerpc32. - It not complete in itself should be included in to a framework that + It not complete in itself should be included in to a framework that defines: __CONTEXT_FUNC_NAME and if appropriate: __CONTEXT_ENABLE_FPRS __CONTEXT_ENABLE_VRS - Any archecture that implements the Vector unit is assumed to also + Any archecture that implements the Vector unit is assumed to also implement the floating unit. */ /* Stack frame offsets. */ @@ -145,6 +145,7 @@ ENTRY(__CONTEXT_FUNC_NAME) # ifdef __CONTEXT_ENABLE_VRS # ifdef PIC mflr r8 +# define got_label GENERATE_GOT_LABEL (__CONTEXT_FUNC_NAME) SETUP_GOT_ACCESS(r7,got_label) addis r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@ha addi r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@l @@ -165,9 +166,9 @@ ENTRY(__CONTEXT_FUNC_NAME) la r10,(_UC_VREGS)(r3) la r9,(_UC_VREGS+16)(r3) - + beq 2f /* L(no_vec) */ -/* address of the combined VSCR/VSAVE quadword. */ +/* address of the combined VSCR/VSAVE quadword. */ la r8,(_UC_VREGS+512)(r3) /* Save the vector registers */ @@ -186,7 +187,7 @@ ENTRY(__CONTEXT_FUNC_NAME) addi r9,r9,32 stvx v0,0,r8 - + stvx v4,0,r10 stvx v5,0,r9 addi r10,r10,32 @@ -277,4 +278,3 @@ ENTRY(__CONTEXT_FUNC_NAME) mtlr r0 blr END(__CONTEXT_FUNC_NAME) - diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S index a2f419b0e1..f7ce4c662a 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S @@ -1,5 +1,5 @@ /* Jump to a new context powerpc32 common. - Copyright (C) 2005, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. + Copyright (C) 2005, 2006, 2008, 2009, 2011, 2012 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 @@ -73,6 +73,7 @@ ENTRY(__CONTEXT_FUNC_NAME) #ifdef PIC mflr r8 +# define got_label GENERATE_GOT_LABEL (__CONTEXT_FUNC_NAME) SETUP_GOT_ACCESS(r7,got_label) addis r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@ha addi r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@l diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S index 19dfcf8402..f571a82f8e 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S @@ -1,5 +1,5 @@ /* Save current context and jump to a new context. - Copyright (C) 2005, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. + Copyright (C) 2005,2006,2008,2009,2011,2012 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 @@ -146,6 +146,7 @@ ENTRY(__CONTEXT_FUNC_NAME) # ifdef PIC mflr r8 +# define got_label GENERATE_GOT_LABEL (__CONTEXT_FUNC_NAME) SETUP_GOT_ACCESS(r7,got_label) addis r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@ha addi r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@l -- cgit v1.2.1