From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oa1-x36.google.com (mail-oa1-x36.google.com [IPv6:2001:4860:4864:20::36]) by sourceware.org (Postfix) with ESMTPS id 991133858D35 for ; Tue, 21 Nov 2023 07:08:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 991133858D35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 991133858D35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:4860:4864:20::36 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700550486; cv=none; b=ZCYl5+x1yHZ20eITVK5Pxz5UURCZzZhcfX2k4o9L2pgf5d25ZNNwArddNhIkCSjC5nWCfkJPNHaK47UUBkPiicP3bXY+BiQ/8lJShjG6c3q7EGy07MEqukM/H+GxVHow7WqG3ygSuzjuNsmPwdiXzfPYuKyaEJFx8ge/eLBUp2Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700550486; c=relaxed/simple; bh=dwAJnibVm8WrYtr+PZ5FmScqJn3oPoncTYZGbu81YgA=; h=DKIM-Signature:From:Message-Id:Mime-Version:Subject:Date:To; b=ILQwUMN4xyZCLPTMnHg1bSa1R5zMrZyEvKwNx91TTii947af8+nk6jL0B2jYZAVVcrMNakLVXFtYwpoVrVjGHGEXckfwQ1BmrtAtY96eYZqkT8OV0BBauAjtXR8MFzuLvQmUYLZa5YkBzU82ioff83rfvm/utgpkJQJiSZ5VkrE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-oa1-x36.google.com with SMTP id 586e51a60fabf-1f93e8b0b94so156167fac.0 for ; Mon, 20 Nov 2023 23:08:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1700550482; x=1701155282; darn=gcc.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=QysTt3WbeXsx44E9rL6m1yve6nzxriwkHjuZy5Fqsk4=; b=VoVheLKVPa5kGUBpRyCoWa2MfaBw1R3K296oESIpwJyApwq7ipfy1vg3r9LCmRwkX0 RwSxGjbkmATPS2WO818ipNfFglxhcUxIxFYU2mkcw/mQxnM58lPXTY6FgvqFs9zgvRdk 2eQima8uMT7achuD8FFu6brmcaRrKiJ7CuEh4hAvaOqJRjmFVmOhG0D8spKAjKIcUlHy YgTpXuDWX0I5T0Ml+zDKohha1BJXmTaewrUY5Q5ovTBzVAxXGDC//a3t1BxnvzKgdWxw wL5T53JOqBSM9JvSj8rB+UysKRLoNhdjBm3Fg4a7VOLr5oWxoFENvLRpKwokh+Rpv40x h3kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700550482; x=1701155282; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=QysTt3WbeXsx44E9rL6m1yve6nzxriwkHjuZy5Fqsk4=; b=ieGIiFd7z7Vxp38illQ5Iu8qlVQIE15MAELNnrGIxbQ9BY091VC3/n2adNz5xhCFUp 7UIx8RpZTorwZYrFqzu7Jc9tvkArVbPdrDONSz7+MiQv2aQ+qdVPr2CZChqeOz9Omg8T GXn3UQsxgMI8WtfRrpU5TPoebiFf9MWgllFmMlCqmRuXFq5pD4Mr+/HFqro3ZSK8XAHg TD9jE4oa7qmYAh2Fcx9NKjsXLQ3BFtZJICfH6PAE/28wPmj7NGGUBh5ytnW/IZgZtufR 0DpPjE8q7p3a2H2pEVi+Lt3Pefir99BRgeCisTtnn+VTgCYi3wtH4QId0RJS1QCOnjxB Iy/A== X-Gm-Message-State: AOJu0YzwsP9DOJuUwhwUkVkl+TfmdulBGcHARJGQgzY0255Vg8PgREUY irHRx/lfQtlNTbfV/iJD074= X-Google-Smtp-Source: AGHT+IF6hca49b5P7tolEnVgft34MxIah3rUUf2EN3BJ67dmFqWBGl0JvKvQEdIVI9d1YpaTNtONBw== X-Received: by 2002:a05:6871:2415:b0:1ef:9c80:8a62 with SMTP id sh21-20020a056871241500b001ef9c808a62mr7861654oab.1.1700550481609; Mon, 20 Nov 2023 23:08:01 -0800 (PST) Received: from smtpclient.apple (zz20184013906F627101.userreverse.dion.ne.jp. [111.98.113.1]) by smtp.gmail.com with ESMTPSA id u15-20020a056a00124f00b006cb94e20011sm3278688pfi.18.2023.11.20.23.07.59 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 Nov 2023 23:08:00 -0800 (PST) From: Tatsuyuki Ishi Message-Id: Content-Type: multipart/alternative; boundary="Apple-Mail=_BB2CD2D1-4711-4822-A5DB-F3E463BEF64F" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3774.200.91.1.1\)) Subject: Re: [PATCH v3] RISC-V: Implement TLS Descriptors. Date: Tue, 21 Nov 2023 16:07:47 +0900 In-Reply-To: Cc: gcc-patches@gcc.gnu.org, Rui Ueyama , Rui Ueyama , Kito Cheng , Jeff Law To: Fangrui Song References: <20230817181308.122802-2-ishitatsuyuki@gmail.com> <20231120131726.52280-1-ishitatsuyuki@gmail.com> X-Mailer: Apple Mail (2.3774.200.91.1.1) X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,HTML_MESSAGE,KAM_SHORT,KAM_STOCKGEN,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE 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: --Apple-Mail=_BB2CD2D1-4711-4822-A5DB-F3E463BEF64F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Nov 21, 2023, at 15:59, Fangrui Song wrote: >=20 > On Mon, Nov 20, 2023 at 6:20=E2=80=AFAM Tatsuyuki Ishi > wrote: >>=20 >> This implements TLS Descriptors (TLSDESC) as specified in [1]. >>=20 >> The 4-instruction sequence is implemented as a single RTX insn for >> simplicity, but this can be revisited later if instruction scheduling or >> more flexible RA is desired. >>=20 >> The default remains to be the traditional TLS model, but can be configur= ed >> with --with_tls=3D{trad,desc}. The choice can be revisited once toolchain >> and libc support ships. >>=20 >> [1]: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/373. >>=20 >> gcc/Changelog: >> * config/riscv/riscv.opt: Add -mtls-dialect to configure TLS flav= or. >> * config.gcc: Add --with_tls configuration option to change the >> default TLS flavor. >> * config/riscv/riscv.h: Add TARGET_TLSDESC determined from >> -mtls-dialect and with_tls defaults. >> * config/riscv/riscv-opts.h: Define enum riscv_tls_type for the >> two TLS flavors. >> * config/riscv/riscv-protos.h: Define SYMBOL_TLSDESC symbol type. >> * config/riscv/riscv.md: Add instruction sequence for TLSDESC. >> * config/riscv/riscv.cc (riscv_symbol_insns): Add instruction >> sequence length data for TLSDESC. >> (riscv_legitimize_tls_address): Add lowering of TLSDESC. >> * doc/install.texi: Document --with-tls for RISC-V. >> * doc/invoke.texi: Document --mtls-dialect for RISC-V. >=20 > Nit: One dash for --mtls-dialect. Ack. Thanks. >> --- >> No regression in gcc tests for rv64gc, tested alongside the binutils and >> glibc implementation. Tested with --with_tls=3Ddesc. >>=20 >> v2: Add with_tls configuration option, and a few readability improvement= s. >> Added Changelog. >> v3: Add documentation per Kito's suggestion. >> Fix minor issues pointed out by Kito and Jeff. >> Thanks Kito Cheng and Jeff Law for review. >>=20 >> I've considered gating this behind a GAS feature test, but it seems >> nontrivial especially for restricting the variants available at runtime. >> Since TLS descriptors is not selected by default, I've decided to leave = it >> ungated. >>=20 >> In other news, I have made some progress on binutils side, and I'll try = to >> update the GAS / ld patch set with relaxation included, by the end of th= is >> month. >=20 > Thanks for the update. I understand the complexity adding a runtime > test when the feature also requires binutils and rtld support. > I hope that we add a test checking assembly under > gcc/testsuite/gcc.target/riscv/tls , otherwise as a non-default test, > when this breaks, it may be difficult to figure it out. > (glibc/elf/tst-* will need a runtime test, but GCC needs to have its own.) Checking assembly sounds reasonable. I=E2=80=99ll look into it after finis= hing the binutils stuff. >> gcc/config.gcc | 15 ++++++++++++++- >> gcc/config/riscv/riscv-opts.h | 6 ++++++ >> gcc/config/riscv/riscv-protos.h | 5 +++-- >> gcc/config/riscv/riscv.cc | 24 ++++++++++++++++++++---- >> gcc/config/riscv/riscv.h | 9 +++++++-- >> gcc/config/riscv/riscv.md | 21 ++++++++++++++++++++- >> gcc/config/riscv/riscv.opt | 14 ++++++++++++++ >> gcc/doc/install.texi | 3 +++ >> gcc/doc/invoke.texi | 13 ++++++++++++- >> 9 files changed, 99 insertions(+), 11 deletions(-) >>=20 >> diff --git a/gcc/config.gcc b/gcc/config.gcc >> index 415e0e1ebc5..2c1a7179b02 100644 >> --- a/gcc/config.gcc >> +++ b/gcc/config.gcc >> @@ -2434,6 +2434,7 @@ riscv*-*-linux*) >> # Force .init_array support. The configure script cannot always >> # automatically detect that GAS supports it, yet we require it. >> gcc_cv_initfini_array=3Dyes >> + with_tls=3D${with_tls:-trad} >> ;; >> riscv*-*-elf* | riscv*-*-rtems*) >> tm_file=3D"elfos.h newlib-stdint.h ${tm_file} riscv/elf.h" >> @@ -2476,6 +2477,7 @@ riscv*-*-freebsd*) >> # Force .init_array support. The configure script cannot always >> # automatically detect that GAS supports it, yet we require it. >> gcc_cv_initfini_array=3Dyes >> + with_tls=3D${with_tls:-trad} >> ;; >>=20 >> loongarch*-*-linux*) >> @@ -4566,7 +4568,7 @@ case "${target}" in >> ;; >>=20 >> riscv*-*-*) >> - supported_defaults=3D"abi arch tune riscv_attribute isa_= spec" >> + supported_defaults=3D"abi arch tune riscv_attribute isa_= spec tls" >>=20 >> case "${target}" in >> riscv-* | riscv32*) xlen=3D32 ;; >> @@ -4694,6 +4696,17 @@ case "${target}" in >> ;; >> esac >> fi >> + # Handle --with-tls. >> + case "$with_tls" in >> + "" \ >> + | trad | desc) >> + # OK >> + ;; >> + *) >> + echo "Unknown TLS method used in --with-tls=3D$w= ith_tls" 1>&2 >> + exit 1 >> + ;; >> + esac >>=20 >> # Handle --with-multilib-list. >> if test "x${with_multilib_list}" !=3D xdefault; then >> diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts= .h >> index 378a17699cd..db03f35430a 100644 >> --- a/gcc/config/riscv/riscv-opts.h >> +++ b/gcc/config/riscv/riscv-opts.h >> @@ -319,4 +319,10 @@ enum riscv_entity >> #define TARGET_VECTOR_VLS = \ >> (TARGET_VECTOR && riscv_autovec_preference =3D=3D RVV_SCALABLE) >>=20 >> +/* TLS types. */ >> +enum riscv_tls_type { >> + TLS_TRADITIONAL, >> + TLS_DESCRIPTORS >> +}; >> + >=20 > I wonder whether `enum class` can be used instead and we can get rid > of the `TLS_` prefix. > gcc/config/ already has some uses. Sounds reasonable. If others have no objections I=E2=80=99ll put it in a re= vision. >> #endif /* ! GCC_RISCV_OPTS_H */ >> diff --git a/gcc/config/riscv/riscv-protos.h b/gcc/config/riscv/riscv-pr= otos.h >> index 472c00dc439..9b7471f7591 100644 >> --- a/gcc/config/riscv/riscv-protos.h >> +++ b/gcc/config/riscv/riscv-protos.h >> @@ -33,9 +33,10 @@ enum riscv_symbol_type { >> SYMBOL_TLS, >> SYMBOL_TLS_LE, >> SYMBOL_TLS_IE, >> - SYMBOL_TLS_GD >> + SYMBOL_TLS_GD, >> + SYMBOL_TLSDESC, >> }; >> -#define NUM_SYMBOL_TYPES (SYMBOL_TLS_GD + 1) >> +#define NUM_SYMBOL_TYPES (SYMBOL_TLSDESC + 1) >>=20 >> /* Classifies an address. >>=20 >> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc >> index 49062bef9fc..c158e224aaa 100644 >> --- a/gcc/config/riscv/riscv.cc >> +++ b/gcc/config/riscv/riscv.cc >> @@ -799,6 +799,7 @@ static int riscv_symbol_insns (enum riscv_symbol_typ= e type) >> case SYMBOL_ABSOLUTE: return 2; /* LUI + the reference. */ >> case SYMBOL_PCREL: return 2; /* AUIPC + the reference. */ >> case SYMBOL_TLS_LE: return 3; /* LUI + ADD TP + the reference. */ >> + case SYMBOL_TLSDESC: return 6; /* 4-instruction call + ADD TP + the= reference. */ >> case SYMBOL_GOT_DISP: return 3; /* AUIPC + LD GOT + the reference. = */ >> default: gcc_unreachable (); >> } >> @@ -1734,7 +1735,7 @@ riscv_call_tls_get_addr (rtx sym, rtx result) >> static rtx >> riscv_legitimize_tls_address (rtx loc) >> { >> - rtx dest, tp, tmp; >> + rtx dest, tp, tmp, a0; >> enum tls_model model =3D SYMBOL_REF_TLS_MODEL (loc); >>=20 >> #if 0 >> @@ -1750,9 +1751,24 @@ riscv_legitimize_tls_address (rtx loc) >> /* Rely on section anchors for the optimization that LDM TLS >> provides. The anchor's address is loaded with GD TLS. */ >> case TLS_MODEL_GLOBAL_DYNAMIC: >> - tmp =3D gen_rtx_REG (Pmode, GP_RETURN); >> - dest =3D gen_reg_rtx (Pmode); >> - emit_libcall_block (riscv_call_tls_get_addr (loc, tmp), dest, tmp= , loc); >> + if (TARGET_TLSDESC) >> + { >> + static unsigned seqno; >> + tp =3D gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM); >> + a0 =3D gen_rtx_REG (Pmode, GP_ARG_FIRST); >> + dest =3D gen_reg_rtx (Pmode); >> + >> + emit_insn (gen_tlsdesc (Pmode, loc, GEN_INT (seqno))); >> + emit_insn (gen_add3_insn (dest, a0, tp)); >> + seqno++; >> + } >> + else >> + { >> + tmp =3D gen_rtx_REG (Pmode, GP_RETURN); >> + dest =3D gen_reg_rtx (Pmode); >> + emit_libcall_block (riscv_call_tls_get_addr (loc, tmp), dest, = tmp, >> + loc); >> + } >> break; >>=20 >> case TLS_MODEL_INITIAL_EXEC: >> diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h >> index e18a0081297..faea78f5f4c 100644 >> --- a/gcc/config/riscv/riscv.h >> +++ b/gcc/config/riscv/riscv.h >> @@ -59,6 +59,7 @@ extern const char *riscv_multi_lib_check (int argc, co= nst char **argv); >> --with-abi is ignored if -mabi is specified. >> --with-tune is ignored if -mtune or -mcpu is specified. >> --with-isa-spec is ignored if -misa-spec is specified. >> + --with-tls is ignored if -mtls-dialect is specified. >>=20 >> But using default -march/-mtune value if -mcpu don't have valid optio= n. */ >> #define OPTION_DEFAULT_SPECS \ >> @@ -68,8 +69,9 @@ extern const char *riscv_multi_lib_check (int argc, co= nst char **argv); >> {"arch", "%{!march=3D*:" = \ >> " %{!mcpu=3D*:-march=3D%(VALUE)}" = \ >> " %{mcpu=3D*:%:riscv_expand_arch_from_cpu(%* %(VALUE))}}" }, = \ >> - {"abi", "%{!mabi=3D*:-mabi=3D%(VALUE)}" }, \ >> - {"isa_spec", "%{!misa-spec=3D*:-misa-spec=3D%(VALUE)}" }, \ >> + {"abi", "%{!mabi=3D*:-mabi=3D%(VALUE)}" }, = \ >> + {"isa_spec", "%{!misa-spec=3D*:-misa-spec=3D%(VALUE)}" }, = \ >> + {"tls", "%{!mtls-dialect=3D*:-mtls-dialect=3D%(VALUE)}"}, = \ >>=20 >> #ifdef IN_LIBGCC2 >> #undef TARGET_64BIT >> @@ -1122,4 +1124,7 @@ extern void riscv_remove_unneeded_save_restore_cal= ls (void); >> #define OPTIMIZE_MODE_SWITCHING(ENTITY) (TARGET_VECTOR) >> #define NUM_MODES_FOR_MODE_SWITCHING {VXRM_MODE_NONE, riscv_vector::FRM_= NONE} >>=20 >> +/* Check TLS Descriptors mechanism is selected. */ >> +#define TARGET_TLSDESC (riscv_tls_dialect =3D=3D TLS_DESCRIPTORS) >> + >> #endif /* ! GCC_RISCV_H */ >> diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md >> index b456fa6abb3..7c66c64b893 100644 >> --- a/gcc/config/riscv/riscv.md >> +++ b/gcc/config/riscv/riscv.md >> @@ -47,7 +47,7 @@ >> UNSPEC_TLS_LE >> UNSPEC_TLS_IE >> UNSPEC_TLS_GD >> - >> + UNSPEC_TLSDESC >> ;; High part of PC-relative address. >> UNSPEC_AUIPC >>=20 >> @@ -121,6 +121,7 @@ >> (T1_REGNUM 6) >> (S0_REGNUM 8) >> (S1_REGNUM 9) >> + (A0_REGNUM 10) >> (S2_REGNUM 18) >> (S3_REGNUM 19) >> (S4_REGNUM 20) >> @@ -1869,6 +1870,24 @@ >> [(set_attr "got" "load") >> (set_attr "mode" "")]) >>=20 >> +(define_insn "@tlsdesc" >> + [(set (reg:P A0_REGNUM) >> + (unspec:P >> + [(match_operand:P 0 "symbolic_operand" "") >> + (match_operand:P 1 "const_int_operand")] >> + UNSPEC_TLSDESC)) >> + (clobber (reg:P T0_REGNUM))] >> + "TARGET_TLSDESC" >> + { >> + return ".LT%1: auipc\ta0, %%tlsdesc_hi(%0)\;" >> + "\tt0,%%tlsdesc_load_lo(.LT%1)(a0)\;" >> + "addi\ta0,a0,%%tlsdesc_add_lo(.LT%1)\;" >> + "jalr\tt0,t0,%%tlsdesc_call(.LT%1)"; >> + } >> + [(set_attr "type" "multi") >> + (set_attr "length" "16") >> + (set_attr "mode" "")]) >> + >> (define_insn "auipc" >> [(set (match_operand:P 0 "register_operand" "=3Dr") >> (unspec:P >> diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt >> index 6304efebfd5..9ba690f8497 100644 >> --- a/gcc/config/riscv/riscv.opt >> +++ b/gcc/config/riscv/riscv.opt >> @@ -311,3 +311,17 @@ Enum(riscv_autovec_lmul) String(m8) Value(RVV_M8) >> -param=3Driscv-autovec-lmul=3D >> Target RejectNegative Joined Enum(riscv_autovec_lmul) Var(riscv_autovec_= lmul) Init(RVV_M1) >> -param=3Driscv-autovec-lmul=3D Set the RVV LMUL of auto-vect= orization in the RISC-V port. >> + >> +Enum >> +Name(tls_type) Type(enum riscv_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=3D >> +Target RejectNegative Joined Enum(tls_type) Var(riscv_tls_dialect) Init= (TLS_TRADITIONAL) Save >> +Specify TLS dialect. >> diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi >> index e099cd0b568..6ee533c0a40 100644 >> --- a/gcc/doc/install.texi >> +++ b/gcc/doc/install.texi >> @@ -1174,6 +1174,9 @@ Specify the default TLS dialect, for systems were = there is a choice. >> For ARM targets, possible values for @var{dialect} are @code{gnu} or >> @code{gnu2}, which select between the original GNU dialect and the GNU T= LS >> descriptor-based dialect. >> +For RISC-V targets, possible values for @var{dialect} are @code{trad} or >> +@code{desc}, which select between the traditional GNU dialect and the G= NU TLS >> +descriptor-based dialect. >>=20 >> @item --enable-multiarch >> Specify whether to enable or disable multiarch support. The default is >> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi >> index f2c1067ab7d..77b82c46311 100644 >> --- a/gcc/doc/invoke.texi >> +++ b/gcc/doc/invoke.texi >> @@ -1234,7 +1234,8 @@ See RS/6000 and PowerPC Options. >> -mstack-protector-guard=3D@var{guard} -mstack-protector-guard-reg=3D@va= r{reg} >> -mstack-protector-guard-offset=3D@var{offset} >> -mcsr-check -mno-csr-check >> --minline-atomics -mno-inline-atomics} >> +-minline-atomics -mno-inline-atomics >> +-mtls-dialect=3Ddesc -mtls-dialect=3Dtrad} >>=20 >> @emph{RL78 Options} >> @gccoptlist{-msim -mmul=3Dnone -mmul=3Dg13 -mmul=3Dg14 -mallregs >> @@ -29403,6 +29404,16 @@ which register to use as base register for read= ing the canary, >> and from what offset from that base register. There is no default >> register or offset as this is entirely for use within the Linux >> kernel. >> + >> +@opindex mtls-dialect=3Ddesc >> +@item -mtls-dialect=3Ddesc >> +Use TLS descriptors as the thread-local storage mechanism for dynamic a= ccesses >> +of TLS variables. >> + >> +@opindex mtls-dialect=3Dtrad >> +@item -mtls-dialect=3Dtrad >> +Use traditional TLS as the thread-local storage mechanism for dynamic a= ccesses >> +of TLS variables. This is the default. >> @end table >>=20 >> @node RL78 Options >> -- >> 2.42.1 >>=20 >=20 >=20 > --=20 > =E5=AE=8B=E6=96=B9=E7=9D=BF --Apple-Mail=_BB2CD2D1-4711-4822-A5DB-F3E463BEF64F--