1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-29 19:30:36 +02:00

Rework extension points between embedder and GC

This commit is contained in:
Andy Wingo 2025-04-16 12:06:02 +02:00
parent 424a0cefd9
commit 6e36c039e9
6 changed files with 80 additions and 68 deletions

View file

@ -24,11 +24,16 @@ COLLECTORS = \
DEFAULT_BUILD := opt
BUILD_CFLAGS_opt = -O2 -g -DNDEBUG
BUILD_CFLAGS_optdebug = -Og -g -DGC_DEBUG=1
BUILD_CFLAGS_debug = -O0 -g -DGC_DEBUG=1
BUILD_CFLAGS_opt = -O2 -g
BUILD_CFLAGS_optdebug = -Og -g
BUILD_CFLAGS_debug = -O0 -g
BUILD_CPPFLAGS_opt = -DNDEBUG
BUILD_CPPFLAGS_optdebug = -DGC_DEBUG=1
BUILD_CPPFLAGS_debug = -DGC_DEBUG=1
BUILD_CFLAGS = $(BUILD_CFLAGS_$(or $(BUILD),$(DEFAULT_BUILD)))
BUILD_CPPFLAGS = $(BUILD_CPPFLAGS_$(or $(BUILD),$(DEFAULT_BUILD)))
USE_LTTNG_0 :=
USE_LTTNG_1 := 1
@ -40,7 +45,7 @@ TRACEPOINT_LIBS = $(LTTNG_LIBS)
CC = gcc
CFLAGS = -Wall -flto -fno-strict-aliasing -fvisibility=hidden -Wno-unused $(BUILD_CFLAGS)
CPPFLAGS = -Iapi $(TRACEPOINT_CPPFLAGS)
CPPFLAGS = -Iapi $(TRACEPOINT_CPPFLAGS) $(BUILD_CPPFLAGS)
LDFLAGS = -lpthread -flto=auto $(TRACEPOINT_LIBS)
DEPFLAGS = -MMD -MP -MF $(@:obj/%.o=.deps/%.d)
COMPILE = $(CC) $(CFLAGS) $(CPPFLAGS) $(DEPFLAGS) -o $@
@ -63,30 +68,30 @@ obj/gc-options.o: src/gc-options.c | .deps obj
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 $<
$(COMPILE) -DGC_EMBEDDER=\"../benchmarks/$*-embedder.h\" -c $<
obj/%.gc-finalizer.o: src/gc-finalizer.c | .deps obj
$(COMPILE) -include benchmarks/$*-embedder.h -c $<
$(COMPILE) -DGC_EMBEDDER=\"../benchmarks/$*-embedder.h\" -c $<
GC_STEM_bdw = bdw
GC_CFLAGS_bdw = -DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1
GC_CPPFLAGS_bdw = -DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1
GC_IMPL_CFLAGS_bdw = `pkg-config --cflags bdw-gc`
GC_LIBS_bdw = `pkg-config --libs bdw-gc`
GC_STEM_semi = semi
GC_CFLAGS_semi = -DGC_PRECISE_ROOTS=1
GC_CPPFLAGS_semi = -DGC_PRECISE_ROOTS=1
GC_LIBS_semi = -lm
GC_STEM_pcc = pcc
GC_CFLAGS_pcc = -DGC_PRECISE_ROOTS=1 -DGC_PARALLEL=1
GC_CPPFLAGS_pcc = -DGC_PRECISE_ROOTS=1 -DGC_PARALLEL=1
GC_LIBS_pcc = -lm
GC_STEM_generational_pcc = $(GC_STEM_pcc)
GC_CFLAGS_generational_pcc = $(GC_CFLAGS_pcc) -DGC_GENERATIONAL=1
GC_CPPFLAGS_generational_pcc = $(GC_CPPFLAGS_pcc) -DGC_GENERATIONAL=1
GC_LIBS_generational_pcc = $(GC_LIBS_pcc)
define mmc_variant
GC_STEM_$(1) = mmc
GC_CFLAGS_$(1) = $(2)
GC_CPPFLAGS_$(1) = $(2)
GC_LIBS_$(1) = -lm
endef
@ -112,14 +117,14 @@ $(eval $(call trace_mmc_variants))
make_gc_var = $$($(1)$(subst -,_,$(2)))
gc_impl = $(call make_gc_var,GC_STEM_,$(1)).c
gc_attrs = $(call make_gc_var,GC_STEM_,$(1))-attrs.h
gc_cflags = $(call make_gc_var,GC_CFLAGS_,$(1))
gc_cppflags = $(call make_gc_var,GC_CPPFLAGS_,$(1))
gc_impl_cflags = $(call make_gc_var,GC_IMPL_CFLAGS_,$(1))
gc_libs = $(call make_gc_var,GC_LIBS_,$(1))
define benchmark_template
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 $$<
$$(COMPILE) $(call gc_cppflags,$(2)) $(call gc_impl_cflags,$(2)) -DGC_EMBEDDER=\"../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 $$<
$$(COMPILE) $(call gc_cppflags,$(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/gc-tracepoint.o obj/$(1).gc-ephemeron.o obj/$(1).gc-finalizer.o | bin
$$(LINK) $$^ $(call gc_libs,$(2))
endef

View file

@ -4,7 +4,7 @@
# whippet/ subdirectory:
#
# noinst_LTLIBRARIES =
# WHIPPET_EMBEDDER_CPPFLAGS = -include src/my-embedder.h
# WHIPPET_EMBEDDER_H = $(srcdir)/src/my-embedder.h
# include whippet/embed.am
#
# my-embedder.h should provide the various hooks that Whippet needs to
@ -12,9 +12,8 @@
#
# The result is a libwhippet.la. To compile and link against it:
#
# AM_CFLAGS = $(WHIPPET_CPPFLAGS) $(WHIPPET_CFLAGS) $(WHIPPET_TO_EMBEDDER_CPPFLAGS)
# AM_CPPFLAGS = $(WHIPPET_CPPFLAGS)
# LDADD = libwhippet.la
# AM_LDFLAGS = $(WHIPPET_TO_EMBEDDER_LDFLAGS)
#
# The assumption is that the embedder will build a single copy of
# Whippet, specialized against a single collector, a single set of
@ -93,72 +92,70 @@ libwhippet_la_SOURCES = \
%D%/src/swar.h \
%D%/src/tracer.h
WHIPPET_CFLAGS_bdw = -DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1
WHIPPET_CFLAGS_semi = -DGC_PRECISE_ROOTS=1
WHIPPET_CFLAGS_pcc = -DGC_PRECISE_ROOTS=1 -DGC_PARALLEL=1
WHIPPET_CFLAGS_generational_pcc = $(WHIPPET_CFLAGS_pcc) -DGC_GENERATIONAL=1
WHIPPET_CFLAGS_mmc = \
WHIPPET_CPPFLAGS_bdw = -DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1
WHIPPET_CPPFLAGS_semi = -DGC_PRECISE_ROOTS=1
WHIPPET_CPPFLAGS_pcc = -DGC_PRECISE_ROOTS=1 -DGC_PARALLEL=1
WHIPPET_CPPFLAGS_generational_pcc = $(WHIPPET_CPPFLAGS_pcc) -DGC_GENERATIONAL=1
WHIPPET_CPPFLAGS_mmc = \
-DGC_PRECISE_ROOTS=1
WHIPPET_CFLAGS_generational_mmc = \
WHIPPET_CPPFLAGS_generational_mmc = \
-DGC_PRECISE_ROOTS=1 -DGC_GENERATIONAL=1
WHIPPET_CFLAGS_parallel_mmc = \
WHIPPET_CPPFLAGS_parallel_mmc = \
-DGC_PRECISE_ROOTS=1 -DGC_PARALLEL=1
WHIPPET_CFLAGS_parallel_generational_mmc = \
WHIPPET_CPPFLAGS_parallel_generational_mmc = \
-DGC_PRECISE_ROOTS=1 -DGC_GENERATIONAL=1 -DGC_PARALLEL=1
WHIPPET_CFLAGS_stack_conservative_mmc = \
WHIPPET_CPPFLAGS_stack_conservative_mmc = \
-DGC_CONSERVATIVE_ROOTS=1
WHIPPET_CFLAGS_stack_conservative_generational_mmc = \
WHIPPET_CPPFLAGS_stack_conservative_generational_mmc = \
-DGC_CONSERVATIVE_ROOTS=1 -DGC_GENERATIONAL=1
WHIPPET_CFLAGS_stack_conservative_parallel_mmc = \
WHIPPET_CPPFLAGS_stack_conservative_parallel_mmc = \
-DGC_CONSERVATIVE_ROOTS=1 -DGC_PARALLEL=1
WHIPPET_CFLAGS_stack_conservative_parallel_generational_mmc = \
WHIPPET_CPPFLAGS_stack_conservative_parallel_generational_mmc = \
-DGC_CONSERVATIVE_ROOTS=1 -DGC_GENERATIONAL=1 -DGC_PARALLEL=1
WHIPPET_CFLAGS_heap_conservative_mmc = \
WHIPPET_CPPFLAGS_heap_conservative_mmc = \
-DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1
WHIPPET_CFLAGS_heap_conservative_generational_mmc = \
WHIPPET_CPPFLAGS_heap_conservative_generational_mmc = \
-DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1 -DGC_GENERATIONAL=1
WHIPPET_CFLAGS_heap_conservative_parallel_mmc = \
WHIPPET_CPPFLAGS_heap_conservative_parallel_mmc = \
-DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1 -DGC_PARALLEL=1
WHIPPET_CFLAGS_heap_conservative_parallel_generational_mmc = \
WHIPPET_CPPFLAGS_heap_conservative_parallel_generational_mmc = \
-DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1 -DGC_GENERATIONAL=1 -DGC_PARALLEL=1
WHIPPET_CFLAGS = $(WHIPPET_CFLAGS_$(subst -,_,$(WHIPPET_COLLECTOR)))
WHIPPET_CPPFLAGS = $(WHIPPET_CPPFLAGS_$(subst -,_,$(WHIPPET_COLLECTOR)))
WHIPPET_CPPFLAGS += -I$(srcdir)/%D%/api
WHIPPET_IMPL_CFLAGS =
WHIPPET_LIBS = -lm
WHIPPET_CPPFLAGS = -I$(srcdir)/%D%/api
WHIPPET_TO_EMBEDDER_CPPFLAGS = $(WHIPPET_CPPFLAGS)
if WHIPPET_ENABLE_DEBUG
WHIPPET_CFLAGS += -DGC_DEBUG=1
WHIPPET_CPPFLAGS += -DGC_DEBUG=1
endif
if WHIPPET_COLLECTOR_SEMI
libwhippet_la_SOURCES += %D%/src/semi.c
WHIPPET_TO_EMBEDDER_CPPFLAGS += -include $(srcdir)/%D%/api/semi-attrs.h
WHIPPET_CPPFLAGS += -DWHIPPET_ATTRS=\"$(srcdir)/%D%/api/semi-attrs.h\"
endif
if WHIPPET_COLLECTOR_PCC
libwhippet_la_SOURCES += %D%/src/pcc.c
WHIPPET_TO_EMBEDDER_CPPFLAGS += -include $(srcdir)/%D%/api/pcc-attrs.h
WHIPPET_CPPFLAGS += -DWHIPPET_ATTRS=\"$(srcdir)/%D%/api/pcc-attrs.h\"
endif
if WHIPPET_COLLECTOR_BDW
libwhippet_la_SOURCES += %D%/src/bdw.c
WHIPPET_IMPL_CFLAGS += $(WHIPPET_BDW_CFLAGS)
WHIPPET_LIBS += $(WHIPPET_BDW_LIBS)
WHIPPET_TO_EMBEDDER_CPPFLAGS += -include $(srcdir)/%D%/api/bdw-attrs.h
WHIPPET_CPPFLAGS += -DWHIPPET_ATTRS=\"$(srcdir)/%D%/api/bdw-attrs.h\"
endif
if WHIPPET_COLLECTOR_MMC
libwhippet_la_SOURCES += %D%/src/mmc.c
WHIPPET_TO_EMBEDDER_CPPFLAGS += -include $(srcdir)/%D%/api/mmc-attrs.h
WHIPPET_CPPFLAGS += -DWHIPPET_ATTRS=\"$(srcdir)/%D%/api/mmc-attrs.h\"
endif
# add to cflags: -flto -fvisibility=hidden -fno-strict-aliasing
libwhippet_common_la_CPPFLAGS = $(WHIPPET_CPPFLAGS)
libwhippet_common_la_CFLAGS = -Wall -Wno-unused $(CFLAGS)
libwhippet_common_la_CFLAGS += $(WHIPPET_CFLAGS)
libwhippet_common_la_LDFLAGS = -lpthread $(LDFLAGS)
libwhippet_common_la_LIBADD = $(LIBS)
@ -171,7 +168,8 @@ if !WHIPPET_ENABLE_DEBUG
libwhippet_common_la_CFLAGS += -DNDEBUG
endif
libwhippet_la_CPPFLAGS = $(libwhippet_common_la_CPPFLAGS) $(WHIPPET_EMBEDDER_CPPFLAGS)
libwhippet_la_CPPFLAGS = $(libwhippet_common_la_CPPFLAGS)
libwhippet_la_CPPFLAGS += -DGC_EMBEDDER=\"$(WHIPPET_EMBEDDER_H)\"
libwhippet_la_CFLAGS = $(libwhippet_common_la_CFLAGS)
libwhippet_la_CFLAGS += $(WHIPPET_IMPL_CFLAGS)
libwhippet_la_LDFLAGS = $(libwhippet_common_la_LDFLAGS) $(WHIPPET_LIBS)

View file

@ -1,11 +1,19 @@
GC_COLLECTOR ?= semi
GC_COLLECTOR ?= pcc
GC_EMBEDDER_H ?= whippet-embedder.h
GC_EMBEDDER_CPPFLAGS ?=
GC_EMBEDDER_CFLAGS ?=
DEFAULT_BUILD := opt
BUILD_CFLAGS_opt = -O2 -g -DNDEBUG
BUILD_CFLAGS_optdebug = -O2 -g -DGC_DEBUG=1
BUILD_CFLAGS_debug = -O0 -g -DGC_DEBUG=1
BUILD_CPPFLAGS_opt = -DNDEBUG
BUILD_CPPFLAGS_optdebug = -DGC_DEBUG=1
BUILD_CPPFLAGS_debug = -DGC_DEBUG=1
BUILD_CFLAGS_opt = -O2 -g
BUILD_CFLAGS_optdebug = -O2 -g
BUILD_CFLAGS_debug = -O0 -g
GC_BUILD_CPPFLAGS = $(BUILD_CPPFLAGS_$(or $(GC_BUILD),$(DEFAULT_BUILD)))
GC_BUILD_CFLAGS = $(BUILD_CFLAGS_$(or $(GC_BUILD),$(DEFAULT_BUILD)))
V ?= 1
@ -23,39 +31,40 @@ 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_TRACEPOINT_CPPFLAGS)
GC_CPPFLAGS = -I$(GC_BASE)api $(GC_TRACEPOINT_CPPFLAGS) $(GC_BUILD_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 $@
GC_PLATFORM = gnu-linux
GC_OBJDIR =
GC_EMBEDDER_CPPFLAGS += -DGC_EMBEDDER=\"$(GC_EMBEDDER_H)\"
$(GC_OBJDIR)gc-platform.o: $(WHIPPET)src/gc-platform-$(GC_PLATFORM).c
$(GC_OBJDIR)gc-platform.o: $(GC_BASE)src/gc-platform-$(GC_PLATFORM).c
$(GC_COMPILE) -c $<
$(GC_OBJDIR)gc-stack.o: $(WHIPPET)src/gc-stack.c
$(GC_OBJDIR)gc-stack.o: $(GC_BASE)src/gc-stack.c
$(GC_COMPILE) -c $<
$(GC_OBJDIR)gc-options.o: $(WHIPPET)src/gc-options.c
$(GC_OBJDIR)gc-options.o: $(GC_BASE)src/gc-options.c
$(GC_COMPILE) -c $<
$(GC_OBJDIR)gc-tracepoint.o: $(WHIPPET)src/gc-tracepoint.c
$(GC_OBJDIR)gc-tracepoint.o: $(GC_BASE)src/gc-tracepoint.c
$(GC_COMPILE) -c $<
$(GC_OBJDIR)gc-ephemeron.o: $(WHIPPET)src/gc-ephemeron.c
$(GC_COMPILE) $(EMBEDDER_TO_GC_CFLAGS) -c $<
$(GC_OBJDIR)gc-finalizer.o: $(WHIPPET)src/gc-finalizer.c
$(GC_COMPILE) $(EMBEDDER_TO_GC_CFLAGS) -c $<
$(GC_OBJDIR)gc-ephemeron.o: $(GC_BASE)src/gc-ephemeron.c
$(GC_COMPILE) $(GC_EMBEDDER_CFLAGS) -c $<
$(GC_OBJDIR)gc-finalizer.o: $(GC_BASE)src/gc-finalizer.c
$(GC_COMPILE) $(GC_EMBEDDER_CFLAGS) -c $<
GC_STEM_bdw = bdw
GC_CFLAGS_bdw = -DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1
GC_CPPFLAGS_bdw = -DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1
GC_IMPL_CFLAGS_bdw = `pkg-config --cflags bdw-gc`
GC_LIBS_bdw = `pkg-config --libs bdw-gc`
GC_STEM_semi = semi
GC_CFLAGS_semi = -DGC_PRECISE_ROOTS=1
GC_CPPFLAGS_semi = -DGC_PRECISE_ROOTS=1
GC_LIBS_semi = -lm
GC_STEM_pcc = pcc
GC_CFLAGS_pcc = -DGC_PRECISE_ROOTS=1 -DGC_PARALLEL=1
GC_LIBS_pcc = -lm
GC_CPPFLAGS_pcc = -DGC_PRECISE_ROOTS=1 -DGC_PARALLEL=1
GC_LIBS_pcc = -lm
GC_STEM_generational_pcc = $(GC_STEM_pcc)
GC_CFLAGS_generational_pcc = $(GC_CFLAGS_pcc) -DGC_GENERATIONAL=1
@ -63,7 +72,7 @@ GC_LIBS_generational_pcc = $(GC_LIBS_pcc)
define mmc_variant
GC_STEM_$(1) = mmc
GC_CFLAGS_$(1) = $(2)
GC_CPPFLAGS_$(1) = $(2)
GC_LIBS_$(1) = -lm
endef
@ -88,18 +97,17 @@ $(eval $(call trace_mmc_variants))
gc_var = $($(1)$(subst -,_,$(2)))
gc_impl = $(call gc_var,GC_STEM_,$(1)).c
gc_attrs = $(call gc_var,GC_STEM_,$(1))-attrs.h
gc_cflags = $(call gc_var,GC_CFLAGS_,$(1))
gc_cppflags = $(call gc_var,GC_CPPFLAGS_,$(1))
gc_impl_cflags = $(call gc_var,GC_IMPL_CFLAGS_,$(1))
gc_libs = $(call gc_var,GC_LIBS_,$(1))
GC_IMPL = $(call gc_impl,$(GC_COLLECTOR))
GC_CFLAGS += $(call gc_cflags,$(GC_COLLECTOR))
GC_CPPFLAGS += $(call gc_cppflags,$(GC_COLLECTOR))
GC_CPPFLAGS += -DWHIPPET_ATTRS=\"$(GC_BASE)api/$(GC_IMPL)-attrs.h\"
GC_IMPL_CFLAGS = $(call gc_impl_cflags,$(GC_COLLECTOR))
GC_ATTRS = $(WHIPPET)api/$(call gc_attrs,$(GC_COLLECTOR))
GC_TO_EMBEDDER_CFLAGS = -include $(GC_ATTRS)
GC_LIBS = $(call gc_libs,$(GC_COLLECTOR))
$(GC_OBJDIR)gc-impl.o: $(WHIPPET)src/$(call gc_impl,$(GC_COLLECTOR))
$(GC_OBJDIR)gc-impl.o: $(GC_BASE)src/$(call gc_impl,$(GC_COLLECTOR))
$(GC_COMPILE) $(GC_IMPL_CFLAGS) $(EMBEDDER_TO_GC_CFLAGS) -c $<
GC_OBJS=$(foreach O,gc-platform.o gc-stack.o gc-options.o gc-tracepoint.o gc-ephemeron.o gc-finalizer.o gc-impl.o,$(GC_OBJDIR)$(O))

View file

@ -6,7 +6,7 @@
#include "address-hash.h"
#include "debug.h"
#include "gc-embedder-api.h"
#include "embedder-api-impl.h"
#include "gc-ephemeron-internal.h"
// # Overview

View file

@ -6,7 +6,7 @@
#define GC_IMPL 1
#include "debug.h"
#include "gc-embedder-api.h"
#include "embedder-api-impl.h"
#include "gc-ephemeron-internal.h" // for gc_visit_ephemeron_key
#include "gc-finalizer-internal.h"

View file

@ -5,6 +5,7 @@
#error internal header file, not part of API
#endif
#include "embedder-api-impl.h"
#include "gc-ephemeron-internal.h"
#include "gc-finalizer-internal.h"
#include "gc-options-internal.h"