From 0d701e3eb89870237669ef7bf41394d90c35ae70 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Fri, 5 Feb 2021 13:11:44 +0100 Subject: [PATCH] opts: fix handling of -fpatchable-function-entries option gcc/ChangeLog: PR lto/98971 * cfgexpand.c (pass_expand::execute): Parse per-function option flag_patchable_function_entry and use it. * common.opt: Remove function_entry_patch_area_size and function_entry_patch_area_start global variables. * opts.c (parse_and_check_patch_area): New function. (common_handle_option): Use it. * opts.h (parse_and_check_patch_area): New function. * toplev.c (process_options): Parse and use function_entry_patch_area_size. --- gcc/cfgexpand.c | 6 +++-- gcc/common.opt | 10 +------- gcc/opts.c | 65 +++++++++++++++++++++++++++++++------------------ gcc/opts.h | 4 +++ gcc/toplev.c | 6 ++++- 5 files changed, 55 insertions(+), 36 deletions(-) diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 8d20ca6cefb..aef9e916fcd 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -73,6 +73,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-ssa-address.h" #include "output.h" #include "builtins.h" +#include "opts.h" /* Some systems use __main in a way incompatible with its use in gcc, in these cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to @@ -6845,8 +6846,9 @@ pass_expand::execute (function *fun) if (crtl->tail_call_emit) fixup_tail_calls (); - unsigned HOST_WIDE_INT patch_area_size = function_entry_patch_area_size; - unsigned HOST_WIDE_INT patch_area_entry = function_entry_patch_area_start; + HOST_WIDE_INT patch_area_size, patch_area_entry; + parse_and_check_patch_area (flag_patchable_function_entry, false, + &patch_area_size, &patch_area_entry); tree patchable_function_entry_attr = lookup_attribute ("patchable_function_entry", diff --git a/gcc/common.opt b/gcc/common.opt index a8a2b67a99d..c75dd36843e 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -144,14 +144,6 @@ 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 enum dwarf_gnat_encodings gnat_encodings = DWARF_GNAT_ENCODINGS_DEFAULT @@ -2309,7 +2301,7 @@ Common Var(flag_profile_reorder_functions) Optimization Enable function reordering that improves code placement. fpatchable-function-entry= -Common Joined Optimization +Common Var(flag_patchable_function_entry) Joined Optimization Insert NOP instructions at each function entry. frandom-seed diff --git a/gcc/opts.c b/gcc/opts.c index 1f1cf8388f7..fc5f61e13cc 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -2130,6 +2130,44 @@ check_alignment_argument (location_t loc, const char *flag, const char *name, } } +/* Parse argument of -fpatchable-function-entry option ARG and store + corresponding values to PATCH_AREA_SIZE and PATCH_AREA_START. + If REPORT_ERROR is set to true, generate error for a problematic + option arguments. */ + +void +parse_and_check_patch_area (const char *arg, bool report_error, + HOST_WIDE_INT *patch_area_size, + HOST_WIDE_INT *patch_area_start) +{ + *patch_area_size = 0; + *patch_area_start = 0; + + if (arg == NULL) + return; + + char *patch_area_arg = xstrdup (arg); + char *comma = strchr (patch_area_arg, ','); + if (comma) + { + *comma = '\0'; + *patch_area_size = integral_argument (patch_area_arg); + *patch_area_start = integral_argument (comma + 1); + } + else + *patch_area_size = integral_argument (patch_area_arg); + + if (*patch_area_size < 0 + || *patch_area_size > USHRT_MAX + || *patch_area_start < 0 + || *patch_area_start > USHRT_MAX + || *patch_area_size < *patch_area_start) + if (report_error) + error ("invalid arguments for %<-fpatchable-function-entry%>"); + + free (patch_area_arg); +} + /* Print help when OPT__help_ is set. */ void @@ -2671,30 +2709,9 @@ common_handle_option (struct gcc_options *opts, case OPT_fpatchable_function_entry_: { - char *patch_area_arg = xstrdup (arg); - char *comma = strchr (patch_area_arg, ','); - if (comma) - { - *comma = '\0'; - function_entry_patch_area_size = - integral_argument (patch_area_arg); - function_entry_patch_area_start = - integral_argument (comma + 1); - } - else - { - function_entry_patch_area_size = - integral_argument (patch_area_arg); - function_entry_patch_area_start = 0; - } - if (function_entry_patch_area_size < 0 - || function_entry_patch_area_size > USHRT_MAX - || function_entry_patch_area_start < 0 - || function_entry_patch_area_start > USHRT_MAX - || function_entry_patch_area_size - < function_entry_patch_area_start) - error ("invalid arguments for %<-fpatchable-function-entry%>"); - free (patch_area_arg); + HOST_WIDE_INT patch_area_size, patch_area_start; + parse_and_check_patch_area (arg, true, &patch_area_size, + &patch_area_start); } break; diff --git a/gcc/opts.h b/gcc/opts.h index a6ed2e3953e..bafc790112b 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -475,6 +475,10 @@ extern bool parse_and_check_align_values (const char *flag, bool report_error, location_t loc); +extern void parse_and_check_patch_area (const char *arg, bool report_error, + HOST_WIDE_INT *patch_area_size, + HOST_WIDE_INT *patch_area_start); + extern void parse_options_from_collect_gcc_options (const char *, obstack *, int *); diff --git a/gcc/toplev.c b/gcc/toplev.c index a8947a735ff..05bd449eafc 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1725,10 +1725,14 @@ process_options (void) flag_sanitize &= ~SANITIZE_HWADDRESS; } + HOST_WIDE_INT patch_area_size, patch_area_start; + parse_and_check_patch_area (flag_patchable_function_entry, false, + &patch_area_size, &patch_area_start); + /* Do not use IPA optimizations for register allocation if profiler is active or patchable function entries are inserted for run-time instrumentation or port does not emit prologue and epilogue as RTL. */ - if (profile_flag || function_entry_patch_area_size + if (profile_flag || patch_area_size || !targetm.have_prologue () || !targetm.have_epilogue ()) flag_ipa_ra = 0; -- 2.30.2