summaryrefslogtreecommitdiffstats
path: root/loc2c.c
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2009-02-18 12:53:08 -0800
committerJosh Stone <jistone@redhat.com>2009-02-18 12:53:08 -0800
commit23ad66b41ded81502948584816390c634f66c5ee (patch)
treedb900ca0141a16152c3bf27395cd4975cad6a1ab /loc2c.c
parent2aa2ccb83142c3bf98ac8ee1558a0ee72dff3a1f (diff)
parent482fe2af17347b472232c5d7c4b26e53606e395e (diff)
downloadsystemtap-steved-23ad66b41ded81502948584816390c634f66c5ee.tar.gz
systemtap-steved-23ad66b41ded81502948584816390c634f66c5ee.tar.xz
systemtap-steved-23ad66b41ded81502948584816390c634f66c5ee.zip
Enable typecasting with @cast
println(@cast(myptr, "task_struct")->pid) println(@cast(myptr, "task_struct", "kernel")->pid) Merge branch 'typecast', bump ChangeLog entries to push date
Diffstat (limited to 'loc2c.c')
-rw-r--r--loc2c.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/loc2c.c b/loc2c.c
index fc2ccd1e..7cae16cd 100644
--- a/loc2c.c
+++ b/loc2c.c
@@ -1021,6 +1021,43 @@ c_translate_location (struct obstack *pool,
return NULL;
}
+/* Translate a C fragment for a direct argument VALUE. On errors, call FAIL,
+ which should not return. Any later errors will use FAIL and FAIL_ARG from
+ this translate call. On success, return the fragment created. */
+struct location *
+c_translate_argument (struct obstack *pool,
+ void (*fail) (void *arg, const char *fmt, ...)
+ __attribute__ ((noreturn, format (printf, 2, 3))),
+ void *fail_arg,
+ void (*emit_address) (void *fail_arg,
+ struct obstack *, Dwarf_Addr),
+ int indent, const char *value)
+{
+ indent += 2;
+
+ obstack_printf(pool, "%*saddr = %s;\n", indent * 2, "", value);
+ obstack_1grow (pool, '\0');
+ char *program = obstack_finish (pool);
+
+ struct location *loc = obstack_alloc (pool, sizeof *loc);
+ loc->next = NULL;
+ loc->fail = fail;
+ loc->fail_arg = fail_arg;
+ loc->emit_address = emit_address;
+ loc->ops = NULL;
+ loc->nops = 0;
+ loc->byte_size = 0;
+ loc->type = loc_address;
+ loc->frame_base = NULL;
+ loc->address.declare = NULL;
+ loc->address.program = program;
+ loc->address.stack_depth = 0;
+ loc->address.used_deref = false;
+
+ return loc;
+}
+
+
/* Emit "uintNN_t TARGET = ...;". */
static bool
emit_base_fetch (struct obstack *pool, Dwarf_Word byte_size,