This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: more on TLS


On Mon, Feb 04, 2002 at 05:43:44PM -0800, Ulrich Drepper wrote:
> In case somebody is thinking about implementing the TLS stuff for
> anything but x86.  I suggest to wait (read it as: I'll not integrate
> any changes for other archs yet).  The design is still in flux.  I
> know the differences between the ABIs for the different architectures
> and integrate appropriate configury.

I noticed a few inconsistancies (perhaps just typos) in the
existing document.  I'll comment on them later.  For now,
here's what I've come up with for Alpha.  Comments appreciated.


r~



New relocs:

	#define R_ALPHA_TLS_GD_HI	28
	#define R_ALPHA_TLS_GD_LO	29
	#define R_ALPHA_TLS_GD_16	30
	#define R_ALPHA_TLS_LDM_HI	31
	#define R_ALPHA_TLS_LDM_LO	32
	#define R_ALPHA_TLS_LDM_16	33
	#define R_ALPHA_TLS_LDO_HI	34
	#define R_ALPHA_TLS_LDO_LO	35
	#define R_ALPHA_TLS_LDO_16	36
	#define R_ALPHA_TLS_IE_HI	37
	#define R_ALPHA_TLS_IE_LO	38
	#define R_ALPHA_TLS_IE_16	39
	#define R_ALPHA_TLS_LE_HI	40
	#define R_ALPHA_TLS_LE_LO	41
	#define R_ALPHA_TLS_LE_16	42
	#define R_ALPHA_DTPMOD32	43
	#define R_ALPHA_DTPOFF32	44
	#define R_ALPHA_TPOFF32		45

	#define LITUSE_TLS_GD		4
	#define LITUSE_TLS_LDM		5

Sequences:

  GD32
	ldah	$16,x($gp)			!tls_gd_hi
	lda	$16,x($16)			!tls_gd_lo
	ldq	$27,__tls_get_addr($gp)		!literal!1
	jsr	$26,($27),__tls_get_addr	!lituse_tls_gd(x)!1

  GD16
	lda	$16,x($16)			!tls_gd_16
	ldq	$27,__tls_get_addr($gp)		!literal!1
	jsr	$26,($27),__tls_get_addr	!lituse_tls_gd(x)!1

  LD32
	ldah	$16,0($gp)			!tls_ldm_hi
	lda	$16,0($16)			!tls_ldm_lo
	ldq	$27,__tls_get_addr($gp)		!literal!1
	jsr	$26,($27),__tls_get_addr	!lituse_tls_ldm!1
	...
	ldah	$1,x($0)			!tls_ldo_hi
	lda	$1,x($1)			!tls_ldo_lo

  LD16
	lda	$16,0($gp)			!tls_ldm_16
	ldq	$27,__tls_get_addr($gp)		!literal!1
	jsr	$26,($27),__tls_get_addr	!lituse_tls_ldm!1
	...
	lda	$1,x($0)			!tls_ldo_16

  IE32
	ldah	$1,x($gp)			!tls_ie_hi
	ldl	$1,x($1)			!tls_ie_lo
	addq	$tp,$1,$0

  IE16
	ldl	$1,x($gp)			!tls_ie_16
	addq	$tp,$1,$0

  LE32
	ldah	$1,x($tp)			!tls_le_hi
	lda	$1,x($1)			!tls_le_lo

  LE16
	lda	$1,x($tp)			!tls_le_16

Relaxations:

  literal+lituse_tls_gd(x)	-> no relocs
	ldq			-> call_pal rduniq
	jsr			-> addq $16,$0,$0

  tls_gd_hi			-> tls_ie_hi
  tls_gd_lo			-> tls_ie_lo
	lda			-> ldl

  tls_gd_16			-> tls_ie_16
	lda			-> ldl

  tls_gd_hi			-> tls_le_hi
  tls_gd_lo			-> tls_le_lo

  literal+lituse_tls_ldm	-> no relocs
	ldq			-> call_pal rduniq
	jsr			-> addq $16,$0,$0

  tls_ldm_hi			-> tls_le_hi vs .tdata
  tls_ldm_lo			-> tls_le_lo vs .tdata

  tls_ie_hi			-> tls_le_hi
  tls_ie_lo  			-> tls_le_lo
	ldl			-> lda

Effects of Relaxations:

  GD32/IE32
	ldah	$16,x($gp)			!tls_ie_hi
	ldl	$16,x($16)			!tls_ie_lo
	call_pal rduniq
	addq	$16,$0,$0

  GD16/IE16
	ldl	$16,x($gp)			!tls_ie_16
	call_pal rduniq
	addq	$16,$0,$0

  GD32/LE32
	ldah	$16,x				!tls_le_hi
	lda	$16,x($16)			!tls_le_lo
	call_pal rduniq
	addq	$16,$0,$0

  IE32/LE32
	ldah	$1,x				!tls_le_hi
	lda	$1,x($1)			!tls_le_lo
	addq	$tp,$1,$0

  LD32/LE32
	ldah	$16,.tdata			!tls_le_hi
	ldah	$16,.tdata($16)			!tls_le_lo
	call_pal rduniq
	addq	$16,$0,$0
	...
	ldah	$1,x($0)			!tls_ldo_hi
	lda	$1,x($1)			!tls_ldo_lo

Special Notes:

	GD16, LD16, IE16 refer to 16-bit offsets from the GOT,
	such as one finds with -fpic vs -fPIC.

	LE16 refers to a 16-bit offset from the TP.  Thus certain
	relaxations from GD/LD/IE16 to LE cannot occur unless the
	tls offset for the symbol is small enough.  LE16 should be
	usable directly via a compiler option.

	The $tp register referred to in the IE and LE sequences
	is some register in which the compiler has saved the thread
	pointer that it acquired from "call_pal rduniq".

	The TLS_LDM relocs do not reference their symbol.

	The __tls_get_addr function preserves the $gp register.

	Literals with lituse_tls_gd or lituse_tls_ldm uses cannot
	be combined with other lituses.

	Unlike other lituses, the symbol associated with lituse_tls_gd
	is meaningful.

	Relaxations are done strictly via reloations, thus the
	above sequences can be arbitrarily re-ordered.  With the
	exception that the literal for one of the lituse_tls relocs
	must be considered to set $0, not just $27.

	Threads are limited to 2GB local storage.  This is due to
	the maximum displacement available in the ldah+lda insns
	for LE32.  Note that the IE form takes advantage of this
	by storing the tlsoffset in a 32-bit slot, not a 64-bit slot.

	The tls_index struct should also have 32-bit components to
	save space.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]