pw_trace: Add compile time trace enable mechanism

Allows compile time control of enabling/disabling trace points
or sets of trace points.

Change-Id: I869cda12f904eb22919e862cf7a7619c7c68bb4e
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/87343
Commit-Queue: Erik Gilling <konkers@google.com>
Reviewed-by: Rob Oliver <rgoliver@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
diff --git a/pw_trace/docs.rst b/pw_trace/docs.rst
index 51171ee..0791f7f 100644
--- a/pw_trace/docs.rst
+++ b/pw_trace/docs.rst
@@ -220,6 +220,42 @@
 .. cpp:function:: PW_TRACE_FUNCTION()
 .. cpp:function:: PW_TRACE_FUNCTION(group_label)
 
+Compile time enabling/disabling
+-------------------------------
+Traces in a file can be enabled/disabled at compile time by defining through
+the ``PW_TRACE_ENABLE`` macro.  A value of 0 causes traces to be disabled.
+A non-zero value will enable traces.  While tracing defaults to enabled,
+it is best practice to define ``PW_TRACE_ENABLE`` explicitly in files that
+use tracing as the default may change in the future.
+
+A good pattern is to have a module level configuration parameter for enabling
+tracing and define ``PW_TRACE_ENABLE`` in terms of that at the top of each
+of the module's files:
+
+
+.. code-block:: cpp
+
+  // Enable tracing based on pw_example module config parameter.
+  #define PW_TRACE_ENABLE PW_EXAMPLE_TRACE_ENABLE
+
+
+Additionally specific trace points (or sets of points) can be enabled/disabled
+using the following pattern:
+
+.. code-block:: cpp
+
+  // Assuming tracing is disabled at the top of the file.
+
+  // Enable specific trace.
+  #undef PW_TRACE_ENABLE
+  #define PW_TRACE_ENABLE 1
+  PW_TRACE_INSTANT("important trace");
+
+  // Set traces back to disabled.  PW_TRACE_ENABLE can not be left
+  // undefined.
+  #undef PW_TRACE_ENABLE
+  #define PW_TRACE_ENABLE 0
+
 -----------
 Backend API
 -----------
diff --git a/pw_trace/public/pw_trace/internal/trace_internal.h b/pw_trace/public/pw_trace/internal/trace_internal.h
index 18e51a7..9355b49 100644
--- a/pw_trace/public/pw_trace/internal/trace_internal.h
+++ b/pw_trace/public/pw_trace/internal/trace_internal.h
@@ -59,18 +59,53 @@
 #define PW_TRACE_FUNCTION_LABEL __PRETTY_FUNCTION__
 #endif
 
+// Control to enable/disable tracing.  If 0, no traces are emitted.
+//
+// Defaults to enabled.
+#ifndef PW_TRACE_ENABLE
+#define PW_TRACE_ENABLE 1
+#endif  // PW_TRACE_ENABLE
+
+#define _PW_TRACE_IF_ENABLED(event_type, flags, label, group_label, trace_id) \
+  do {                                                                        \
+    if ((PW_TRACE_ENABLE) != 0) {                                             \
+      PW_TRACE(event_type, flags, label, group_label, trace_id);              \
+    }                                                                         \
+  } while (0)
+
+#define _PW_TRACE_DATA_IF_ENABLED(event_type,         \
+                                  flags,              \
+                                  label,              \
+                                  group_label,        \
+                                  trace_id,           \
+                                  data_format_string, \
+                                  data,               \
+                                  size)               \
+  do {                                                \
+    if ((PW_TRACE_ENABLE) != 0) {                     \
+      PW_TRACE_DATA(event_type,                       \
+                    flags,                            \
+                    label,                            \
+                    group_label,                      \
+                    trace_id,                         \
+                    data_format_string,               \
+                    data,                             \
+                    size);                            \
+    }                                                 \
+  } while (0)
+
 // This block handles:
 //      - PW_TRACE_INSTANT(label)
 //      - PW_TRACE_INSTANT_FLAG(flag, label)
 // Which creates a trace event with the type: PW_TRACE_TYPE_INSTANT
 // NOTE: If this type is not defined by the backend this trace is removed.
 #ifdef PW_TRACE_TYPE_INSTANT
