s390x: Implement tls_value (#4616)
Implement the tls_value for s390 in the ELF general-dynamic mode. Notable differences to the x86_64 implementation are: - We use a __tls_get_offset libcall instead of __tls_get_addr. - The current thread pointer (stored in a pair of access registers) needs to be added to the result of __tls_get_offset. - __tls_get_offset has a variant ABI that requires the address of the GOT (global offset table) is passed in %r12. This means we need a new libcall entries for __tls_get_offset. In addition, we also need a way to access _GLOBAL_OFFSET_TABLE_. The latter is a "magic" symbol with a well-known name defined by the ABI and recognized by the linker. This patch introduces a new ExternalName::KnownSymbol variant to support such names (originally due to @afonso360). We also need to emit a relocation on a symbol placed in a constant pool, as well as an extra relocation on the call to __tls_get_offset required for TLS linker optimization. Needed by the cg_clif frontend.
This commit is contained in:
@@ -66,6 +66,8 @@ pub enum LibCall {
|
||||
|
||||
/// Elf __tls_get_addr
|
||||
ElfTlsGetAddr,
|
||||
/// Elf __tls_get_offset
|
||||
ElfTlsGetOffset,
|
||||
// When adding a new variant make sure to add it to `all_libcalls` too.
|
||||
}
|
||||
|
||||
@@ -104,6 +106,7 @@ impl FromStr for LibCall {
|
||||
"Memcmp" => Ok(Self::Memcmp),
|
||||
|
||||
"ElfTlsGetAddr" => Ok(Self::ElfTlsGetAddr),
|
||||
"ElfTlsGetOffset" => Ok(Self::ElfTlsGetOffset),
|
||||
_ => Err(()),
|
||||
}
|
||||
}
|
||||
@@ -173,6 +176,7 @@ impl LibCall {
|
||||
Memmove,
|
||||
Memcmp,
|
||||
ElfTlsGetAddr,
|
||||
ElfTlsGetOffset,
|
||||
]
|
||||
}
|
||||
|
||||
@@ -214,7 +218,8 @@ impl LibCall {
|
||||
| LibCall::Memset
|
||||
| LibCall::Memmove
|
||||
| LibCall::Memcmp
|
||||
| LibCall::ElfTlsGetAddr => unimplemented!(),
|
||||
| LibCall::ElfTlsGetAddr
|
||||
| LibCall::ElfTlsGetOffset => unimplemented!(),
|
||||
}
|
||||
|
||||
sig
|
||||
|
||||
Reference in New Issue
Block a user