summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--NEWS4
-rw-r--r--elaborate.cxx36
-rw-r--r--examples/ChangeLog5
-rw-r--r--examples/futexes.stp2
-rwxr-xr-xexamples/sig_by_proc.stp2
-rwxr-xr-xexamples/small_demos/rwtiming.stp5
-rw-r--r--main.cxx14
-rw-r--r--session.h3
-rw-r--r--stap.1.in3
-rw-r--r--testsuite/ChangeLog5
-rw-r--r--testsuite/systemtap.base/warnings.exp16
-rw-r--r--testsuite/systemtap.base/warnings.stp9
13 files changed, 102 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 56783eec..7e6861c3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/NEWS b/NEWS
index ff6f1370..b093d78f 100644
--- a/NEWS
+++ b/NEWS
@@ -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
diff --git a/main.cxx b/main.cxx
index 09435fad..7d4b8133 100644
--- a/main.cxx
+++ b/main.cxx
@@ -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':
diff --git a/session.h b/session.h
index 1c0e1890..b7fb64ea 100644
--- a/session.h
+++ b/session.h
@@ -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. */
diff --git a/stap.1.in b/stap.1.in
index ffca672f..8b23c595 100644
--- a/stap.1.in
+++ b/stap.1.in
@@ -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()) }