#ifdef TRACEPOINT_DEFINE
+/*
+ * When TRACEPOINT_PROBE_DYNAMIC_LINKAGE is defined, we do not emit a
+ * unresolved symbol that requires the provider to be linked in. When
+ * TRACEPOINT_PROBE_DYNAMIC_LINKAGE is not defined, we emit an
+ * unresolved symbol that depends on having the provider linked in,
+ * otherwise the linker complains. This deals with use of static
+ * libraries, ensuring that the linker does not remove the provider
+ * object from the executable.
+ */
+#ifdef TRACEPOINT_PROBE_DYNAMIC_LINKAGE
+#define _TRACEPOINT_UNDEFINED_REF(provider)
+#else /* TRACEPOINT_PROBE_DYNAMIC_LINKAGE */
+#define _TRACEPOINT_UNDEFINED_REF(provider) \
+ &__tracepoint_provider_##provider,
+#endif /* TRACEPOINT_PROBE_DYNAMIC_LINKAGE */
+
/*
* Note: to allow PIC code, we need to allow the linker to update the pointers
* in the __tracepoints_ptrs section.
* Therefore, this section is _not_ const (read-only).
*/
#define _DEFINE_TRACEPOINT(provider, name) \
+ extern int __tracepoint_provider_##provider; \
static const char __tp_strtab_##provider##___##name[] \
__attribute__((section("__tracepoints_strings"))) = \
#provider ":" #name; \
struct tracepoint __tracepoint_##provider##___##name \
__attribute__((section("__tracepoints"))) = \
- { __tp_strtab_##provider##___##name, 0, NULL }; \
+ { __tp_strtab_##provider##___##name, 0, NULL, _TRACEPOINT_UNDEFINED_REF(provider) }; \
static struct tracepoint * __tracepoint_ptr_##provider##___##name \
__attribute__((used, section("__tracepoints_ptrs"))) = \
&__tracepoint_##provider##___##name;
* TRACE_INFO 6
* informational message
*
- * TRACE_DEBUG_SYSTEM 7
- * information has system-level scope
+ * TRACE_SYSTEM 7
+ * information has system-level scope (set of programs)
*
- * TRACE_PROCESS 8
- * information has process-level scope
+ * TRACE_PROGRAM 8
+ * information has program-level scope (set of processes)
*
- * TRACE_MODULE 9
- * information has module (executable/library) scope
+ * TRACE_PROCESS 9
+ * information has process-level scope (set of modules)
*
- * TRACE_UNIT 10
- * information has compilation unit scope
+ * TRACE_MODULE 10
+ * information has module (executable/library) scope (set of units)
*
- * TRACE_CLASS 11
- * information has class-level scope
+ * TRACE_UNIT 11
+ * information has compilation unit scope (set of functions)
*
- * TRACE_OBJECT 12
- * information has object-level scope
- *
- * TRACE_FUNCTION 13
+ * TRACE_FUNCTION 12
* information has function-level scope
*
- * TRACE_PRINTF 14
- * tracepoint_printf message
+ * TRACE_DEFAULT 13
+ * default trace loglevel (TRACEPOINT_EVENT default)
+ *
+ * TRACE_VERBOSE 14
+ * verbose information
*
* TRACE_DEBUG 15
- * debug-level message
+ * debug-level message (trace_printf default)
*
* Declare tracepoint loglevels for tracepoints. A TRACEPOINT_EVENT
* should be declared prior to the the TRACEPOINT_LOGLEVEL for a given
* TRACEPOINT_LOGLEVEL.
*/
-#define TRACEPOINT_LOGLEVEL_ENUM(...)
+enum {
+ TRACE_EMERG = 0,
+ TRACE_ALERT = 1,
+ TRACE_CRIT = 2,
+ TRACE_ERR = 3,
+ TRACE_WARNING = 4,
+ TRACE_NOTICE = 5,
+ TRACE_INFO = 6,
+ TRACE_SYSTEM = 7,
+ TRACE_PROGRAM = 8,
+ TRACE_PROCESS = 9,
+ TRACE_MODULE = 10,
+ TRACE_UNIT = 11,
+ TRACE_FUNCTION = 12,
+ TRACE_DEFAULT = 13,
+ TRACE_VERBOSE = 14,
+ TRACE_DEBUG = 15,
+};
+
#define TRACEPOINT_LOGLEVEL(provider, name, loglevel)
#endif /* #ifndef TRACEPOINT_LOGLEVEL */