aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sparc/sysdep.h
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-02-18 22:31:42 -0800
committerDavid S. Miller <davem@davemloft.net>2012-02-18 22:31:42 -0800
commitdd54084dd9549ae15c12db248571ad76946b8712 (patch)
tree5ca8baa1ff74716ac8fa735cee0a0f169f985e39 /sysdeps/unix/sparc/sysdep.h
parent2bcc53a3378d6e8782e1655cc18c8ac60e031a5d (diff)
downloadglibc-dd54084dd9549ae15c12db248571ad76946b8712.tar
glibc-dd54084dd9549ae15c12db248571ad76946b8712.tar.gz
glibc-dd54084dd9549ae15c12db248571ad76946b8712.tar.bz2
glibc-dd54084dd9549ae15c12db248571ad76946b8712.zip
Rework sparc PIC macros so crt{i,n}.S can use them too.
* sysdeps/unix/sparc/sysdep.h (SPARC_PIC_THUNK): New macro. (SETUP_PIC_REG): Use SPARC_PIC_THUNK and don't save and restore %o7 across the call. (SETUP_PIC_REG_LEAF): Do %o7 save/restore in this new macro instead. * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Use SETUP_PIC_REG_LEAF. * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. * sysdeps/sparc/crti.S: Use SETUP_PIC_REG. * sysdeps/sparc/crtn.S: Likewise.
Diffstat (limited to 'sysdeps/unix/sparc/sysdep.h')
-rw-r--r--sysdeps/unix/sparc/sysdep.h15
1 files changed, 11 insertions, 4 deletions
diff --git a/sysdeps/unix/sparc/sysdep.h b/sysdeps/unix/sparc/sysdep.h
index fe8b75a0e7..10d561e789 100644
--- a/sysdeps/unix/sparc/sysdep.h
+++ b/sysdeps/unix/sparc/sysdep.h
@@ -26,8 +26,7 @@
C name space. Make sure we use an innocuous name. */
#define syscall_error C_SYMBOL_NAME(__syscall_error)
-#ifdef PIC
-#define SETUP_PIC_REG(reg, tmp) \
+#define SPARC_PIC_THUNK(reg) \
.ifndef __sparc_get_pc_thunk.reg; \
.section .text.__sparc_get_pc_thunk.reg,"axG",@progbits,__sparc_get_pc_thunk.reg,comdat; \
.align 32; \
@@ -38,13 +37,21 @@ __sparc_get_pc_thunk.reg: \
jmp %o7 + 8; \
add %o7, %reg, %##reg; \
.previous; \
- .endif; \
+ .endif;
+
+#define SETUP_PIC_REG(reg) \
+ SPARC_PIC_THUNK(reg) \
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %##reg; \
+ call __sparc_get_pc_thunk.reg; \
+ or %##reg, %lo(_GLOBAL_OFFSET_TABLE_+4), %##reg;
+
+#define SETUP_PIC_REG_LEAF(reg, tmp) \
+ SPARC_PIC_THUNK(reg) \
sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %##reg; \
mov %o7, %##tmp; \
call __sparc_get_pc_thunk.reg; \
or %##reg, %lo(_GLOBAL_OFFSET_TABLE_+4), %##reg; \
mov %##tmp, %o7;
-#endif
#define ENTRY(name) \
.global C_SYMBOL_NAME(name); \