[PATCH v5] LoongArch: Add support for TLS descriptors
Add support for TLS descriptors on normal code model and extreme code model. Normal code model instruction sequence: -mno-explicit-relocs: la.tls.desc $r4, s add.d $r12, $r4, $r2 -mexplicit-relocs: pcalau12i $r4,%desc_pc_hi20(s) addi.d $r4,$r4,%desc_pc_lo12(s) ld.d$r1,$r4,%desc_ld(s) jirl$r1,$r1,%desc_call(s) add.d $r12, $r4, $r2 Extreme code model instruction sequence: -mno-explicit-relocs: la.tls.desc $r4, $r12, s add.d $r12, $r4, $r2 -mexplicit-relocs: pcalau12i $r4,%desc_pc_hi20(s) addi.d $r12,$r0,%desc_pc_lo12(s) lu32i.d $r12,%desc64_pc_lo20(s) lu52i.d $r12,$r12,%desc64_pc_hi12(s) add.d $r4,$r4,$r12 ld.d$r1,$r4,%desc_ld(s) jirl$r1,$r1,%desc_call(s) add.d $r12, $r4, $r2 The default is still traditional TLS model, but can be configured with --with-tls={trad,desc}. The default can change to TLS descriptors once libc and LLVM support this. gcc/ChangeLog: * config.gcc: Add --with-tls option to change TLS flavor. * config/loongarch/genopts/loongarch.opt.in: Add -mtls-dialect to configure TLS flavor. * config/loongarch/loongarch-def.h (struct loongarch_target): Add tls_dialect. * config/loongarch/loongarch-driver.cc (la_driver_init): Add tls flavor. * config/loongarch/loongarch-opts.cc (loongarch_init_target): Add tls_dialect. (loongarch_config_target): Ditto. (loongarch_update_gcc_opt_status): Ditto. * config/loongarch/loongarch-opts.h (loongarch_init_target):Ditto. (TARGET_TLS_DESC): New define. * config/loongarch/loongarch.cc (loongarch_symbol_insns): Add TLS DESC instructions sequence length. (loongarch_legitimize_tls_address): New TLS DESC instruction sequence. (loongarch_option_override_internal): Add la_opt_tls_dialect. (loongarch_option_restore): Add la_target.tls_dialect. * config/loongarch/loongarch.md (@got_load_tls_desc): Normal code model for TLS DESC. (got_load_tls_desc_off64): Extreme code model for TLS DESC. * config/loongarch/loongarch.opt: Regenerated. gcc/testsuite/ChangeLog: * gcc.target/loongarch/cmodel-extreme-1.c: Add -mtls-dialect=trad. * gcc.target/loongarch/cmodel-extreme-2.c: Ditto. * gcc.target/loongarch/explicit-relocs-auto-tls-ld-gd.c: Ditto. * gcc.target/loongarch/explicit-relocs-medium-call36-auto-tls-ld-gd.c: Ditto. * gcc.target/loongarch/func-call-medium-1.c: Ditto. * gcc.target/loongarch/func-call-medium-2.c: Ditto. * gcc.target/loongarch/func-call-medium-3.c: Ditto. * gcc.target/loongarch/func-call-medium-4.c: Ditto. * gcc.target/loongarch/tls-extreme-macro.c: Ditto. * gcc.target/loongarch/tls-gd-noplt.c: Ditto. * gcc.target/loongarch/explicit-relocs-auto-extreme-tls-desc.c: New test. * gcc.target/loongarch/explicit-relocs-auto-tls-desc.c: New test. * gcc.target/loongarch/explicit-relocs-extreme-tls-desc.c: New test. * gcc.target/loongarch/explicit-relocs-tls-desc.c: New test. Co-authored-by: Lulu Cheng Co-authored-by: Xi Ruoyao --- Changes v4 -> v5: - Use (reg:P 4) instead of match_operand in got_load_tls_desc and got_load_tls_desc_off64. - Change instruction sequence to prevent additional white spaces in the output asm before tabs. Changes v3 -> v4: - Add TLS descriptors test cases. Changes v2 -> v3: - Set default to traditional TLS model. - Add support for -mexplicit-relocs and extreme code model. Changes v1 -> v2: - Clobber fcc0-fcc7 registers in got_load_tls_desc template. - Support --with-tls in configure. v4 link: https://sourceware.org/pipermail/gcc-patches/2024-March/647597.html v3 link: https://sourceware.org/pipermail/gcc-patches/2024-March/647578.html v2 link: https://sourceware.org/pipermail/gcc-patches/2024-February/646817.html v1 link: https://sourceware.org/pipermail/gcc-patches/2023-December/638907.html gcc/config.gcc| 19 +- gcc/config/loongarch/genopts/loongarch.opt.in | 14 gcc/config/loongarch/loongarch-def.h | 7 ++ gcc/config/loongarch/loongarch-driver.cc | 2 +- gcc/config/loongarch/loongarch-opts.cc| 12 +++- gcc/config/loongarch/loongarch-opts.h | 2 + gcc/config/loongarch/loongarch.cc | 47 + gcc/config/loongarch/loongarch.md | 68 +++ gcc/config/loongarch/loongarch.opt| 14 .../gcc.target/loongarch/cmodel-extreme-1.c | 2 +- .../gcc.target/loongarch/cmodel-extreme-2.c | 2 +- .../explicit-relocs-auto-extreme-tls-desc.c | 10 +++ .../loongarch/explicit-relocs-auto-tls-desc.c | 10 +++ .../explicit-relocs-auto-tls-ld-gd.c | 2 +- .../explicit-relocs-extreme-tls-desc.c| 16 + ...icit-relocs-medium-call36-auto-
Re: [PATCH v4] LoongArch: Add support for TLS descriptors
在 2024/3/13 上午6:15, Xi Ruoyao 写道: On Tue, 2024-03-12 at 17:20 +0800, mengqinggang wrote: +(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 RETURN_ADDR_REGNUM))] + "TARGET_TLS_DESC" +{ + return TARGET_EXPLICIT_RELOCS + ? "pcalau12i\t$r4,%%desc_pc_hi20(%1)\n\ + \taddi.d\t$r4,$r4,%%desc_pc_lo12(%1)\n\ + \tld.d\t$r1,$r4,%%desc_ld(%1)\n\ + \tjirl\t$r1,$r1,%%desc_call(%1)" Use something like ? "pcalau12i\t$r4,%%desc_pc_hi20(%1)\n\t" "addi.d\t$r4,$r4,%%desc_pc_lo12(%1)\n\t" "ld.d\t$r1,$r4,%%desc_ld(%1)\n\t" "jirl\t$r1,$r1,%%desc_call(%1)" : "la.tls.desc\t%0,%1"; to prevent additional white spaces in the output asm before tabs. + : "la.tls.desc\t%0,%1"; +} + [(set_attr "got" "load") + (set_attr "mode" "") + (set_attr "length" "16")]) + +(define_insn "got_load_tls_desc_off64" + [(set (match_operand:DI 0 "register_operand" "=r") + (unspec:DI + [(match_operand:DI 1 "symbolic_operand" "")] + UNSPEC_TLS_DESC_OFF64)) + (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 RETURN_ADDR_REGNUM)) + (clobber (match_operand:DI 2 "register_operand" "=&r"))] + "TARGET_TLS_DESC && TARGET_CMODEL_EXTREME" +{ + return TARGET_EXPLICIT_RELOCS + ? "pcalau12i\t$r4,%%desc_pc_hi20(%1)\n\ + \taddi.d\t%2,$r0,%%desc_pc_lo12(%1)\n\ + \tlu32i.d\t%2,%%desc64_pc_lo20(%1)\n\ + \tlu52i.d\t%2,%2,%%desc64_pc_hi12(%1)\n\ + \tadd.d\t$r4,$r4,%2\n\ + \tld.d\t$r1,$r4,%%desc_ld(%1)\n\ + \tjirl\t$r1,$r1,%%desc_call(%1)" + : "la.tls.desc\t%0,%2,%1"; Likewise. +} + [(set_attr "got" "load") + (set_attr "length" "28")]) Otherwise OK. It's better to allow splitting these two instructions but we can do it in another patch. And IMO it's better to enable TLS desc by default if supported by both the assembler and the libc, but we'll have to defer it until Glibc 2.40 release. Do we need to wait until LLVM also supports TLS DESC before setting it as default?
[PATCH v4] LoongArch: Add support for TLS descriptors
Add support for TLS descriptors on normal code model and extreme code model. Normal code model instruction sequence: -mno-explicit-relocs: la.tls.desc $r4, s add.d $r12, $r4, $r2 -mexplicit-relocs: pcalau12i $r4,%desc_pc_hi20(s) addi.d $r4,$r4,%desc_pc_lo12(s) ld.d$r1,$r4,%desc_ld(s) jirl$r1,$r1,%desc_call(s) add.d $r12, $r4, $r2 Extreme code model instruction sequence: -mno-explicit-relocs: la.tls.desc $r4, $r12, s add.d $r12, $r4, $r2 -mexplicit-relocs: pcalau12i $r4,%desc_pc_hi20(s) addi.d $r12,$r0,%desc_pc_lo12(s) lu32i.d $r12,%desc64_pc_lo20(s) lu52i.d $r12,$r12,%desc64_pc_hi12(s) add.d $r4,$r4,$r12 ld.d$r1,$r4,%desc_ld(s) jirl$r1,$r1,%desc_call(s) add.d $r12, $r4, $r2 The default is still traditional TLS model, but can be configured with --with-tls={trad,desc}. The default can change to TLS descriptors once libc and LLVM support this. gcc/ChangeLog: * config.gcc: Add --with-tls option to change TLS flavor. * config/loongarch/genopts/loongarch.opt.in: Add -mtls-dialect to configure TLS flavor. * config/loongarch/loongarch-def.h (struct loongarch_target): Add tls_dialect. * config/loongarch/loongarch-driver.cc (la_driver_init): Add tls flavor. * config/loongarch/loongarch-opts.cc (loongarch_init_target): Add tls_dialect. (loongarch_config_target): Ditto. (loongarch_update_gcc_opt_status): Ditto. * config/loongarch/loongarch-opts.h (loongarch_init_target):Ditto. (TARGET_TLS_DESC): New define. * config/loongarch/loongarch.cc (loongarch_symbol_insns): Add TLS DESC instructions sequence length. (loongarch_legitimize_tls_address): New TLS DESC instruction sequence. (loongarch_option_override_internal): Add la_opt_tls_dialect. (loongarch_option_restore): Add la_target.tls_dialect. * config/loongarch/loongarch.md (@got_load_tls_desc): Normal code model for TLS DESC. (got_load_tls_desc_off64): Extreme code model for TLS DESC. * config/loongarch/loongarch.opt: Regenerated. gcc/testsuite/ChangeLog: * gcc.target/loongarch/cmodel-extreme-1.c: Add -mtls-dialect=trad. * gcc.target/loongarch/cmodel-extreme-2.c: Ditto. * gcc.target/loongarch/explicit-relocs-auto-tls-ld-gd.c: Ditto. * gcc.target/loongarch/explicit-relocs-medium-call36-auto-tls-ld-gd.c: Ditto. * gcc.target/loongarch/func-call-medium-1.c: Ditto. * gcc.target/loongarch/func-call-medium-2.c: Ditto. * gcc.target/loongarch/func-call-medium-3.c: Ditto. * gcc.target/loongarch/func-call-medium-4.c: Ditto. * gcc.target/loongarch/tls-extreme-macro.c: Ditto. * gcc.target/loongarch/tls-gd-noplt.c: Ditto. * gcc.target/loongarch/explicit-relocs-auto-extreme-tls-desc.c: New test. * gcc.target/loongarch/explicit-relocs-auto-tls-desc.c: New test. * gcc.target/loongarch/explicit-relocs-extreme-tls-desc.c: New test. * gcc.target/loongarch/explicit-relocs-tls-desc.c: New test. --- Changes v3 -> v4: - Add TLS descriptors test cases. Changes v2 -> v3: - Set default to traditional TLS model. - Add support for -mexplicit-relocs and extreme code model. Changes v1 -> v2: - Clobber fcc0-fcc7 registers in got_load_tls_desc template. - Support --with-tls in configure. v3 link: https://sourceware.org/pipermail/gcc-patches/2024-March/647578.html v2 link: https://sourceware.org/pipermail/gcc-patches/2024-February/646817.html v1 link: https://sourceware.org/pipermail/gcc-patches/2023-December/638907.html gcc/config.gcc| 19 +- gcc/config/loongarch/genopts/loongarch.opt.in | 14 gcc/config/loongarch/loongarch-def.h | 7 ++ gcc/config/loongarch/loongarch-driver.cc | 2 +- gcc/config/loongarch/loongarch-opts.cc| 12 +++- gcc/config/loongarch/loongarch-opts.h | 2 + gcc/config/loongarch/loongarch.cc | 48 + gcc/config/loongarch/loongarch.md | 68 +++ gcc/config/loongarch/loongarch.opt| 14 .../gcc.target/loongarch/cmodel-extreme-1.c | 2 +- .../gcc.target/loongarch/cmodel-extreme-2.c | 2 +- .../explicit-relocs-auto-extreme-tls-desc.c | 10 +++ .../loongarch/explicit-relocs-auto-tls-desc.c | 10 +++ .../explicit-relocs-auto-tls-ld-gd.c | 2 +- .../explicit-relocs-extreme-tls-desc.c| 16 + ...icit-relocs-medium-call36-auto-tls-ld-gd.c | 2 +- .../loongarch/explicit-relocs-tls-desc.c | 13 .../gcc.target/loongarch/func-call-medium-1.c | 2 +- .../gcc.target/loongarch/func-call-medium-2.c | 2 +- .../gcc.target/loongarch/func-call-medium-3.c | 2 +- .../gcc.target/loongarch/func-call-medium-4.c | 2 +- .../gcc.target/loongarch/tls-extreme-macro.c
Re: [PATCH v3] LoongArch: Add support for TLS descriptors.
The patch is here: https://sourceware.org/pipermail/gcc-patches/2024-March/647578.html, first email was blocked by the server. 在 2024/3/11 下午4:21, mengqinggang 写道: Add support for TLS descriptors on normal code model and extreme code model. Normal code model instruction sequence: -mno-explicit-relocs: la.tls.desc$r4, s add.d $r12, $r4, $r2 -mexplicit-relocs: pcalau12i $r4,%desc_pc_hi20(s) addi.d $r4,$r4,%desc_pc_lo12(s) ld.d $r1,$r4,%desc_ld(s) jirl $r1,$r1,%desc_call(s)" add.d $r12, $r4, $r2 Extreme code model instruction sequence: -mno-explicit-relocs: la.tls.desc$r4, $r12, s add.d $r12, $r4, $r2 -mexplicit-relocs: pcalau12i $r4,%desc_pc_hi20(s) addi.d $r12,$r0,%desc_pc_lo12(s) lu32i.d$r12,%desc64_pc_lo20(s) lu52i.d$r12,$r12,%desc64_pc_hi12(s) add.d $r4,$r4,$r12 ld.d $r1,$r4,%desc_ld(s) jirl $r1,$r1,%desc_call(s) add.d $r12, $r4, $r2 The default is still traditional TLS model, but can be configured with --with-tls={trad,desc}. The default can change to TLS descriptors once libc and LLVM support this. gcc/ChangeLog: * config.gcc: Add --with-tls option to change TLS flavor. * config/loongarch/genopts/loongarch.opt.in: Add -mtls-dialect to configure TLS flavor. * config/loongarch/loongarch-def.h (struct loongarch_target): Add tls_dialect. * config/loongarch/loongarch-driver.cc (la_driver_init): Add tls flavor. * config/loongarch/loongarch-opts.cc (loongarch_init_target): Add tls_dialect. (loongarch_config_target): Ditto. (loongarch_update_gcc_opt_status): Ditto. * config/loongarch/loongarch-opts.h (loongarch_init_target):Ditto. (TARGET_TLS_DESC): New define. * config/loongarch/loongarch.cc (loongarch_symbol_insns): Add TLS DESC instructions sequence length. (loongarch_legitimize_tls_address): New TLS DESC instruction sequence. (loongarch_option_override_internal): Add la_opt_tls_dialect. (loongarch_option_restore): Add la_target.tls_dialect. * config/loongarch/loongarch.md (@got_load_tls_desc): Normal code model for TLS DESC. (got_load_tls_desc_off64): Extreme code model for TLS DESC. * config/loongarch/loongarch.opt: Regenerated. --- Changes v2 -> v3: - Set default to traditional TLS model. - Add support for -mexplicit-relocs and extreme code model. Changes v1 -> v2: - Clobber fcc0-fcc7 registers in got_load_tls_desc template. - Support --with-tls in configure. v2 link: https://sourceware.org/pipermail/gcc-patches/2024-February/646817.html v1 link: https://sourceware.org/pipermail/gcc-patches/2023-December/638907.html gcc/config.gcc| 19 +- gcc/config/loongarch/genopts/loongarch.opt.in | 14 gcc/config/loongarch/loongarch-def.h | 7 ++ gcc/config/loongarch/loongarch-driver.cc | 2 +- gcc/config/loongarch/loongarch-opts.cc| 12 +++- gcc/config/loongarch/loongarch-opts.h | 2 + gcc/config/loongarch/loongarch.cc | 48 + gcc/config/loongarch/loongarch.md | 68 +++ gcc/config/loongarch/loongarch.opt| 14 9 files changed, 170 insertions(+), 16 deletions(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index 624e0dae191..baebafdbf5d 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -4991,7 +4991,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 \ @@ -5249,6 +5249,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 @@ -5914,6 +5926,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
[PATCH v3] LoongArch: Add support for TLS descriptors.
Add support for TLS descriptors on normal code model and extreme code model. Normal code model instruction sequence: -mno-explicit-relocs: la.tls.desc $r4, s add.d $r12, $r4, $r2 -mexplicit-relocs: pcalau12i $r4,%desc_pc_hi20(s) addi.d $r4,$r4,%desc_pc_lo12(s) ld.d$r1,$r4,%desc_ld(s) jirl$r1,$r1,%desc_call(s)" add.d $r12, $r4, $r2 Extreme code model instruction sequence: -mno-explicit-relocs: la.tls.desc $r4, $r12, s add.d $r12, $r4, $r2 -mexplicit-relocs: pcalau12i $r4,%desc_pc_hi20(s) addi.d $r12,$r0,%desc_pc_lo12(s) lu32i.d $r12,%desc64_pc_lo20(s) lu52i.d $r12,$r12,%desc64_pc_hi12(s) add.d $r4,$r4,$r12 ld.d$r1,$r4,%desc_ld(s) jirl$r1,$r1,%desc_call(s) add.d $r12, $r4, $r2 The default is still traditional TLS model, but can be configured with --with-tls={trad,desc}. The default can change to TLS descriptors once libc and LLVM support this. gcc/ChangeLog: * config.gcc: Add --with-tls option to change TLS flavor. * config/loongarch/genopts/loongarch.opt.in: Add -mtls-dialect to configure TLS flavor. * config/loongarch/loongarch-def.h (struct loongarch_target): Add tls_dialect. * config/loongarch/loongarch-driver.cc (la_driver_init): Add tls flavor. * config/loongarch/loongarch-opts.cc (loongarch_init_target): Add tls_dialect. (loongarch_config_target): Ditto. (loongarch_update_gcc_opt_status): Ditto. * config/loongarch/loongarch-opts.h (loongarch_init_target):Ditto. (TARGET_TLS_DESC): New define. * config/loongarch/loongarch.cc (loongarch_symbol_insns): Add TLS DESC instructions sequence length. (loongarch_legitimize_tls_address): New TLS DESC instruction sequence. (loongarch_option_override_internal): Add la_opt_tls_dialect. (loongarch_option_restore): Add la_target.tls_dialect. * config/loongarch/loongarch.md (@got_load_tls_desc): Normal code model for TLS DESC. (got_load_tls_desc_off64): Extreme code model for TLS DESC. * config/loongarch/loongarch.opt: Regenerated. --- Changes v2 -> v3: - Set default to traditional TLS model. - Add support for -mexplicit-relocs and extreme code model. Changes v1 -> v2: - Clobber fcc0-fcc7 registers in got_load_tls_desc template. - Support --with-tls in configure. v2 link: https://sourceware.org/pipermail/gcc-patches/2024-February/646817.html v1 link: https://sourceware.org/pipermail/gcc-patches/2023-December/638907.html gcc/config.gcc| 19 +- gcc/config/loongarch/genopts/loongarch.opt.in | 14 gcc/config/loongarch/loongarch-def.h | 7 ++ gcc/config/loongarch/loongarch-driver.cc | 2 +- gcc/config/loongarch/loongarch-opts.cc| 12 +++- gcc/config/loongarch/loongarch-opts.h | 2 + gcc/config/loongarch/loongarch.cc | 48 + gcc/config/loongarch/loongarch.md | 68 +++ gcc/config/loongarch/loongarch.opt| 14 9 files changed, 170 insertions(+), 16 deletions(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index 624e0dae191..baebafdbf5d 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -4991,7 +4991,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 \ @@ -5249,6 +5249,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 @@ -5914,6 +5926,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 02f918053f5..7de107c3e3d 100644 --- a/gcc/config/loongarch
Re: [PATCH] LoongArch: Emit R_LARCH_RELAX for TLS IE with non-extreme code model to allow the IE to LE linker relaxation
Hi, Thanks, this patch is LGTM. 在 2024/3/7 上午10:56, Xi Ruoyao 写道: On Thu, 2024-03-07 at 10:43 +0800, mengqinggang wrote: Hi, Whether to add an option to control the generation of R_LARCH_RELAX, similar to as -mrelax/-mno-relax. There are already -mrelax and -mno-relax, they can be checked in the compiler code with TARGET_LINKER_RELAXATION. /* snip */ + case 'Q': + if (!TARGET_LINKER_RELAXATION) +break; So with -mno-relax we'll break early here, then no R_LARCH_RELAX will be printed. + if (code == HIGH) +op = XEXP (op, 0); + + if (loongarch_classify_symbolic_expression (op) == SYMBOL_TLS_IE) +fprintf (file, ".reloc\t.,R_LARCH_RELAX\n\t"); + + break; The tls-ie-norelax.c test case also checks for -mno-relax: +/* { dg-do compile } */ +/* { dg-options "-O2 -mcmodel=normal -mexplicit-relocs -mno-relax" } */ +/* { dg-final { scan-assembler-not "R_LARCH_RELAX" { target tls_native } } } */ i.e. -mno-relax is used compiling this test case, and the compiled assembly code should not contain R_LARCH_RELAX.
Re: [PATCH] LoongArch: Emit R_LARCH_RELAX for TLS IE with non-extreme code model to allow the IE to LE linker relaxation
Hi, Whether to add an option to control the generation of R_LARCH_RELAX, similar to as -mrelax/-mno-relax. 在 2024/2/29 下午3:11, Xi Ruoyao 写道: In Binutils we need to make IE to LE relaxation only allowed when there is an R_LARCH_RELAX after R_LARCH_TLE_IE_PC_{HI20,LO12} so an invalid "partial" relaxation won't happen with the extreme code model. So if we are emitting %ie_pc_{hi20,lo12} in a non-extreme code model, emit an R_LARCH_RELAX to allow the relaxation. The IE to LE relaxation does not require the pcalau12i and the ld instruction to be adjacent, so we don't need to limit ourselves to use the macro. For the distro maintainers backporting changes: this change depends on r14-8721, without r14-8721 R_LARCH_RELAX can be emitted mistakenly in the extreme code model. gcc/ChangeLog: * config/loongarch/loongarch.cc (loongarch_print_operand_reloc): Support 'Q' for R_LARCH_RELAX for TLS IE. (loongarch_output_move): Use 'Q' to print R_LARCH_RELAX for TLS IE. * config/loongarch/loongarch.md (ld_from_got): Likewise. gcc/testsuite/ChangeLog: * gcc.target/loongarch/tls-ie-relax.c: New test. * gcc.target/loongarch/tls-ie-norelax.c: New test. * gcc.target/loongarch/tls-ie-extreme.c: New test. --- Bootstrapped & regtested on loongarch64-linux-gnu. Ok for trunk? gcc/config/loongarch/loongarch.cc | 15 ++- gcc/config/loongarch/loongarch.md | 2 +- .../gcc.target/loongarch/tls-ie-extreme.c | 5 + .../gcc.target/loongarch/tls-ie-norelax.c | 5 + gcc/testsuite/gcc.target/loongarch/tls-ie-relax.c | 11 +++ 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/loongarch/tls-ie-extreme.c create mode 100644 gcc/testsuite/gcc.target/loongarch/tls-ie-norelax.c create mode 100644 gcc/testsuite/gcc.target/loongarch/tls-ie-relax.c diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 0428b6e65d5..70e31bb831c 100644 --- a/gcc/config/loongarch/loongarch.cc +++ b/gcc/config/loongarch/loongarch.cc @@ -4981,7 +4981,7 @@ loongarch_output_move (rtx dest, rtx src) if (type == SYMBOL_TLS_LE) return "lu12i.w\t%0,%h1"; else - return "pcalau12i\t%0,%h1"; + return "%Q1pcalau12i\t%0,%h1"; } if (src_code == CONST_INT) @@ -6145,6 +6145,7 @@ loongarch_print_operand_reloc (FILE *file, rtx op, bool hi64_part, 'L' Print the low-part relocation associated with OP. 'm'Print one less than CONST_INT OP in decimal. 'N'Print the inverse of the integer branch condition for comparison OP. + 'Q' Print R_LARCH_RELAX for TLS IE. 'r' Print address 12-31bit relocation associated with OP. 'R' Print address 32-51bit relocation associated with OP. 'T'Print 'f' for (eq:CC ...), 't' for (ne:CC ...), @@ -6282,6 +6283,18 @@ loongarch_print_operand (FILE *file, rtx op, int letter) letter); break; +case 'Q': + if (!TARGET_LINKER_RELAXATION) + break; + + if (code == HIGH) + op = XEXP (op, 0); + + if (loongarch_classify_symbolic_expression (op) == SYMBOL_TLS_IE) + fprintf (file, ".reloc\t.,R_LARCH_RELAX\n\t"); + + break; + case 'r': loongarch_print_operand_reloc (file, op, false /* hi64_part */, true /* lo_reloc */); diff --git a/gcc/config/loongarch/loongarch.md b/gcc/config/loongarch/loongarch.md index f3b5c641fce..525e1e82183 100644 --- a/gcc/config/loongarch/loongarch.md +++ b/gcc/config/loongarch/loongarch.md @@ -2620,7 +2620,7 @@ (define_insn "@ld_from_got" (match_operand:P 2 "symbolic_operand")))] UNSPEC_LOAD_FROM_GOT))] "" - "ld.\t%0,%1,%L2" + "%Q2ld.\t%0,%1,%L2" [(set_attr "type" "move")] ) diff --git a/gcc/testsuite/gcc.target/loongarch/tls-ie-extreme.c b/gcc/testsuite/gcc.target/loongarch/tls-ie-extreme.c new file mode 100644 index 000..00c545a3e8c --- /dev/null +++ b/gcc/testsuite/gcc.target/loongarch/tls-ie-extreme.c @@ -0,0 +1,5 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=loongarch64 -mabi=lp64d -mcmodel=extreme -mexplicit-relocs=auto -mrelax" } */ +/* { dg-final { scan-assembler-not "R_LARCH_RELAX" { target tls_native } } } */ + +#include "tls-ie-relax.c" diff --git a/gcc/testsuite/gcc.target/loongarch/tls-ie-norelax.c b/gcc/testsuite/gcc.target/loongarch/tls-ie-norelax.c new file mode 100644 index 000..dd6bf3634a4 --- /dev/null +++ b/gcc/testsuite/gcc.target/loongarch/tls-ie-norelax.c @@ -0,0 +1,5 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mcmodel=normal -mexplicit-relocs -mno-relax" } */ +/* { dg-final { scan-assembler-not "R_LARCH_RELAX" { target tls_native } } } */ + +#include "tls-ie-relax.c" diff --git a/gcc/testsuite/gcc.target/loongarch/tl
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.
[PATCH v2] LoongArch: Add support for TLS descriptors
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}. 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_TLS_LE, SYMBOL_TLSGD, SYMBOL_TLSLDM, + SYMBOL_TLS_DESC, }; -#define NUM_SYMBOL_TYPES (SYMBOL_TLSLDM + 1) +#define NUM_SYMBOL_TYPES (SYMBOL_TLS_DESC + 1) /* Routines implemented in loongarch.cc. */ extern rtx loongarch_emit_move (rtx, rtx); diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 0428b6e65d5..b4e43f1d037 100644 --- a/gcc/config/loongarch/loongarch.cc ++
Re: [PATCH] LoongArch: Add support for TLS descriptors
This is mainly for the convenience of testing, and we will consider the issues you mentioned. 在 2023/12/1 下午6:01, Xi Ruoyao 写道: On Fri, 2023-12-01 at 17:55 +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}. No, the default should be trad to be compatible with old Glibc and Binutils. Or you can check the value of --with-glibc-version=M.N and the GAS feature when GCC is configured to decide the default.
[PATCH] LoongArch: Add support for TLS descriptors
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}. 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. --- gcc/config.gcc| 16 ++- 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 | 9 gcc/config/loongarch/loongarch.md | 15 +++ gcc/config/loongarch/loongarch.opt| 14 ++ 8 files changed, 111 insertions(+), 11 deletions(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index 748430194f3..5b3120dff6d 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2545,6 +2545,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*) @@ -2557,6 +2558,7 @@ loongarch*-*-elf*) # For .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} ;; mips*-*-netbsd*) # NetBSD/mips, either endian. @@ -4986,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 \ @@ -5244,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 8af6cc6f532..4a2ae80f25b 100644 --- a/gcc/config/loongarch/genopts/loongarch.opt.in +++ b/gcc/config/loongarch/genopts/loongarch.opt.in @@ -254,3 +254,17 @@ default value is 4. ; CPUCFG independantly, so we use bit flags to specify them. Variable HOST_WIDE_INT 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 fa3773223bc..28cd08712f4 100644 --- a/gcc/config/loongarch/loongarch-opts.h +++ b/gcc/config/loongarch/loongarch-opts.h @@ -115,4 +115,10 @@ loongarch_update_gcc_opt_status (struct loongarch_target *target, #define HAVE_AS_TLS 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 cb8fc36b086..4b3f942da90 100644 --- a/gcc/config/loongarch/loongarch-protos.h +++ b/gcc/config/loongarch/loongarch-protos.h @@ -53,8 +53,9 @@ enum loongarch_symbol_type { SYMBOL_TLS_LE, SYMBOL_TLSGD, SYMBOL_TLSLDM, + SYMBOL_TLS_DESC, }; -#define NUM_SYMBOL_TYPES (SYMBOL_TLSLDM + 1) +#define NUM_SYMBOL_TYPES (SYMBOL_TLS_DESC + 1) /* Routines implement
[PATCH v3] Modify gas uleb128 support test
Some assemblers (GNU as for LoongArch) generates relocations for leb128 symbol arithmetic for relaxation, we need to disable relaxation probing leb128 support then. gcc/ChangeLog: * configure: Regenerate. * configure.ac: Checking assembler for -mno-relax support. Disable relaxation when probing leb128 support. co-authored-by: Xi Ruoyao --- gcc/configure| 42 +- gcc/configure.ac | 17 - 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/gcc/configure b/gcc/configure index d5e218e9a16..2ceab4e3b9c 100755 --- a/gcc/configure +++ b/gcc/configure @@ -24676,6 +24676,46 @@ _ACEOF +# Some assemblers (GNU as for LoongArch) generates relocations for +# leb128 symbol arithmetic for relaxation, we need to disable relaxation +# probing leb128 support then. +case $target in + loongarch*-*-*) +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for -mno-relax support" >&5 +$as_echo_n "checking assembler for -mno-relax support... " >&6; } +if ${gcc_cv_as_mno_relax+:} false; then : + $as_echo_n "(cached) " >&6 +else + gcc_cv_as_mno_relax=no + if test x$gcc_cv_as != x; then +$as_echo '.text' > conftest.s +if { ac_try='$gcc_cv_as $gcc_cv_as_flags -mno-relax -o conftest.o conftest.s >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then + gcc_cv_as_mno_relax=yes +else + echo "configure: failed program was" >&5 + cat conftest.s >&5 +fi +rm -f conftest.o conftest.s + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_mno_relax" >&5 +$as_echo "$gcc_cv_as_mno_relax" >&6; } +if test $gcc_cv_as_mno_relax = yes; then + check_leb128_asflags=-mno-relax +fi + +;; + *) +check_leb128_asflags= +;; +esac + # Check if we have .[us]leb128, and support symbol arithmetic with it. # Older versions of GAS and some non-GNU assemblers, have a bugs handling # these directives, even when they appear to accept them. @@ -24694,7 +24734,7 @@ L1: L2: .uleb128 0x8000 ' > conftest.s -if { ac_try='$gcc_cv_as $gcc_cv_as_flags -o conftest.o conftest.s >&5' +if { ac_try='$gcc_cv_as $gcc_cv_as_flags $check_leb128_asflags -o conftest.o conftest.s >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? diff --git a/gcc/configure.ac b/gcc/configure.ac index 019d0375a2f..d780ea25386 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -3229,10 +3229,25 @@ AC_MSG_RESULT($gcc_cv_ld_ro_rw_mix) gcc_AC_INITFINI_ARRAY +# Some assemblers (GNU as for LoongArch) generates relocations for +# leb128 symbol arithmetic for relaxation, we need to disable relaxation +# probing leb128 support then. +case $target in + loongarch*-*-*) +gcc_GAS_CHECK_FEATURE([-mno-relax support], + gcc_cv_as_mno_relax,[-mno-relax],[.text],, + [check_leb128_asflags=-mno-relax]) +;; + *) +check_leb128_asflags= +;; +esac + # Check if we have .[us]leb128, and support symbol arithmetic with it. # Older versions of GAS and some non-GNU assemblers, have a bugs handling # these directives, even when they appear to accept them. -gcc_GAS_CHECK_FEATURE([.sleb128 and .uleb128], gcc_cv_as_leb128,, +gcc_GAS_CHECK_FEATURE([.sleb128 and .uleb128], gcc_cv_as_leb128, +[$check_leb128_asflags], [ .data .uleb128 L2 - L1 L1: -- 2.31.1
[PATCH] LoongArch: Fix lo_sum rtx cost
The cost of lo_sum rtx for addi.d instruction my be a very big number if computed by common function. It may cause some symbols saving to stack and loading from stack if there no enough registers during loop optimization. gcc/ChangeLog: * config/loongarch/loongarch.cc (loongarch_rtx_costs): Add lo_sum cost. --- gcc/config/loongarch/loongarch.cc | 4 1 file changed, 4 insertions(+) diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc index 845fad5a8e8..0e57f09379c 100644 --- a/gcc/config/loongarch/loongarch.cc +++ b/gcc/config/loongarch/loongarch.cc @@ -3648,6 +3648,10 @@ loongarch_rtx_costs (rtx x, machine_mode mode, int outer_code, *total = COSTS_N_INSNS (4); return false; +case LO_SUM: + *total = set_src_cost (XEXP (x, 0), mode, speed); + return true; + case LT: case LTU: case LE: -- 2.36.0
[PATCH v2] Modify gas uleb128 support test
Some assemblers (GNU as for LoongArch) generates relocations for leb128 symbol arithmetic for relaxation, we need to disable relaxation probing leb128 support then. gcc/ChangeLog: * configure: Regenerate. * configure.ac: Checking assembler for -mno-relax support. Disable relaxation when probing leb128 support. co-authored-by: Xi Ruoyao --- gcc/configure| 35 ++- gcc/configure.ac | 10 +- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/gcc/configure b/gcc/configure index 07e8a64afbb..b1cc52a8041 100755 --- a/gcc/configure +++ b/gcc/configure @@ -24676,6 +24676,39 @@ _ACEOF +# Some assemblers (GNU as for LoongArch) generates relocations for +# leb128 symbol arithmetic for relaxation, we need to disable relaxation +# probing leb128 support then. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for -mno-relax support" >&5 +$as_echo_n "checking assembler for -mno-relax support... " >&6; } +if ${gcc_cv_as_mno_relax+:} false; then : + $as_echo_n "(cached) " >&6 +else + gcc_cv_as_mno_relax=no + if test x$gcc_cv_as != x; then +$as_echo '.text' > conftest.s +if { ac_try='$gcc_cv_as $gcc_cv_as_flags -mno-relax -o conftest.o conftest.s >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then + gcc_cv_as_mno_relax=yes +else + echo "configure: failed program was" >&5 + cat conftest.s >&5 +fi +rm -f conftest.o conftest.s + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_mno_relax" >&5 +$as_echo "$gcc_cv_as_mno_relax" >&6; } +if test $gcc_cv_as_mno_relax = yes; then + check_leb128_asflags=-mno-relax +fi + + # Check if we have .[us]leb128, and support symbol arithmetic with it. # Older versions of GAS and some non-GNU assemblers, have a bugs handling # these directives, even when they appear to accept them. @@ -24694,7 +24727,7 @@ L1: L2: .uleb128 0x8000 ' > conftest.s -if { ac_try='$gcc_cv_as $gcc_cv_as_flags -o conftest.o conftest.s >&5' +if { ac_try='$gcc_cv_as $gcc_cv_as_flags $check_leb128_asflags -o conftest.o conftest.s >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? diff --git a/gcc/configure.ac b/gcc/configure.ac index cb4be11facd..10027a4 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -3229,10 +3229,18 @@ AC_MSG_RESULT($gcc_cv_ld_ro_rw_mix) gcc_AC_INITFINI_ARRAY +# Some assemblers (GNU as for LoongArch) generates relocations for +# leb128 symbol arithmetic for relaxation, we need to disable relaxation +# probing leb128 support then. +gcc_GAS_CHECK_FEATURE([-mno-relax support], + gcc_cv_as_mno_relax,[-mno-relax],[.text],, + [check_leb128_asflags=-mno-relax]) + # Check if we have .[us]leb128, and support symbol arithmetic with it. # Older versions of GAS and some non-GNU assemblers, have a bugs handling # these directives, even when they appear to accept them. -gcc_GAS_CHECK_FEATURE([.sleb128 and .uleb128], gcc_cv_as_leb128,, +gcc_GAS_CHECK_FEATURE([.sleb128 and .uleb128], gcc_cv_as_leb128, +[$check_leb128_asflags], [ .data .uleb128 L2 - L1 L1: -- 2.36.0
Re: [PATCH] LoongArch: gcc: Modify gas uleb128 support test.
Thank you very much, we will send a new patch use this. 在 2023/9/14 下午8:09, Xi Ruoyao 写道: On Thu, 2023-09-14 at 19:54 +0800, chenglulu wrote: Sorry, it's my problem. We will modify it as soon as possible. Try this: diff --git a/gcc/configure.ac b/gcc/configure.ac index cb4be11facd..10027a4 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -3229,10 +3229,18 @@ AC_MSG_RESULT($gcc_cv_ld_ro_rw_mix) gcc_AC_INITFINI_ARRAY +# Some assemblers (GNU as for LoongArch) generates relocations for +# leb128 symbol arithmetic for relaxation, we need to disable relaxation +# probing leb128 support then. +gcc_GAS_CHECK_FEATURE([-mno-relax support], + gcc_cv_as_mno_relax,[-mno-relax],[.text],, + [check_leb128_asflags=-mno-relax]) + # Check if we have .[us]leb128, and support symbol arithmetic with it. # Older versions of GAS and some non-GNU assemblers, have a bugs handling # these directives, even when they appear to accept them. -gcc_GAS_CHECK_FEATURE([.sleb128 and .uleb128], gcc_cv_as_leb128,, +gcc_GAS_CHECK_FEATURE([.sleb128 and .uleb128], gcc_cv_as_leb128, +[$check_leb128_asflags], [ .data .uleb128 L2 - L1 L1: