-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathMakefile
147 lines (123 loc) · 4.69 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
TESTS = quads mt-gcbench ephemerons finalizers
COLLECTORS = \
bdw \
semi \
\
pcc \
generational-pcc \
\
mmc \
stack-conservative-mmc \
heap-conservative-mmc \
\
parallel-mmc \
stack-conservative-parallel-mmc \
heap-conservative-parallel-mmc \
\
generational-mmc \
stack-conservative-generational-mmc \
heap-conservative-generational-mmc \
\
parallel-generational-mmc \
stack-conservative-parallel-generational-mmc \
heap-conservative-parallel-generational-mmc
DEFAULT_BUILD := opt
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
USE_LTTNG := $(shell pkg-config --exists lttng-ust && echo 1 || echo 0)
LTTNG_CPPFLAGS := $(if $(USE_LTTNG_$(USE_LTTNG)), $(shell pkg-config --cflags lttng-ust),)
LTTNG_LIBS := $(if $(USE_LTTNG_$(USE_LTTNG)), $(shell pkg-config --libs lttng-ust),)
TRACEPOINT_CPPFLAGS = $(if $(USE_LTTNG_$(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 $(TRACEPOINT_CPPFLAGS) $(BUILD_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 $@
PLATFORM = gnu-linux
ALL_TESTS = $(foreach COLLECTOR,$(COLLECTORS),$(addsuffix .$(COLLECTOR),$(TESTS)))
all: $(ALL_TESTS:%=bin/%)
.deps obj bin: ; mkdir -p $@
include $(wildcard .deps/*)
obj/gc-platform.o: src/gc-platform-$(PLATFORM).c | .deps obj
$(COMPILE) -c $<
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) -DGC_EMBEDDER=\"../benchmarks/$*-embedder.h\" -c $<
obj/%.gc-finalizer.o: src/gc-finalizer.c | .deps obj
$(COMPILE) -DGC_EMBEDDER=\"../benchmarks/$*-embedder.h\" -c $<
GC_STEM_bdw = bdw
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_CPPFLAGS_semi = -DGC_PRECISE_ROOTS=1
GC_LIBS_semi = -lm
GC_STEM_pcc = pcc
GC_CPPFLAGS_pcc = -DGC_PRECISE_ROOTS=1 -DGC_PARALLEL=1
GC_LIBS_pcc = -lm
GC_STEM_generational_pcc = $(GC_STEM_pcc)
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_CPPFLAGS_$(1) = $(2)
GC_LIBS_$(1) = -lm
endef
define generational_mmc_variants
$(call mmc_variant,$(1)mmc,$(2))
$(call mmc_variant,$(1)generational_mmc,$(2) -DGC_GENERATIONAL=1)
endef
define parallel_mmc_variants
$(call generational_mmc_variants,$(1),$(2))
$(call generational_mmc_variants,$(1)parallel_,$(2) -DGC_PARALLEL=1)
endef
define trace_mmc_variants
$(call parallel_mmc_variants,,-DGC_PRECISE_ROOTS=1)
$(call parallel_mmc_variants,stack_conservative_,-DGC_CONSERVATIVE_ROOTS=1)
$(call parallel_mmc_variants,heap_conservative_,-DGC_CONSERVATIVE_ROOTS=1 -DGC_CONSERVATIVE_TRACE=1)
endef
$(eval $(call trace_mmc_variants))
# $(1) is the benchmark, $(2) is the collector configuration
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_cppflags = $(call make_gc_var,GC_CPPFLAGS_,$(1))
gc_cppflags += -DGC_ATTRS=\"../api/$(call gc_attrs,$(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_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_cppflags,$(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
$(foreach BENCHMARK,$(TESTS),\
$(foreach COLLECTOR,$(COLLECTORS),\
$(eval $(call benchmark_template,$(BENCHMARK),$(COLLECTOR)))))
.PRECIOUS: $(ALL_TESTS) $(OBJS)
clean:
rm -f $(ALL_TESTS)
rm -rf .deps obj bin
# Clear some of the default rules.
.SUFFIXES:
.SECONDARY:
%.c:;
Makefile:;