From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24810 invoked by alias); 16 Jul 2019 10:42:37 -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 24800 invoked by uid 89); 16 Jul 2019 10:42:36 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-13.3 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_STOCKGEN,SEM_URI,SEM_URIRED autolearn=ham version=3.3.1 spammy= 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; Tue, 16 Jul 2019 10:42:35 +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 2C8142B; Tue, 16 Jul 2019 03:42:33 -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 CA1283F71A; Tue, 16 Jul 2019 03:42:32 -0700 (PDT) Subject: Re: [ARM/FDPIC v5 08/21] [ARM] FDPIC: Enforce local/global binding for function descriptors To: Christophe Lyon , "gcc-patches@gcc.gnu.org" References: <20190515124006.25840-1-christophe.lyon@st.com> <20190515124006.25840-9-christophe.lyon@st.com> From: Kyrill Tkachov Message-ID: <05f54c43-4f85-9bb0-ac70-98e997945929@foss.arm.com> Date: Tue, 16 Jul 2019 10:51: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-9-christophe.lyon@st.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-SW-Source: 2019-07/txt/msg01107.txt.bz2 Hi Christophe, On 5/15/19 1:39 PM, Christophe Lyon wrote: > Use local binding rules to decide whether we can use GOTOFFFUNCDESC to > compute the function address. > > 2019-XX-XX  Christophe Lyon  >         Mickaël Guêné > >         gcc/ >         * config/arm/arm.c (arm_local_funcdesc_p): New function. >         (legitimize_pic_address): Enforce binding rules on function >         pointers in FDPIC mode. >         (arm_assemble_integer): Likewise. > > Change-Id: I3fa0b63bc0f672903f405aa72cc46052de1c0feb > > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c > index dbd1671..40e3f3b 100644 > --- a/gcc/config/arm/arm.c > +++ b/gcc/config/arm/arm.c > @@ -3790,6 +3790,42 @@ arm_options_perform_arch_sanity_checks (void) >      } >  } > > +/* Test whether a local function descriptor is canonical, i.e., > +   whether we can use GOTOFFFUNCDESC to compute the address of the > +   function.  */ > +static bool > +arm_fdpic_local_funcdesc_p (rtx fnx) > +{ > +  tree fn; > +  enum symbol_visibility vis; > +  bool ret; > + > +  if (!TARGET_FDPIC) > +    return TRUE; > + > +  if (! SYMBOL_REF_LOCAL_P (fnx)) > +    return FALSE; > + Please use normal C 'true' and 'false' in this patch. Ok with that change once the rest is approved. Thanks, Kyrill > +  fn = SYMBOL_REF_DECL (fnx); > + > +  if (! fn) > +    return FALSE; > + > +  vis = DECL_VISIBILITY (fn); > + > +  if (vis == VISIBILITY_PROTECTED) > +    /* Private function descriptors for protected functions are not > +       canonical.  Temporarily change the visibility to global so that > +       we can ensure uniqueness of funcdesc pointers.  */ > +    DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT; > + > +  ret = default_binds_local_p_1 (fn, flag_pic); > + > +  DECL_VISIBILITY (fn) = vis; > + > +  return ret; > +} > + >  static void >  arm_add_gc_roots (void) >  { > @@ -7563,7 +7599,9 @@ legitimize_pic_address (rtx orig, machine_mode > mode, rtx reg, rtx pic_reg, >             || (GET_CODE (orig) == SYMBOL_REF >                 && SYMBOL_REF_LOCAL_P (orig) >                 && (SYMBOL_REF_DECL (orig) > -                  ? !DECL_WEAK (SYMBOL_REF_DECL (orig)) : 1))) > +                  ? !DECL_WEAK (SYMBOL_REF_DECL (orig)) : 1) > +              && (!SYMBOL_REF_FUNCTION_P (orig) > +                  || arm_fdpic_local_funcdesc_p (orig)))) >            && NEED_GOT_RELOC >            && arm_pic_data_is_text_relative) >          insn = arm_pic_static_addr (orig, reg); > @@ -23231,7 +23269,9 @@ arm_assemble_integer (rtx x, unsigned int > size, int aligned_p) >                || (GET_CODE (x) == SYMBOL_REF >                    && (!SYMBOL_REF_LOCAL_P (x) >                        || (SYMBOL_REF_DECL (x) > -                         ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0)))) > +                         ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0) > +                     || (SYMBOL_REF_FUNCTION_P (x) > +                         && !arm_fdpic_local_funcdesc_p (x))))) >              { >                if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x)) >                  fputs ("(GOTFUNCDESC)", asm_out_file); > -- > 2.6.3 >