This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, Pointer Bounds Checker 20/x] Follow transparent alias chains


Ping

2014-06-03 13:01 GMT+04:00 Richard Biener <richard.guenther@gmail.com>:
> On Mon, Jun 2, 2014 at 5:15 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
>> Hi,
>>
>> In the most case we follow transparent alias chains wne assemble names.  But in some cases it is not performed.  For instrumented functions it is critical and following patch fixes that.  It also adds a visibility inheritance for instrtumented functions.
>
> It feels like this should be handled by the symtab code nowadays ... Honza?
>
> Richard.
>
>> Bootstrapped and tested on linux-x86_64.
>>
>> Thanks,
>> Ilya
>> --
>> gcc/
>>
>> 2014-06-02  Ilya Enkovich  <ilya.enkovich@intel.com>
>>
>>         * varasm.c: Include tree-chkp.h.
>>         (ultimate_transparent_alias_target): Move up.
>>         (make_decl_rtl): For instrumented function use
>>         name of the original decl.
>>         (assemble_start_function): Mark function as global
>>         in case it is instrumentation clone of the global
>>         function.
>>         (do_assemble_alias): Follow transparent alias chain
>>         for identifier.  Check if original alias is public.
>>         (maybe_assemble_visibility): Use visibility of the
>>         original function for instrumented version.
>>         (default_unique_section): Likewise.
>>
>>
>> diff --git a/gcc/varasm.c b/gcc/varasm.c
>> index fcae2fa..d473bc7 100644
>> --- a/gcc/varasm.c
>> +++ b/gcc/varasm.c
>> @@ -54,6 +54,7 @@ along with GCC; see the file COPYING3.  If not see
>>  #include "pointer-set.h"
>>  #include "asan.h"
>>  #include "basic-block.h"
>> +#include "tree-chkp.h"
>>
>>  #ifdef XCOFF_DEBUGGING_INFO
>>  #include "xcoffout.h"          /* Needed for external data
>> @@ -1200,6 +1201,30 @@ use_blocks_for_decl_p (tree decl)
>>    return targetm.use_blocks_for_decl_p (decl);
>>  }
>>
>> +/* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at *ALIAS
>> +   until we find an identifier that is not itself a transparent alias.
>> +   Modify the alias passed to it by reference (and all aliases on the
>> +   way to the ultimate target), such that they do not have to be
>> +   followed again, and return the ultimate target of the alias
>> +   chain.  */
>> +
>> +static inline tree
>> +ultimate_transparent_alias_target (tree *alias)
>> +{
>> +  tree target = *alias;
>> +
>> +  if (IDENTIFIER_TRANSPARENT_ALIAS (target))
>> +    {
>> +      gcc_assert (TREE_CHAIN (target));
>> +      target = ultimate_transparent_alias_target (&TREE_CHAIN (target));
>> +      gcc_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target)
>> +                 && ! TREE_CHAIN (target));
>> +      *alias = target;
>> +    }
>> +
>> +  return target;
>> +}
>> +
>>  /* Create the DECL_RTL for a VAR_DECL or FUNCTION_DECL.  DECL should
>>     have static storage duration.  In other words, it should not be an
>>     automatic variable, including PARM_DECLs.
>> @@ -1214,6 +1239,7 @@ make_decl_rtl (tree decl)
>>  {
>>    const char *name = 0;
>>    int reg_number;
>> +  tree id;
>>    rtx x;
>>
>>    /* Check that we are not being given an automatic variable.  */
>> @@ -1271,7 +1297,12 @@ make_decl_rtl (tree decl)
>>        return;
>>      }
>>
>> -  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
>> +  id = DECL_ASSEMBLER_NAME (decl);
>> +  if (TREE_CODE (decl) == FUNCTION_DECL
>> +      && cgraph_get_node (decl)
>> +      && cgraph_get_node (decl)->instrumentation_clone)
>> +    ultimate_transparent_alias_target (&id);
>> +  name = IDENTIFIER_POINTER (id);
>>
>>    if (name[0] != '*' && TREE_CODE (decl) != FUNCTION_DECL
>>        && DECL_REGISTER (decl))
>> @@ -1699,7 +1730,10 @@ assemble_start_function (tree decl, const char *fnname)
>>
>>    /* Make function name accessible from other files, if appropriate.  */
>>
>> -  if (TREE_PUBLIC (decl))
>> +  if (TREE_PUBLIC (decl)
>> +      || (cgraph_get_node (decl)->instrumentation_clone
>> +         && cgraph_get_node (decl)->instrumented_version
>> +         && TREE_PUBLIC (cgraph_get_node (decl)->instrumented_version->decl)))
>>      {
>>        notice_global_symbol (decl);
>>
>> @@ -2386,30 +2420,6 @@ mark_decl_referenced (tree decl)
>>  }
>>
>>
>> -/* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at *ALIAS
>> -   until we find an identifier that is not itself a transparent alias.
>> -   Modify the alias passed to it by reference (and all aliases on the
>> -   way to the ultimate target), such that they do not have to be
>> -   followed again, and return the ultimate target of the alias
>> -   chain.  */
>> -
>> -static inline tree
>> -ultimate_transparent_alias_target (tree *alias)
>> -{
>> -  tree target = *alias;
>> -
>> -  if (IDENTIFIER_TRANSPARENT_ALIAS (target))
>> -    {
>> -      gcc_assert (TREE_CHAIN (target));
>> -      target = ultimate_transparent_alias_target (&TREE_CHAIN (target));
>> -      gcc_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target)
>> -                 && ! TREE_CHAIN (target));
>> -      *alias = target;
>> -    }
>> -
>> -  return target;
>> -}
>> -
>>  /* Output to FILE (an assembly file) a reference to NAME.  If NAME
>>     starts with a *, the rest of NAME is output verbatim.  Otherwise
>>     NAME is transformed in a target-specific way (usually by the
>> @@ -5544,6 +5554,9 @@ vec<alias_pair, va_gc> *alias_pairs;
>>  void
>>  do_assemble_alias (tree decl, tree target)
>>  {
>> +  tree orig_decl = decl;
>> +  tree id;
>> +
>>    /* Emulated TLS had better not get this var.  */
>>    gcc_assert (!(!targetm.have_tls
>>                 && TREE_CODE (decl) == VAR_DECL
>> @@ -5552,12 +5565,21 @@ do_assemble_alias (tree decl, tree target)
>>    if (TREE_ASM_WRITTEN (decl))
>>      return;
>>
>> +  if (TREE_CODE (decl) == FUNCTION_DECL
>> +      && cgraph_get_node (decl)->instrumentation_clone
>> +      && cgraph_get_node (decl)->instrumented_version)
>> +    orig_decl = cgraph_get_node (decl)->instrumented_version->decl;
>> +
>> +  id = DECL_ASSEMBLER_NAME (decl);
>> +  ultimate_transparent_alias_target (&id);
>> +
>>    /* We must force creation of DECL_RTL for debug info generation, even though
>>       we don't use it here.  */
>>    make_decl_rtl (decl);
>>
>>    TREE_ASM_WRITTEN (decl) = 1;
>>    TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
>> +  TREE_ASM_WRITTEN (id) = 1;
>>
>>    if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
>>      {
>> @@ -5568,7 +5590,7 @@ do_assemble_alias (tree decl, tree target)
>>
>>  #ifdef ASM_OUTPUT_WEAKREF
>>        ASM_OUTPUT_WEAKREF (asm_out_file, decl,
>> -                         IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
>> +                         IDENTIFIER_POINTER (id),
>>                           IDENTIFIER_POINTER (target));
>>  #else
>>        if (!TARGET_SUPPORTS_WEAK)
>> @@ -5584,7 +5606,7 @@ do_assemble_alias (tree decl, tree target)
>>  #ifdef ASM_OUTPUT_DEF
>>    /* Make name accessible from other files, if appropriate.  */
>>
>> -  if (TREE_PUBLIC (decl))
>> +  if (TREE_PUBLIC (decl) || TREE_PUBLIC (orig_decl))
>>      {
>>        globalize_decl (decl);
>>        maybe_assemble_visibility (decl);
>> @@ -5594,7 +5616,7 @@ do_assemble_alias (tree decl, tree target)
>>  #if defined (ASM_OUTPUT_TYPE_DIRECTIVE)
>>        if (targetm.has_ifunc_p ())
>>         ASM_OUTPUT_TYPE_DIRECTIVE
>> -         (asm_out_file, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
>> +         (asm_out_file, IDENTIFIER_POINTER (id),
>>            IFUNC_ASM_TYPE);
>>        else
>>  #endif
>> @@ -5606,7 +5628,7 @@ do_assemble_alias (tree decl, tree target)
>>    ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
>>  # else
>>    ASM_OUTPUT_DEF (asm_out_file,
>> -                 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
>> +                 IDENTIFIER_POINTER (id),
>>                   IDENTIFIER_POINTER (target));
>>  # endif
>>  #elif defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
>> @@ -5614,7 +5636,7 @@ do_assemble_alias (tree decl, tree target)
>>      const char *name;
>>      tree *p, t;
>>
>> -    name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
>> +    name = IDENTIFIER_POINTER (id);
>>  # ifdef ASM_WEAKEN_DECL
>>      ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
>>  # else
>> @@ -5623,7 +5645,8 @@ do_assemble_alias (tree decl, tree target)
>>      /* Remove this function from the pending weak list so that
>>         we do not emit multiple .weak directives for it.  */
>>      for (p = &weak_decls; (t = *p) ; )
>> -      if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
>> +      if (DECL_ASSEMBLER_NAME (decl) == DECL_ASSEMBLER_NAME (TREE_VALUE (t))
>> +         || id == DECL_ASSEMBLER_NAME (TREE_VALUE (t)))
>>         *p = TREE_CHAIN (t);
>>        else
>>         p = &TREE_CHAIN (t);
>> @@ -5632,8 +5655,7 @@ do_assemble_alias (tree decl, tree target)
>>         list, for the same reason.  */
>>      for (p = &weakref_targets; (t = *p) ; )
>>        {
>> -       if (DECL_ASSEMBLER_NAME (decl)
>> -           == ultimate_transparent_alias_target (&TREE_VALUE (t)))
>> +       if (id == ultimate_transparent_alias_target (&TREE_VALUE (t)))
>>           *p = TREE_CHAIN (t);
>>         else
>>           p = &TREE_CHAIN (t);
>> @@ -5899,6 +5921,12 @@ maybe_assemble_visibility (tree decl)
>>  {
>>    enum symbol_visibility vis = DECL_VISIBILITY (decl);
>>
>> +  if (TREE_CODE (decl) == FUNCTION_DECL
>> +      && cgraph_get_node (decl)
>> +      && cgraph_get_node (decl)->instrumentation_clone
>> +      && cgraph_get_node (decl)->instrumented_version)
>> +    vis = DECL_VISIBILITY (cgraph_get_node (decl)->instrumented_version->decl);
>> +
>>    if (vis != VISIBILITY_DEFAULT)
>>      {
>>        targetm.asm_out.assemble_visibility (decl, vis);
>> @@ -6463,6 +6491,7 @@ default_unique_section (tree decl, int reloc)
>>    bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
>>    const char *prefix, *name, *linkonce;
>>    char *string;
>> +  tree id;
>>
>>    switch (categorize_decl_for_section (decl, reloc))
>>      {
>> @@ -6512,7 +6541,9 @@ default_unique_section (tree decl, int reloc)
>>        gcc_unreachable ();
>>      }
>>
>> -  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
>> +  id = DECL_ASSEMBLER_NAME (decl);
>> +  ultimate_transparent_alias_target (&id);
>> +  name = IDENTIFIER_POINTER (id);
>>    name = targetm.strip_name_encoding (name);
>>
>>    /* If we're using one_only, then there needs to be a .gnu.linkonce


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]