summaryrefslogtreecommitdiffstats
path: root/tapsets.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'tapsets.cxx')
-rw-r--r--tapsets.cxx57
1 files changed, 53 insertions, 4 deletions
diff --git a/tapsets.cxx b/tapsets.cxx
index 3dbbfa81..97c538ee 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -1166,19 +1166,68 @@ dwarf_builder::build(systemtap_session & sess,
#endif /* HAVE_ELFUTILS_LIBDWFL_H */
+// ------------------------------------------------------------------------
+// Built-in function support class
+// ------------------------------------------------------------------------
+
+token *
+builtin_function::id(string const & name)
+{
+ token *t = new token;
+ t->type = tok_identifier;
+ t->content = name;
+ t->location.file = "<builtin>";
+ return t;
+}
+
+builtin_function::builtin_function(exp_type ty, string const & name)
+{
+ f = new functiondecl;
+ f->tok = id(name);
+ f->name = name;
+ f->type = ty;
+ f->body = NULL;
+}
+
+builtin_function &
+builtin_function::arg(exp_type e, string const & name)
+{
+ vardecl *arg = new vardecl;
+ arg->name = name;
+ arg->tok = id(name);
+ arg->type = e;
+ f->formal_args.push_back(arg);
+ return *this;
+}
+
+void
+builtin_function::bind(systemtap_session & s)
+{
+ for (unsigned i = 0; i < s.functions.size(); ++i)
+ {
+ if (s.functions[i]->name == f->name)
+ throw semantic_error("builtin function " + f->name + " registered twice");
+ }
+ s.functions.push_back(f);
+}
// ------------------------------------------------------------------------
// Standard tapset registry.
// ------------------------------------------------------------------------
void
-register_standard_tapsets(match_node * root)
+register_standard_tapsets(systemtap_session & s)
{
// Rudimentary binders for begin and end targets
- root->bind("begin")->bind(new be_builder(true));
- root->bind("end")->bind(new be_builder(false));
+ s.pattern_root->bind("begin")->bind(new be_builder(true));
+ s.pattern_root->bind("end")->bind(new be_builder(false));
#ifdef HAVE_ELFUTILS_LIBDWFL_H
- dwarf_derived_probe::register_patterns(root);
+ dwarf_derived_probe::register_patterns(s.pattern_root);
#endif /* HAVE_ELFUTILS_LIBDWFL_H */
+
+ // Some standard builtins
+ builtin_function(pe_long, "printk").arg(pe_string, "message").bind(s);
+ builtin_function(pe_long, "log").arg(pe_string, "message").bind(s);
+ builtin_function(pe_long, "warn").arg(pe_string, "message").bind(s);
}