Re: [PATCH v2] LoongArch: Add support for TLS descriptors
在 2024/3/1 下午5:39, mengqinggang 写道: Thanks, I try to send a new version patch next week. 在 2024/2/29 下午2:08, Xi Ruoyao 写道: On Thu, 2024-02-29 at 09:42 +0800, mengqinggang wrote: Generate la.tls.desc macro instruction for TLS descriptors model. la.tls.desc expand to pcalau12i $a0, %desc_pc_hi20(a) ld.d $a1, $a0, %desc_ld_pc_lo12(a) addi.d $a0, $a0, %desc_add_pc_lo12(a) jirl $ra, $a1, %desc_call(a) The default is TLS descriptors, but can be configure with -mtls-dialect={desc,trad}. Please keep trad as the default for now. Glibc-2.40 will be released after GCC 14.1 but we don't want to end up in a situation where the default configuration of the latest GCC release creating something not working with latest Glibc release. And there's also musl libc we need to take into account. Or you can write some autoconf test for if the assembler supports tlsdesc and check TARGET_GLIBC_MAJOR & TARGET_GLIBC_MINOR for Glibc version to decide if enable desc by default. If you want this but don't have time to implement you can leave trad the default and I'll take care of this. I think the implementation of the options also needs to be tweaked. I've modified a version and the patch is attached. And here you need to add test cases. Thanks. /* snip */ +(define_insn "@got_load_tls_desc" + [(set (match_operand:P 0 "register_operand" "=r") + (unspec:P + [(match_operand:P 1 "symbolic_operand" "")] + UNSPEC_TLS_DESC)) + (clobber (reg:SI FCC0_REGNUM)) + (clobber (reg:SI FCC1_REGNUM)) + (clobber (reg:SI FCC2_REGNUM)) + (clobber (reg:SI FCC3_REGNUM)) + (clobber (reg:SI FCC4_REGNUM)) + (clobber (reg:SI FCC5_REGNUM)) + (clobber (reg:SI FCC6_REGNUM)) + (clobber (reg:SI FCC7_REGNUM)) + (clobber (reg:SI A1_REGNUM)) + (clobber (reg:SI RETURN_ADDR_REGNUM))] Ok, the clobber list is correct. + "TARGET_TLS_DESC" + "la.tls.desc\t%0,%1" With -mexplicit-relocs=always we should emit %desc_pc_lo12 etc. instead of la.tls.desc. As we don't want to add too many code we can just hard code the 4 instructions here instead of splitting this insn, just something like { return TARGET_EXPLICIT_RELOCS_ALWAS ? ".." : "la.tls.desc\t%0,%1"; } + [(set_attr "got" "load") + (set_attr "mode" "")]) We need (set_attr "length" "16") in this list as this actually expands into 16 bytes. diff --git a/gcc/config.gcc b/gcc/config.gcc index 01ddc1a92f6..955e74d3bf9 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2547,7 +2547,6 @@ loongarch*-*-linux*) # Force .init_array support. The configure script cannot always # automatically detect that GAS supports it, yet we require it. gcc_cv_initfini_array=yes - with_tls=${with_tls:-desc} ;; loongarch*-*-elf*) @@ -5924,6 +5923,11 @@ case ${target} in lasx)tm_defines="$tm_defines DEFAULT_ISA_EXT_SIMD=ISA_EXT_SIMD_LASX" ;; esac + case ${with_tls} in + "" | trad) tm_defines="$tm_defines DEFAULT_TLS_TYPE=TLS_TRADITIONAL" ;; + desc) tm_defines="$tm_defines DEFAULT_TLS_TYPE=TLS_DESCRIPTORS" ;; + esac + tmake_file="loongarch/t-loongarch $tmake_file" ;; diff --git a/gcc/config/loongarch/genopts/loongarch.opt.in b/gcc/config/loongarch/genopts/loongarch.opt.in index 2cc943ef683..7de107c3e3d 100644 --- a/gcc/config/loongarch/genopts/loongarch.opt.in +++ b/gcc/config/loongarch/genopts/loongarch.opt.in @@ -264,7 +264,7 @@ TargetVariable HOST_WIDE_INT la_isa_evolution = 0 Enum -Name(tls_type) Type(enum loongarch_tls_type) +Name(tls_type) Type(int) The possible TLS dialects: EnumValue @@ -274,5 +274,5 @@ EnumValue Enum(tls_type) String(desc) Value(TLS_DESCRIPTORS) mtls-dialect= -Target RejectNegative Joined Enum(tls_type) Var(loongarch_tls_dialect) Init(TLS_DESCRIPTORS) Save +Target RejectNegative Joined Enum(tls_type) Var(la_opt_tls_dialect) Init(M_OPT_UNSET) Save Specify TLS dialect. diff --git a/gcc/config/loongarch/loongarch-def.h b/gcc/config/loongarch/loongarch-def.h index 2dbf006d013..48d60e2b456 100644 --- a/gcc/config/loongarch/loongarch-def.h +++ b/gcc/config/loongarch/loongarch-def.h @@ -175,6 +175,7 @@ struct loongarch_target int cpu_arch; /* CPU_ */ int cpu_tune; /* same */ int cmodel; /* CMODEL_ */ + int tls_dialect; /* TLS_ */ }; /* CPU model */ @@ -188,6 +189,12 @@ enum { N_TUNE_TYPES = 5 }; +/* TLS types. */ +enum { + TLS_TRADITIONAL = 0, + TLS_DESCRIPTORS = 1 +}; + /* CPU model properties */ extern loongarch_def_array loongarch_cpu_strings; diff --git a/gcc/config/loongarch/loongarch-driver.cc b/gcc/config/loongarch/loongarch-driver.cc index 62658f531ad..8c4ed34698b 100644 --- a/gcc/config/loongarch/loongarch-driver.cc +++ b/gcc/config/loongarch/loongarch-driver.cc @@ -45,7 +45,7 @@ la_driver_init (int argc ATTRIBUTE_UNUSED, const char **argv ATTRIBUTE_UNUSED) /* Initialize all fields of la_target. */ loongarch_init_target (&la_target, M_OPT_UNSET, M_OPT_UNSET, M_OPT_UNSET, M_OPT_UNSET, M_OPT_UNSET, M_OPT_U
Re: [PATCH v2] LoongArch: Add support for TLS descriptors
Thanks, I try to send a new version patch next week. 在 2024/2/29 下午2:08, Xi Ruoyao 写道: On Thu, 2024-02-29 at 09:42 +0800, mengqinggang wrote: Generate la.tls.desc macro instruction for TLS descriptors model. la.tls.desc expand to pcalau12i $a0, %desc_pc_hi20(a) ld.d $a1, $a0, %desc_ld_pc_lo12(a) addi.d $a0, $a0, %desc_add_pc_lo12(a) jirl $ra, $a1, %desc_call(a) The default is TLS descriptors, but can be configure with -mtls-dialect={desc,trad}. Please keep trad as the default for now. Glibc-2.40 will be released after GCC 14.1 but we don't want to end up in a situation where the default configuration of the latest GCC release creating something not working with latest Glibc release. And there's also musl libc we need to take into account. Or you can write some autoconf test for if the assembler supports tlsdesc and check TARGET_GLIBC_MAJOR & TARGET_GLIBC_MINOR for Glibc version to decide if enable desc by default. If you want this but don't have time to implement you can leave trad the default and I'll take care of this. /* snip */ +(define_insn "@got_load_tls_desc" + [(set (match_operand:P 0 "register_operand" "=r") + (unspec:P + [(match_operand:P 1 "symbolic_operand" "")] + UNSPEC_TLS_DESC)) + (clobber (reg:SI FCC0_REGNUM)) + (clobber (reg:SI FCC1_REGNUM)) + (clobber (reg:SI FCC2_REGNUM)) + (clobber (reg:SI FCC3_REGNUM)) + (clobber (reg:SI FCC4_REGNUM)) + (clobber (reg:SI FCC5_REGNUM)) + (clobber (reg:SI FCC6_REGNUM)) + (clobber (reg:SI FCC7_REGNUM)) + (clobber (reg:SI A1_REGNUM)) + (clobber (reg:SI RETURN_ADDR_REGNUM))] Ok, the clobber list is correct. + "TARGET_TLS_DESC" + "la.tls.desc\t%0,%1" With -mexplicit-relocs=always we should emit %desc_pc_lo12 etc. instead of la.tls.desc. As we don't want to add too many code we can just hard code the 4 instructions here instead of splitting this insn, just something like { return TARGET_EXPLICIT_RELOCS_ALWAS ? ".." : "la.tls.desc\t%0,%1"; } + [(set_attr "got" "load") + (set_attr "mode" "")]) We need (set_attr "length" "16") in this list as this actually expands into 16 bytes.
Re: [PATCH v2] LoongArch: Add support for TLS descriptors
On 2024-02-29 09:42, mengqinggang wrote: Generate la.tls.desc macro instruction for TLS descriptors model. la.tls.desc expand to pcalau12i $a0, %desc_pc_hi20(a) ld.d $a1, $a0, %desc_ld_pc_lo12(a) addi.d$a0, $a0, %desc_add_pc_lo12(a) jirl $ra, $a1, %desc_call(a) Sorry for I might miss something before. Just some confusing. In binutils `la.tls.desc` has been resolved as #define INSN_LA_TLS_DESC64 \ "pcalau12i $r4,%%desc_pc_hi20(%2);" \ "addi.d $r4,$r4,%%desc_pc_lo12(%2);" \ "ld.d $r1,$r4,%%desc_ld(%2);" \ "jirl $r1,$r1,%%desc_call(%2);", \ Should is need to be consistent with binutils? The default is TLS descriptors, but can be configure with -mtls-dialect={desc,trad}. gcc/ChangeLog: * config.gcc: Add --with_tls to change the TLS flavor. * config/loongarch/genopts/loongarch.opt.in: Add -mtls-dialect to configure TLS flavor. * config/loongarch/loongarch-opts.h (enum loongarch_tls_type): New. * config/loongarch/loongarch-protos.h (NUM_SYMBOL_TYPES): New. * config/loongarch/loongarch.cc (loongarch_symbol_insns): Add instruction sequence length data for TLS DESC. (loongarch_legitimize_tls_address): New TLS DESC instruction sequence. * config/loongarch/loongarch.h (TARGET_TLS_DESC): New. * config/loongarch/loongarch.md (@got_load_tls_desc): New. * config/loongarch/loongarch.opt: Regenerated. --- Changes v1 -> v2: - Clobber fcc0-fcc7 registers in got_load_tls_desc template. - Support --with-tls in configure. gcc/config.gcc| 15 ++- gcc/config/loongarch/genopts/loongarch.opt.in | 14 ++ gcc/config/loongarch/loongarch-opts.h | 6 +++ gcc/config/loongarch/loongarch-protos.h | 3 +- gcc/config/loongarch/loongarch.cc | 45 +++ gcc/config/loongarch/loongarch.h | 8 gcc/config/loongarch/loongarch.md | 36 +++ gcc/config/loongarch/loongarch.opt| 14 ++ 8 files changed, 130 insertions(+), 11 deletions(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index a0f9c672308..72a5e992821 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2546,6 +2546,7 @@ loongarch*-*-linux*) # Force .init_array support. The configure script cannot always # automatically detect that GAS supports it, yet we require it. gcc_cv_initfini_array=yes + with_tls=${with_tls:-desc} ;; loongarch*-*-elf*) @@ -4987,7 +4988,7 @@ case "${target}" in ;; loongarch*-*) - supported_defaults="abi arch tune fpu simd multilib-default strict-align-lib" + supported_defaults="abi arch tune fpu simd multilib-default strict-align-lib tls" # Local variables unset \ @@ -5245,6 +5246,18 @@ case "${target}" in with_multilib_list="${abi_base}/${abi_ext}" fi + # Handle --with-tls. + case "$with_tls" in + "" \ + | trad | desc) + # OK + ;; + *) + echo "Unknown TLS method used in --with-tls=$with_tls" 1>&2 + exit 1 + ;; + esac + # Check if the configured default ABI combination is included in # ${with_multilib_list}. loongarch_multilib_list_sane=no diff --git a/gcc/config/loongarch/genopts/loongarch.opt.in b/gcc/config/loongarch/genopts/loongarch.opt.in index 02f918053f5..2cc943ef683 100644 --- a/gcc/config/loongarch/genopts/loongarch.opt.in +++ b/gcc/config/loongarch/genopts/loongarch.opt.in @@ -262,3 +262,17 @@ default value is 4. ; CPUCFG independently, so we use bit flags to specify them. TargetVariable HOST_WIDE_INT la_isa_evolution = 0 + +Enum +Name(tls_type) Type(enum loongarch_tls_type) +The possible TLS dialects: + +EnumValue +Enum(tls_type) String(trad) Value(TLS_TRADITIONAL) + +EnumValue +Enum(tls_type) String(desc) Value(TLS_DESCRIPTORS) + +mtls-dialect= +Target RejectNegative Joined Enum(tls_type) Var(loongarch_tls_dialect) Init(TLS_DESCRIPTORS) Save +Specify TLS dialect. diff --git a/gcc/config/loongarch/loongarch-opts.h b/gcc/config/loongarch/loongarch-opts.h index 586e67e65ee..a08ab6fac10 100644 --- a/gcc/config/loongarch/loongarch-opts.h +++ b/gcc/config/loongarch/loongarch-opts.h @@ -134,4 +134,10 @@ struct loongarch_flags { #define HAVE_AS_TLS_LE_RELAXATION 0 #endif +/* TLS types. */ +enum loongarch_tls_type { + TLS_TRADITIONAL, + TLS_DESCRIPTORS +}; + #endif /* LOONGARCH_OPTS_H */ diff --git a/gcc/config/loongarch/loongarch-protos.h b/gcc/config/loongarch/loongarch-protos.h index 1fdfda9af01..6b417a3c371 100644 --- a/gcc/config/loongarch/loongarch-protos.h +++ b/gcc/config/loongarch/loongarch-protos.h @@ -53,8 +53,9 @@ enum loongarch_symbol_type { SYMBOL
Re: [PATCH v2] LoongArch: Add support for TLS descriptors
On Thu, 2024-02-29 at 14:08 +0800, Xi Ruoyao wrote: > > + "TARGET_TLS_DESC" > > + "la.tls.desc\t%0,%1" > > With -mexplicit-relocs=always we should emit %desc_pc_lo12 etc. instead > of la.tls.desc. As we don't want to add too many code we can just hard > code the 4 instructions here instead of splitting this insn, just > something like > > { return TARGET_EXPLICIT_RELOCS_ALWAS ? ".." : "la.tls.desc\t%0,%1"; } And if -mcmodel=extreme we should use a 3-operand la.tls.desc. Or if we don't want to support this we can just error out if -mcmodel=extreme - mtls-dialect=desc. -- Xi Ruoyao School of Aerospace Science and Technology, Xidian University
Re: [PATCH v2] LoongArch: Add support for TLS descriptors
On Thu, 2024-02-29 at 09:42 +0800, mengqinggang wrote: > Generate la.tls.desc macro instruction for TLS descriptors model. > > la.tls.desc expand to > pcalau12i $a0, %desc_pc_hi20(a) > ld.d $a1, $a0, %desc_ld_pc_lo12(a) > addi.d $a0, $a0, %desc_add_pc_lo12(a) > jirl $ra, $a1, %desc_call(a) > > The default is TLS descriptors, but can be configure with > -mtls-dialect={desc,trad}. Please keep trad as the default for now. Glibc-2.40 will be released after GCC 14.1 but we don't want to end up in a situation where the default configuration of the latest GCC release creating something not working with latest Glibc release. And there's also musl libc we need to take into account. Or you can write some autoconf test for if the assembler supports tlsdesc and check TARGET_GLIBC_MAJOR & TARGET_GLIBC_MINOR for Glibc version to decide if enable desc by default. If you want this but don't have time to implement you can leave trad the default and I'll take care of this. /* snip */ > +(define_insn "@got_load_tls_desc" > + [(set (match_operand:P 0 "register_operand" "=r") > + (unspec:P > + [(match_operand:P 1 "symbolic_operand" "")] > + UNSPEC_TLS_DESC)) > + (clobber (reg:SI FCC0_REGNUM)) > + (clobber (reg:SI FCC1_REGNUM)) > + (clobber (reg:SI FCC2_REGNUM)) > + (clobber (reg:SI FCC3_REGNUM)) > + (clobber (reg:SI FCC4_REGNUM)) > + (clobber (reg:SI FCC5_REGNUM)) > + (clobber (reg:SI FCC6_REGNUM)) > + (clobber (reg:SI FCC7_REGNUM)) > + (clobber (reg:SI A1_REGNUM)) > + (clobber (reg:SI RETURN_ADDR_REGNUM))] Ok, the clobber list is correct. > + "TARGET_TLS_DESC" > + "la.tls.desc\t%0,%1" With -mexplicit-relocs=always we should emit %desc_pc_lo12 etc. instead of la.tls.desc. As we don't want to add too many code we can just hard code the 4 instructions here instead of splitting this insn, just something like { return TARGET_EXPLICIT_RELOCS_ALWAS ? ".." : "la.tls.desc\t%0,%1"; } > + [(set_attr "got" "load") > + (set_attr "mode" "")]) We need (set_attr "length" "16") in this list as this actually expands into 16 bytes. -- Xi Ruoyao School of Aerospace Science and Technology, Xidian University