Re: [PATCH v11] add -fpatchable-function-entry=N,M option
On 06/07/17 15:03, Torsten Duwe wrote: > Permit A 38 > > gcc/c-family/ChangeLog > 2017-07-06 Torsten Duwe> > * c-attribs.c (c_common_attribute_table): Add entry for > "patchable_function_entry". > > gcc/lto/ChangeLog > 2017-07-06 Torsten Duwe > > * lto-lang.c (lto_attribute_table): Add entry for > "patchable_function_entry". > > gcc/ChangeLog > 2017-07-06 Torsten Duwe > > * common.opt: Introduce -fpatchable-function-entry > command line option, and its variables function_entry_patch_area_size > and function_entry_patch_area_start. > * opts.c (common_handle_option): Add -fpatchable_function_entry_ case, > including a two-value parser. > * target.def (print_patchable_function_entry): New target hook. > * targhooks.h (default_print_patchable_function_entry): New function. > * targhooks.c (default_print_patchable_function_entry): Likewise. > * toplev.c (process_options): Switch off IPA-RA if > patchable function entries are being generated. > * varasm.c (assemble_start_function): Look at the > patchable-function-entry command line switch and current > function attributes and maybe generate NOP instructions by > calling the print_patchable_function_entry hook. > * doc/extend.texi: Document patchable_function_entry attribute. > * doc/invoke.texi: Document -fpatchable_function_entry > command line option. > * doc/tm.texi.in (TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY): > New target hook. > * doc/tm.texi: Likewise. > > gcc/testsuite/ChangeLog > 2017-07-06 Torsten Duwe > > * c-c++-common/patchable_function_entry-default.c: New test. > * c-c++-common/patchable_function_entry-decl.c: Likewise. > * c-c++-common/patchable_function_entry-definition.c: Likewise. > > diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c > index 626ffa1cde7..ecb00c1d5b9 100644 > --- a/gcc/c-family/c-attribs.c > +++ b/gcc/c-family/c-attribs.c > @@ -142,6 +142,8 @@ static tree handle_bnd_variable_size_attribute (tree *, > tree, tree, int, bool *) > static tree handle_bnd_legacy (tree *, tree, tree, int, bool *); > static tree handle_bnd_instrument (tree *, tree, tree, int, bool *); > static tree handle_fallthrough_attribute (tree *, tree, tree, int, bool *); > +static tree handle_patchable_function_entry_attribute (tree *, tree, tree, > +int, bool *); > > /* Table of machine-independent attributes common to all C-like languages. > > @@ -351,6 +353,9 @@ const struct attribute_spec c_common_attribute_table[] = > handle_bnd_instrument, false }, >{ "fallthrough", 0, 0, false, false, false, > handle_fallthrough_attribute, false }, > + { "patchable_function_entry", 1, 2, true, false, false, > + handle_patchable_function_entry_attribute, > + false }, >{ NULL, 0, 0, false, false, false, NULL, false } > }; > > @@ -3260,3 +3265,10 @@ handle_fallthrough_attribute (tree *, tree name, tree, > int, >*no_add_attrs = true; >return NULL_TREE; > } > + > +static tree > +handle_patchable_function_entry_attribute (tree *, tree, tree, int, bool *) > +{ > + /* Nothing to be done here. */ > + return NULL_TREE; > +} > diff --git a/gcc/common.opt b/gcc/common.opt > index e81165c488b..78cfa568a95 100644 > --- a/gcc/common.opt > +++ b/gcc/common.opt > @@ -163,6 +163,13 @@ bool flag_stack_usage_info = false > Variable > int flag_debug_asm > > +; How many NOP insns to place at each function entry by default > +Variable > +HOST_WIDE_INT function_entry_patch_area_size > + > +; And how far the real asm entry point is into this area > +Variable > +HOST_WIDE_INT function_entry_patch_area_start > > ; Balance between GNAT encodings and standard DWARF to emit. > Variable > @@ -2030,6 +2037,10 @@ fprofile-reorder-functions > Common Report Var(flag_profile_reorder_functions) > Enable function reordering that improves code placement. > > +fpatchable-function-entry= > +Common Joined Optimization > +Insert NOP instructions at each function entry. > + > frandom-seed > Common Var(common_deferred_options) Defer > > diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi > index 03ba8fc436c..86d567783f7 100644 > --- a/gcc/doc/extend.texi > +++ b/gcc/doc/extend.texi > @@ -3105,6 +3105,27 @@ that affect more than one function. > This attribute should be used for debugging purposes only. It is not > suitable in production code. > > +@item patchable_function_entry > +@cindex @code{patchable_function_entry} function attribute > +@cindex extra NOP instructions at the function entry point > +In case the target's text segment can be made writable at run time by > +any means, padding the function entry with
[PATCH v11] add -fpatchable-function-entry=N,M option
Permit A 38 gcc/c-family/ChangeLog 2017-07-06 Torsten Duwe* c-attribs.c (c_common_attribute_table): Add entry for "patchable_function_entry". gcc/lto/ChangeLog 2017-07-06 Torsten Duwe * lto-lang.c (lto_attribute_table): Add entry for "patchable_function_entry". gcc/ChangeLog 2017-07-06 Torsten Duwe * common.opt: Introduce -fpatchable-function-entry command line option, and its variables function_entry_patch_area_size and function_entry_patch_area_start. * opts.c (common_handle_option): Add -fpatchable_function_entry_ case, including a two-value parser. * target.def (print_patchable_function_entry): New target hook. * targhooks.h (default_print_patchable_function_entry): New function. * targhooks.c (default_print_patchable_function_entry): Likewise. * toplev.c (process_options): Switch off IPA-RA if patchable function entries are being generated. * varasm.c (assemble_start_function): Look at the patchable-function-entry command line switch and current function attributes and maybe generate NOP instructions by calling the print_patchable_function_entry hook. * doc/extend.texi: Document patchable_function_entry attribute. * doc/invoke.texi: Document -fpatchable_function_entry command line option. * doc/tm.texi.in (TARGET_ASM_PRINT_PATCHABLE_FUNCTION_ENTRY): New target hook. * doc/tm.texi: Likewise. gcc/testsuite/ChangeLog 2017-07-06 Torsten Duwe * c-c++-common/patchable_function_entry-default.c: New test. * c-c++-common/patchable_function_entry-decl.c: Likewise. * c-c++-common/patchable_function_entry-definition.c: Likewise. diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index 626ffa1cde7..ecb00c1d5b9 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -142,6 +142,8 @@ static tree handle_bnd_variable_size_attribute (tree *, tree, tree, int, bool *) static tree handle_bnd_legacy (tree *, tree, tree, int, bool *); static tree handle_bnd_instrument (tree *, tree, tree, int, bool *); static tree handle_fallthrough_attribute (tree *, tree, tree, int, bool *); +static tree handle_patchable_function_entry_attribute (tree *, tree, tree, + int, bool *); /* Table of machine-independent attributes common to all C-like languages. @@ -351,6 +353,9 @@ const struct attribute_spec c_common_attribute_table[] = handle_bnd_instrument, false }, { "fallthrough", 0, 0, false, false, false, handle_fallthrough_attribute, false }, + { "patchable_function_entry",1, 2, true, false, false, + handle_patchable_function_entry_attribute, + false }, { NULL, 0, 0, false, false, false, NULL, false } }; @@ -3260,3 +3265,10 @@ handle_fallthrough_attribute (tree *, tree name, tree, int, *no_add_attrs = true; return NULL_TREE; } + +static tree +handle_patchable_function_entry_attribute (tree *, tree, tree, int, bool *) +{ + /* Nothing to be done here. */ + return NULL_TREE; +} diff --git a/gcc/common.opt b/gcc/common.opt index e81165c488b..78cfa568a95 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -163,6 +163,13 @@ bool flag_stack_usage_info = false Variable int flag_debug_asm +; How many NOP insns to place at each function entry by default +Variable +HOST_WIDE_INT function_entry_patch_area_size + +; And how far the real asm entry point is into this area +Variable +HOST_WIDE_INT function_entry_patch_area_start ; Balance between GNAT encodings and standard DWARF to emit. Variable @@ -2030,6 +2037,10 @@ fprofile-reorder-functions Common Report Var(flag_profile_reorder_functions) Enable function reordering that improves code placement. +fpatchable-function-entry= +Common Joined Optimization +Insert NOP instructions at each function entry. + frandom-seed Common Var(common_deferred_options) Defer diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 03ba8fc436c..86d567783f7 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -3105,6 +3105,27 @@ that affect more than one function. This attribute should be used for debugging purposes only. It is not suitable in production code. +@item patchable_function_entry +@cindex @code{patchable_function_entry} function attribute +@cindex extra NOP instructions at the function entry point +In case the target's text segment can be made writable at run time by +any means, padding the function entry with a number of NOPs can be +used to provide a universal tool for instrumentation. + +The @code{patchable_function_entry} function attribute can be used to +change the number of NOPs to any desired value. The two-value