aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/arm
diff options
context:
space:
mode:
authorRoland McGrath <roland@hack.frob.com>2014-08-01 11:28:49 -0700
committerRoland McGrath <roland@hack.frob.com>2014-08-01 11:28:49 -0700
commit6f64e7d75fdab0be50edc814a41ddc43ef4ec8ef (patch)
treea06a97081593c3e6d14bdf0e5fcc4b8af5ffd89e /sysdeps/arm
parenta476ac4b45fe39b023bed55c852abad04d70c5df (diff)
downloadglibc-6f64e7d75fdab0be50edc814a41ddc43ef4ec8ef.zip
glibc-6f64e7d75fdab0be50edc814a41ddc43ef4ec8ef.tar.gz
glibc-6f64e7d75fdab0be50edc814a41ddc43ef4ec8ef.tar.bz2
ARM: Move PTR_MANGLE et al out of Linux-specific file.
Diffstat (limited to 'sysdeps/arm')
-rw-r--r--sysdeps/arm/sysdep.h48
1 files changed, 48 insertions, 0 deletions
diff --git a/sysdeps/arm/sysdep.h b/sysdeps/arm/sysdep.h
index 7f34ab0..84b07e1 100644
--- a/sysdeps/arm/sysdep.h
+++ b/sysdeps/arm/sysdep.h
@@ -19,6 +19,10 @@
#include <sysdeps/generic/sysdep.h>
#include <features.h>
+#ifndef __ASSEMBLER__
+# include <stdint.h>
+#endif
+
/* The __ARM_ARCH define is provided by gcc 4.8. Construct it otherwise. */
#ifndef __ARM_ARCH
# ifdef __ARM_ARCH_2__
@@ -286,3 +290,47 @@
#else
# define PC_OFS 8
#endif
+
+/* Pointer mangling support. */
+#if (defined NOT_IN_libc && defined IS_IN_rtld) || \
+ (!defined SHARED && (!defined NOT_IN_libc || defined IS_IN_libpthread))
+# ifdef __ASSEMBLER__
+# define PTR_MANGLE_LOAD(guard, tmp) \
+ LDST_PCREL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard_local));
+# define PTR_MANGLE(dst, src, guard, tmp) \
+ PTR_MANGLE_LOAD(guard, tmp); \
+ PTR_MANGLE2(dst, src, guard)
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
+# define PTR_MANGLE2(dst, src, guard) \
+ eor dst, src, guard
+# define PTR_DEMANGLE(dst, src, guard, tmp) \
+ PTR_MANGLE (dst, src, guard, tmp)
+# define PTR_DEMANGLE2(dst, src, guard) \
+ PTR_MANGLE2 (dst, src, guard)
+# else
+extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
+# define PTR_MANGLE(var) \
+ (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard_local)
+# define PTR_DEMANGLE(var) PTR_MANGLE (var)
+# endif
+#else
+# ifdef __ASSEMBLER__
+# define PTR_MANGLE_LOAD(guard, tmp) \
+ LDST_GLOBAL(ldr, guard, tmp, C_SYMBOL_NAME(__pointer_chk_guard));
+# define PTR_MANGLE(dst, src, guard, tmp) \
+ PTR_MANGLE_LOAD(guard, tmp); \
+ PTR_MANGLE2(dst, src, guard)
+/* Use PTR_MANGLE2 for efficiency if guard is already loaded. */
+# define PTR_MANGLE2(dst, src, guard) \
+ eor dst, src, guard
+# define PTR_DEMANGLE(dst, src, guard, tmp) \
+ PTR_MANGLE (dst, src, guard, tmp)
+# define PTR_DEMANGLE2(dst, src, guard) \
+ PTR_MANGLE2 (dst, src, guard)
+# else
+extern uintptr_t __pointer_chk_guard attribute_relro;
+# define PTR_MANGLE(var) \
+ (var) = (__typeof (var)) ((uintptr_t) (var) ^ __pointer_chk_guard)
+# define PTR_DEMANGLE(var) PTR_MANGLE (var)
+# endif
+#endif