From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 99390 invoked by alias); 4 Sep 2019 14:16:21 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 99376 invoked by uid 89); 4 Sep 2019 14:16:21 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-17.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3 autolearn=ham version=3.3.1 spammy=HContent-Transfer-Encoding:8bit X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.110.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 04 Sep 2019 14:16:19 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 899AA28; Wed, 4 Sep 2019 07:16:17 -0700 (PDT) Received: from [10.2.206.47] (e120808-lin.cambridge.arm.com [10.2.206.47]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 1E0353F59C; Wed, 4 Sep 2019 07:16:16 -0700 (PDT) Subject: Re: [ARM/FDPIC v5 10/21] [ARM] FDPIC: Implement TLS support. To: Christophe Lyon , "gcc-patches@gcc.gnu.org" References: <20190515124006.25840-1-christophe.lyon@st.com> <20190515124006.25840-11-christophe.lyon@st.com> From: Kyrill Tkachov Message-ID: <2e3ad9a4-edf4-d513-ddba-1dae0da305cc@foss.arm.com> Date: Wed, 04 Sep 2019 14:16:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.1 MIME-Version: 1.0 In-Reply-To: <20190515124006.25840-11-christophe.lyon@st.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-SW-Source: 2019-09/txt/msg00195.txt.bz2 Hi Christophe, On 5/15/19 1:39 PM, Christophe Lyon wrote: > Support additional relocations: TLS_GD32_FDPIC, TLS_LDM32_FDPIC, and > TLS_IE32_FDPIC. > > We do not support the GNU2 TLS dialect. > > 2019-XX-XX  Christophe Lyon  >         Mickaël Guêné > >         gcc/ >         * config/arm/arm.c (tls_reloc): Add TLS_GD32_FDPIC, >         TLS_LDM32_FDPIC and TLS_IE32_FDPIC. >         (arm_call_tls_get_addr): Add FDPIC support. >         (legitimize_tls_address): Likewise. >         (arm_emit_tls_decoration): Likewise. > > Change-Id: I4ea5034ff654540c4658d0a79fb92f70550cdf4a > > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c > index 99d13bf..5fc7a20 100644 > --- a/gcc/config/arm/arm.c > +++ b/gcc/config/arm/arm.c > @@ -2379,9 +2379,12 @@ char arm_arch_name[] = "__ARM_ARCH_PROFILE__"; > >  enum tls_reloc { >    TLS_GD32, > +  TLS_GD32_FDPIC, >    TLS_LDM32, > +  TLS_LDM32_FDPIC, >    TLS_LDO32, >    TLS_IE32, > +  TLS_IE32_FDPIC, >    TLS_LE32, >    TLS_DESCSEQ  /* GNU scheme */ >  }; > @@ -8760,20 +8763,34 @@ arm_call_tls_get_addr (rtx x, rtx reg, rtx > *valuep, int reloc) >    gcc_assert (reloc != TLS_DESCSEQ); >    start_sequence (); > > -  labelno = GEN_INT (pic_labelno++); > -  label = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), > UNSPEC_PIC_LABEL); > -  label = gen_rtx_CONST (VOIDmode, label); > +  if (TARGET_FDPIC) > +    { > +      sum = gen_rtx_UNSPEC (Pmode, > +                           gen_rtvec (2, x, GEN_INT (reloc)), > +                           UNSPEC_TLS); > +    } > +  else > +    { > +      labelno = GEN_INT (pic_labelno++); > +      label = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), > UNSPEC_PIC_LABEL); > +      label = gen_rtx_CONST (VOIDmode, label); > > -  sum = gen_rtx_UNSPEC (Pmode, > -                       gen_rtvec (4, x, GEN_INT (reloc), label, > -                                  GEN_INT (TARGET_ARM ? 8 : 4)), > -                       UNSPEC_TLS); > +      sum = gen_rtx_UNSPEC (Pmode, > +                           gen_rtvec (4, x, GEN_INT (reloc), label, > +                                      GEN_INT (TARGET_ARM ? 8 : 4)), > +                           UNSPEC_TLS); > +    } >    reg = load_tls_operand (sum, reg); > > -  if (TARGET_ARM) > -    emit_insn (gen_pic_add_dot_plus_eight (reg, reg, labelno)); > +  if (TARGET_FDPIC) > +    { > +      emit_insn (gen_addsi3 (reg, reg, gen_rtx_REG (Pmode, > FDPIC_REGNUM))); > +    } No {} around single statement. >    else > -    emit_insn (gen_pic_add_dot_plus_four (reg, reg, labelno)); > +    if (TARGET_ARM) > +      emit_insn (gen_pic_add_dot_plus_eight (reg, reg, labelno)); Merge that "if" with the "else" in an "else if" > +    else > +      emit_insn (gen_pic_add_dot_plus_four (reg, reg, labelno)); > >    *valuep = emit_library_call_value (get_tls_get_addr (), NULL_RTX, >                                       LCT_PURE, /* LCT_CONST?  */ > @@ -8808,6 +8825,7 @@ arm_tls_descseq_addr (rtx x, rtx reg) >    return reg; >  } > > + >  rtx >  legitimize_tls_address (rtx x, rtx reg) >  { > @@ -8820,6 +8838,9 @@ legitimize_tls_address (rtx x, rtx reg) >      case TLS_MODEL_GLOBAL_DYNAMIC: >        if (TARGET_GNU2_TLS) >          { > +         if (TARGET_FDPIC) > +           gcc_unreachable(); > + Use gcc_assert (TARGET_FDPIC) >            reg = arm_tls_descseq_addr (x, reg); > >            tp = arm_load_tp (NULL_RTX); > @@ -8829,7 +8850,10 @@ legitimize_tls_address (rtx x, rtx reg) >        else >          { >            /* Original scheme */ > -         insns = arm_call_tls_get_addr (x, reg, &ret, TLS_GD32); > +         if (TARGET_FDPIC) > +           insns = arm_call_tls_get_addr (x, reg, &ret, TLS_GD32_FDPIC); > +         else > +           insns = arm_call_tls_get_addr (x, reg, &ret, TLS_GD32); >            dest = gen_reg_rtx (Pmode); >            emit_libcall_block (insns, dest, ret, x); >          } > @@ -8838,6 +8862,9 @@ legitimize_tls_address (rtx x, rtx reg) >      case TLS_MODEL_LOCAL_DYNAMIC: >        if (TARGET_GNU2_TLS) >          { > +         if (TARGET_FDPIC) > +           gcc_unreachable(); > + Likewise. Ok with those changes. Thanks, Kyrill >            reg = arm_tls_descseq_addr (x, reg); > >            tp = arm_load_tp (NULL_RTX); > @@ -8846,7 +8873,10 @@ legitimize_tls_address (rtx x, rtx reg) >          } >        else >          { > -         insns = arm_call_tls_get_addr (x, reg, &ret, TLS_LDM32); > +         if (TARGET_FDPIC) > +           insns = arm_call_tls_get_addr (x, reg, &ret, TLS_LDM32_FDPIC); > +         else > +           insns = arm_call_tls_get_addr (x, reg, &ret, TLS_LDM32); > >            /* Attach a unique REG_EQUIV, to allow the RTL optimizers to >               share the LDM result with other LD model accesses.  */ > @@ -8865,23 +8895,35 @@ legitimize_tls_address (rtx x, rtx reg) >        return dest; > >      case TLS_MODEL_INITIAL_EXEC: > -      labelno = GEN_INT (pic_labelno++); > -      label = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), > UNSPEC_PIC_LABEL); > -      label = gen_rtx_CONST (VOIDmode, label); > -      sum = gen_rtx_UNSPEC (Pmode, > -                           gen_rtvec (4, x, GEN_INT (TLS_IE32), label, > -                                      GEN_INT (TARGET_ARM ? 8 : 4)), > -                           UNSPEC_TLS); > -      reg = load_tls_operand (sum, reg); > - > -      if (TARGET_ARM) > -       emit_insn (gen_tls_load_dot_plus_eight (reg, reg, labelno)); > -      else if (TARGET_THUMB2) > -       emit_insn (gen_tls_load_dot_plus_four (reg, NULL, reg, labelno)); > +      if (TARGET_FDPIC) > +       { > +         sum = gen_rtx_UNSPEC (Pmode, > +                               gen_rtvec (2, x, GEN_INT > (TLS_IE32_FDPIC)), > +                               UNSPEC_TLS); > +         reg = load_tls_operand (sum, reg); > +         emit_insn (gen_addsi3 (reg, reg, gen_rtx_REG (Pmode, > FDPIC_REGNUM))); > +         emit_move_insn (reg, gen_rtx_MEM (Pmode, reg)); > +       } >        else >          { > -         emit_insn (gen_pic_add_dot_plus_four (reg, reg, labelno)); > -         emit_move_insn (reg, gen_const_mem (SImode, reg)); > +         labelno = GEN_INT (pic_labelno++); > +         label = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, labelno), > UNSPEC_PIC_LABEL); > +         label = gen_rtx_CONST (VOIDmode, label); > +         sum = gen_rtx_UNSPEC (Pmode, > +                               gen_rtvec (4, x, GEN_INT (TLS_IE32), > label, > +                                          GEN_INT (TARGET_ARM ? 8 : 4)), > +                               UNSPEC_TLS); > +         reg = load_tls_operand (sum, reg); > + > +         if (TARGET_ARM) > +           emit_insn (gen_tls_load_dot_plus_eight (reg, reg, labelno)); > +         else if (TARGET_THUMB2) > +           emit_insn (gen_tls_load_dot_plus_four (reg, NULL, reg, > labelno)); > +         else > +           { > +             emit_insn (gen_pic_add_dot_plus_four (reg, reg, labelno)); > +             emit_move_insn (reg, gen_const_mem (SImode, reg)); > +           } >          } > >        tp = arm_load_tp (NULL_RTX); > @@ -28218,15 +28260,24 @@ arm_emit_tls_decoration (FILE *fp, rtx x) >      case TLS_GD32: >        fputs ("(tlsgd)", fp); >        break; > +    case TLS_GD32_FDPIC: > +      fputs ("(tlsgd_fdpic)", fp); > +      break; >      case TLS_LDM32: >        fputs ("(tlsldm)", fp); >        break; > +    case TLS_LDM32_FDPIC: > +      fputs ("(tlsldm_fdpic)", fp); > +      break; >      case TLS_LDO32: >        fputs ("(tlsldo)", fp); >        break; >      case TLS_IE32: >        fputs ("(gottpoff)", fp); >        break; > +    case TLS_IE32_FDPIC: > +      fputs ("(gottpoff_fdpic)", fp); > +      break; >      case TLS_LE32: >        fputs ("(tpoff)", fp); >        break; > -- > 2.6.3 >