Also needs to get the attribute spec and call  the attribute handler ..

David

On Tue, Jun 5, 2012 at 9:28 PM, Xinliang David Li <davi...@google.com> wrote:
> Please document it in doc/invoke.texi with examples.
>
> thanks,
>
> David
>
> On Tue, Jun 5, 2012 at 7:28 PM, Dehao Chen <de...@google.com> wrote:
>> Patch updated: using regex to match the function name:
>>
>> http://codereview.appspot.com/6281047
>>
>> Thanks,
>> Dehao
>>
>> 2012-06-01  Dehao Chen  <de...@google.com>
>>
>>        * gcc/cgraph.c (cgraph_node): Add attribute to function decl.
>>        * gcc/opts-global.c (add_attribute_pattern): New function.
>>        (pattern_match_function_attributes): New function.
>>        (handle_common_deferred_options): Handle new options.
>>        * gcc/opts.c (common_handle_option): Handle new options.
>>        * gcc/opts.h (handle_common_deferred_options): New function.
>>        * gcc/common.opt (ffunction_attribute_list): New option.
>>
>> Index: gcc/doc/invoke.texi
>> ===================================================================
>> --- gcc/doc/invoke.texi (revision 188050)
>> +++ gcc/doc/invoke.texi (working copy)
>> @@ -362,7 +362,8 @@
>>  -fdelete-null-pointer-checks -fdse -fdevirtualize -fdse @gol
>>  -fearly-inlining -fipa-sra -fexpensive-optimizations -ffast-math @gol
>>  -ffinite-math-only -ffloat-store -fexcess-precision=@var{style} @gol
>> --fforward-propagate -ffp-contract=@var{style} -ffunction-sections @gol
>> +-fforward-propagate -ffp-contract=@var{style} @gol
>> +-ffunction-attribute-list -ffunction-sections @gol
>>  -fgcse -fgcse-after-reload -fgcse-las -fgcse-lm -fgraphite-identity @gol
>>  -fgcse-sm -fif-conversion -fif-conversion2 -findirect-inlining @gol
>>  -finline-functions -finline-functions-called-once -finline-limit=@var{n} 
>> @gol
>> @@ -8585,6 +8586,10 @@
>>  specify this option and you may have problems with debugging if
>>  you specify both this option and @option{-g}.
>>
>> +@item -ffunction-attribute-list
>> +@opindex ffunction-attribute-list
>> +List of function name patterns that will be applied specified attribute.
>> +
>>  @item -fbranch-target-load-optimize
>>  @opindex fbranch-target-load-optimize
>>  Perform branch target register load optimization before prologue / epilogue
>> Index: gcc/cgraph.c
>> ===================================================================
>> --- gcc/cgraph.c        (revision 188050)
>> +++ gcc/cgraph.c        (working copy)
>> @@ -99,6 +99,7 @@
>>  #include "ipa-utils.h"
>>  #include "lto-streamer.h"
>>  #include "l-ipo.h"
>> +#include "opts.h"
>>
>>  const char * const ld_plugin_symbol_resolution_names[]=
>>  {
>> @@ -554,6 +555,7 @@
>>       node->origin->nested = node;
>>     }
>>   cgraph_add_assembler_hash_node (node);
>> +  pattern_match_function_attributes (decl);
>>   return node;
>>  }
>>
>> Index: gcc/opts.c
>> ===================================================================
>> --- gcc/opts.c  (revision 188050)
>> +++ gcc/opts.c  (working copy)
>> @@ -1647,6 +1647,10 @@
>>       /* Deferred.  */
>>       break;
>>
>> +    case OPT_ffunction_attribute_list_:
>> +      /* Deferred.  */
>> +      break;
>> +
>>     case OPT_fsched_verbose_:
>>  #ifdef INSN_SCHEDULING
>>       /* Handled with Var in common.opt.  */
>> Index: gcc/opts.h
>> ===================================================================
>> --- gcc/opts.h  (revision 188050)
>> +++ gcc/opts.h  (working copy)
>> @@ -382,4 +382,5 @@
>>                                     location_t loc,
>>                                     const char *value);
>>  extern void write_opts_to_asm (void);
>> +extern void pattern_match_function_attributes (tree);
>>  #endif
>> Index: gcc/common.opt
>> ===================================================================
>> --- gcc/common.opt      (revision 188050)
>> +++ gcc/common.opt      (working copy)
>> @@ -1242,6 +1242,10 @@
>>  Common Report Var(flag_function_sections)
>>  Place each function into its own section
>>
>> +ffunction-attribute-list=
>> +Common Joined RejectNegative Var(common_deferred_options) Defer
>> +-ffunction-attribute-list=attribute:name,...  Add attribute to named 
>> functions
>> +
>>  fgcda=
>>  Common Joined RejectNegative Var(gcov_da_name)
>>  Set the gcov data file name.
>> Index: gcc/opts-global.c
>> ===================================================================
>> --- gcc/opts-global.c   (revision 188050)
>> +++ gcc/opts-global.c   (working copy)
>> @@ -39,6 +39,7 @@
>>  #include "tree-pass.h"
>>  #include "params.h"
>>  #include "l-ipo.h"
>> +#include "xregex.h"
>>
>>  typedef const char *const_char_p; /* For DEF_VEC_P.  */
>>  DEF_VEC_P(const_char_p);
>> @@ -50,6 +51,13 @@
>>  const char **in_fnames;
>>  unsigned num_in_fnames;
>>
>> +static struct reg_func_attr_patterns
>> +{
>> +  regex_t r;
>> +  const char *attribute;
>> +  struct reg_func_attr_patterns *next;
>> +} *reg_func_attr_patterns;
>> +
>>  /* Return a malloced slash-separated list of languages in MASK.  */
>>
>>  static char *
>> @@ -79,6 +87,62 @@
>>   return result;
>>  }
>>
>> +/* Add strings like attribute_str:pattern... to attribute pattern list.  */
>> +
>> +static void
>> +add_attribute_pattern (const char *arg)
>> +{
>> +  char *tmp;
>> +  char *pattern_str;
>> +  struct reg_func_attr_patterns *one_pat;
>> +  int ec;
>> +
>> +  /* We never free this string.  */
>> +  tmp = xstrdup (arg);
>> +
>> +  pattern_str = strchr (tmp, ':');
>> +  if (!pattern_str)
>> +    error ("invalid pattern in -ffunction-attribute-list option: %qs", tmp);
>> +
>> +  *pattern_str = '\0';
>> +  pattern_str ++;
>> +
>> +  one_pat = XCNEW (struct reg_func_attr_patterns);
>> +  one_pat->next = reg_func_attr_patterns;
>> +  one_pat->attribute = tmp;
>> +  reg_func_attr_patterns = one_pat;
>> +  if ((ec= regcomp (&one_pat->r, pattern_str, REG_EXTENDED|REG_NOSUB) != 0))
>> +    {
>> +      char err[100];
>> +      regerror (ec, &one_pat->r, err, 99);
>> +      error ("invalid pattern in -ffunction-attribute-list option: %qs: 
>> %qs",
>> +            pattern_str, err);
>> +    }
>> +}
>> +
>> +/* Match FNDECL's name with user specified patterns, and add attributes
>> +   to FNDECL.  */
>> +
>> +void
>> +pattern_match_function_attributes (tree fndecl)
>> +{
>> +  const char *name;
>> +  struct reg_func_attr_patterns *one_pat;
>> +
>> +  if (!fndecl)
>> +    return;
>> +
>> +  if (!reg_func_attr_patterns)
>> +    return;
>> +
>> +  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl));
>> +
>> +  for (one_pat = reg_func_attr_patterns; one_pat; one_pat = one_pat->next)
>> +    if (regexec (&one_pat->r, name, 0, NULL, 0) == 0)
>> +      decl_attributes (&fndecl, tree_cons (
>> +         get_identifier (one_pat->attribute), NULL, NULL), 0);
>> +}
>> +
>>  /* Complain that switch DECODED does not apply to this front end (mask
>>    LANG_MASK).  */
>>
>> @@ -452,6 +516,10 @@
>>          set_random_seed (opt->arg);
>>          break;
>>
>> +       case OPT_ffunction_attribute_list_:
>> +         add_attribute_pattern (opt->arg);
>> +         break;
>> +
>>        case OPT_fstack_limit:
>>          /* The real switch is -fno-stack-limit.  */
>>          if (!opt->value)

Reply via email to