wingo pushed a commit to branch wip-whippet
in repository guile.

commit cca54736a01bff8e031c6b6e1fa0a425d2fe9322
Author: Andy Wingo <wi...@igalia.com>
AuthorDate: Mon Feb 10 12:45:25 2025 +0100

    Add build support for tracepoints via lttng-ust
---
 Makefile            | 14 +++++++--
 api/gc-lttng.h      | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 api/gc-tracepoint.h | 17 +++++++++++
 embed.mk            | 10 +++++--
 manifest.scm        |  1 +
 src/gc-tracepoint.c |  6 ++++
 6 files changed, 126 insertions(+), 5 deletions(-)

diff --git a/Makefile b/Makefile
index 8de7346b9..c92cda4d5 100644
--- a/Makefile
+++ b/Makefile
@@ -30,10 +30,16 @@ BUILD_CFLAGS_debug    = -O0 -g -DGC_DEBUG=1
 
 BUILD_CFLAGS = $(BUILD_CFLAGS_$(or $(BUILD),$(DEFAULT_BUILD)))
 
+USE_LTTNG := $(shell pkg-config --exists lttng-ust && echo 1)
+LTTNG_CPPFLAGS := $(if $(USE_LTTNG), $(shell pkg-config --cflags lttng-ust),)
+LTTNG_LIBS := $(if $(USE_LTTNG), $(shell pkg-config --libs lttng-ust),)
+TRACEPOINT_CPPFLAGS = $(if $(USE_LTTNG),$(LTTNG_CPPFLAGS) 
-DGC_TRACEPOINT_LTTNG=1,)
+TRACEPOINT_LIBS = $(LTTNG_LIBS)
+
 CC       = gcc
 CFLAGS   = -Wall -flto -fno-strict-aliasing -fvisibility=hidden -Wno-unused 
$(BUILD_CFLAGS)
-CPPFLAGS = -Iapi
-LDFLAGS  = -lpthread -flto=auto
+CPPFLAGS = -Iapi $(TRACEPOINT_CPPFLAGS)
+LDFLAGS  = -lpthread -flto=auto $(TRACEPOINT_LIBS)
 DEPFLAGS = -MMD -MP -MF $(@:obj/%.o=.deps/%.d)
 COMPILE  = $(CC) $(CFLAGS) $(CPPFLAGS) $(DEPFLAGS) -o $@
 LINK     = $(CC) $(LDFLAGS) -o $@
@@ -52,6 +58,8 @@ obj/gc-stack.o: src/gc-stack.c | .deps obj
        $(COMPILE) -c $<
 obj/gc-options.o: src/gc-options.c | .deps obj
        $(COMPILE) -c $<
+obj/gc-tracepoint.o: src/gc-tracepoint.c | .deps obj
+       $(COMPILE) -c $<
 obj/%.gc-ephemeron.o: src/gc-ephemeron.c | .deps obj
        $(COMPILE) -include benchmarks/$*-embedder.h -c $<
 obj/%.gc-finalizer.o: src/gc-finalizer.c | .deps obj
@@ -110,7 +118,7 @@ obj/$(1).$(2).gc.o: src/$(call gc_impl,$(2)) | .deps obj
        $$(COMPILE) $(call gc_cflags,$(2)) $(call gc_impl_cflags,$(2)) -include 
benchmarks/$(1)-embedder.h -c $$<
 obj/$(1).$(2).o: benchmarks/$(1).c | .deps obj
        $$(COMPILE) $(call gc_cflags,$(2)) -include api/$(call gc_attrs,$(2)) 
-c $$<
-bin/$(1).$(2): obj/$(1).$(2).gc.o obj/$(1).$(2).o obj/gc-stack.o 
obj/gc-options.o obj/gc-platform.o obj/$(1).gc-ephemeron.o 
obj/$(1).gc-finalizer.o | bin
+bin/$(1).$(2): obj/$(1).$(2).gc.o obj/$(1).$(2).o obj/gc-stack.o 
obj/gc-options.o obj/gc-platform.o obj/gc-tracepoint.o obj/$(1).gc-ephemeron.o 
obj/$(1).gc-finalizer.o | bin
        $$(LINK) $$^ $(call gc_libs,$(2))
 endef
 
