summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordsmith <dsmith>2006-08-28 17:59:50 +0000
committerdsmith <dsmith>2006-08-28 17:59:50 +0000
commitdc38c0ae43f0c98b203866eeeb88070d32db2c8d (patch)
tree830f0e353042f693a1fbe1e1bd5b895010e46673
parent30da8acfcbaef6bf88d806b8ded4195b88df7f39 (diff)
downloadsystemtap-steved-dc38c0ae43f0c98b203866eeeb88070d32db2c8d.tar.gz
systemtap-steved-dc38c0ae43f0c98b203866eeeb88070d32db2c8d.tar.xz
systemtap-steved-dc38c0ae43f0c98b203866eeeb88070d32db2c8d.zip
2006-08-28 David Smith <dsmith@redhat.com>
* translate.cxx: Added inclusion of session.h. (translate_pass): Instead of asking each probe to emit itself, we ask the session's probes member variable to emit all the probes. * tapsets.cxx: Added inclusion of session.h. Added a register_probe member function to all derived_probe based classes. Added a derived_probe_group derived class for all probe types: (be_derived_probe_group): New class. (never_derived_probe_group): New class. (dwarf_derived_probe_group): New class. (timer_derived_probe_group): New class. (profile_derived_probe_group): New class. (mark_derived_probe_group): New class. (hrtimer_derived_probe_group): New class (derived_probe_group_container): New class. * elaborate.h: Removed inclusion of session.h since session.h now includes elaborate.h. (derived_probe): Added register_probe member function. (derived_probe_group): Added class definition. This is the base class of all of the derived probe groups - dwarf, timer, etc. (derived_probe_group_container): Added class definition. An instance of this class will be stored in the session and contain all the other probe groups. * elaborate.cxx (derived_probe_group::register_probe): Added derived_probe_group::register_probe stubs. (alias_derived_probe::register_probe): Added register_probe member function. (semantic_pass_symbols): After deriving a probe, the probes now register themselves with the session. * session.h: Includes elaborate.h to get derived_probe_group_container definition. systemtap_session class 'probes' member variable switched from a vector of derived probes to a derived_probe_group_container. * buildrun.cxx: Added inclusion of session.h since it was removed from elaborate.h. * main.cxx: Added inclusion of session.h since it was removed from elaborate.h. * parse.h: Added forward struct declarations. * staptree.h: Removed inclusion of session.h.
-rw-r--r--ChangeLog42
-rw-r--r--buildrun.cxx1
-rw-r--r--elaborate.cxx57
-rw-r--r--elaborate.h63
-rw-r--r--main.cxx1
-rw-r--r--parse.h25
-rw-r--r--session.h5
-rw-r--r--staptree.h1
-rw-r--r--tapsets.cxx342
-rw-r--r--translate.cxx7
10 files changed, 534 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index ce77eb5e..660dc07a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,45 @@
+2006-08-28 David Smith <dsmith@redhat.com>
+
+ * translate.cxx: Added inclusion of session.h.
+ (translate_pass): Instead of asking each probe to emit itself, we
+ ask the session's probes member variable to emit all the probes.
+ * tapsets.cxx: Added inclusion of session.h. Added a
+ register_probe member function to all derived_probe based
+ classes. Added a derived_probe_group derived class for all probe
+ types:
+ (be_derived_probe_group): New class.
+ (never_derived_probe_group): New class.
+ (dwarf_derived_probe_group): New class.
+ (timer_derived_probe_group): New class.
+ (profile_derived_probe_group): New class.
+ (mark_derived_probe_group): New class.
+ (hrtimer_derived_probe_group): New class
+ (derived_probe_group_container): New class.
+ * elaborate.h: Removed inclusion of session.h since session.h now
+ includes elaborate.h.
+ (derived_probe): Added register_probe member function.
+ (derived_probe_group): Added class definition. This is the base
+ class of all of the derived probe groups - dwarf, timer, etc.
+ (derived_probe_group_container): Added class definition. An
+ instance of this class will be stored in the session and contain
+ all the other probe groups.
+ * elaborate.cxx (derived_probe_group::register_probe): Added
+ derived_probe_group::register_probe stubs.
+ (alias_derived_probe::register_probe): Added register_probe member
+ function.
+ (semantic_pass_symbols): After deriving a probe, the probes now
+ register themselves with the session.
+ * session.h: Includes elaborate.h to get
+ derived_probe_group_container definition. systemtap_session class
+ 'probes' member variable switched from a vector of derived probes
+ to a derived_probe_group_container.
+ * buildrun.cxx: Added inclusion of session.h since it was removed
+ from elaborate.h.
+ * main.cxx: Added inclusion of session.h since it was removed
+ from elaborate.h.
+ * parse.h: Added forward struct declarations.
+ * staptree.h: Removed inclusion of session.h.
+
2006-08-23 Josh Stone <joshua.i.stone@intel.com>
PR 3093
diff --git a/buildrun.cxx b/buildrun.cxx
index 8573fbf6..4c869fa2 100644
--- a/buildrun.cxx
+++ b/buildrun.cxx
@@ -8,6 +8,7 @@
#include "config.h"
#include "buildrun.h"
+#include "session.h"
#include <fstream>
#include <sstream>
diff --git a/elaborate.cxx b/elaborate.cxx
index dd0cb0c4..957f5ea5 100644
--- a/elaborate.cxx
+++ b/elaborate.cxx
@@ -10,6 +10,7 @@
#include "elaborate.h"
#include "parse.h"
#include "tapsets.h"
+#include "session.h"
extern "C" {
#include <sys/utsname.h>
@@ -70,6 +71,58 @@ derived_probe::derived_probe (probe *p, probe_point *l):
// ------------------------------------------------------------------------
+// Members of derived_probe_group
+
+void
+derived_probe_group::register_probe(be_derived_probe* p)
+{
+ throw semantic_error ("unexpected registration of a be_derived_probe");
+}
+
+
+void
+derived_probe_group::register_probe(dwarf_derived_probe* p)
+{
+ throw semantic_error ("unexpected registration of a dwarf_derived_probe");
+}
+
+
+void
+derived_probe_group::register_probe(hrtimer_derived_probe* p)
+{
+ throw semantic_error ("unexpected registration of a hrtimer_derived_probe");
+}
+
+
+void
+derived_probe_group::register_probe(mark_derived_probe* p)
+{
+ throw semantic_error ("unexpected registration of a mark_derived_probe");
+}
+
+
+void
+derived_probe_group::register_probe(never_derived_probe* p)
+{
+ throw semantic_error ("unexpected registration of a never_derived_probe");
+}
+
+
+void
+derived_probe_group::register_probe(profile_derived_probe* p)
+{
+ throw semantic_error ("unexpected registration of a profile_derived_probe");
+}
+
+
+void
+derived_probe_group::register_probe(timer_derived_probe* p)
+{
+ throw semantic_error ("unexpected registration of a timer_derived_probe");
+}
+
+
+// ------------------------------------------------------------------------
// Members of derived_probe_builder
bool
@@ -330,6 +383,8 @@ struct alias_derived_probe: public derived_probe
{
alias_derived_probe (probe* base): derived_probe (base) {}
+ void register_probe (systemtap_session& s) { }
+
// alias probes should be ultimately expanded to other derived_probe
// types, and not themselves emitted.
void emit_registrations (translator_output* o) { throw semantic_error ("inappropriate", this->tok); }
@@ -882,7 +937,7 @@ semantic_pass_symbols (systemtap_session& s)
for (unsigned j=0; j<dps.size(); j++)
{
derived_probe* dp = dps[j];
- s.probes.push_back (dp);
+ dp->register_probe (s);
try
{
diff --git a/elaborate.h b/elaborate.h
index 9a10283c..9cb5b88e 100644
--- a/elaborate.h
+++ b/elaborate.h
@@ -9,7 +9,6 @@
#ifndef ELABORATE_H
#define ELABORATE_H
-#include "session.h"
#include "staptree.h"
#include "parse.h"
#include <string>
@@ -116,6 +115,8 @@ struct derived_probe: public probe
virtual ~derived_probe () {}
+ virtual void register_probe (systemtap_session& s) = 0;
+
virtual void emit_registrations (translator_output* o) = 0;
// (from within module_init):
// rc = ..... register_or_whatever (ENTRYFN);
@@ -148,6 +149,33 @@ public:
// ------------------------------------------------------------------------
+struct be_derived_probe;
+struct dwarf_derived_probe;
+struct hrtimer_derived_probe;
+struct mark_derived_probe;
+struct never_derived_probe;
+struct profile_derived_probe;
+struct timer_derived_probe;
+struct unparser;
+
+struct derived_probe_group
+{
+ virtual ~derived_probe_group () {}
+
+ virtual void register_probe(be_derived_probe* p);
+ virtual void register_probe(dwarf_derived_probe* p);
+ virtual void register_probe(hrtimer_derived_probe* p);
+ virtual void register_probe(mark_derived_probe* p);
+ virtual void register_probe(never_derived_probe* p);
+ virtual void register_probe(profile_derived_probe* p);
+ virtual void register_probe(timer_derived_probe* p);
+ virtual size_t size () = 0;
+
+ virtual void emit_probes (translator_output* op, unparser* up) = 0;
+};
+
+// ------------------------------------------------------------------------
+
struct derived_probe_builder
{
virtual void build(systemtap_session & sess,
@@ -218,4 +246,37 @@ void derive_probes (systemtap_session& s,
symbol * get_symbol_within_expression (expression *e);
+struct unparser;
+
+struct derived_probe_group_container: public derived_probe_group
+{
+private:
+ std::vector<derived_probe*> probes;
+ derived_probe_group* be_probe_group;
+ derived_probe_group* dwarf_probe_group;
+ derived_probe_group* hrtimer_probe_group;
+ derived_probe_group* mark_probe_group;
+ derived_probe_group* never_probe_group;
+ derived_probe_group* profile_probe_group;
+ derived_probe_group* timer_probe_group;
+
+public:
+ derived_probe_group_container ();
+ ~derived_probe_group_container ();
+
+ void register_probe (be_derived_probe* p);
+ void register_probe (dwarf_derived_probe* p);
+ void register_probe (hrtimer_derived_probe* p);
+ void register_probe (mark_derived_probe* p);
+ void register_probe (never_derived_probe* p);
+ void register_probe (profile_derived_probe* p);
+ void register_probe (timer_derived_probe* p);
+ size_t size () { return (probes.size ()); }
+
+ derived_probe* operator[] (size_t n) { return (probes[n]); }
+
+ void emit_probes (translator_output* op, unparser* up);
+};
+
+
#endif // ELABORATE_H
diff --git a/main.cxx b/main.cxx
index 0e584b5b..ddd91fe2 100644
--- a/main.cxx
+++ b/main.cxx
@@ -14,6 +14,7 @@
#include "elaborate.h"
#include "translate.h"
#include "buildrun.h"
+#include "session.h"
#include <iostream>
#include <fstream>
diff --git a/parse.h b/parse.h
index a3b337c1..335cbe53 100644
--- a/parse.h
+++ b/parse.h
@@ -59,6 +59,8 @@ struct parse_error: public std::runtime_error
};
+struct systemtap_session;
+
class lexer
{
public:
@@ -77,6 +79,29 @@ private:
};
+struct stapfile;
+struct probe;
+struct probe_alias;
+struct vardecl;
+struct functiondecl;
+struct embeddedcode;
+struct probe_point;
+struct literal;
+struct block;
+struct for_loop;
+struct statement;
+struct if_statement;
+struct foreach_loop;
+struct expr_statement;
+struct return_statement;
+struct delete_statement;
+struct break_statement;
+struct next_statement;
+struct continue_statement;
+struct indexable;
+struct expression;
+struct hist_op;
+
class parser
{
public:
diff --git a/session.h b/session.h
index b9f86991..50e06437 100644
--- a/session.h
+++ b/session.h
@@ -9,6 +9,7 @@
#ifndef SESSION_H
#define SESSION_H
+#include "elaborate.h"
#include <string>
#include <vector>
#include <iostream>
@@ -21,7 +22,7 @@ struct match_node;
struct stapfile;
struct vardecl;
struct functiondecl;
-struct derived_probe;
+struct derived_probe_group_container;
struct embeddedcode;
struct translator_output;
struct unparser;
@@ -94,7 +95,7 @@ struct systemtap_session
std::vector<stapfile*> files;
std::vector<vardecl*> globals;
std::vector<functiondecl*> functions;
- std::vector<derived_probe*> probes;
+ derived_probe_group_container probes;
std::vector<embeddedcode*> embeds;
std::map<std::string, statistic_decl> stat_decls;
// XXX: vector<*> instead please?
diff --git a/staptree.h b/staptree.h
index 9ece20f6..8c18f276 100644
--- a/staptree.h
+++ b/staptree.h
@@ -9,7 +9,6 @@
#ifndef STAPTREE_H
#define STAPTREE_H
-#include "session.h"
#include <map>
#include <stack>
#include <set>
diff --git a/tapsets.cxx b/tapsets.cxx
index 2aa5e1b7..1d491cc2 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -12,6 +12,7 @@
#include "elaborate.h"
#include "tapsets.h"
#include "translate.h"
+#include "session.h"
#include <deque>
#include <iostream>
@@ -198,12 +199,27 @@ struct be_derived_probe: public derived_probe
be_derived_probe (probe* p, probe_point* l, bool b):
derived_probe (p, l), begin (b) {}
+ void register_probe (systemtap_session& s);
+
void emit_registrations (translator_output* o);
void emit_deregistrations (translator_output* o);
void emit_probe_entries (translator_output* o);
};
+struct be_derived_probe_group: public derived_probe_group
+{
+private:
+ vector<be_derived_probe*> probes;
+
+public:
+ virtual void register_probe(be_derived_probe* p) { probes.push_back (p); }
+ virtual size_t size () { return probes.size (); }
+
+ virtual void emit_probes (translator_output* op, unparser* up);
+};
+
+
struct be_builder: public derived_probe_builder
{
bool begin;
@@ -220,6 +236,13 @@ struct be_builder: public derived_probe_builder
void
+be_derived_probe::register_probe(systemtap_session& s)
+{
+ s.probes.register_probe(this);
+}
+
+
+void
be_derived_probe::emit_registrations (translator_output* o)
{
if (begin)
@@ -270,6 +293,17 @@ be_derived_probe::emit_probe_entries (translator_output* o)
}
+void
+be_derived_probe_group::emit_probes (translator_output* op, unparser* up)
+{
+ for (unsigned i=0; i < probes.size(); i++)
+ {
+ op->newline ();
+ up->emit_probe (probes[i]);
+ }
+}
+
+
// ------------------------------------------------------------------------
// never probes are never run
// ------------------------------------------------------------------------
@@ -279,12 +313,34 @@ struct never_derived_probe: public derived_probe
never_derived_probe (probe* p): derived_probe (p) {}
never_derived_probe (probe* p, probe_point* l): derived_probe (p, l) {}
+ void register_probe (systemtap_session& s);
+
void emit_registrations (translator_output* o);
void emit_deregistrations (translator_output* o);
void emit_probe_entries (translator_output* o);
};
+struct never_derived_probe_group: public derived_probe_group
+{
+private:
+ vector<never_derived_probe*> probes;
+
+public:
+ virtual void register_probe(never_derived_probe* p) { probes.push_back (p); }
+ virtual size_t size () { return probes.size (); }
+
+ virtual void emit_probes (translator_output* op, unparser* up);
+};
+
+
+void
+never_derived_probe::register_probe(systemtap_session& s)
+{
+ s.probes.register_probe(this);
+}
+
+
struct never_builder: public derived_probe_builder
{
never_builder() {}
@@ -317,6 +373,15 @@ never_derived_probe::emit_probe_entries (translator_output* o)
}
+void
+never_derived_probe_group::emit_probes (translator_output* op, unparser* up)
+{
+ for (unsigned i=0; i < probes.size(); i++)
+ {
+ op->newline ();
+ up->emit_probe (probes[i]);
+ }
+}
// ------------------------------------------------------------------------
// Dwarf derived probes.
@@ -1718,6 +1783,8 @@ struct dwarf_derived_probe : public derived_probe
vector<Dwarf_Addr> probe_points;
bool has_return;
+ void register_probe (systemtap_session& s);
+
void add_probe_point(string const & funcname,
char const * filename,
int line,
@@ -1742,6 +1809,20 @@ struct dwarf_derived_probe : public derived_probe
virtual void emit_probe_entries (translator_output * o);
};
+
+struct dwarf_derived_probe_group: public derived_probe_group
+{
+private:
+ vector<dwarf_derived_probe*> probes;
+
+public:
+ virtual void register_probe(dwarf_derived_probe* p) { probes.push_back (p); }
+ virtual size_t size () { return probes.size (); }
+
+ virtual void emit_probes (translator_output* op, unparser* up);
+};
+
+
// Helper struct to thread through the dwfl callbacks.
struct
dwarf_query
@@ -2939,6 +3020,13 @@ dwarf_var_expanding_copy_visitor::visit_target_symbol (target_symbol *e)
void
+dwarf_derived_probe::register_probe(systemtap_session& s)
+{
+ s.probes.register_probe(this);
+}
+
+
+void
dwarf_derived_probe::add_probe_point(string const & funcname,
char const * filename,
int line,
@@ -3375,6 +3463,17 @@ dwarf_derived_probe::emit_probe_entries (translator_output* o)
void
+dwarf_derived_probe_group::emit_probes (translator_output* op, unparser* up)
+{
+ for (unsigned i=0; i < probes.size(); i++)
+ {
+ op->newline ();
+ up->emit_probe (probes[i]);
+ }
+}
+
+
+void
dwarf_builder::build(systemtap_session & sess,
probe * base,
probe_point * location,
@@ -3464,6 +3563,8 @@ struct timer_derived_probe: public derived_probe
timer_derived_probe (probe* p, probe_point* l, int64_t i, int64_t r, bool ms=false);
+ virtual void register_probe (systemtap_session& s);
+
virtual void emit_registrations (translator_output * o);
virtual void emit_deregistrations (translator_output * o);
virtual void emit_probe_entries (translator_output * o);
@@ -3486,6 +3587,13 @@ timer_derived_probe::timer_derived_probe (probe* p, probe_point* l, int64_t i, i
void
+timer_derived_probe::register_probe(systemtap_session& s)
+{
+ s.probes.register_probe(this);
+}
+
+
+void
timer_derived_probe::emit_registrations (translator_output* o)
{
o->newline() << "init_timer (& timer_" << name << ");";
@@ -3540,6 +3648,30 @@ timer_derived_probe::emit_probe_entries (translator_output* o)
}
+struct timer_derived_probe_group: public derived_probe_group
+{
+private:
+ vector<timer_derived_probe*> probes;
+
+public:
+ virtual void register_probe(timer_derived_probe* p) { probes.push_back (p); }
+ virtual size_t size () { return probes.size (); }
+
+ virtual void emit_probes (translator_output* op, unparser* up);
+};
+
+
+void
+timer_derived_probe_group::emit_probes (translator_output* op, unparser* up)
+{
+ for (unsigned i=0; i < probes.size(); i++)
+ {
+ op->newline ();
+ up->emit_probe (probes[i]);
+ }
+}
+
+
struct timer_builder: public derived_probe_builder
{
bool time_is_msecs;
@@ -3581,6 +3713,8 @@ struct profile_derived_probe: public derived_probe
profile_derived_probe (systemtap_session &s, probe* p, probe_point* l);
+ void register_probe (systemtap_session& s);
+
virtual void emit_registrations (translator_output * o);
virtual void emit_deregistrations (translator_output * o);
virtual void emit_probe_entries (translator_output * o);
@@ -3604,6 +3738,13 @@ profile_derived_probe::profile_derived_probe (systemtap_session &s, probe* p, pr
void
+profile_derived_probe::register_probe(systemtap_session& s)
+{
+ s.probes.register_probe(this);
+}
+
+
+void
profile_derived_probe::emit_registrations (translator_output* o)
{
if (using_rpn)
@@ -3660,6 +3801,31 @@ profile_derived_probe::emit_probe_entries (translator_output* o)
}
+struct profile_derived_probe_group: public derived_probe_group
+{
+private:
+ vector<profile_derived_probe*> probes;
+
+public:
+ virtual void register_probe(profile_derived_probe* p) {
+ probes.push_back (p); }
+ virtual size_t size () { return probes.size (); }
+
+ virtual void emit_probes (translator_output* op, unparser* up);
+};
+
+
+void
+profile_derived_probe_group::emit_probes (translator_output* op, unparser* up)
+{
+ for (unsigned i=0; i < probes.size(); i++)
+ {
+ op->newline ();
+ up->emit_probe (probes[i]);
+ }
+}
+
+
struct profile_builder: public derived_probe_builder
{
profile_builder() {}
@@ -3692,6 +3858,8 @@ struct mark_derived_probe: public derived_probe
string module;
string probe_sig_expanded;
+ void register_probe (systemtap_session& s);
+
void emit_registrations (translator_output * o);
void emit_deregistrations (translator_output * o);
void emit_probe_entries (translator_output * o);
@@ -3809,6 +3977,13 @@ mark_derived_probe::mark_derived_probe (systemtap_session &s,
void
+mark_derived_probe::register_probe(systemtap_session& s)
+{
+ s.probes.register_probe(this);
+}
+
+
+void
mark_derived_probe::emit_probe_context_vars (translator_output* o)
{
// Save incoming arguments
@@ -3904,6 +4079,29 @@ mark_derived_probe::emit_deregistrations (translator_output * o)
}
+struct mark_derived_probe_group: public derived_probe_group
+{
+private:
+ vector<mark_derived_probe*> probes;
+
+public:
+ virtual void register_probe(mark_derived_probe* p) { probes.push_back (p); }
+ virtual size_t size () { return probes.size (); }
+
+ virtual void emit_probes (translator_output* op, unparser* up);
+};
+
+
+void
+mark_derived_probe_group::emit_probes (translator_output* op, unparser* up)
+{
+ for (unsigned i=0; i < probes.size(); i++)
+ {
+ op->newline ();
+ up->emit_probe (probes[i]);
+ }
+}
+
struct symboltable_extract
{
@@ -4114,6 +4312,8 @@ struct hrtimer_derived_probe: public derived_probe
// so we don't have to loop over them in the other functions
}
+ void register_probe (systemtap_session& s);
+
virtual void emit_interval (translator_output * o);
virtual void emit_registrations (translator_output * o);
@@ -4123,6 +4323,13 @@ struct hrtimer_derived_probe: public derived_probe
void
+hrtimer_derived_probe::register_probe(systemtap_session& s)
+{
+ s.probes.register_probe(this);
+}
+
+
+void
hrtimer_derived_probe::emit_interval (translator_output* o)
{
o->line() << "({";
@@ -4194,6 +4401,30 @@ hrtimer_derived_probe::emit_probe_entries (translator_output* o)
}
+struct hrtimer_derived_probe_group: public derived_probe_group
+{
+private:
+ vector<hrtimer_derived_probe*> probes;
+
+public:
+ virtual void register_probe(hrtimer_derived_probe* p) { probes.push_back (p); }
+ virtual size_t size () { return probes.size (); }
+
+ virtual void emit_probes (translator_output* op, unparser* up);
+};
+
+
+void
+hrtimer_derived_probe_group::emit_probes (translator_output* op, unparser* up)
+{
+ for (unsigned i=0; i < probes.size(); i++)
+ {
+ op->newline ();
+ up->emit_probe (probes[i]);
+ }
+}
+
+
struct hrtimer_builder: public derived_probe_builder
{
hrtimer_builder() {}
@@ -4348,3 +4579,114 @@ register_standard_tapsets(systemtap_session & s)
s.pattern_root->bind("kernel")->bind_str("mark")->bind(new mark_builder());
s.pattern_root->bind_str("module")->bind_str("mark")->bind(new mark_builder());
}
+
+
+derived_probe_group_container::derived_probe_group_container ():
+ be_probe_group(new be_derived_probe_group),
+ dwarf_probe_group(new dwarf_derived_probe_group),
+ hrtimer_probe_group(new hrtimer_derived_probe_group),
+ mark_probe_group(new mark_derived_probe_group),
+ never_probe_group(new never_derived_probe_group),
+ profile_probe_group(new profile_derived_probe_group),
+ timer_probe_group(new timer_derived_probe_group)
+{
+}
+
+
+derived_probe_group_container::~derived_probe_group_container ()
+{
+ delete be_probe_group;
+ delete dwarf_probe_group;
+ delete hrtimer_probe_group;
+ delete mark_probe_group;
+ delete never_probe_group;
+ delete profile_probe_group;
+ delete timer_probe_group;
+}
+
+
+void
+derived_probe_group_container::register_probe(be_derived_probe* p)
+{
+ probes.push_back (p);
+ be_probe_group->register_probe(p);
+}
+
+
+void
+derived_probe_group_container::register_probe(dwarf_derived_probe* p)
+{
+ probes.push_back (p);
+ dwarf_probe_group->register_probe(p);
+}
+
+
+void
+derived_probe_group_container::register_probe(hrtimer_derived_probe* p)
+{
+ probes.push_back (p);
+ hrtimer_probe_group->register_probe(p);
+}
+
+
+void
+derived_probe_group_container::register_probe(mark_derived_probe* p)
+{
+ probes.push_back (p);
+ mark_probe_group->register_probe(p);
+}
+
+
+void
+derived_probe_group_container::register_probe(never_derived_probe* p)
+{
+ probes.push_back (p);
+ never_probe_group->register_probe(p);
+}
+
+
+void
+derived_probe_group_container::register_probe(profile_derived_probe* p)
+{
+ probes.push_back (p);
+ profile_probe_group->register_probe(p);
+}
+
+
+void
+derived_probe_group_container::register_probe(timer_derived_probe* p)
+{
+ probes.push_back (p);
+ timer_probe_group->register_probe(p);
+}
+
+
+void
+derived_probe_group_container::emit_probes (translator_output* op,
+ unparser* up)
+{
+ // Sanity check.
+ size_t groups_size = be_probe_group->size ()
+ + dwarf_probe_group->size ()
+ + hrtimer_probe_group->size ()
+ + mark_probe_group->size ()
+ + never_probe_group->size ()
+ + profile_probe_group->size ()
+ + timer_probe_group->size ();
+ if (probes.size () != groups_size)
+ {
+ cerr << "There are " << probes.size () << " total probes, and "
+ << groups_size << " grouped probes\n";
+
+ throw runtime_error("internal probe mismatch");
+ }
+
+ // Let each probe group emit its probes.
+ be_probe_group->emit_probes (op, up);
+ dwarf_probe_group->emit_probes (op, up);
+ hrtimer_probe_group->emit_probes (op, up);
+ mark_probe_group->emit_probes (op, up);
+ never_probe_group->emit_probes (op, up);
+ profile_probe_group->emit_probes (op, up);
+ timer_probe_group->emit_probes (op, up);
+}
diff --git a/translate.cxx b/translate.cxx
index 88eb9634..e10ae3c6 100644
--- a/translate.cxx
+++ b/translate.cxx
@@ -11,6 +11,7 @@
#include "staptree.h"
#include "elaborate.h"
#include "translate.h"
+#include "session.h"
#include <iostream>
#include <set>
#include <sstream>
@@ -3926,11 +3927,7 @@ translate_pass (systemtap_session& s)
s.up->emit_function (s.functions[i]);
}
- for (unsigned i=0; i<s.probes.size(); i++)
- {
- s.op->newline();
- s.up->emit_probe (s.probes[i]);
- }
+ s.probes.emit_probes (s.op, s.up);
s.op->newline();
s.up->emit_module_init ();