Re:[pushed] [PATCH] LoongArch: Disable TLS type symbols from generating non-zero offsets.
Pushed to r14-8412. 在 2024/1/23 上午11:54, Lulu Cheng 写道: 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. --- gcc/config/loongarch/loongarch.cc | 18 +- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 82467474288..f2ce1f6906d 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 ();
[PATCH] 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. --- gcc/config/loongarch/loongarch.cc | 18 +- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 82467474288..f2ce1f6906d 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 (); -- 2.39.3