callsite: extract instruction pointer from call sites
[lttng-ust.git] / liblttng-ust / tracepoint.c
index a93f286364550e1cf29a3388fa2f5b4a09d5adbf..6585daa848551cc03cac333f3e03cd8ffba78bf9 100644 (file)
@@ -138,7 +138,7 @@ static void debug_print_probes(struct tracepoint_entry *entry)
 
 static void *
 tracepoint_entry_add_probe(struct tracepoint_entry *entry,
-                          void *probe, void *data)
+                          void (*probe)(void), void *data)
 {
        int nr_probes = 0;
        struct tracepoint_probe *old, *new;
@@ -170,8 +170,8 @@ tracepoint_entry_add_probe(struct tracepoint_entry *entry,
 }
 
 static void *
-tracepoint_entry_remove_probe(struct tracepoint_entry *entry, void *probe,
-                             void *data)
+tracepoint_entry_remove_probe(struct tracepoint_entry *entry,
+                             void (*probe)(void), void *data)
 {
        int nr_probes = 0, nr_del = 0, i;
        struct tracepoint_probe *old, *new;
@@ -381,6 +381,43 @@ static void lib_update_tracepoints(void)
        }
 }
 
+/**
+ * tracepoint_update_callsite_range - Update a callsite range
+ * @begin: beginning of the range
+ * @end: end of the range
+ *
+ * Updates the range of tracepoint call sites.
+ */
+static
+void tracepoint_enable_callsite_range(struct tracepoint_callsite * const *begin,
+                                  struct tracepoint_callsite * const *end)
+{
+       struct tracepoint_callsite * const *iter;
+       int ret;
+
+       for (iter = begin; iter < end; iter++) {
+               if (!*iter)
+                       continue;       /* skip dummy */
+               ret = lttng_callsite_add(*iter);
+               assert(!ret);
+       }
+}
+
+static
+void tracepoint_disable_callsite_range(struct tracepoint_callsite * const *begin,
+                       struct tracepoint_callsite * const *end)
+{
+       struct tracepoint_callsite * const *iter;
+       int ret;
+
+       for (iter = begin; iter < end; iter++) {
+               if (!*iter)
+                       continue;       /* skip dummy */
+               ret = lttng_callsite_remove(*iter);
+               assert(!ret);
+       }
+}
+
 /*
  * Update probes, removing the faulty probes.
  */
@@ -391,7 +428,7 @@ static void tracepoint_update_probes(void)
 }
 
 static struct tracepoint_probe *
-tracepoint_add_probe(const char *name, void *probe, void *data,
+tracepoint_add_probe(const char *name, void (*probe)(void), void *data,
                const char *signature)
 {
        struct tracepoint_entry *entry;
@@ -418,8 +455,8 @@ tracepoint_add_probe(const char *name, void *probe, void *data,
  * The probe address must at least be aligned on the architecture pointer size.
  * Called with the tracepoint mutex held.
  */
-int __tracepoint_probe_register(const char *name, void *probe, void *data,
-               const char *signature)
+int __tracepoint_probe_register(const char *name, void (*probe)(void),
+               void *data, const char *signature)
 {
        void *old;
        int ret = 0;
@@ -440,7 +477,8 @@ end:
        return ret;
 }
 
-static void *tracepoint_remove_probe(const char *name, void *probe, void *data)
+static void *tracepoint_remove_probe(const char *name, void (*probe)(void),
+               void *data)
 {
        struct tracepoint_entry *entry;
        void *old;
@@ -462,7 +500,8 @@ static void *tracepoint_remove_probe(const char *name, void *probe, void *data)
  * @probe: probe function pointer
  * @probe: probe data pointer
  */
-int __tracepoint_probe_unregister(const char *name, void *probe, void *data)
+int __tracepoint_probe_unregister(const char *name, void (*probe)(void),
+               void *data)
 {
        void *old;
        int ret = 0;
@@ -499,7 +538,7 @@ static void tracepoint_add_old_probes(void *old)
  *
  * caller must call tracepoint_probe_update_all()
  */
-int tracepoint_probe_register_noupdate(const char *name, void *probe,
+int tracepoint_probe_register_noupdate(const char *name, void (*probe)(void),
                                       void *data, const char *signature)
 {
        void *old;
@@ -525,7 +564,7 @@ end:
  * caller must call tracepoint_probe_update_all()
  * Called with the tracepoint mutex held.
  */
-int tracepoint_probe_unregister_noupdate(const char *name, void *probe,
+int tracepoint_probe_unregister_noupdate(const char *name, void (*probe)(void),
                                         void *data)
 {
        void *old;
@@ -682,6 +721,44 @@ end:
        return 0;
 }
 
+int tracepoint_register_lib_callsite(struct tracepoint_callsite * const *tp_start,
+                           int tp_count)
+{
+       int real_count = 0;     /* without dummy */
+
+       init_tracepoint();
+
+       tracepoint_enable_callsite_range(tp_start, tp_start + tp_count);
+
+       if (ust_debug()) {
+               int i;
+
+               for (i = 0; i < tp_count; i++) {
+                       if (!tp_start[i])       /* Check for dummy */
+                               continue;
+                       DBG("registered callsite for tracepoint \"%s\" at %s@%p:%s:%u",
+                               tp_start[i]->name,
+                               tp_start[i]->func,
+                               tp_start[i]->ip,
+                               tp_start[i]->file,
+                               tp_start[i]->lineno);
+                       real_count++;
+               }
+       }
+       DBG("just registered a tracepoint callsite section from %p and having %d call sites",
+               tp_start, real_count);
+       return 0;
+}
+
+int tracepoint_unregister_lib_callsite(struct tracepoint_callsite * const *tp_start,
+                           int tp_count)
+{
+       tracepoint_disable_callsite_range(tp_start, tp_start + tp_count);
+       DBG("just unregistered a tracepoints callsite section from %p",
+               tp_start);
+       return 0;
+}
+
 void init_tracepoint(void)
 {
        if (uatomic_xchg(&initialized, 1) == 1)
This page took 0.024975 seconds and 4 git commands to generate.