summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.base/bitfield.stp
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2009-04-13 19:50:23 -0700
committerJosh Stone <jistone@redhat.com>2009-04-13 19:50:23 -0700
commitb9c2e81cc7a62336ec1daf374cb3411add772ab4 (patch)
treea4bd05ef043f77e6cfe8c78b6f24879f68689910 /testsuite/systemtap.base/bitfield.stp
parent675e4d2a0635f822e8258c3f219c6dda685c67cf (diff)
downloadsystemtap-steved-b9c2e81cc7a62336ec1daf374cb3411add772ab4.tar.gz
systemtap-steved-b9c2e81cc7a62336ec1daf374cb3411add772ab4.tar.xz
systemtap-steved-b9c2e81cc7a62336ec1daf374cb3411add772ab4.zip
PR10067: fix bitfield access
* tapsets.cxx (dwflpp::translate_components): Eliminate the extra die-dereference at the end of the loop (a regression from @casts). * runtime/loc2c-runtime.h (store_bitfield): Use the target as the representative type, since the base is always int64_t. Also be a bit more aggressive with masking and parentheses. * testsuite/systemtap.base/bitfield.*: New test for R/W bitfields.
Diffstat (limited to 'testsuite/systemtap.base/bitfield.stp')
-rw-r--r--testsuite/systemtap.base/bitfield.stp46
1 files changed, 46 insertions, 0 deletions
diff --git a/testsuite/systemtap.base/bitfield.stp b/testsuite/systemtap.base/bitfield.stp
new file mode 100644
index 00000000..c2ff4929
--- /dev/null
+++ b/testsuite/systemtap.base/bitfield.stp
@@ -0,0 +1,46 @@
+%{
+#include <linux/tcp.h>
+static struct tcphdr foo = {0};
+%}
+
+function get_ptr:long() %{ THIS->__retvalue = (long)&foo; /* pure */ %}
+function get_ack:long() %{ THIS->__retvalue = foo.ack; /* pure */ %}
+function get_urg:long() %{ THIS->__retvalue = foo.urg; /* pure */ %}
+
+function check:long(ack:long, urg:long) {
+ ptr = get_ptr()
+
+ /* set the bits with cast */
+ @cast(ptr, "tcphdr")->ack = ack
+ @cast(ptr, "tcphdr")->urg = urg
+
+ /* check that reading with embedded-C is ok */
+ real_ack = get_ack()
+ real_urg = get_urg()
+ errors = (ack != real_ack) + (urg != real_urg)
+
+ /* check that reading with a cast is ok */
+ cast_ack = @cast(ptr, "tcphdr")->ack
+ cast_urg = @cast(ptr, "tcphdr")->urg
+ errors += (ack != cast_ack) + (urg != cast_urg)
+
+ if (errors)
+ printf("bitfield had %d errors; expect(%d%d), real(%d%d), cast(%d%d)\n",
+ errors, ack, urg, real_ack, real_urg, cast_ack, cast_urg)
+
+ return errors
+}
+
+probe begin {
+ println("systemtap starting probe")
+
+ errors = check(0, 0)
+ errors += check(0, 1)
+ errors += check(1, 0)
+ errors += check(1, 1)
+
+ println("systemtap ending probe")
+ if (errors == 0)
+ println("systemtap test success")
+ exit()
+}