File: tls-macros.h

package info (click to toggle)
glibc 2.31-13%2Bdeb11u3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 278,368 kB
  • sloc: ansic: 1,025,361; asm: 256,790; makefile: 12,097; sh: 10,548; python: 9,618; cpp: 5,233; awk: 1,956; perl: 514; yacc: 290; pascal: 182; sed: 73
file content (72 lines) | stat: -rw-r--r-- 2,221 bytes parent folder | download | duplicates (16)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <sysdep.h>                     /* For ARCH_HAS_T2.  */

#ifdef __thumb2__
# define ARM_PC_OFFSET "4"
#else
# define ARM_PC_OFFSET "8"
#endif

/* Returns the address of data containing ".word SYMBOL(RELOC)".  */
#if defined (ARCH_HAS_T2) && !defined (PIC)
# define GET_SPECIAL_RELOC(symbol, reloc)			\
  ({								\
    int *__##symbol##_rodata;					\
    asm ("movw %0, #:lower16:1f\n"				\
	 "movt %0, #:upper16:1f\n"				\
	 ".pushsection .rodata.cst4, \"aM\", %%progbits, 4\n"	\
	 ".balign 4\n"						\
	 "1: .word " #symbol "(" #reloc ")\n"			\
	 ".popsection"						\
	 : "=r" (__##symbol##_rodata));				\
    __##symbol##_rodata;					\
  })
#elif defined (ARCH_HAS_T2) && defined (PIC) && ARM_PCREL_MOVW_OK
# define GET_SPECIAL_RELOC(symbol, reloc)			\
  ({								\
    int *__##symbol##_rodata;					\
    asm ("movw %0, #:lower16:1f - 2f - " ARM_PC_OFFSET "\n"	\
	 "movt %0, #:upper16:1f - 2f - " ARM_PC_OFFSET "\n"	\
	 ".pushsection .rodata.cst4, \"aM\", %%progbits, 4\n"	\
	 ".balign 4\n"						\
	 "1: .word " #symbol "(" #reloc ")\n"			\
	 ".popsection\n"					\
	 "2: add %0, %0, pc"					\
	 : "=r" (__##symbol##_rodata));				\
    __##symbol##_rodata;					\
  })
#else
# define GET_SPECIAL_RELOC(symbol, reloc)			\
  ({								\
    int *__##symbol##_rodata;					\
    asm ("adr %0, 1f\n"						\
	 "b 2f\n"						\
	 ".balign 4\n"						\
	 "1: .word " #symbol "(" #reloc ")\n"			\
	 "2:"							\
	 : "=r" (__##symbol##_rodata));				\
    __##symbol##_rodata;					\
  })
#endif

/* Returns the pointer value (SYMBOL(RELOC) + pc - PC_OFS).  */
#define GET_SPECIAL_PCREL(symbol, reloc)				\
  ({									\
    int *__##symbol##_rodata = GET_SPECIAL_RELOC (symbol, reloc);	\
    (void *) ((int) __##symbol##_rodata + *__##symbol##_rodata);	\
  })

#define TLS_LE(x)						\
  (__builtin_thread_pointer () + *GET_SPECIAL_RELOC (x, tpoff))

#define TLS_IE(x)						\
  ((int *) (__builtin_thread_pointer ()				\
	    + *(int *) GET_SPECIAL_PCREL (x, gottpoff)))

extern void *__tls_get_addr (void *);

#define TLS_LD(x)						\
  ((int *) (__tls_get_addr (GET_SPECIAL_PCREL (x, tlsldm))	\
	    + *GET_SPECIAL_RELOC (x, tlsldo)))

#define TLS_GD(x)						\
  ((int *) __tls_get_addr (GET_SPECIAL_PCREL (x, tlsgd)))