diff options
author | Lulu Cheng <chenglulu@loongson.cn> | 2024-01-23 11:28:09 +0800 |
---|---|---|
committer | Lulu Cheng <chenglulu@loongson.cn> | 2024-01-25 15:37:23 +0800 |
commit | 0801a88af40e4bb41c240788a2365ca1e30e281a (patch) | |
tree | 48db0d1731ffe89b1d9e993b0c35de183353c892 | |
parent | 464de9c283f7f4717280c515a192e479d7a840a3 (diff) | |
download | gcc-0801a88af40e4bb41c240788a2365ca1e30e281a.zip gcc-0801a88af40e4bb41c240788a2365ca1e30e281a.tar.gz gcc-0801a88af40e4bb41c240788a2365ca1e30e281a.tar.bz2 |
LoongArch: Disable TLS type symbols from generating non-zero offsets.
TLS gd ld and ie type symbols will generate corresponding GOT entries,
so non-zero offsets cannot be generated.
The address of TLS le type symbol+addend is not implemented in binutils,
so non-zero offset is not generated here for the time being.
gcc/ChangeLog:
* config/loongarch/loongarch.cc (loongarch_symbolic_constant_p):
For symbols of type tls, non-zero Offset is not generated.
-rw-r--r-- | gcc/config/loongarch/loongarch.cc | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 072c68d..da22fd6 100644 --- a/gcc/config/loongarch/loongarch.cc +++ b/gcc/config/loongarch/loongarch.cc @@ -1924,11 +1924,7 @@ loongarch_symbolic_constant_p (rtx x, enum loongarch_symbol_type *symbol_type) x = UNSPEC_ADDRESS (x); } else if (SYMBOL_REF_P (x) || LABEL_REF_P (x)) - { - *symbol_type = loongarch_classify_symbol (x); - if (*symbol_type == SYMBOL_TLS) - return true; - } + *symbol_type = loongarch_classify_symbol (x); else return false; @@ -1939,17 +1935,21 @@ loongarch_symbolic_constant_p (rtx x, enum loongarch_symbol_type *symbol_type) relocations. */ switch (*symbol_type) { - case SYMBOL_TLS_IE: - case SYMBOL_TLS_LE: - case SYMBOL_TLSGD: - case SYMBOL_TLSLDM: case SYMBOL_PCREL: case SYMBOL_PCREL64: /* GAS rejects offsets outside the range [-2^31, 2^31-1]. */ return sext_hwi (INTVAL (offset), 32) == INTVAL (offset); + /* The following symbol types do not allow non-zero offsets. */ case SYMBOL_GOT_DISP: + case SYMBOL_TLS_IE: + case SYMBOL_TLSGD: + case SYMBOL_TLSLDM: case SYMBOL_TLS: + /* From an implementation perspective, tls_le symbols are allowed to + have non-zero offsets, but currently binutils has not added support, + so the generation of non-zero offsets is prohibited here. */ + case SYMBOL_TLS_LE: return false; } gcc_unreachable (); |