summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfche <fche>2005-08-02 18:03:17 +0000
committerfche <fche>2005-08-02 18:03:17 +0000
commita781f4011250a7d6450025a92336250044ab46eb (patch)
tree83f207ad0014565aeb28b2f5dda7b48e28f8feab
parent71696fcfa2761a2d09a0538c0101913f1c41925c (diff)
downloadsystemtap-steved-a781f4011250a7d6450025a92336250044ab46eb.tar.gz
systemtap-steved-a781f4011250a7d6450025a92336250044ab46eb.tar.xz
systemtap-steved-a781f4011250a7d6450025a92336250044ab46eb.zip
2005-08-02 Frank Ch. Eigler <fche@elastic.org>
* loc2.c (emit_loc_address): Emit interleaved declaration into its own nested { } block. * tapsets.cxx (literal_stmt_for_local): Emit deref_fault block unconditionally. * tapset/builtin_hexstring.stp: New builtin. * testsuite/buildok/six.stp: New test.
-rw-r--r--ChangeLog9
-rw-r--r--loc2c.c2
-rw-r--r--tapset/builtin_hexstring.stp7
-rw-r--r--tapsets.cxx18
-rwxr-xr-xtestsuite/buildok/six.stp5
5 files changed, 33 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 84a26b9c..751f70ca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2005-08-02 Frank Ch. Eigler <fche@elastic.org>
+ * loc2.c (emit_loc_address): Emit interleaved declaration into
+ its own nested { } block.
+ * tapsets.cxx (literal_stmt_for_local): Emit deref_fault block
+ unconditionally.
+ * tapset/builtin_hexstring.stp: New builtin.
+ * testsuite/buildok/six.stp: New test.
+
+2005-08-02 Frank Ch. Eigler <fche@elastic.org>
+
* tapsets.cxx (emit_registrations): Treat module_name="kernel"
as if module_name="".
diff --git a/loc2c.c b/loc2c.c
index e3cb3724..73f6ee32 100644
--- a/loc2c.c
+++ b/loc2c.c
@@ -1317,6 +1317,7 @@ emit_loc_address (FILE *out, struct location *loc, unsigned int indent,
emit ("%s", loc->address.program);
else
{
+ emit ("{\n");
emit ("%*s%s " STACKFMT, (indent + 1) * 2, "", STACK_TYPE, 0);
for (unsigned int i = 1; i < loc->address.stack_depth; ++i)
emit (", " STACKFMT, i);
@@ -1324,6 +1325,7 @@ emit_loc_address (FILE *out, struct location *loc, unsigned int indent,
emit ("%s%*s%s = " STACKFMT ";\n", loc->address.program,
(indent + 1) * 2, "", target, 0);
+ emit ("}\n");
}
}
diff --git a/tapset/builtin_hexstring.stp b/tapset/builtin_hexstring.stp
new file mode 100644
index 00000000..c441bbc4
--- /dev/null
+++ b/tapset/builtin_hexstring.stp
@@ -0,0 +1,7 @@
+function _hexstring (num) %{
+ sprintf (THIS->__retvalue, "%llx", (long long) THIS->num);
+%}
+
+function hexstring (num) {
+ return "" . _hexstring (num + 0)
+}
diff --git a/tapsets.cxx b/tapsets.cxx
index a51efad7..780f4c4f 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -581,15 +581,17 @@ dwflpp
assert(memstream);
bool deref = c_emit_location (memstream, head, 1);
+ fprintf(memstream, " goto out;\n");
- fprintf(memstream, "goto out;\n");
- if (deref)
- {
- fprintf(memstream,
- "deref_fault:\n"
- " c->errorcount++; \n"
- " goto out;\n\n");
- }
+ // dummy use of deref_fault label, to disable warning if deref() not used
+ fprintf(memstream, "if (0) goto deref_fault;\n");
+
+ // XXX: deref flag not reliable; emit fault label unconditionally
+ if (deref) ;
+ fprintf(memstream,
+ "deref_fault:\n"
+ " c->errorcount++; \n"
+ " goto out;\n");
fclose (memstream);
string result(buf);
diff --git a/testsuite/buildok/six.stp b/testsuite/buildok/six.stp
new file mode 100755
index 00000000..a63ad99b
--- /dev/null
+++ b/testsuite/buildok/six.stp
@@ -0,0 +1,5 @@
+#! stap -p4
+
+probe kernel.function("context_switch") {
+ log ("switch from=" . hexstring($prev) . " to=" . hexstring($next))
+}