-#define _PW_TRACE_INSTANT_ARGS2(flag, label) \
-  PW_TRACE(PW_TRACE_TYPE_INSTANT,            \
-           flag,                             \
-           label,                            \
-           PW_TRACE_GROUP_LABEL_DEFAULT,     \
-           PW_TRACE_TRACE_ID_DEFAULT)
+#define _PW_TRACE_INSTANT_ARGS2(flag, label)         \
+  _PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_INSTANT,        \
+                       flag,                         \
+                       label,                        \
+                       PW_TRACE_GROUP_LABEL_DEFAULT, \
+                       PW_TRACE_TRACE_ID_DEFAULT)
 #else  // PW_TRACE_TYPE_INSTANT
 #define _PW_TRACE_INSTANT_ARGS2(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // PW_TRACE_TYPE_INSTANT
@@ -82,11 +117,11 @@
 // NOTE: If this type is not defined by the backend this trace is removed.
 #ifdef PW_TRACE_TYPE_INSTANT_GROUP
 #define _PW_TRACE_INSTANT_ARGS3(flag, label, group) \
-  PW_TRACE(PW_TRACE_TYPE_INSTANT_GROUP,             \
-           flag,                                    \
-           label,                                   \
-           group,                                   \
-           PW_TRACE_TRACE_ID_DEFAULT)
+  _PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_INSTANT_GROUP, \
+                       flag,                        \
+                       label,                       \
+                       group,                       \
+                       PW_TRACE_TRACE_ID_DEFAULT)
 #else  // PW_TRACE_TYPE_INSTANT_GROUP
 #define _PW_TRACE_INSTANT_ARGS3(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // PW_TRACE_TYPE_INSTANT_GROUP
@@ -98,7 +133,8 @@
 // NOTE: If this type is not defined by the backend this trace is removed.
 #ifdef PW_TRACE_TYPE_ASYNC_INSTANT
 #define _PW_TRACE_INSTANT_ARGS4(flag, label, group, trace_id) \
-  PW_TRACE(PW_TRACE_TYPE_ASYNC_INSTANT, flag, label, group, trace_id)
+  _PW_TRACE_IF_ENABLED(                                       \
+      PW_TRACE_TYPE_ASYNC_INSTANT, flag, label, group, trace_id)
 #else  // PW_TRACE_TYPE_ASYNC_INSTANT
 #define _PW_TRACE_INSTANT_ARGS4(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // PW_TRACE_TYPE_ASYNC_INSTANT
@@ -109,12 +145,12 @@
 // Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_START
 // NOTE: If this type is not defined by the backend this trace is removed.
 #ifdef PW_TRACE_TYPE_DURATION_START
-#define _PW_TRACE_START_ARGS2(flag, label) \
-  PW_TRACE(PW_TRACE_TYPE_DURATION_START,   \
-           flag,                           \
-           label,                          \
-           PW_TRACE_GROUP_LABEL_DEFAULT,   \
-           PW_TRACE_TRACE_ID_DEFAULT)
+#define _PW_TRACE_START_ARGS2(flag, label)           \
+  _PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_DURATION_START, \
+                       flag,                         \
+                       label,                        \
+                       PW_TRACE_GROUP_LABEL_DEFAULT, \
+                       PW_TRACE_TRACE_ID_DEFAULT)
 #else  // PW_TRACE_TYPE_DURATION_START
 #define _PW_TRACE_START_ARGS2(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // PW_TRACE_TYPE_DURATION_START
@@ -126,12 +162,12 @@
 // NOTE: If this type is not defined by the backend this trace is removed.
 #ifdef PW_TRACE_TYPE_DURATION_GROUP_START  // Disabled if backend doesn't define
                                            // this
-#define _PW_TRACE_START_ARGS3(flag, label, group) \
-  PW_TRACE(PW_TRACE_TYPE_DURATION_GROUP_START,    \
-           flag,                                  \
-           label,                                 \
-           group,                                 \
-           PW_TRACE_TRACE_ID_DEFAULT)
+#define _PW_TRACE_START_ARGS3(flag, label, group)          \
+  _PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_DURATION_GROUP_START, \
+                       flag,                               \
+                       label,                              \
+                       group,                              \
+                       PW_TRACE_TRACE_ID_DEFAULT)
 #else  // PW_TRACE_TYPE_DURATION_GROUP_START
 #define _PW_TRACE_START_ARGS3(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // PW_TRACE_TYPE_DURATION_GROUP_START
