From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 1A1D73858D20 for ; Tue, 2 Apr 2024 06:14:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1A1D73858D20 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1A1D73858D20 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=114.242.206.163 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712038472; cv=none; b=TGZLnpAOWWtpKSWta9lxCMptZPba6d7F32xRbOGqbj/65s9Ii6rPbyEzbtYzeXkWw1NN2fNpJMklYyJUPwLK07UIv0BN6TaDehnPfmLa1YAoAqKxl3UEgDqyvg6rpsUwo7C02TbPJHv5q+Sg6d/qASeuOp23JogRfjDxqR6vhR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712038472; c=relaxed/simple; bh=lLxFcxMucC7kF9qaq8/Z5b1kC1icB+FCCszej0EpHrA=; h=Subject:To:From:Message-ID:Date:MIME-Version; b=hd9OdqUatQ5xArRubhh7Vt3E/EFj55ymTbz25hIZGgry4Zl9tam+l07AOfKabzu2mBXTxl5VGY7ao23Jd5JxHs0nAUrzA/rDFjPmL5hEjd0TWEuLo4kIZA+0T/KMmdRGOpb+gNI6aUjPAeyWybAaT8RP3glVqOakkY7sXm+rHzc= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from loongson.cn (unknown [10.20.4.107]) by gateway (Coremail) with SMTP id _____8DxK+k5ogtm1zgiAA--.60575S3; Tue, 02 Apr 2024 14:14:18 +0800 (CST) Received: from [10.20.4.107] (unknown [10.20.4.107]) by localhost.localdomain (Coremail) with SMTP id AQAAf8Bx1xE1ogtmwopxAA--.12531S3; Tue, 02 Apr 2024 14:14:14 +0800 (CST) Subject: Re: [pushed][PATCH v5] LoongArch: Add support for TLS descriptors To: mengqinggang , gcc-patches@gcc.gnu.org Cc: xuchenghua@loongson.cn, cailulu@loongson.cn, xry111@xry111.site, i.swmail@xen0n.name, maskray@google.com, luweining@loongson.cn, wanglei@loongson.cn, hejinyang@loongson.cn References: <20240319015415.351293-1-mengqinggang@loongson.cn> From: chenglulu Message-ID: <87d5d6d3-9e1e-1674-61f5-2492ec8b57f3@loongson.cn> Date: Tue, 2 Apr 2024 14:14:13 +0800 User-Agent: Mozilla/5.0 (X11; Linux loongarch64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20240319015415.351293-1-mengqinggang@loongson.cn> Content-Type: text/plain; charset=gbk; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-CM-TRANSID:AQAAf8Bx1xE1ogtmwopxAA--.12531S3 X-CM-SenderInfo: xfkh0wpoxo3qxorr0wxvrqhubq/ X-Coremail-Antispam: 1Uk129KBj9fXoWftw13tr4ruw1xXrWUWr18Xrc_yoW5Zr4kJo ZYyF1qvw18Gr4Fkw47Krnxury8Kr92yw43Aa9avr1rGan2vr15u347Kwn3Zry3Jrnrtryr Z3srWFZrAryxJ3sxl-sFpf9Il3svdjkaLaAFLSUrUUUU1b8apTn2vfkv8UJUUUU8wcxFpf 9Il3svdxBIdaVrn0xqx4xG64xvF2IEw4CE5I8CrVC2j2Jv73VFW2AGmfu7bjvjm3AaLaJ3 UjIYCTnIWjp_UUUYA7kC6x804xWl14x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI 8IcIk0rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xG Y2AK021l84ACjcxK6xIIjxv20xvE14v26r1I6r4UM28EF7xvwVC0I7IYx2IY6xkF7I0E14 v26r1j6r4UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAF wI0_Gr1j6F4UJwAaw2AFwI0_Jrv_JF1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqjxCEc2 xF0cIa020Ex4CE44I27wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_ Jrv_JF1lYx0Ex4A2jsIE14v26r4j6F4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvEwI xGrwCYjI0SjxkI62AI1cAE67vIY487MxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY 6r1j6r4UMxCIbckI1I0E14v26r1Y6r17MI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7 xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUtVW8ZwCIc40Y0x0EwIxGrwCI42IY6xII jxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWUJVW8JwCI42IY6xAIw2 0EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x02 67AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7IU8TqcUUUUUU== X-Spam-Status: No, score=-9.5 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,KAM_SHORT,KAM_STOCKGEN,MIME_CHARSET_FARAWAY,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Pushed to r14-9742. Rebase to the latest, and modify invoke.texi to add a description of the TLS DESC compilation option. ÔÚ 2024/3/19 ÉÏÎç9:54, 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. > > 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-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 | 2 +- > .../gcc.target/loongarch/tls-gd-noplt.c | 2 +- > 23 files changed, 228 insertions(+), 26 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-extreme-tls-desc.c > create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-desc.c > create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-extreme-tls-desc.c > create mode 100644 gcc/testsuite/gcc.target/loongarch/explicit-relocs-tls-desc.c > > 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/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(int) > +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(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_UNSET, M_OPT_UNSET, > - 0, 0); > + M_OPT_UNSET, 0, 0); > return ""; > } > > diff --git a/gcc/config/loongarch/loongarch-opts.cc b/gcc/config/loongarch/loongarch-opts.cc > index 7eeac43ed2f..ec929aa7f29 100644 > --- a/gcc/config/loongarch/loongarch-opts.cc > +++ b/gcc/config/loongarch/loongarch-opts.cc > @@ -139,6 +139,7 @@ void > loongarch_init_target (struct loongarch_target *target, > int cpu_arch, int cpu_tune, int fpu, int simd, > int abi_base, int abi_ext, int cmodel, > + int tls_dialect, > HOST_WIDE_INT isa_evolution, > HOST_WIDE_INT isa_evolution_set) > { > @@ -153,6 +154,7 @@ loongarch_init_target (struct loongarch_target *target, > target->abi.base = abi_base; > target->abi.ext = abi_ext; > target->cmodel = cmodel; > + target->tls_dialect = tls_dialect; > } > > > @@ -174,7 +176,8 @@ loongarch_config_target (struct loongarch_target *target, > obstack_init (&msg_obstack); > > struct { > - int arch, tune, fpu, simd, abi_base, abi_ext, cmodel, abi_flt; > + int arch, tune, fpu, simd, abi_base, abi_ext, cmodel, > + tls_dialect, abi_flt; > } constrained = { > M_OPT_ABSENT (target->cpu_arch) ? 0 : 1, > M_OPT_ABSENT (target->cpu_tune) ? 0 : 1, > @@ -183,6 +186,7 @@ loongarch_config_target (struct loongarch_target *target, > M_OPT_ABSENT (target->abi.base) ? 0 : 1, > M_OPT_ABSENT (target->abi.ext) ? 0 : 1, > M_OPT_ABSENT (target->cmodel) ? 0 : 1, > + M_OPT_ABSENT (target->tls_dialect) ? 0 : 1, > M_OPT_ABSENT (target->abi.base) ? 0 : 1, > }; > > @@ -551,6 +555,9 @@ fallback: > gcc_unreachable (); > } > > + t.tls_dialect = constrained.tls_dialect ? target->tls_dialect > + : DEFAULT_TLS_TYPE; > + > /* Cleanup and return. */ > obstack_free (&msg_obstack, NULL); > *target = t; > @@ -786,6 +793,9 @@ loongarch_update_gcc_opt_status (struct loongarch_target *target, > /* status of -mcmodel */ > opts->x_la_opt_cmodel = target->cmodel; > > + /* status of -mtls-dialect */ > + opts->x_la_opt_tls_dialect = target->tls_dialect; > + > /* status of -mfpu */ > opts->x_la_opt_fpu = target->isa.fpu; > > diff --git a/gcc/config/loongarch/loongarch-opts.h b/gcc/config/loongarch/loongarch-opts.h > index 586e67e65ee..88e23fcee4b 100644 > --- a/gcc/config/loongarch/loongarch-opts.h > +++ b/gcc/config/loongarch/loongarch-opts.h > @@ -35,6 +35,7 @@ void > loongarch_init_target (struct loongarch_target *target, > int cpu_arch, int cpu_tune, int fpu, int simd, > int abi_base, int abi_ext, int cmodel, > + int tls_dialect, > HOST_WIDE_INT isa_evolutions, > HOST_WIDE_INT isa_evolutions_set); > > @@ -83,6 +84,7 @@ struct loongarch_flags { > #define TARGET_ABI_LP64 (la_target.abi.base == ABI_BASE_LP64D \ > || la_target.abi.base == ABI_BASE_LP64F \ > || la_target.abi.base == ABI_BASE_LP64S) > +#define TARGET_TLS_DESC (la_target.tls_dialect == TLS_DESCRIPTORS) > > #define ISA_HAS_LSX \ > (la_target.isa.simd == ISA_EXT_SIMD_LSX \ > diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc > index 70e31bb831c..1d7fa2ca3b1 100644 > --- a/gcc/config/loongarch/loongarch.cc > +++ b/gcc/config/loongarch/loongarch.cc > @@ -2028,7 +2028,7 @@ loongarch_symbol_insns (enum loongarch_symbol_type type, machine_mode mode) > > case SYMBOL_TLSGD: > case SYMBOL_TLSLDM: > - return 3; > + return TARGET_TLS_DESC ? 4 : 3; > > case SYMBOL_PCREL64: > return 5; > @@ -2930,24 +2930,43 @@ loongarch_call_tls_get_addr (rtx sym, enum loongarch_symbol_type type, rtx v0) > static rtx > loongarch_legitimize_tls_address (rtx loc) > { > - rtx dest, tp, tmp, tmp1, tmp2, tmp3; > + rtx dest, tp, tmp, tmp1, tmp2, tmp3, a0; > enum tls_model model = SYMBOL_REF_TLS_MODEL (loc); > rtx_insn *insn; > > switch (model) > { > case TLS_MODEL_LOCAL_DYNAMIC: > - tmp = gen_rtx_REG (Pmode, GP_RETURN); > - dest = gen_reg_rtx (Pmode); > - insn = loongarch_call_tls_get_addr (loc, SYMBOL_TLSLDM, tmp); > - emit_libcall_block (insn, dest, tmp, loc); > - break; > - > + if (!TARGET_TLS_DESC) > + { > + tmp = gen_rtx_REG (Pmode, GP_RETURN); > + dest = gen_reg_rtx (Pmode); > + insn = loongarch_call_tls_get_addr (loc, SYMBOL_TLSLDM, tmp); > + emit_libcall_block (insn, dest, tmp, loc); > + break; > + } > + /* Fall through. */ > case TLS_MODEL_GLOBAL_DYNAMIC: > - tmp = gen_rtx_REG (Pmode, GP_RETURN); > - dest = gen_reg_rtx (Pmode); > - insn = loongarch_call_tls_get_addr (loc, SYMBOL_TLSGD, tmp); > - emit_libcall_block (insn, dest, tmp, loc); > + if (TARGET_TLS_DESC) > + { > + a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST); > + dest = gen_reg_rtx (Pmode); > + tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM); > + > + if (TARGET_CMODEL_EXTREME) > + emit_insn (gen_got_load_tls_desc_off64 (loc, gen_reg_rtx (DImode))); > + else > + emit_insn (gen_got_load_tls_desc (Pmode, loc)); > + > + emit_insn (gen_add3_insn (dest, a0, tp)); > + } > + else > + { > + tmp = gen_rtx_REG (Pmode, GP_RETURN); > + dest = gen_reg_rtx (Pmode); > + insn = loongarch_call_tls_get_addr (loc, SYMBOL_TLSGD, tmp); > + emit_libcall_block (insn, dest, tmp, loc); > + } > break; > > case TLS_MODEL_INITIAL_EXEC: > @@ -7660,7 +7679,8 @@ loongarch_option_override_internal (struct gcc_options *opts, > loongarch_init_target (&la_target, > la_opt_cpu_arch, la_opt_cpu_tune, la_opt_fpu, > la_opt_simd, la_opt_abi_base, la_opt_abi_ext, > - la_opt_cmodel, opts->x_la_isa_evolution, > + la_opt_cmodel, la_opt_tls_dialect, > + opts->x_la_isa_evolution, > opts_set->x_la_isa_evolution); > > /* Handle target-specific options: compute defaults/conflicts etc. */ > @@ -7873,6 +7893,7 @@ loongarch_option_restore (struct gcc_options *, > la_target.isa.evolution = ptr->x_la_isa_evolution; > > la_target.cmodel = ptr->x_la_opt_cmodel; > + la_target.tls_dialect = ptr->x_la_opt_tls_dialect; > } > > /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */ > diff --git a/gcc/config/loongarch/loongarch.md b/gcc/config/loongarch/loongarch.md > index 525e1e82183..f4ff6f91311 100644 > --- a/gcc/config/loongarch/loongarch.md > +++ b/gcc/config/loongarch/loongarch.md > @@ -52,6 +52,8 @@ (define_c_enum "unspec" [ > > ;; TLS > UNSPEC_TLS > + UNSPEC_TLS_DESC > + UNSPEC_TLS_DESC_OFF64 > > ;; Stack tie > UNSPEC_TIE > @@ -127,6 +129,15 @@ (define_constants > (T1_REGNUM 13) > (S0_REGNUM 23) > > + (FCC0_REGNUM 64) > + (FCC1_REGNUM 65) > + (FCC2_REGNUM 66) > + (FCC3_REGNUM 67) > + (FCC4_REGNUM 68) > + (FCC5_REGNUM 69) > + (FCC6_REGNUM 70) > + (FCC7_REGNUM 71) > + > ;; Return path styles > (NORMAL_RETURN 0) > (SIBCALL_RETURN 1) > @@ -2760,6 +2771,63 @@ (define_insn "store_word" > > ;; Thread-Local Storage > > +(define_insn "@got_load_tls_desc" > + [(set (reg:P 4) > + (unspec:P > + [(match_operand:P 0 "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(%0)\n\t" > + "addi.d\t$r4,$r4,%%desc_pc_lo12(%0)\n\t" > + "ld.d\t$r1,$r4,%%desc_ld(%0)\n\t" > + "jirl\t$r1,$r1,%%desc_call(%0)" > + : "la.tls.desc\t$r4,%0"; > +} > + [(set_attr "got" "load") > + (set_attr "mode" "") > + (set_attr "length" "16")]) > + > +(define_insn "got_load_tls_desc_off64" > + [(set (reg:DI 4) > + (unspec:DI > + [(match_operand:DI 0 "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 1 "register_operand" "=&r"))] > + "TARGET_TLS_DESC && TARGET_CMODEL_EXTREME" > +{ > + return TARGET_EXPLICIT_RELOCS > + ? "pcalau12i\t$r4,%%desc_pc_hi20(%0)\n\t" > + "addi.d\t%1,$r0,%%desc_pc_lo12(%0)\n\t" > + "lu32i.d\t%1,%%desc64_pc_lo20(%0)\n\t" > + "lu52i.d\t%1,%1,%%desc64_pc_hi12(%0)\n\t" > + "add.d\t$r4,$r4,%1\n\t" > + "ld.d\t$r1,$r4,%%desc_ld(%0)\n\t" > + "jirl\t$r1,$r1,%%desc_call(%0)" > + : "la.tls.desc\t$r4,%1,%0"; > +} > + [(set_attr "got" "load") > + (set_attr "length" "28")]) > + > (define_insn "@load_tls" > [(set (match_operand:P 0 "register_operand" "=r") > (unspec:P > diff --git a/gcc/config/loongarch/loongarch.opt b/gcc/config/loongarch/loongarch.opt > index f10fcdd968c..1c54ab6ae43 100644 > --- a/gcc/config/loongarch/loongarch.opt > +++ b/gcc/config/loongarch/loongarch.opt > @@ -271,6 +271,20 @@ default value is 4. > TargetVariable > HOST_WIDE_INT la_isa_evolution = 0 > > +Enum > +Name(tls_type) Type(int) > +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(la_opt_tls_dialect) Init(M_OPT_UNSET) Save > +Specify TLS dialect. > + > mfrecipe > Target Mask(ISA_FRECIPE) Var(la_isa_evolution) > Support frecipe.{s/d} and frsqrte.{s/d} instructions. > diff --git a/gcc/testsuite/gcc.target/loongarch/cmodel-extreme-1.c b/gcc/testsuite/gcc.target/loongarch/cmodel-extreme-1.c > index 564ee4017f7..6269607e7df 100644 > --- a/gcc/testsuite/gcc.target/loongarch/cmodel-extreme-1.c > +++ b/gcc/testsuite/gcc.target/loongarch/cmodel-extreme-1.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-march=loongarch64 -mabi=lp64d -O2 -mcmodel=extreme -fno-plt -mexplicit-relocs=always -fdump-rtl-final" } */ > +/* { dg-options "-march=loongarch64 -mabi=lp64d -O2 -mcmodel=extreme -mtls-dialect=trad -fno-plt -mexplicit-relocs=always -fdump-rtl-final" } */ > > int a; > extern int b; > diff --git a/gcc/testsuite/gcc.target/loongarch/cmodel-extreme-2.c b/gcc/testsuite/gcc.target/loongarch/cmodel-extreme-2.c > index ce834805f38..35f6ee0bb30 100644 > --- a/gcc/testsuite/gcc.target/loongarch/cmodel-extreme-2.c > +++ b/gcc/testsuite/gcc.target/loongarch/cmodel-extreme-2.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-march=loongarch64 -mabi=lp64d -O2 -mcmodel=extreme -fno-plt -mexplicit-relocs=auto -fdump-rtl-final" } */ > +/* { dg-options "-march=loongarch64 -mabi=lp64d -O2 -mcmodel=extreme -mtls-dialect=trad -fno-plt -mexplicit-relocs=auto -fdump-rtl-final" } */ > > #include "cmodel-extreme-1.c" > > diff --git a/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-extreme-tls-desc.c b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-extreme-tls-desc.c > new file mode 100644 > index 00000000000..0fc7a1a5117 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-extreme-tls-desc.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fPIC -mcmodel=extreme -mexplicit-relocs=auto -mtls-dialect=desc" } */ > + > +__thread int a __attribute__((visibility("hidden"))); > +extern __thread int b __attribute__((visibility("default"))); > + > +int test() { return a + b; } > + > +/* { dg-final { scan-assembler "la\\.tls\\.desc\t\\\$r4,\\\$r12,\\.LANCHOR0" { target tls_native } } } */ > +/* { dg-final { scan-assembler "la\\.tls\\.desc\t\\\$r4,\\\$r12,\\.LANCHOR0" { target tls_native } } } */ > diff --git a/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-desc.c b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-desc.c > new file mode 100644 > index 00000000000..37947ecfdc8 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-desc.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fPIC -mexplicit-relocs=auto -mtls-dialect=desc" } */ > + > +__thread int a __attribute__((visibility("hidden"))); > +extern __thread int b __attribute__((visibility("default"))); > + > +int test() { return a + b; } > + > +/* { dg-final { scan-assembler "la\\.tls\\.desc\t\\\$r4,\\.LANCHOR0" { target tls_native } } } */ > +/* { dg-final { scan-assembler "la\\.tls\\.desc\t\\\$r4,\\.LANCHOR0" { target tls_native } } } */ > diff --git a/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-ld-gd.c b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-ld-gd.c > index ca55fcfc53e..b47e37c822c 100644 > --- a/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-ld-gd.c > +++ b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-auto-tls-ld-gd.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -fPIC -mexplicit-relocs=auto" } */ > +/* { dg-options "-O2 -fPIC -mexplicit-relocs=auto -mtls-dialect=trad" } */ > > __thread int a __attribute__((visibility("hidden"))); > extern __thread int b __attribute__((visibility("default"))); > diff --git a/gcc/testsuite/gcc.target/loongarch/explicit-relocs-extreme-tls-desc.c b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-extreme-tls-desc.c > new file mode 100644 > index 00000000000..3797556e1e6 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-extreme-tls-desc.c > @@ -0,0 +1,16 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fPIC -mexplicit-relocs -mtls-dialect=desc -mcmodel=extreme" } */ > + > +__thread int a __attribute__((visibility("hidden"))); > +extern __thread int b __attribute__((visibility("default"))); > + > +int test() { return a + b; } > + > +/* { dg-final { scan-assembler "pcalau12i\t\\\$r4,%desc_pc_hi20\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "addi.d\t\\\$r12,\\\$r0,%desc_pc_lo12\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "lu32i.d\t\\\$r12,%desc64_pc_lo20\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "lu52i.d\t\\\$r12,\\\$r12,%desc64_pc_hi12\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "add.d\t\\\$r4,\\\$r4,\\\$r12" { target tls_native } } } */ > +/* { dg-final { scan-assembler "ld.d\t\\\$r1,\\\$r4,%desc_ld\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "jirl\t\\\$r1,\\\$r1,%desc_call\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "add.d\t\\\$r12,\\\$r4,\\\$r2" { target tls_native } } } */ > diff --git a/gcc/testsuite/gcc.target/loongarch/explicit-relocs-medium-call36-auto-tls-ld-gd.c b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-medium-call36-auto-tls-ld-gd.c > index d1a4820834c..cfb8553236a 100644 > --- a/gcc/testsuite/gcc.target/loongarch/explicit-relocs-medium-call36-auto-tls-ld-gd.c > +++ b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-medium-call36-auto-tls-ld-gd.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -fPIC -mexplicit-relocs=auto -mcmodel=medium -fplt" } */ > +/* { dg-options "-O2 -fPIC -mexplicit-relocs=auto -mtls-dialect=trad -mcmodel=medium -fplt" } */ > /* { dg-final { scan-assembler "pcaddu18i\t\\\$r1,%call36\\\(__tls_get_addr\\\)" { target { tls_native && loongarch_call36_support } } } } */ > > #include "./explicit-relocs-auto-tls-ld-gd.c" > diff --git a/gcc/testsuite/gcc.target/loongarch/explicit-relocs-tls-desc.c b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-tls-desc.c > new file mode 100644 > index 00000000000..f6690309156 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/loongarch/explicit-relocs-tls-desc.c > @@ -0,0 +1,13 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fPIC -mexplicit-relocs -mtls-dialect=desc" } */ > + > +__thread int a __attribute__((visibility("hidden"))); > +extern __thread int b __attribute__((visibility("default"))); > + > +int test() { return a + b; } > + > +/* { dg-final { scan-assembler "pcalau12i\t\\\$r4,%desc_pc_hi20\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "addi.d\t\\\$r4,\\\$r4,%desc_pc_lo12\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "ld.d\t\\\$r1,\\\$r4,%desc_ld\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "jirl\t\\\$r1,\\\$r1,%desc_call\\\(\\.LANCHOR0\\\)" { target tls_native } } } */ > +/* { dg-final { scan-assembler "add.d\t\\\$r12,\\\$r4,\\\$r2" { target tls_native } } } */ > diff --git a/gcc/testsuite/gcc.target/loongarch/func-call-medium-1.c b/gcc/testsuite/gcc.target/loongarch/func-call-medium-1.c > index 6339e832fe5..5e81df55207 100644 > --- a/gcc/testsuite/gcc.target/loongarch/func-call-medium-1.c > +++ b/gcc/testsuite/gcc.target/loongarch/func-call-medium-1.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-mabi=lp64d -O0 -fpic -fplt -mno-explicit-relocs -mcmodel=medium" } */ > +/* { dg-options "-mabi=lp64d -O0 -fpic -fplt -mno-explicit-relocs -mtls-dialect=trad -mcmodel=medium" } */ > /* { dg-final { scan-assembler "test:.*la\.global\t.*g\n\tjirl" } } */ > /* { dg-final { scan-assembler "test1:.*la\.global\t.*f\n\tjirl" } } */ > /* { dg-final { scan-assembler "test2:.*la\.local\t.*l\n\tjirl" } } */ > diff --git a/gcc/testsuite/gcc.target/loongarch/func-call-medium-2.c b/gcc/testsuite/gcc.target/loongarch/func-call-medium-2.c > index a53e75e0bf9..d73df2dd8c2 100644 > --- a/gcc/testsuite/gcc.target/loongarch/func-call-medium-2.c > +++ b/gcc/testsuite/gcc.target/loongarch/func-call-medium-2.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-mabi=lp64d -O0 -fno-pic -fplt -mno-explicit-relocs -mcmodel=medium" } */ > +/* { dg-options "-mabi=lp64d -O0 -fno-pic -fplt -mno-explicit-relocs -mtls-dialect=trad -mcmodel=medium" } */ > /* { dg-final { scan-assembler "test:.*la\.global\t.*g\n\tjirl" } } */ > /* { dg-final { scan-assembler "test1:.*la\.local\t.*f\n\tjirl" } } */ > /* { dg-final { scan-assembler "test2:.*la\.local\t.*l\n\tjirl" } } */ > diff --git a/gcc/testsuite/gcc.target/loongarch/func-call-medium-3.c b/gcc/testsuite/gcc.target/loongarch/func-call-medium-3.c > index 0da7bf98e3c..88a66745070 100644 > --- a/gcc/testsuite/gcc.target/loongarch/func-call-medium-3.c > +++ b/gcc/testsuite/gcc.target/loongarch/func-call-medium-3.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-mabi=lp64d -O0 -fpic -fno-plt -mno-explicit-relocs -mcmodel=medium" } */ > +/* { dg-options "-mabi=lp64d -O0 -fpic -fno-plt -mno-explicit-relocs -mtls-dialect=trad -mcmodel=medium" } */ > /* { dg-final { scan-assembler "test:.*la\.global\t.*g\n\tjirl" } } */ > /* { dg-final { scan-assembler "test1:.*la\.global\t.*f\n\tjirl" } } */ > /* { dg-final { scan-assembler "test2:.*la\.local\t.*l\n\tjirl" } } */ > diff --git a/gcc/testsuite/gcc.target/loongarch/func-call-medium-4.c b/gcc/testsuite/gcc.target/loongarch/func-call-medium-4.c > index 0219688ae80..f9dc12feaf5 100644 > --- a/gcc/testsuite/gcc.target/loongarch/func-call-medium-4.c > +++ b/gcc/testsuite/gcc.target/loongarch/func-call-medium-4.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-mabi=lp64d -O0 -fno-pic -fno-plt -mno-explicit-relocs -mcmodel=medium" } */ > +/* { dg-options "-mabi=lp64d -O0 -fno-pic -fno-plt -mno-explicit-relocs -mtls-dialect=trad -mcmodel=medium" } */ > /* { dg-final { scan-assembler "test:.*la\.global\t.*g\n\tjirl" } } */ > /* { dg-final { scan-assembler "test1:.*la\.local\t.*f\n\tjirl" } } */ > /* { dg-final { scan-assembler "test2:.*la\.local\t.*l\n\tjirl" } } */ > diff --git a/gcc/testsuite/gcc.target/loongarch/tls-extreme-macro.c b/gcc/testsuite/gcc.target/loongarch/tls-extreme-macro.c > index 4341f82129c..4adda4202fd 100644 > --- a/gcc/testsuite/gcc.target/loongarch/tls-extreme-macro.c > +++ b/gcc/testsuite/gcc.target/loongarch/tls-extreme-macro.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-march=loongarch64 -mabi=lp64d -O2 -mcmodel=extreme -fno-plt -mexplicit-relocs=none" } */ > +/* { dg-options "-march=loongarch64 -mabi=lp64d -O2 -mcmodel=extreme -mtls-dialect=trad -fno-plt -mexplicit-relocs=none" } */ > /* { dg-final { scan-assembler "test_le:.*la.tls.le\t\\\$r\[0-9\]+,\\\.L" { target tls_native } } } */ > /* { dg-final { scan-assembler "test_ie:.*la.tls.ie\t\\\$r\[0-9\]+,\\\$r\[0-9\]+,\\\.L" { target tls_native } } } */ > /* { dg-final { scan-assembler "test_ld:.*la.tls.ld\t\\\$r\[0-9\]+,\\\$r\[0-9\]+,\\\.L.*la.global\t\\\$r\[0-9\]+,\\\$r\[0-9\]+,__tls_get_addr" { target tls_native } } } */ > diff --git a/gcc/testsuite/gcc.target/loongarch/tls-gd-noplt.c b/gcc/testsuite/gcc.target/loongarch/tls-gd-noplt.c > index 9432c477e9d..dfa1bf53c92 100644 > --- a/gcc/testsuite/gcc.target/loongarch/tls-gd-noplt.c > +++ b/gcc/testsuite/gcc.target/loongarch/tls-gd-noplt.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O0 -fno-plt -mcmodel=normal -mexplicit-relocs" } */ > +/* { dg-options "-O0 -fno-plt -mcmodel=normal -mtls-dialect=trad -mexplicit-relocs" } */ > /* { dg-final { scan-assembler "pcalau12i\t.*%got_pc_hi20\\(__tls_get_addr\\)\n\tld\.d.*%got_pc_lo12\\(__tls_get_addr\\)" { target tls_native } } } */ > > __attribute__ ((tls_model ("global-dynamic"))) __thread int a;