The ported patch: r188371 | dehao | 2012-06-09 18:44:58 -0700 (Sat, 09 Jun 2012) | 13 lines
2012-06-10 Dehao Chen <de...@google.com> Backport r188303 from google-4_7 * 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. The new patch: bootstrapped and passed regression test. Is it ok for google-4_8 branch? Thanks, Dehao Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi (revision 198322) +++ gcc/doc/invoke.texi (working copy) @@ -369,7 +369,8 @@ Objective-C and Objective-C++ Dialects}. -fdelete-null-pointer-checks -fdevirtualize -fdse @gol -fearly-inlining -fipa-sra -fexpensive-optimizations -ffat-lto-objects @gol -ffast-math -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 -fhoist-adjacent-loads -fif-conversion @gol -fif-conversion2 -findirect-inlining @gol @@ -9064,6 +9065,15 @@ You cannot use @code{gprof} on all systems if you 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. +For example, the following command line will add "cold" attribute to +functions that has "ErrorMessage" in its name. +@smallexample +gcc -ffunction-atribute-list=cold:ErrorMessage -c foo.c +@end smallexample + @item -fbranch-target-load-optimize @opindex fbranch-target-load-optimize Perform branch target register load optimization before prologue / epilogue Index: gcc/common.opt =================================================================== --- gcc/common.opt (revision 198322) +++ gcc/common.opt (working copy) @@ -1267,6 +1267,10 @@ Enum(fp_contract_mode) String(on) Value(FP_CONTRAC EnumValue Enum(fp_contract_mode) String(fast) Value(FP_CONTRACT_FAST) +ffunction-attribute-list= +Common Joined RejectNegative Var(common_deferred_options) Defer +-ffunction-attribute-list=attribute:name,... Add attribute to named functions + ; Nonzero means don't put addresses of constant functions in registers. ; Used for compiling the Unix kernel, where strange substitutions are ; done on the assembly output. Index: gcc/cgraph.c =================================================================== --- gcc/cgraph.c (revision 198322) +++ gcc/cgraph.c (working copy) @@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see #include "ipa-inline.h" #include "cfgloop.h" #include "gimple-pretty-print.h" +#include "opts.h" /* FIXME: Only for PROP_loops, but cgraph shouldn't have to know about this. */ #include "tree-pass.h" @@ -535,6 +536,7 @@ cgraph_create_node (tree decl) node->next_nested = node->origin->nested; node->origin->nested = node; } + pattern_match_function_attributes (decl); return node; } Index: gcc/opts-global.c =================================================================== --- gcc/opts-global.c (revision 198322) +++ gcc/opts-global.c (working copy) @@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-pass.h" #include "params.h" #include "l-ipo.h" +#include "xregex.h" typedef const char *const_char_p; /* For DEF_VEC_P. */ @@ -47,6 +48,13 @@ static vec<const_char_p> ignored_options; 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 * @@ -76,6 +84,62 @@ write_langs (unsigned int mask) 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). */ @@ -477,6 +541,10 @@ handle_common_deferred_options (void) 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) Index: gcc/opts.c =================================================================== --- gcc/opts.c (revision 198322) +++ gcc/opts.c (working copy) @@ -1648,6 +1648,10 @@ common_handle_option (struct gcc_options *opts, /* 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 198322) +++ gcc/opts.h (working copy) @@ -415,4 +415,5 @@ extern void set_struct_debug_option (struct gcc_op extern bool opt_enum_arg_to_value (size_t opt_index, const char *arg, int *value, unsigned int lang_mask); extern void write_opts_to_asm (void); +extern void pattern_match_function_attributes (tree); #endif