@@ -143,7 +179,7 @@
 // NOTE: If this type is not defined by the backend this trace is removed.
 #ifdef PW_TRACE_TYPE_ASYNC_START
 #define _PW_TRACE_START_ARGS4(flag, label, group, trace_id) \
-  PW_TRACE(PW_TRACE_TYPE_ASYNC_START, flag, label, group, trace_id)
+  _PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_ASYNC_START, flag, label, group, trace_id)
 #else  // PW_TRACE_TYPE_ASYNC_START
 #define _PW_TRACE_START_ARGS4(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // PW_TRACE_TYPE_ASYNC_START
@@ -154,12 +190,12 @@
 // Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_END
 // NOTE: If this type is not defined by the backend this trace is removed.
 #ifdef PW_TRACE_TYPE_DURATION_END
-#define _PW_TRACE_END_ARGS2(flag, label) \
-  PW_TRACE(PW_TRACE_TYPE_DURATION_END,   \
-           flag,                         \
-           label,                        \
-           PW_TRACE_GROUP_LABEL_DEFAULT, \
-           PW_TRACE_TRACE_ID_DEFAULT)
+#define _PW_TRACE_END_ARGS2(flag, label)             \
+  _PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_DURATION_END,   \
+                       flag,                         \
+                       label,                        \
+                       PW_TRACE_GROUP_LABEL_DEFAULT, \
+                       PW_TRACE_TRACE_ID_DEFAULT)
 #else  // PW_TRACE_TYPE_DURATION_END
 #define _PW_TRACE_END_ARGS2(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // PW_TRACE_TYPE_DURATION_END
@@ -170,12 +206,12 @@
 // Which creates a trace event with the type: PW_TRACE_TYPE_DURATION_GROUP_END
 // NOTE: If this type is not defined by the backend this trace is removed.
 #ifdef PW_TRACE_TYPE_DURATION_GROUP_END
-#define _PW_TRACE_END_ARGS3(flag, label, group) \
-  PW_TRACE(PW_TRACE_TYPE_DURATION_GROUP_END,    \
-           flag,                                \
-           label,                               \
-           group,                               \
-           PW_TRACE_TRACE_ID_DEFAULT)
+#define _PW_TRACE_END_ARGS3(flag, label, group)          \
+  _PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_DURATION_GROUP_END, \
+                       flag,                             \
+                       label,                            \
+                       group,                            \
+                       PW_TRACE_TRACE_ID_DEFAULT)
 #else  // PW_TRACE_TYPE_DURATION_GROUP_END
 #define _PW_TRACE_END_ARGS3(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // PW_TRACE_TYPE_DURATION_GROUP_END
@@ -187,7 +223,7 @@
 // NOTE: If this type is not defined by the backend this trace is removed.
 #ifdef PW_TRACE_TYPE_ASYNC_END
 #define _PW_TRACE_END_ARGS4(flag, label, group, trace_id) \
-  PW_TRACE(PW_TRACE_TYPE_ASYNC_END, flag, label, group, trace_id)
+  _PW_TRACE_IF_ENABLED(PW_TRACE_TYPE_ASYNC_END, flag, label, group, trace_id)
 #else  // PW_TRACE_TYPE_ASYNC_END
 #define _PW_TRACE_END_ARGS4(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // PW_TRACE_TYPE_ASYNC_END
@@ -195,20 +231,20 @@
 // The pigweed scope objects gets defined inline with the trace event. The
 // constructor handles the start trace event, and the destructor does the end.
 #ifndef _PW_TRACE_SCOPE_OBJECT
