diff options
Diffstat (limited to 'libc/sysdeps/linux/sh/sysdep.h')
-rw-r--r-- | libc/sysdeps/linux/sh/sysdep.h | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/libc/sysdeps/linux/sh/sysdep.h b/libc/sysdeps/linux/sh/sysdep.h index 6f182cd0e..bd6234292 100644 --- a/libc/sysdeps/linux/sh/sysdep.h +++ b/libc/sysdeps/linux/sh/sysdep.h @@ -144,7 +144,7 @@ #define ret_ERRVAL ret -#ifndef PIC +#ifndef __PIC__ # define SYSCALL_ERROR_HANDLER \ mov.l 0f,r1; \ jmp @r1; \ @@ -246,7 +246,7 @@ 0: .long _GLOBAL_OFFSET_TABLE_; \ 1: .long errno@GOT # endif /* _LIBC_REENTRANT */ -#endif /* PIC */ +#endif /* __PIC__ */ # ifdef __SH4__ # define SYSCALL_INST_PAD \ @@ -273,5 +273,24 @@ .align 2; \ 1: .long SYS_ify (syscall_name); \ 2: - #endif /* __ASSEMBLER__ */ + +/* Pointer mangling support. */ +#if defined NOT_IN_libc && defined IS_IN_rtld +/* We cannot use the thread descriptor because in ld.so we use setjmp + earlier than the descriptor is initialized. Using a global variable + is too complicated here since we have no PC-relative addressing mode. */ +#else +# ifdef __ASSEMBLER__ +# define PTR_MANGLE(reg, tmp) \ + stc gbr,tmp; mov.l @(POINTER_GUARD,tmp),tmp; xor tmp,reg +# define PTR_MANGLE2(reg, tmp) xor tmp,reg +# define PTR_DEMANGLE(reg, tmp) PTR_MANGLE (reg, tmp) +# define PTR_DEMANGLE2(reg, tmp) PTR_MANGLE2 (reg, tmp) +# else +# define PTR_MANGLE(var) \ + (var) = (void *) ((uintptr_t) (var) ^ THREAD_GET_POINTER_GUARD ()) +# define PTR_DEMANGLE(var) PTR_MANGLE (var) +# endif +#endif + |