From 8d5a7d1f8e00bf65bce222eb81a3f9efef74a36c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 7 Aug 2007 23:44:59 +0000 Subject: common.opt (finstrument-functions-exclude-function-list): New option. ./: * common.opt (finstrument-functions-exclude-function-list): New option. (finstrument-functions-exclude-file-list): New option. * opts.c (char_p): Define and DEF_VEC. (flag_instrument_functions_exclude_functions): New static variable. (flag_instrument_functions_exclude_files): New static variable. (add_instrument_functions_exclude_list): New static function. (flag_instrument_functions_exclude_p): New function. (common_handle_option): Handle new options. * flags.h (flag_instrument_functions_exclude_p): Declare. * gimplify.c (gimplify_function_tree): Call flag_instrument_functions_exclude_p. * doc/invoke.texi (Option Summary): Mention new options. (Code Gen Options): Document new options. testsuite/: * gcc.dg/instrument-1.c: New test. * gcc.dg/instrument-2.c: New test. * gcc.dg/instrument-3.c: New test. From-SVN: r127284 --- gcc/opts.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) (limited to 'gcc/opts.c') diff --git a/gcc/opts.c b/gcc/opts.c index d6f0ec1..21491fa 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -353,6 +353,15 @@ static bool flag_unroll_loops_set, flag_tracer_set; static bool flag_value_profile_transformations_set; static bool flag_peel_loops_set, flag_branch_probabilities_set; +/* Functions excluded from profiling. */ + +typedef char *char_p; /* For DEF_VEC_P. */ +DEF_VEC_P(char_p); +DEF_VEC_ALLOC_P(char_p,heap); + +static VEC(char_p,heap) *flag_instrument_functions_exclude_functions; +static VEC(char_p,heap) *flag_instrument_functions_exclude_files; + /* Input file names. */ const char **in_fnames; unsigned num_in_fnames; @@ -602,6 +611,87 @@ add_input_filename (const char *filename) in_fnames[num_in_fnames - 1] = filename; } +/* Add functions or file names to a vector of names to exclude from + instrumentation. */ + +static void +add_instrument_functions_exclude_list (VEC(char_p,heap) **pvec, + const char* arg) +{ + char *tmp; + char *r; + char *w; + char *token_start; + + /* We never free this string. */ + tmp = xstrdup (arg); + + r = tmp; + w = tmp; + token_start = tmp; + + while (*r != '\0') + { + if (*r == ',') + { + *w++ = '\0'; + ++r; + VEC_safe_push (char_p, heap, *pvec, token_start); + token_start = w; + } + if (*r == '\\' && r[1] == ',') + { + *w++ = ','; + r += 2; + } + else + *w++ = *r++; + } + if (*token_start != '\0') + VEC_safe_push (char_p, heap, *pvec, token_start); +} + +/* Return whether we should exclude FNDECL from instrumentation. */ + +bool +flag_instrument_functions_exclude_p (tree fndecl) +{ + if (VEC_length (char_p, flag_instrument_functions_exclude_functions) > 0) + { + const char *name; + int i; + char *s; + + name = lang_hooks.decl_printable_name (fndecl, 0); + for (i = 0; + VEC_iterate (char_p, flag_instrument_functions_exclude_functions, + i, s); + ++i) + { + if (strstr (name, s) != NULL) + return true; + } + } + + if (VEC_length (char_p, flag_instrument_functions_exclude_files) > 0) + { + const char *name; + int i; + char *s; + + name = DECL_SOURCE_FILE (fndecl); + for (i = 0; + VEC_iterate (char_p, flag_instrument_functions_exclude_files, i, s); + ++i) + { + if (strstr (name, s) != NULL) + return true; + } + } + + return false; +} + /* Decode and handle the vector of command line options. LANG_MASK contains has a single bit set representing the current language. */ @@ -1474,6 +1564,16 @@ common_handle_option (size_t scode, const char *arg, int value, set_param_value ("max-inline-insns-auto", value / 2); break; + case OPT_finstrument_functions_exclude_function_list_: + add_instrument_functions_exclude_list + (&flag_instrument_functions_exclude_functions, arg); + break; + + case OPT_finstrument_functions_exclude_file_list_: + add_instrument_functions_exclude_list + (&flag_instrument_functions_exclude_files, arg); + break; + case OPT_fmessage_length_: pp_set_line_maximum_length (global_dc->printer, value); break; -- cgit v1.1