]> git.cworth.org Git - apitrace/commitdiff
trim: Prune uninteresting calls while trimming (unless --no-prune is passed)
authorCarl Worth <cworth@cworth.org>
Sat, 11 Aug 2012 18:33:12 +0000 (11:33 -0700)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 22 Nov 2012 08:02:58 +0000 (08:02 +0000)
Examine the CALL_FLAG_UNINTERESTING flag and leave out these calls
when trimming. These calls are generally the calls that have no side
effects, (such as query functions). Some calls without side effects
might be considered interesting, (such as glGetError returning a
non-zero error).

This pruning behavior can be avoided by passing the new --no-prune
option (or the new --exact option which is identical to passing both
--no-prune and -no-deps).

cli/cli_trim.cpp

index 75670af93f7f7ce9b281a40f6edd3e115569732a..80a1b640a9890409a1d11a65dd54bc37375d205e 100644 (file)
@@ -48,12 +48,37 @@ usage(void)
         << synopsis << "\n"
         "\n"
         "    -h, --help               Show this help message and exit\n"
-        "        --calls=CALLSET      Include specified calls in the trimmed output\n"
+        "\n"
+        "        --calls=CALLSET      Include specified calls in the trimmed output.\n"
+        "                             Note that due to dependency analysis and pruning\n"
+        "                             of uninteresting calls the resulting trace may\n"
+        "                             include more and less calls than specified.\n"
+        "                             See --no-deps, --no-prune, and --exact to change\n"
+        "                             this behavior.\n"
+        "\n"
         "        --deps               Perform dependency analysis and include dependent\n"
-        "                             calls as needed. This is the default behavior.\n"
-        "        --no-deps            Do not perform dependency analysis. Include only\n"
-        "                             those calls explicitly listed in --calls\n"
+        "                             calls as needed, (even if those calls were not\n"
+        "                             explicitly requested with --calls). This is the\n"
+        "                             default behavior. See --no-deps and --exact.\n"
+        "\n"
+        "        --no-deps            Do not perform dependency analysis. In this mode\n"
+        "                             the trimmed trace will never include calls from\n"
+        "                             outside the range specified in --calls.\n"
+        "\n"
+        "        --prune              Omit calls that have no side effects, even if the\n"
+        "                             call is within the range specified by --calls.\n"
+        "                             This is the default behavior. See --no-prune\n"
+        "\n"
+        "        --no-prune           Do not prune uninteresting calls from the trace.\n"
+        "                             In this mode the trimmed trace will never omit\n"
+        "                             any calls within the range specified in --calls.\n"
+        "\n"
+        "    -x, --exact              Trim the trace to exactly the calls specified in\n"
+        "                             --calls. This option is equivalent to passing\n"
+        "                             both --no-deps and --no-prune.\n"
+        "\n"
         "        --thread=THREAD_ID   Only retain calls from specified thread\n"
+        "\n"
         "    -o, --output=TRACE_FILE  Output trace file\n"
         "\n"
     ;
@@ -63,11 +88,13 @@ enum {
     CALLS_OPT = CHAR_MAX + 1,
     DEPS_OPT,
     NO_DEPS_OPT,
+    PRUNE_OPT,
+    NO_PRUNE_OPT,
     THREAD_OPT,
 };
 
 const static char *
-shortOptions = "ho:";
+shortOptions = "ho:x";
 
 const static struct option
 longOptions[] = {
@@ -75,6 +102,9 @@ longOptions[] = {
     {"calls", required_argument, 0, CALLS_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},
+    {"exact", no_argument, 0, 'x'},
     {"thread", required_argument, 0, THREAD_OPT},
     {"output", required_argument, 0, 'o'},
     {0, 0, 0, 0}
@@ -136,6 +166,9 @@ struct trim_options {
     /* Whether dependency analysis should be performed. */
     bool dependency_analysis;
 
+    /* Whether uninteresting calls should be pruned.. */
+    bool prune_uninteresting;
+
     /* Output filename */
     std::string output;
 
@@ -166,6 +199,11 @@ trim_trace(const char *filename, struct trim_options *options)
         if (options->thread != -1 && call->thread_id != options->thread)
             continue;
 
+        /* Also, prune if uninteresting (unless the user asked for no pruning. */
+        if (options->prune_uninteresting && call->flags & trace::CALL_FLAG_UNINTERESTING) {
+            continue;
+        }
+
         /* If this call is included in the user-specified call
          * set, then we don't need to perform any analysis on
          * it. We know it must be included. */
@@ -216,6 +254,7 @@ command(int argc, char *argv[])
 
     options.calls = trace::CallSet(trace::FREQUENCY_ALL);
     options.dependency_analysis = true;
+    options.prune_uninteresting = true;
     options.output = "";
     options.thread = -1;
 
@@ -234,6 +273,16 @@ command(int argc, char *argv[])
         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 'x':
+            options.dependency_analysis = false;
+            options.prune_uninteresting = false;
+            break;
         case THREAD_OPT:
             options.thread = atoi(optarg);
             break;