-#define _PW_TRACE_SCOPE_OBJECT(                                        \
-    object_name, flag, event_type_start, event_type_end, label, group) \
-  class object_name {                                                  \
-   public:                                                             \
-    object_name(uint32_t trace_id = PW_TRACE_TRACE_ID_DEFAULT)         \
-        : trace_id_(trace_id) {                                        \
-      PW_TRACE(event_type_start, flag, label, group, trace_id_);       \
-    }                                                                  \
-    ~object_name() {                                                   \
-      PW_TRACE(event_type_end, flag, label, group, trace_id_);         \
-    }                                                                  \
-                                                                       \
-   private:                                                            \
-    const uint32_t trace_id_;                                          \
+#define _PW_TRACE_SCOPE_OBJECT(                                              \
+    object_name, flag, event_type_start, event_type_end, label, group)       \
+  class object_name {                                                        \
+   public:                                                                   \
+    object_name(uint32_t trace_id = PW_TRACE_TRACE_ID_DEFAULT)               \
+        : trace_id_(trace_id) {                                              \
+      _PW_TRACE_IF_ENABLED(event_type_start, flag, label, group, trace_id_); \
+    }                                                                        \
+    ~object_name() {                                                         \
+      _PW_TRACE_IF_ENABLED(event_type_end, flag, label, group, trace_id_);   \
+    }                                                                        \
+                                                                             \
+   private:                                                                  \
+    const uint32_t trace_id_;                                                \
   }
 #endif  // _PW_TRACE_SCOPE_OBJECT
 
@@ -303,16 +339,16 @@
 // NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
 // is removed.
 #if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT)
-#define _PW_TRACE_INSTANT_DATA_ARGS5(            \
-    flag, label, data_format_string, data, size) \
-  PW_TRACE_DATA(PW_TRACE_TYPE_INSTANT,           \
-                flag,                            \
-                label,                           \
-                PW_TRACE_GROUP_LABEL_DEFAULT,    \
-                PW_TRACE_TRACE_ID_DEFAULT,       \
-                data_format_string,              \
-                data,                            \
-                size)
+#define _PW_TRACE_INSTANT_DATA_ARGS5(                     \
+    flag, label, data_format_string, data, size)          \
+  _PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_INSTANT,        \
+                            flag,                         \
+                            label,                        \
+                            PW_TRACE_GROUP_LABEL_DEFAULT, \
+                            PW_TRACE_TRACE_ID_DEFAULT,    \
+                            data_format_string,           \
+                            data,                         \
+                            size)
 #else  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT)
 #define _PW_TRACE_INSTANT_DATA_ARGS5(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT)
@@ -333,16 +369,16 @@
 // NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
 // is removed.
 #if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT_GROUP)
-#define _PW_TRACE_INSTANT_DATA_ARGS6(                   \
-    flag, label, group, data_format_string, data, size) \
-  PW_TRACE_DATA(PW_TRACE_TYPE_INSTANT_GROUP,            \
-                flag,                                   \
-                label,                                  \
-                group,                                  \
-                PW_TRACE_TRACE_ID_DEFAULT,              \
-                data_format_string,                     \
-                data,                                   \
-                size)
+#define _PW_TRACE_INSTANT_DATA_ARGS6(                    \
+    flag, label, group, data_format_string, data, size)  \
+  _PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_INSTANT_GROUP, \
+                            flag,                        \
+                            label,                       \
+                            group,                       \
+                            PW_TRACE_TRACE_ID_DEFAULT,   \
+                            data_format_string,          \
+                            data,                        \
+                            size)
 #else  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT_GROUP)
 #define _PW_TRACE_INSTANT_DATA_ARGS6(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_INSTANT_GROUP)
@@ -367,14 +403,14 @@
 #if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_INSTANT)
 #define _PW_TRACE_INSTANT_DATA_ARGS7(                             \
     flag, label, group, trace_id, data_format_string, data, size) \
-  PW_TRACE_DATA(PW_TRACE_TYPE_ASYNC_INSTANT,                      \
-                flag,                                             \
-                label,                                            \
-                group,                                            \
-                trace_id,                                         \
-                data_format_string,                               \
-                data,                                             \
-                size)
+  _PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_ASYNC_INSTANT,          \
+                            flag,                                 \
+                            label,                                \
+                            group,                                \
+                            trace_id,                             \
+                            data_format_string,                   \
+                            data,                                 \
+                            size)
 #else  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_INSTANT)
 #define _PW_TRACE_INSTANT_DATA_ARGS7(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_INSTANT)
@@ -393,16 +429,16 @@
 // NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
 // is removed.
 #if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
