chiark / gitweb /
eglibc (2.11.3-4+deb6u3) squeeze-lts; urgency=medium
[eglibc.git] / ports / sysdeps / arm / tls-macros.h
1 #ifdef __thumb2__
2 #define ARM_PC_OFFSET "4"
3 #else
4 #define ARM_PC_OFFSET "8"
5 #endif
6
7 #define TLS_LE(x)                                       \
8   ({ int *__result;                                     \
9      void *tp = __builtin_thread_pointer ();            \
10      asm ("ldr %0, 1f; "                                \
11           "add %0, %1, %0; "                            \
12           "b 2f; "                                      \
13           ".align 2; "                                  \
14           "1: .word " #x "(tpoff); "                    \
15           "2: "                                         \
16           : "=&r" (__result) : "r" (tp));               \
17      __result; })
18
19 #ifdef __thumb2__
20 #define TLS_IE(x)                                       \
21   ({ int *__result;                                     \
22      void *tp = __builtin_thread_pointer ();            \
23      asm ("ldr %0, 1f; "                                \
24           "3: add %0, pc, %0;"                          \
25           "ldr %0, [%0];"                               \
26           "add %0, %1, %0; "                            \
27           "b 2f; "                                      \
28           ".align 2; "                                  \
29           "1: .word " #x "(gottpoff) + (. - 3b - 4); "  \
30           "2: "                                         \
31           : "=&r" (__result) : "r" (tp));               \
32      __result; })
33 #else
34 #define TLS_IE(x)                                       \
35   ({ int *__result;                                     \
36      void *tp = __builtin_thread_pointer ();            \
37      asm ("ldr %0, 1f; "                                \
38           "3: ldr %0, [pc, %0];"                        \
39           "add %0, %1, %0; "                            \
40           "b 2f; "                                      \
41           ".align 2; "                                  \
42           "1: .word " #x "(gottpoff) + (. - 3b - 8); "  \
43           "2: "                                         \
44           : "=&r" (__result) : "r" (tp));               \
45      __result; })
46 #endif
47
48 #define TLS_LD(x)                                       \
49   ({ char *__result;                                    \
50      int __offset;                                      \
51      extern void *__tls_get_addr (void *);              \
52      asm ("ldr %0, 2f; "                                \
53           "1: add %0, pc, %0; "                         \
54           "b 3f; "                                      \
55           ".align 2; "                                  \
56           "2: .word " #x "(tlsldm) + (. - 1b - "ARM_PC_OFFSET"); "      \
57           "3: "                                         \
58           : "=r" (__result));                           \
59      __result = (char *)__tls_get_addr (__result);      \
60      asm ("ldr %0, 1f; "                                \
61           "b 2f; "                                      \
62           ".align 2; "                                  \
63           "1: .word " #x "(tlsldo); "                   \
64           "2: "                                         \
65           : "=r" (__offset));                           \
66      (int *) (__result + __offset); })
67
68 #define TLS_GD(x)                                       \
69   ({ int *__result;                                     \
70      extern void *__tls_get_addr (void *);              \
71      asm ("ldr %0, 2f; "                                \
72           "1: add %0, pc, %0; "                         \
73           "b 3f; "                                      \
74           ".align 2; "                                  \
75           "2: .word " #x "(tlsgd) + (. - 1b - "ARM_PC_OFFSET"); "       \
76           "3: "                                         \
77           : "=r" (__result));                           \
78      (int *)__tls_get_addr (__result); })