diff --git a/api/gc-lttng.h b/api/gc-lttng.h
new file mode 100644
index 000000000..630e7c543
--- /dev/null
+++ b/api/gc-lttng.h
@@ -0,0 +1,83 @@
+#define LTTNG_UST_TRACEPOINT_PROVIDER whippet
+
+#undef LTTNG_UST_TRACEPOINT_INCLUDE
+#define LTTNG_UST_TRACEPOINT_INCLUDE "gc-lttng.h"
+
+#if !defined(_TP_H) || defined(LTTNG_UST_TRACEPOINT_HEADER_MULTI_READ)
+#define _TP_H
+
+#include <lttng/tracepoint.h>
+
+LTTNG_UST_TRACEPOINT_ENUM(
+  whippet, gc_kind,
+  LTTNG_UST_TP_ENUM_VALUES
+  (lttng_ust_field_enum_value("MINOR", 1)
+   lttng_ust_field_enum_value("MAJOR", 2)
+   lttng_ust_field_enum_value("COMPACTING", 3)))
+
+LTTNG_UST_TRACEPOINT_EVENT_CLASS(
+  whippet, tracepoint,
+  LTTNG_UST_TP_ARGS(),
+  LTTNG_UST_TP_FIELDS())
+
+LTTNG_UST_TRACEPOINT_EVENT_CLASS(
+  whippet, size_tracepoint,
+  LTTNG_UST_TP_ARGS(size_t, size),
+  LTTNG_UST_TP_FIELDS(lttng_ust_field_integer(size_t, size, size)))
+
+
+/* The tracepoint instances */
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, size_tracepoint, whippet, init,
+  LTTNG_UST_TP_ARGS(size_t, size))
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, size_tracepoint, whippet, heap_resized,
+  LTTNG_UST_TP_ARGS(size_t, size))
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, size_tracepoint, whippet, live_data_size,
+  LTTNG_UST_TP_ARGS(size_t, size))
+
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, requesting_stop, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, waiting_for_stop, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, mutators_stopped, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT(
+  whippet, prepare_gc,
+  LTTNG_UST_TP_ARGS(int, gc_kind),
+  LTTNG_UST_TP_FIELDS(
+    lttng_ust_field_enum(whippet, gc_kind, int, gc_kind, gc_kind)))
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, roots_traced, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, heap_traced, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, ephemerons_traced, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, finalizers_traced, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, restarting_mutators, LTTNG_UST_TP_ARGS())
+
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, mutator_added, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, mutator_cause_gc, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, mutator_stopping, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, mutator_stopped, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, mutator_restarted, LTTNG_UST_TP_ARGS())
+LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(
+  whippet, tracepoint, whippet, mutator_removed, LTTNG_UST_TP_ARGS())
+
+/*
+ * Use LTTNG_UST_TRACEPOINT_EVENT(), LTTNG_UST_TRACEPOINT_EVENT_CLASS(),
+ * LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(), and
+ * LTTNG_UST_TRACEPOINT_LOGLEVEL() here.
+ */
+
+#endif /* _TP_H */
+
+#include <lttng/tracepoint-event.h>
diff --git a/api/gc-tracepoint.h b/api/gc-tracepoint.h
new file mode 100644
index 000000000..598d0bc44
--- /dev/null
+++ b/api/gc-tracepoint.h
@@ -0,0 +1,17 @@
+#ifndef GC_TRACEPOINT_H
+#define GC_TRACEPOINT_H
+
+#ifdef GC_TRACEPOINT_LTTNG
+
+#include "gc-lttng.h"
+
+#define GC_TRACEPOINT(...) \
+  lttng_ust_tracepoint(whippet, __VA_ARGS__)
+
+#else // GC_TRACEPOINT_LTTNG
+
+#define GC_TRACEPOINT(...) do {} while (0)
+
+#endif // GC_TRACEPOINT_LTTNG
+
+#endif // GC_TRACEPOINT_H
diff --git a/embed.mk b/embed.mk
index a98f7df48..4612a0bb1 100644
--- a/embed.mk
+++ b/embed.mk
@@ -12,11 +12,17 @@ V ?= 1
 v_0 = @
 v_1 =
 
+GC_USE_LTTNG := $(shell pkg-config --exists lttng-ust && echo 1)
+GC_LTTNG_CPPFLAGS := $(if $(GC_USE_LTTNG), $(shell pkg-config --cflags 
lttng-ust),)
+GC_LTTNG_LIBS := $(if $(GC_USE_LTTNG), $(shell pkg-config --libs lttng-ust),)
+GC_TRACEPOINT_CPPFLAGS = $(if $(GC_USE_LTTNG),$(GC_LTTNG_CPPFLAGS) 
-DGC_TRACEPOINT_LTTNG=1,)
+GC_TRACEPOINT_LIBS = $(GC_LTTNG_LIBS)
+
 GC_V        = $(v_$(V))
 GC_CC       = gcc
 GC_CFLAGS   = -Wall -flto -fno-strict-aliasing -fvisibility=hidden -Wno-unused 
$(GC_BUILD_CFLAGS)
-GC_CPPFLAGS = -I$(WHIPPET)api
-GC_LDFLAGS  = -lpthread -flto=auto
+GC_CPPFLAGS = -I$(WHIPPET)api $(GC_TRACEPOINT_CPPFLAGS)
+GC_LDFLAGS  = -lpthread -flto=auto $(GC_TRACEPOINT_LIBS)
 GC_DEPFLAGS = 
 GC_COMPILE  = $(GC_V)$(GC_CC) $(GC_CFLAGS) $(GC_CPPFLAGS) $(GC_DEPFLAGS) -o $@
 GC_LINK     = $(GC_V)$(GC_CC) $(GC_LDFLAGS) -o $@
diff --git a/manifest.scm b/manifest.scm
index fbb5d428c..ea35cf3d2 100644
--- a/manifest.scm
+++ b/manifest.scm
@@ -4,6 +4,7 @@
  '("bash"
    "coreutils"
    "gcc-toolchain"
+   "lttng-ust"
    "glibc"
    "libgc"
    "make"
diff --git a/src/gc-tracepoint.c b/src/gc-tracepoint.c
new file mode 100644
index 000000000..aa8ebc4a1
--- /dev/null
+++ b/src/gc-tracepoint.c
@@ -0,0 +1,6 @@
+#include <assert.h>
+#ifdef GC_TRACEPOINT_LTTNG
+#define LTTNG_UST_TRACEPOINT_DEFINE
+#define LTTNG_UST_TRACEPOINT_CREATE_PROBES
+#include "gc-lttng.h"
+#endif // GC_TRACEPOINT_LTTNG

Reply via email to