diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | elaborate.cxx | 36 | ||||
-rw-r--r-- | examples/ChangeLog | 5 | ||||
-rw-r--r-- | examples/futexes.stp | 2 | ||||
-rwxr-xr-x | examples/sig_by_proc.stp | 2 | ||||
-rwxr-xr-x | examples/small_demos/rwtiming.stp | 5 | ||||
-rw-r--r-- | main.cxx | 14 | ||||
-rw-r--r-- | session.h | 3 | ||||
-rw-r--r-- | stap.1.in | 3 | ||||
-rw-r--r-- | testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | testsuite/systemtap.base/warnings.exp | 16 | ||||
-rw-r--r-- | testsuite/systemtap.base/warnings.stp | 9 |
13 files changed, 102 insertions, 12 deletions
@@ -1,5 +1,15 @@ 2007-10-05 Frank Ch. Eigler <fche@elastic.org> + PR 1119 + * elaborate.cxx (semantic_pass_opt[12]): Warn on elided + variables/functions in user script. + * session.h (suppress_warnings): New field. Change + "timing" to plain old bool. + * main.cxx (main): Configure warnings on by default. + * stap.1.in: Document this. + +2007-10-05 Frank Ch. Eigler <fche@elastic.org> + PR 5036 * systemtap.spec.in: Create new systemtap-testsuite sub-rpm. Install crash(8)'s staplog.so into -runtime sub-rpm if built. @@ -1,5 +1,9 @@ * What's new in version 0.6 / since version 0.5.15? +- Systemtap will warn you if your script contains unused variables or + functions. This is helpful in case of misspelled variables. If it + doth protest too much, turn it off with "stap -w ...". + - You can add error-handling probes to a script, which are run if a script was stopped due to errors. In such a case, "end" probes are not run, but "error" ones are. diff --git a/elaborate.cxx b/elaborate.cxx index 621e1a72..d86cc37d 100644 --- a/elaborate.cxx +++ b/elaborate.cxx @@ -1372,7 +1372,10 @@ void semantic_pass_opt1 (systemtap_session& s, bool& relaxed_p) { if (ftv.traversed.find(s.functions[i]) == ftv.traversed.end()) { - if (s.verbose>2) + if (s.functions[i]->tok->location.file == s.user_file->name && // !tapset + ! s.suppress_warnings) + clog << "WARNING: eliding unused function " << *s.functions[i]->tok << endl; + else if (s.verbose>2) clog << "Eliding unused function " << s.functions[i]->name << endl; if (s.tapset_compile_coverage) { @@ -1412,10 +1415,14 @@ void semantic_pass_opt2 (systemtap_session& s, bool& relaxed_p) for (unsigned j=0; j<s.probes[i]->locals.size(); /* see below */) { vardecl* l = s.probes[i]->locals[j]; + if (vut.read.find (l) == vut.read.end() && vut.written.find (l) == vut.written.end()) { - if (s.verbose>2) + if (l->tok->location.file == s.user_file->name && // !tapset + ! s.suppress_warnings) + clog << "WARNING: eliding unused variable " << *l->tok << endl; + else if (s.verbose>2) clog << "Eliding unused local variable " << l->name << " in " << s.probes[i]->name << endl; if (s.tapset_compile_coverage) { @@ -1436,7 +1443,10 @@ void semantic_pass_opt2 (systemtap_session& s, bool& relaxed_p) if (vut.read.find (l) == vut.read.end() && vut.written.find (l) == vut.written.end()) { - if (s.verbose>2) + if (l->tok->location.file == s.user_file->name && // !tapset + ! s.suppress_warnings) + clog << "WARNING: eliding unused variable " << *l->tok << endl; + else if (s.verbose>2) clog << "Eliding unused local variable " << l->name << " in function " << s.functions[i]->name << endl; @@ -1457,7 +1467,10 @@ void semantic_pass_opt2 (systemtap_session& s, bool& relaxed_p) if (vut.read.find (l) == vut.read.end() && vut.written.find (l) == vut.written.end()) { - if (s.verbose>2) + if (l->tok->location.file == s.user_file->name && // !tapset + ! s.suppress_warnings) + clog << "WARNING: eliding unused variable " << *l->tok << endl; + else if (s.verbose>2) clog << "Eliding unused global variable " << l->name << endl; if (s.tapset_compile_coverage) { @@ -1529,9 +1542,17 @@ dead_assignment_remover::visit_assignment (assignment* e) e->left->visit (& vut); if (vut.side_effect_free ()) // XXX: use _wrt() once we track focal_vars { + /* PR 1119: NB: This is not necessary here. A write-only + variable will also be elided soon at the next _opt2 iteration. + if (e->left->tok->location.file == session.user_file->name && // !tapset + ! session.suppress_warnings) + clog << "WARNING: eliding write-only " << *e->left->tok << endl; + else + */ if (session.verbose>2) clog << "Eliding assignment to " << leftvar->name << " at " << *e->tok << endl; + *current_expr = e->right; // goodbye assignment* relaxed_p = false; } @@ -1653,6 +1674,13 @@ dead_stmtexpr_remover::visit_expr_statement (expr_statement *s) if (vut.side_effect_free_wrt (focal_vars) && *current_stmt == s) // we're not nested any deeper than expected { + /* PR 1119: NB: this message is not a good idea here. It can + name some arbitrary RHS expression of an assignment. + if (s->value->tok->location.file == session.user_file->name && // not tapset + ! session.suppress_warnings) + clog << "WARNING: eliding read-only " << *s->value->tok << endl; + else + */ if (session.verbose>2) clog << "Eliding side-effect-free expression " << *s->tok << endl; diff --git a/examples/ChangeLog b/examples/ChangeLog index a6e2e840..a4df876c 100644 --- a/examples/ChangeLog +++ b/examples/ChangeLog @@ -1,3 +1,8 @@ +2007-10-05 Frank Ch. Eigler <fche@elastic.org> + + * futexes.stp, sig_by_proc.stp, small_demos/rwtiming.stp: Fix elision + warnings. + 2007-09-15 Wenji Huang <wenji.huang@oracle.com> * iostat-scsi.stp: Make module probe optional,clarify reference to flags. diff --git a/examples/futexes.stp b/examples/futexes.stp index 78af3c92..515a8db6 100644 --- a/examples/futexes.stp +++ b/examples/futexes.stp @@ -5,7 +5,7 @@ global thread_thislock # short global thread_blocktime # -global FUTEX_WAIT = 0, FUTEX_WAKE = 1 +global FUTEX_WAIT = 0 /*, FUTEX_WAKE = 1 */ global lock_waits # long-lived stats on (tid,lock) blockage elapsed time global process_names # long-lived pid-to-execname mapping diff --git a/examples/sig_by_proc.stp b/examples/sig_by_proc.stp index 192f3d34..18b236d3 100755 --- a/examples/sig_by_proc.stp +++ b/examples/sig_by_proc.stp @@ -11,7 +11,7 @@ # Print signal counts by process name in descending order. # -global sigcnt, pid2name, sig2name +global sigcnt, sig2name probe begin { print("Collecting data... Type Ctrl-C to exit and display results\n") diff --git a/examples/small_demos/rwtiming.stp b/examples/small_demos/rwtiming.stp index c5a9aed3..d570c581 100755 --- a/examples/small_demos/rwtiming.stp +++ b/examples/small_demos/rwtiming.stp @@ -50,7 +50,10 @@ probe kernel.function("sys_write").return { probe end { foreach(name+ in names) { # sort by names printf ("process: %s\n", name) - if (opens[name]) printf ("opens n=%d\n", opens[name]) + if (opens[name]) { + printf ("opens n=%d\n", opens[name]) + print (@hist_log(time_opens[name])) + } if (@count(reads[name])) { printf ("reads n=%d, sum=%d, avg=%d\n", @count(reads[name]), # extracting stat results @@ -71,6 +71,7 @@ usage (systemtap_session& s, int exitcode) << " -V show version" << endl << " -k keep temporary directory" << endl << " -u unoptimized translation" << (s.unoptimized ? " [set]" : "") << endl + << " -w suppress warnings" << (s.suppress_warnings ? " [set]" : "") << endl << " -g guru mode" << (s.guru_mode ? " [set]" : "") << endl << " -P prologue-searching for function probes" << (s.prologue_searching ? " [set]" : "") << endl @@ -200,10 +201,11 @@ main (int argc, char * const argv []) s.kernel_release = string (buf.release); s.architecture = string (buf.machine); s.verbose = 0; - s.timing = 0; + s.timing = false; s.guru_mode = false; s.bulk_mode = false; s.unoptimized = false; + s.suppress_warnings = false; #ifdef ENABLE_PROLOGUES s.prologue_searching = true; @@ -273,8 +275,8 @@ main (int argc, char * const argv []) while (true) { - // NB: also see find_hash(), help(), switch stmt below, stap.1 man page - int grc = getopt (argc, argv, "hVMvtp:I:e:o:R:r:m:kgPc:x:D:bs:uq"); + // NB: also see find_hash(), usage(), switch stmt below, stap.1 man page + int grc = getopt (argc, argv, "hVMvtp:I:e:o:R:r:m:kgPc:x:D:bs:uqw"); if (grc < 0) break; switch (grc) @@ -292,7 +294,11 @@ main (int argc, char * const argv []) break; case 't': - s.timing ++; + s.timing = true; + break; + + case 'w': + s.suppress_warnings = true; break; case 'p': @@ -85,12 +85,13 @@ struct systemtap_session int target_pid; int last_pass; unsigned verbose; - unsigned timing; + bool timing; bool keep_tmpdir; bool guru_mode; bool bulk_mode; bool unoptimized; bool merge; + bool suppress_warnings; int buffer_size; unsigned perfmon; bool symtab; /* true: emit symbol table at translation time; false: let staprun do it. */ @@ -104,6 +104,9 @@ debbugging information for $target variables. .B \-u Unoptimized mode. Disable unused code elision during elaboration. .TP +.B \-w +Suppressed warnings mode. Disable warning messages for elided code in user script. +.TP .BI \-b Use bulk mode (percpu files) for kernel-to-user data transfer. .TP diff --git a/testsuite/ChangeLog b/testsuite/ChangeLog index 7d400487..5e04e64f 100644 --- a/testsuite/ChangeLog +++ b/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-10-05 Frank Ch. Eigler <fche@elastic.org> + + PR 1119. + * systemtap.base/warnings.*: New test. + 2007-10-05 Martin Hunt <hunt@redhat.com> * buildok/aux_syscalls-embedded.stp: Add all embedded diff --git a/testsuite/systemtap.base/warnings.exp b/testsuite/systemtap.base/warnings.exp new file mode 100644 index 00000000..90409d18 --- /dev/null +++ b/testsuite/systemtap.base/warnings.exp @@ -0,0 +1,16 @@ +set test "warnings" + +spawn stap -p4 $srcdir/$subdir/warnings.stp +set ok 0 +expect { + -re {^WARNING:[^\r\n]*\r\n} { incr ok; exp_continue } + -re {^[^\r\n]*.ko\r\n} { incr ok; exp_continue } + timeout { fail "$test (timeout)" } + eof { } +} +wait +if {$ok == 6} { + pass $test +} else { + fail $test +} diff --git a/testsuite/systemtap.base/warnings.stp b/testsuite/systemtap.base/warnings.stp new file mode 100644 index 00000000..a0ce8d8d --- /dev/null +++ b/testsuite/systemtap.base/warnings.stp @@ -0,0 +1,9 @@ +# PR 1119 + +global elide_me1 + +function elide_me2 () {} + +function foo:long () { elide_me3 = 1 } + +probe never { elide_me4 = 1; (elide_me5+5); print (foo()) } |