-#define _PW_TRACE_START_DATA_ARGS5(              \
-    flag, label, data_format_string, data, size) \
-  PW_TRACE_DATA(PW_TRACE_TYPE_DURATION_START,    \
-                flag,                            \
-                label,                           \
-                PW_TRACE_GROUP_LABEL_DEFAULT,    \
-                PW_TRACE_TRACE_ID_DEFAULT,       \
-                data_format_string,              \
-                data,                            \
-                size)
+#define _PW_TRACE_START_DATA_ARGS5(                       \
+    flag, label, data_format_string, data, size)          \
+  _PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_DURATION_START, \
+                            flag,                         \
+                            label,                        \
+                            PW_TRACE_GROUP_LABEL_DEFAULT, \
+                            PW_TRACE_TRACE_ID_DEFAULT,    \
+                            data_format_string,           \
+                            data,                         \
+                            size)
 #else  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
 #define _PW_TRACE_START_DATA_ARGS5(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
@@ -423,16 +459,16 @@
 // NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
 // is removed.
 #if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_GROUP_START)
-#define _PW_TRACE_START_DATA_ARGS6(                     \
-    flag, label, group, data_format_string, data, size) \
-  PW_TRACE_DATA(PW_TRACE_TYPE_DURATION_GROUP_START,     \
-                flag,                                   \
-                label,                                  \
-                group,                                  \
-                PW_TRACE_TRACE_ID_DEFAULT,              \
-                data_format_string,                     \
-                data,                                   \
-                size)
+#define _PW_TRACE_START_DATA_ARGS6(                             \
+    flag, label, group, data_format_string, data, size)         \
+  _PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_DURATION_GROUP_START, \
+                            flag,                               \
+                            label,                              \
+                            group,                              \
+                            PW_TRACE_TRACE_ID_DEFAULT,          \
+                            data_format_string,                 \
+                            data,                               \
+                            size)
 #else  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
 #define _PW_TRACE_START_DATA_ARGS6(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
@@ -457,14 +493,14 @@
 #if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_START)
 #define _PW_TRACE_START_DATA_ARGS7(                               \
     flag, label, group, trace_id, data_format_string, data, size) \
-  PW_TRACE_DATA(PW_TRACE_TYPE_ASYNC_START,                        \
-                flag,                                             \
-                label,                                            \
-                group,                                            \
-                trace_id,                                         \
-                data_format_string,                               \
-                data,                                             \
-                size)
+  _PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_ASYNC_START,            \
+                            flag,                                 \
+                            label,                                \
+                            group,                                \
+                            trace_id,                             \
+                            data_format_string,                   \
+                            data,                                 \
+                            size)
 #else  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_START)
 #define _PW_TRACE_START_DATA_ARGS7(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_START)
@@ -484,14 +520,14 @@
 // is removed.
 #if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_END)
 #define _PW_TRACE_END_DATA_ARGS5(flag, label, data_format_string, data, size) \
-  PW_TRACE_DATA(PW_TRACE_TYPE_DURATION_END,                                   \
-                flag,                                                         \
-                label,                                                        \
-                PW_TRACE_GROUP_LABEL_DEFAULT,                                 \
-                PW_TRACE_TRACE_ID_DEFAULT,                                    \
-                data_format_string,                                           \
-                data,                                                         \
-                size)
+  _PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_DURATION_END,                       \
+                            flag,                                             \
+                            label,                                            \
+                            PW_TRACE_GROUP_LABEL_DEFAULT,                     \
+                            PW_TRACE_TRACE_ID_DEFAULT,                        \
+                            data_format_string,                               \
+                            data,                                             \
+                            size)
 #else  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
 #define _PW_TRACE_END_DATA_ARGS5(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_START)
@@ -512,16 +548,16 @@
 // NOTE: If this type or PW_TRACE_DATA is not defined by the backend this trace
 // is removed.
 #if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_GROUP_END)
-#define _PW_TRACE_END_DATA_ARGS6(                       \
-    flag, label, group, data_format_string, data, size) \
-  PW_TRACE_DATA(PW_TRACE_TYPE_DURATION_GROUP_END,       \
-                flag,                                   \
-                label,                                  \
-                group,                                  \
-                PW_TRACE_TRACE_ID_DEFAULT,              \
-                data_format_string,                     \
-                data,                                   \
-                size)
+#define _PW_TRACE_END_DATA_ARGS6(                             \
+    flag, label, group, data_format_string, data, size)       \
+  _PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_DURATION_GROUP_END, \
+                            flag,                             \
+                            label,                            \
+                            group,                            \
+                            PW_TRACE_TRACE_ID_DEFAULT,        \
+                            data_format_string,               \
+                            data,                             \
+                            size)
 #else  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_GROUP_END)
 #define _PW_TRACE_END_DATA_ARGS6(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_DURATION_GROUP_END)
