summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Smith <dsmith@redhat.com>2008-04-11 09:52:55 -0500
committerDavid Smith <dsmith@redhat.com>2008-04-11 09:52:55 -0500
commit342d3f9693ea4eead68ba8ff841132a7adc7776b (patch)
treeff28366732005e38c4cdd9db71196204c8a255d2
parent0f3f43c992867e6b1a963872b83ea1dcbf7ddd96 (diff)
downloadsystemtap-steved-342d3f9693ea4eead68ba8ff841132a7adc7776b.tar.gz
systemtap-steved-342d3f9693ea4eead68ba8ff841132a7adc7776b.tar.xz
systemtap-steved-342d3f9693ea4eead68ba8ff841132a7adc7776b.zip
2008-04-11 David Smith <dsmith@redhat.com>
* elaborate.h (struct derived_probe_group): Added emit_module_header virtual function. * translate.cxx (c_unparser::emit_common_header): Calls each probe group's emit_module_header function. (translate_pass): Moved inclusion of linux/marker.h to mark_derived_probe_group::emit_module_header(). * tapsets.cxx (struct be_derived_probe_group): Added empty emit_module_header function. (struct timer_derived_probe_group): Ditto. (struct profile_derived_probe_group): Ditto. (struct procfs_derived_probe_group): Ditto. (struct hrtimer_derived_probe_group): Ditto. (struct perfmon_derived_probe_group): Ditto. (dwarf_derived_probe_group::emit_module_header): Moved kprobes kernel check from emit_module_decls() to here. (uprobe_derived_probe_group::emit_module_header): Moved uprobe kernel check from emit_module_decls() to here. (uprobe_derived_probe_group::emit_module_decls): Moved uprobe kernel check to emit_module_header(). (mark_derived_probe_group::emit_module_header): Moved marker kernel check from emit_module_decls and translate_pass() to here. (uprobe_derived_probe_group::emit_module_decls): Moved marker kernel check to emit_module_header().
-rw-r--r--ChangeLog26
-rw-r--r--elaborate.h6
-rw-r--r--tapsets.cxx53
-rw-r--r--translate.cxx9
4 files changed, 80 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 65660ac0..cbf6e83e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2008-04-11 David Smith <dsmith@redhat.com>
+
+ * elaborate.h (struct derived_probe_group): Added
+ emit_module_header virtual function.
+ * translate.cxx (c_unparser::emit_common_header): Calls each probe
+ group's emit_module_header function.
+ (translate_pass): Moved inclusion of linux/marker.h to
+ mark_derived_probe_group::emit_module_header().
+ * tapsets.cxx (struct be_derived_probe_group): Added empty
+ emit_module_header function.
+ (struct timer_derived_probe_group): Ditto.
+ (struct profile_derived_probe_group): Ditto.
+ (struct procfs_derived_probe_group): Ditto.
+ (struct hrtimer_derived_probe_group): Ditto.
+ (struct perfmon_derived_probe_group): Ditto.
+ (dwarf_derived_probe_group::emit_module_header): Moved kprobes
+ kernel check from emit_module_decls() to here.
+ (uprobe_derived_probe_group::emit_module_header): Moved uprobe
+ kernel check from emit_module_decls() to here.
+ (uprobe_derived_probe_group::emit_module_decls): Moved uprobe
+ kernel check to emit_module_header().
+ (mark_derived_probe_group::emit_module_header): Moved marker
+ kernel check from emit_module_decls and translate_pass() to here.
+ (uprobe_derived_probe_group::emit_module_decls): Moved marker
+ kernel check to emit_module_header().
+
2008-04-10 Frank Ch. Eigler <fche@elastic.org>
PR 2949.
diff --git a/elaborate.h b/elaborate.h
index 30bf5bce..f53f3870 100644
--- a/elaborate.h
+++ b/elaborate.h
@@ -150,6 +150,12 @@ struct derived_probe_group
{
virtual ~derived_probe_group () {}
+ virtual void emit_module_header (systemtap_session& s) = 0;
+ // The _header-generated code may assume that only basic includes
+ // have been generated. _header is called near the start of the
+ // code generation process, before the context, embedded-C code,
+ // etc. are generated.
+
virtual void emit_module_decls (systemtap_session& s) = 0;
// The _decls-generated code may assume that declarations such as
// the context, embedded-C code, function and probe handler bodies
diff --git a/tapsets.cxx b/tapsets.cxx
index ceda9015..a7f8034e 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -104,6 +104,7 @@ struct be_derived_probe: public derived_probe
struct be_derived_probe_group: public generic_dpg<be_derived_probe>
{
public:
+ void emit_module_header (systemtap_session& ) { };
void emit_module_decls (systemtap_session& s);
void emit_module_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
@@ -2068,6 +2069,7 @@ private:
public:
void enroll (dwarf_derived_probe* probe);
+ void emit_module_header (systemtap_session& s);
void emit_module_decls (systemtap_session& s);
void emit_module_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
@@ -3927,17 +3929,22 @@ dwarf_derived_probe_group::enroll (dwarf_derived_probe* p)
void
-dwarf_derived_probe_group::emit_module_decls (systemtap_session& s)
+dwarf_derived_probe_group::emit_module_header (systemtap_session& s)
{
if (probes_by_module.empty()) return;
- s.op->newline() << "/* ---- dwarf probes ---- */";
-
- // Warn of misconfigured kernels
+ // Warn of misconfigured kernels
s.op->newline() << "#if ! defined(CONFIG_KPROBES)";
s.op->newline() << "#error \"Need CONFIG_KPROBES!\"";
s.op->newline() << "#endif";
- s.op->newline();
+}
+
+void
+dwarf_derived_probe_group::emit_module_decls (systemtap_session& s)
+{
+ if (probes_by_module.empty()) return;
+
+ s.op->newline() << "/* ---- dwarf probes ---- */";
// Forward declare the master entry functions
s.op->newline() << "static int enter_kprobe_probe (struct kprobe *inst,";
@@ -4264,6 +4271,7 @@ struct uprobe_derived_probe: public derived_probe
struct uprobe_derived_probe_group: public generic_dpg<uprobe_derived_probe>
{
public:
+ void emit_module_header (systemtap_session& s);
void emit_module_decls (systemtap_session& s);
void emit_module_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
@@ -4313,10 +4321,9 @@ struct uprobe_builder: public derived_probe_builder
void
-uprobe_derived_probe_group::emit_module_decls (systemtap_session& s)
+uprobe_derived_probe_group::emit_module_header (systemtap_session& s)
{
if (probes.empty()) return;
- s.op->newline() << "/* ---- user probes ---- */";
// If uprobes isn't in the kernel, pull it in from the runtime.
s.op->newline() << "#if defined(CONFIG_UPROBES) || defined(CONFIG_UPROBES_MODULE)";
@@ -4324,6 +4331,14 @@ uprobe_derived_probe_group::emit_module_decls (systemtap_session& s)
s.op->newline() << "#else";
s.op->newline() << "#include \"uprobes/uprobes.h\"";
s.op->newline() << "#endif";
+}
+
+
+void
+uprobe_derived_probe_group::emit_module_decls (systemtap_session& s)
+{
+ if (probes.empty()) return;
+ s.op->newline() << "/* ---- user probes ---- */";
s.op->newline() << "struct stap_uprobe {";
s.op->newline(1) << "union { struct uprobe up; struct uretprobe urp; };";
@@ -4442,6 +4457,7 @@ struct timer_derived_probe_group: public generic_dpg<timer_derived_probe>
{
void emit_interval (translator_output* o);
public:
+ void emit_module_header (systemtap_session& ) { };
void emit_module_decls (systemtap_session& s);
void emit_module_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
@@ -4583,6 +4599,7 @@ struct profile_derived_probe: public derived_probe
struct profile_derived_probe_group: public generic_dpg<profile_derived_probe>
{
public:
+ void emit_module_header (systemtap_session& ) { };
void emit_module_decls (systemtap_session& s);
void emit_module_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
@@ -4711,6 +4728,7 @@ profile_derived_probe_group::emit_module_exit (systemtap_session& s)
}
+
// ------------------------------------------------------------------------
// procfs file derived probes
// ------------------------------------------------------------------------
@@ -4749,6 +4767,7 @@ public:
has_read_probes(false), has_write_probes(false) {}
void enroll (procfs_derived_probe* probe);
+ void emit_module_header (systemtap_session& ) { };
void emit_module_decls (systemtap_session& s);
void emit_module_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
@@ -5189,6 +5208,7 @@ procfs_builder::build(systemtap_session & sess,
}
+
// ------------------------------------------------------------------------
// statically inserted macro-based derived probes
// ------------------------------------------------------------------------
@@ -5223,6 +5243,7 @@ struct mark_derived_probe: public derived_probe
struct mark_derived_probe_group: public generic_dpg<mark_derived_probe>
{
public:
+ void emit_module_header (systemtap_session& s);
void emit_module_decls (systemtap_session& s);
void emit_module_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
@@ -5661,18 +5682,26 @@ mark_derived_probe::initialize_probe_context_vars (translator_output* o)
void
-mark_derived_probe_group::emit_module_decls (systemtap_session& s)
+mark_derived_probe_group::emit_module_header (systemtap_session& s)
{
if (probes.empty())
return;
- s.op->newline() << "/* ---- marker probes ---- */";
-
// Warn of misconfigured kernels
s.op->newline() << "#if ! defined(CONFIG_MARKERS)";
s.op->newline() << "#error \"Need CONFIG_MARKERS!\"";
s.op->newline() << "#endif";
+ s.op->newline() << "#include <linux/marker.h>";
s.op->newline();
+}
+
+void
+mark_derived_probe_group::emit_module_decls (systemtap_session& s)
+{
+ if (probes.empty())
+ return;
+
+ s.op->newline() << "/* ---- marker probes ---- */";
s.op->newline() << "struct stap_marker_probe {";
s.op->newline(1) << "const char * const name;";
@@ -5887,6 +5916,7 @@ mark_builder::build(systemtap_session & sess,
}
+
// ------------------------------------------------------------------------
// hrtimer derived probes
// ------------------------------------------------------------------------
@@ -5928,6 +5958,7 @@ struct hrtimer_derived_probe_group: public generic_dpg<hrtimer_derived_probe>
{
void emit_interval (translator_output* o);
public:
+ void emit_module_header (systemtap_session& ) { };
void emit_module_decls (systemtap_session& s);
void emit_module_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
@@ -6180,6 +6211,7 @@ timer_builder::register_patterns(match_node *root)
}
+
// ------------------------------------------------------------------------
// perfmon derived probes
// ------------------------------------------------------------------------
@@ -6282,6 +6314,7 @@ public:
struct perfmon_derived_probe_group: public generic_dpg<perfmon_derived_probe>
{
public:
+ void emit_module_header (systemtap_session& ) { };
void emit_module_decls (systemtap_session&) {}
void emit_module_init (systemtap_session&) {}
void emit_module_exit (systemtap_session&) {}
diff --git a/translate.cxx b/translate.cxx
index c9ec094a..ba848d43 100644
--- a/translate.cxx
+++ b/translate.cxx
@@ -849,6 +849,11 @@ translator_output::line ()
void
c_unparser::emit_common_header ()
{
+ vector<derived_probe_group*> g = all_session_groups (*session);
+ for (unsigned i=0; i<g.size(); i++)
+ g[i]->emit_module_header (*session);
+
+ o->newline();
o->newline() << "typedef char string_t[MAXSTRINGLEN];";
o->newline();
o->newline() << "#define STAP_SESSION_STARTING 0";
@@ -4526,10 +4531,6 @@ translate_pass (systemtap_session& s)
s.op->newline() << "#define read_trylock(x) ({ read_lock(x); 1; })";
s.op->newline() << "#endif";
- s.op->newline() << "#if defined(CONFIG_MARKERS)";
- s.op->newline() << "#include <linux/marker.h>";
- s.op->newline() << "#endif";
-
s.up->emit_common_header (); // context etc.
for (unsigned i=0; i<s.embeds.size(); i++)