SPARC: General Dynamic (GD)
This code sequence implements the GD model described in Thread-Local Storage Access Models.
Table 16-2 SPARC: General Dynamic Thread-Local Variable Access Codes
|
Code Sequence |
Initial Relocations |
Symbol |
# %l7 - initialized to GOT pointer 0x00 sethi %hi(@dtlndx(x)), %o0 0x04 add %o0, %lo(@dtlndx(x)), %o0 0x08 add %l7, %o0, %o0 0x0c call x@TLSPLT # %o0 - contains address of TLS variable |
R_SPARC_TLS_GD_HI22 R_SPARC_TLS_GD_LO10 R_SPARC_TLS_GD_ADD R_SPARC_TLS_GD_CALL |
x x x x |
|
→ |
Outstanding Relocations: 32-bit |
Symbol |
GOT[n] GOT[n + 1] |
R_SPARC_TLS_DTPMOD32 R_SPARC_TLS_DTPOFF32 |
x x |
|
→ |
Outstanding Relocations: 64-bit |
Symbol |
GOT[n] GOT[n + 1] |
R_SPARC_TLS_DTPMOD64 R_SPARC_TLS_DTPOFF64 |
x x |
The sethi, and add instructions generate R_SPARC_TLS_GD_HI22 and R_SPARC_TLS_GD_LO10 relocations respectively. These relocations instruct the link-editor to allocate space in the GOT to hold a TLS_index structure for variable x. The link-editor processes this relocation by substituting the GOT-relative offset for the new GOT entry.
The load object index and TLS block index for x are not known until runtime. Therefore, the link-editor places the R_SPARC_TLS_DTPMOD32 and R_SPARC_TLS_DPTOFF32 relocations against the GOT for processing by the runtime linker.
The second add instruction causes the generation of the R_SPARC_TLS_GD_ADD relocation. This relocation is used only if the GD code sequence is changed to another sequence by the link-editor.
The call instruction uses the special syntax, x@TLSPLT. This call references the TLS variable and generates the R_SPARC_TLS_GD_CALL relocation. This relocation instructs the link-editor to bind the call to the __tls_get_addr() function, and associates the call instruction with the GD code sequence.
Note:
Theadd instruction must appear before the call instruction. The add instruction can not be placed into the delay slot for the call. This requirement is necessary as the code-transformations that can occur later require a known order. The register used as the GOT-pointer for the add instruction tagged by the R_SPARC_TLS_GD_ADD relocation, must be the first register in the add instruction. This requirement permits the link-editor to identify the GOT-pointer register during a code transformation.