@@ -546,14 +582,14 @@
 #if defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_END)
 #define _PW_TRACE_END_DATA_ARGS7(                                 \
     flag, label, group, trace_id, data_format_string, data, size) \
-  PW_TRACE_DATA(PW_TRACE_TYPE_ASYNC_END,                          \
-                flag,                                             \
-                label,                                            \
-                group,                                            \
-                trace_id,                                         \
-                data_format_string,                               \
-                data,                                             \
-                size)
+  _PW_TRACE_DATA_IF_ENABLED(PW_TRACE_TYPE_ASYNC_END,              \
+                            flag,                                 \
+                            label,                                \
+                            group,                                \
+                            trace_id,                             \
+                            data_format_string,                   \
+                            data,                                 \
+                            size)
 #else  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_END)
 #define _PW_TRACE_END_DATA_ARGS7(...) _PW_TRACE_DISABLED(__VA_ARGS__)
 #endif  // defined(PW_TRACE_DATA) && defined(PW_TRACE_TYPE_ASYNC_END)
diff --git a/pw_trace/trace_facade_test.cc b/pw_trace/trace_facade_test.cc
index 9497284..5e80601 100644
--- a/pw_trace/trace_facade_test.cc
+++ b/pw_trace/trace_facade_test.cc
@@ -399,3 +399,53 @@
                   PW_TRACE_GROUP_LABEL_DEFAULT,
                   PW_TRACE_TRACE_ID_DEFAULT));
 }
+
+TEST(DisableTrace, Instant) {
+  PW_TRACE_INSTANT("Test");
+  EXPECT_EQ(LastEvent::Instance().Get(),
+            Event(Instantaneous,
+                  PW_TRACE_FLAGS_DEFAULT,
+                  "Test",
+                  PW_TRACE_GROUP_LABEL_DEFAULT,
+                  PW_TRACE_TRACE_ID_DEFAULT));
+#undef PW_TRACE_ENABLE
+#define PW_TRACE_ENABLE 0
+  PW_TRACE_INSTANT("TestDisabled");
+
+  EXPECT_EQ(LastEvent::Instance().Get(),
+            Event(Instantaneous,
+                  PW_TRACE_FLAGS_DEFAULT,
+                  "Test",
+                  PW_TRACE_GROUP_LABEL_DEFAULT,
+                  PW_TRACE_TRACE_ID_DEFAULT));
+#undef PW_TRACE_ENABLE
+#define PW_TRACE_ENABLE 1
+}
+
+TEST(DisableTrace, InstantData) {
+  PW_TRACE_INSTANT_DATA("Test", "s", kSomeData, sizeof(kSomeData));
+  EXPECT_EQ(LastEvent::Instance().Get(),
+            Event(Instantaneous,
+                  PW_TRACE_FLAGS_DEFAULT,
+                  "Test",
+                  PW_TRACE_GROUP_LABEL_DEFAULT,
+                  PW_TRACE_TRACE_ID_DEFAULT,
+                  "s",
+                  kSomeData,
+                  sizeof(kSomeData)));
+
+#undef PW_TRACE_ENABLE
+#define PW_TRACE_ENABLE 0
+  PW_TRACE_INSTANT_DATA("TestDisabled", "s", kSomeData, sizeof(kSomeData));
+  EXPECT_EQ(LastEvent::Instance().Get(),
+            Event(Instantaneous,
+                  PW_TRACE_FLAGS_DEFAULT,
+                  "Test",
+                  PW_TRACE_GROUP_LABEL_DEFAULT,
+                  PW_TRACE_TRACE_ID_DEFAULT,
+                  "s",
+                  kSomeData,
+                  sizeof(kSomeData)));
+#undef PW_TRACE_ENABLE
+#define PW_TRACE_ENABLE 1
+}