summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2009-03-04 20:17:38 -0800
committerJosh Stone <jistone@redhat.com>2009-03-06 18:47:01 -0800
commit79189b84b112484901e5ee6b84a334da24791128 (patch)
tree0bb566ce7320d22fe560375610d1ac2eda2774de
parent75ead1f7f65c280a7a068e562dbb7b751f1f0de4 (diff)
downloadsystemtap-steved-79189b84b112484901e5ee6b84a334da24791128.tar.gz
systemtap-steved-79189b84b112484901e5ee6b84a334da24791128.tar.xz
systemtap-steved-79189b84b112484901e5ee6b84a334da24791128.zip
Build skeleton tracepoint probes
* tapsets.cxx (tracepoint_derived_probe): Create a skeleton probe (tracepoint_derived_probe_group): Create a skeleton group (tracepoint_query::handle_query_func): build a probe
-rw-r--r--tapsets.cxx83
1 files changed, 79 insertions, 4 deletions
diff --git a/tapsets.cxx b/tapsets.cxx
index adda3d19..f7bba968 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -9209,16 +9209,89 @@ mark_builder::build(systemtap_session & sess,
struct tracepoint_derived_probe: public derived_probe
{
- // TODO
+ tracepoint_derived_probe (systemtap_session& s,
+ dwflpp& dw, Dwarf_Die& func_die,
+ const string& tracepoint_name,
+ probe* base_probe, probe_point* location);
+
+ systemtap_session& sess;
+ string tracepoint_name;
+
+ void join_group (systemtap_session& s);
};
struct tracepoint_derived_probe_group: public generic_dpg<tracepoint_derived_probe>
{
- // TODO
+ void emit_module_decls (systemtap_session& s);
+ void emit_module_init (systemtap_session& s);
+ void emit_module_exit (systemtap_session& s);
};
+tracepoint_derived_probe::tracepoint_derived_probe (systemtap_session& s,
+ dwflpp& dw, Dwarf_Die& func_die,
+ const string& tracepoint_name,
+ probe* base, probe_point* loc):
+ derived_probe (base, new probe_point(*loc) /* .components soon rewritten */),
+ sess (s), tracepoint_name (tracepoint_name)
+{
+ // create synthetic probe point name; preserve condition
+ vector<probe_point::component*> comps;
+ comps.push_back (new probe_point::component (TOK_KERNEL));
+ comps.push_back (new probe_point::component (TOK_TRACE, new literal_string (tracepoint_name)));
+ this->sole_location()->components = comps;
+
+ if (sess.verbose > 2)
+ clog << "tracepoint-based " << name << " tracepoint='" << tracepoint_name
+ << "'" << endl;
+}
+
+
+void
+tracepoint_derived_probe::join_group (systemtap_session& s)
+{
+ if (! s.tracepoint_derived_probes)
+ s.tracepoint_derived_probes = new tracepoint_derived_probe_group ();
+ s.tracepoint_derived_probes->enroll (this);
+}
+
+
+void
+tracepoint_derived_probe_group::emit_module_decls (systemtap_session& s)
+{
+ if (probes.empty())
+ return;
+
+ s.op->newline() << "/* ---- tracepointer probes ---- */";
+
+ // TODO
+}
+
+
+void
+tracepoint_derived_probe_group::emit_module_init (systemtap_session &s)
+{
+ if (probes.size () == 0)
+ return;
+
+ s.op->newline() << "/* init tracepoint probes */";
+
+ // TODO
+}
+
+
+void
+tracepoint_derived_probe_group::emit_module_exit (systemtap_session& s)
+{
+ if (probes.empty())
+ return;
+
+ s.op->newline() << "/* deregister tracepointer probes */";
+ // TODO
+}
+
+
struct tracepoint_query : public base_query
{
tracepoint_query(dwflpp & dw, const string & tracepoint,
@@ -9269,8 +9342,10 @@ tracepoint_query::handle_query_func(Dwarf_Die * func)
assert(dw.function_name.compare(0, 10, "stapprobe_") == 0);
string tracepoint_instance = dw.function_name.substr(10);
- // TODO build a tracepoint_derived_probe
- clog << "DEBUG: found a tracepoint: " << tracepoint_instance << endl;
+ derived_probe *dp = new tracepoint_derived_probe (dw.sess, dw, *func,
+ tracepoint_instance,
+ base_probe, base_loc);
+ results.push_back (dp);
return DWARF_CB_OK;
}