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)