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_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 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 +#ifdef GC_TRACEPOINT_LTTNG +#define LTTNG_UST_TRACEPOINT_DEFINE +#define LTTNG_UST_TRACEPOINT_CREATE_PROBES +#include "gc-lttng.h" +#endif // GC_TRACEPOINT_LTTNG