mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#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)))
 |