X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=cli%2Fcli_trim.cpp;h=342e66b02e831c2b22a5d9a63d4a17e98c9a48d1;hb=ec8f5a61f393e75e4c3e3e22f84c773af66810e9;hp=5625a2c4f845ee2e0bccdba1cd24ed42c04b3ddb;hpb=25fe524415ade86b96e5d260134fab7de587b227;p=apitrace diff --git a/cli/cli_trim.cpp b/cli/cli_trim.cpp index 5625a2c..342e66b 100644 --- a/cli/cli_trim.cpp +++ b/cli/cli_trim.cpp @@ -53,9 +53,13 @@ usage(void) " --calls=CALLSET Include specified calls in the trimmed output.\n" " --frames=FRAMESET Include specified frames in the trimmed output.\n" " --deps Include additional calls to satisfy dependencies\n" - " --prune Omit uninteresting calls from the trace output\n" + " --no-deps Do not include any more calls than requestd\n" + " --prune Omit calls without side effects from the output\n" + " --no-prune Do not omit any requested calls\n" " -a, --auto Trim automatically to calls specified in --calls/--frames\n" " Equivalent to both --deps and --prune\n" + " --exact Trim to exactly the calls specified in --calls/--frames\n" + " Equivalent to both --no-deps and --no-prune\n" " --print-callset Print the final set of calls included in output\n" " --trim-spec=SPEC Only performing trimming as described in SPEC\n" " --thread=THREAD_ID Only retain calls from specified thread\n" @@ -78,15 +82,29 @@ help() " --deps Perform dependency analysis and include dependent\n" " calls as needed, (even if those calls were not\n" " explicitly requested with --calls or --frames).\n" + " (On by default. See --no-deps or --exact)\n" + " --no-deps Do not perform dependency analysis. Output will\n" + " not include any additional calls beyond those\n" + " explicitly requested with --calls or --frames).\n" "\n" " --prune Omit calls with no side effects, even if the call\n" " is within the range specified by --calls/--frames.\n" + " (On by default. See --no-prune or --exact)\n" + "\n" + " --no-prune Never omit any calls from the range specified\n" + " --calls/--frames.\n" "\n" " -a, --auto Use dependency analysis and pruning\n" " of uninteresting calls the resulting trace may\n" " include more and less calls than specified.\n" " This option is equivalent\n" - " to passing both --deps and --prune.\n" + " to passing both --deps and --prune and is on by\n" + " default (see --no-deps, --no-prune and --exact)\n" + "\n" + " --exact Trim output to exact the calls or frames\n" + " specified with --calls or --frames.\n" + " This option is equivalent\n" + " to passing both --no-deps and --no-prune.\n" "\n" " --print-callset Print to stdout the final set of calls included\n" " in the trim output. This can be useful for\n" @@ -117,10 +135,13 @@ enum { CALLS_OPT = CHAR_MAX + 1, FRAMES_OPT, DEPS_OPT, + NO_DEPS_OPT, PRUNE_OPT, + NO_PRUNE_OPT, THREAD_OPT, PRINT_CALLSET_OPT, - TRIM_SPEC_OPT + TRIM_SPEC_OPT, + EXACT_OPT }; const static char * @@ -132,8 +153,11 @@ longOptions[] = { {"calls", required_argument, 0, CALLS_OPT}, {"frames", required_argument, 0, FRAMES_OPT}, {"deps", no_argument, 0, DEPS_OPT}, + {"no-deps", no_argument, 0, NO_DEPS_OPT}, {"prune", no_argument, 0, PRUNE_OPT}, + {"no-prune", no_argument, 0, NO_PRUNE_OPT}, {"auto", no_argument, 0, 'a'}, + {"exact", no_argument, 0, EXACT_OPT}, {"thread", required_argument, 0, THREAD_OPT}, {"output", required_argument, 0, 'o'}, {"print-callset", no_argument, 0, PRINT_CALLSET_OPT}, @@ -179,7 +203,7 @@ trim_trace(const char *filename, struct trim_options *options) trace::ParseBookmark beginning; trace::Parser p; TraceAnalyzer analyzer(options->trim_flags); - std::set *required; + trace::FastCallSet *required; unsigned frame; int call_range_first, call_range_last; @@ -196,11 +220,11 @@ trim_trace(const char *filename, struct trim_options *options) trace::Call *call; while ((call = p.parse_call())) { - /* There's no use doing any work past the last call or frame + /* There's no use doing any work past the last call and frame * requested by the user. */ - if (call->no > options->calls.getLast() || - frame > options->frames.getLast()) { - + if ((options->calls.empty() || call->no > options->calls.getLast()) && + (options->frames.empty() || frame > options->frames.getLast())) { + delete call; break; } @@ -210,8 +234,8 @@ trim_trace(const char *filename, struct trim_options *options) goto NEXT; } - /* Also, prune if uninteresting (unless the user asked for no pruning. */ - if (options->prune_uninteresting && call->flags & trace::CALL_FLAG_VERBOSE) { + /* Also, prune if no side effects (unless the user asked for no pruning. */ + if (options->prune_uninteresting && call->flags & trace::CALL_FLAG_NO_SIDE_EFFECTS) { goto NEXT; } @@ -264,15 +288,15 @@ trim_trace(const char *filename, struct trim_options *options) call_range_last = -1; while ((call = p.parse_call())) { - /* There's no use doing any work past the last call or frame + /* There's no use doing any work past the last call and frame * requested by the user. */ - if (call->no > options->calls.getLast() || - frame > options->frames.getLast()) { + if ((options->calls.empty() || call->no > options->calls.getLast()) && + (options->frames.empty() || frame > options->frames.getLast())) { break; } - if (required->find(call->no) != required->end()) { + if (required->contains(call->no)) { writer.writeCall(call); if (options->print_callset) { @@ -349,8 +373,8 @@ command(int argc, char *argv[]) options.calls = trace::CallSet(trace::FREQUENCY_NONE); options.frames = trace::CallSet(trace::FREQUENCY_NONE); - options.dependency_analysis = false; - options.prune_uninteresting = false; + options.dependency_analysis = true; + options.prune_uninteresting = true; options.output = ""; options.thread = -1; options.print_callset = 0; @@ -371,13 +395,23 @@ command(int argc, char *argv[]) case DEPS_OPT: options.dependency_analysis = true; break; + case NO_DEPS_OPT: + options.dependency_analysis = false; + break; case PRUNE_OPT: options.prune_uninteresting = true; break; + case NO_PRUNE_OPT: + options.prune_uninteresting = false; + break; case 'a': options.dependency_analysis = true; options.prune_uninteresting = true; break; + case EXACT_OPT: + options.dependency_analysis = false; + options.prune_uninteresting = false; + break; case THREAD_OPT: options.thread = atoi(optarg); break;