summaryrefslogtreecommitdiffstats
path: root/tapsets.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'tapsets.cxx')
-rw-r--r--tapsets.cxx17
1 files changed, 13 insertions, 4 deletions
diff --git a/tapsets.cxx b/tapsets.cxx
index a9ef2487..5335ea9c 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -3103,6 +3103,7 @@ dwarf_derived_probe_group::emit_module_decls (systemtap_session& s)
s.op->newline() << "static struct stap_dwarf_probe {";
s.op->newline(1) << "const unsigned return_p:1;";
s.op->newline() << "const unsigned maxactive_p:1;";
+ s.op->newline() << "const unsigned optional_p:1;";
s.op->newline() << "unsigned registered_p:1;";
s.op->newline() << "const unsigned short maxactive_val;";
@@ -3163,6 +3164,8 @@ dwarf_derived_probe_group::emit_module_decls (systemtap_session& s)
assert (p->maxactive_val >= 0 && p->maxactive_val <= USHRT_MAX);
s.op->line() << " .maxactive_val=" << p->maxactive_val << ",";
}
+ if (p->locations[0]->optional)
+ s.op->line() << " .optional_p=1,";
s.op->line() << " .address=(unsigned long)0x" << hex << p->addr << dec << "ULL,";
s.op->line() << " .module=\"" << p->module << "\",";
s.op->line() << " .section=\"" << p->section << "\",";
@@ -3266,8 +3269,9 @@ dwarf_derived_probe_group::emit_module_init (systemtap_session& s)
s.op->newline(-1) << "}";
s.op->newline() << "if (rc) {"; // PR6749: tolerate a failed register_*probe.
s.op->newline(1) << "sdp->registered_p = 0;";
- s.op->newline() << "_stp_warn (\"probe %s registration error (rc %d)\", probe_point, rc);";
- s.op->newline() << "rc = 0;"; // continue with other probes
+ s.op->newline() << "if (!sdp->optional_p)";
+ s.op->newline(1) << "_stp_warn (\"probe %s registration error (rc %d)\", probe_point, rc);";
+ s.op->newline(-1) << "rc = 0;"; // continue with other probes
// XXX: shall we increment numskipped?
s.op->newline(-1) << "}";
@@ -4611,6 +4615,7 @@ kprobe_derived_probe_group::emit_module_decls (systemtap_session& s)
s.op->newline() << "static struct stap_dwarfless_probe {";
s.op->newline(1) << "const unsigned return_p:1;";
s.op->newline() << "const unsigned maxactive_p:1;";
+ s.op->newline() << "const unsigned optional_p:1;";
s.op->newline() << "unsigned registered_p:1;";
s.op->newline() << "const unsigned short maxactive_val;";
@@ -4657,6 +4662,9 @@ kprobe_derived_probe_group::emit_module_decls (systemtap_session& s)
s.op->line() << " .maxactive_val=" << p->maxactive_val << ",";
}
+ if (p->locations[0]->optional)
+ s.op->line() << " .optional_p=1,";
+
if (p->has_statement)
s.op->line() << " .address=(unsigned long)0x" << hex << p->addr << dec << "ULL,";
else
@@ -4766,8 +4774,9 @@ kprobe_derived_probe_group::emit_module_init (systemtap_session& s)
s.op->newline(-1) << "}";
s.op->newline() << "if (rc) {"; // PR6749: tolerate a failed register_*probe.
s.op->newline(1) << "sdp->registered_p = 0;";
- s.op->newline() << "_stp_warn (\"probe %s registration error (rc %d)\", probe_point, rc);";
- s.op->newline() << "rc = 0;"; // continue with other probes
+ s.op->newline() << "if (!sdp->optional_p)";
+ s.op->newline(1) << "_stp_warn (\"probe %s registration error (rc %d)\", probe_point, rc);";
+ s.op->newline(-1) << "rc = 0;"; // continue with other probes
// XXX: shall we increment numskipped?
s.op->newline(-1) << "}";