diff options
Diffstat (limited to 'test/monniaux/rules.mk')
-rw-r--r-- | test/monniaux/rules.mk | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/test/monniaux/rules.mk b/test/monniaux/rules.mk new file mode 100644 index 00000000..cab957c0 --- /dev/null +++ b/test/monniaux/rules.mk @@ -0,0 +1,162 @@ +# This Makefile does not depend on ../rules.mk +SHELL=bash + +# You can modify ALL_CFILES to include the files that should be linked +ALL_CFILES?=$(wildcard *.c) + +# Name of the target +TARGET?=toto + +# Arguments of execution +EXECUTE_ARGS?= + +# Name of the clock object +CLOCK=../clock + +# Maximum amount of time measures (see cycles.h) +MAX_MEASURES=10 +MEASURES?=time + +# Flags common to both compilers, then to gcc, then to ccomp +ALL_CFLAGS+=-Wall -D__KVX_COS__ -DMAX_MEASURES=$(MAX_MEASURES) +#ALL_CFLAGS+=-g +ALL_GCCFLAGS+=$(ALL_CFLAGS) -std=c99 -Wextra -Werror=implicit +ALL_CCOMPFLAGS+=$(ALL_CFLAGS) # -fprofile-use= ../compcert_profiling.dat + +# The compilers +KVX_CC?=kvx-elf-gcc +KVX_CCOMP?=ccomp + +# Command to execute +#EXECUTE_CYCLES?=timeout --signal=SIGTERM 3m kvx-cluster --syscall=libstd_scalls.so --cycle-based -- +EXECUTE_CYCLES?=kvx-cluster --enable-cache --syscall=libstd_scalls.so --cycle-based -- + +# You can define up to GCC4FLAGS and CCOMP4FLAGS +GCC0FLAGS?=$(ALL_GCCFLAGS) -O0 +GCC1FLAGS?=$(ALL_GCCFLAGS) -O1 +GCC2FLAGS?=$(ALL_GCCFLAGS) -O2 +GCC3FLAGS?=$(ALL_GCCFLAGS) -O3 +GCC4FLAGS?= +CCOMP0FLAGS?=$(ALL_CCOMPFLAGS) -O2 +CCOMP1FLAGS?=$(ALL_CCOMPFLAGS) -O2 -fprepass= list +CCOMP2FLAGS?=$(ALL_CCOMPFLAGS) -O2 -funrollsingle 30 +CCOMP3FLAGS?=$(ALL_CCOMPFLAGS) -O2 -fprepass= list -funrollsingle 30 +CCOMP4FLAGS?=$(ALL_CCOMPFLAGS) -O2 -fprepass= zigzag + +# Prefix names +GCC0PREFIX?=.gcc.o0 +GCC1PREFIX?=.gcc.o1 +GCC2PREFIX?=.gcc.o2 +GCC3PREFIX?=.gcc.o3 +GCC4PREFIX?= +CCOMP0PREFIX?=.ccomp +CCOMP1PREFIX?=.ccomp.prepass_list +CCOMP2PREFIX?=.ccomp.unrollsingle_30 +CCOMP3PREFIX?=.ccomp.prepass_list-unrollsingle_30 +CCOMP4PREFIX?=.ccomp.prepass_zigzag + +# List of outfiles, updated by gen_rules +OUTFILES:= +BINFILES:= + +# First line of the CSV file, completed later +FIRSTLINE:=benches + +firstrule: all + +# $1: compiler +# $2: compilation flags +# $3: extension prefix +define gen_rules + +.SECONDARY: +asm/%$(3).s: %.c + @mkdir -p $$(@D) + $(1) $(2) -S $$< -o $$@ + +.SECONDARY: +bin/$(TARGET)$(3).bin: $(addprefix obj/,$(ALL_CFILES:.c=$(3).o)) $(CLOCK).gcc.kvx.o + @mkdir -p $$(@D) + $(1) $$+ -lm -o $$@ + +BINFILES:=$(BINFILES) bin/$(TARGET)$(3).bin +OUTFILES:=$(OUTFILES) out/$(TARGET)$(3).out +FIRSTLINE:=$(FIRSTLINE), $(3) + +endef + +# Clock generation +$(CLOCK).gcc.kvx.o: $(CLOCK).c + $(KVX_CC) $(ALL_GCCFLAGS) -O3 $< -c -o $@ + +# Generic rules +obj/%.o: asm/%.s + @mkdir -p $(@D) + $(KVX_CC) $< -c -o $@ + +out/%.out: bin/%.bin + @mkdir -p $(@D) + @rm -f $@ + $(EXECUTE_CYCLES) $< $(subst __BASE__,$(patsubst %.out,%,$@),$(EXECUTE_ARGS)) | tee -a $@ + +## +# Generating the rules for all the compiler/flags.. +## + +ifneq ($(GCC0FLAGS),) +$(eval $(call gen_rules,$(KVX_CC),$(GCC0FLAGS),$(GCC0PREFIX))) +endif +ifneq ($(GCC1FLAGS),) +$(eval $(call gen_rules,$(KVX_CC),$(GCC1FLAGS),$(GCC1PREFIX))) +endif +ifneq ($(GCC2FLAGS),) +$(eval $(call gen_rules,$(KVX_CC),$(GCC2FLAGS),$(GCC2PREFIX))) +endif +ifneq ($(GCC3FLAGS),) +$(eval $(call gen_rules,$(KVX_CC),$(GCC3FLAGS),$(GCC3PREFIX))) +endif +ifneq ($(GCC4FLAGS),) +$(eval $(call gen_rules,$(KVX_CC),$(GCC4FLAGS),$(GCC4PREFIX))) +endif + +ifneq ($(CCOMP0FLAGS),) +$(eval $(call gen_rules,$(KVX_CCOMP),$(CCOMP0FLAGS),$(CCOMP0PREFIX))) +endif +ifneq ($(CCOMP1FLAGS),) +$(eval $(call gen_rules,$(KVX_CCOMP),$(CCOMP1FLAGS),$(CCOMP1PREFIX))) +endif +ifneq ($(CCOMP2FLAGS),) +$(eval $(call gen_rules,$(KVX_CCOMP),$(CCOMP2FLAGS),$(CCOMP2PREFIX))) +endif +ifneq ($(CCOMP3FLAGS),) +$(eval $(call gen_rules,$(KVX_CCOMP),$(CCOMP3FLAGS),$(CCOMP3PREFIX))) +endif +ifneq ($(CCOMP4FLAGS),) +$(eval $(call gen_rules,$(KVX_CCOMP),$(CCOMP4FLAGS),$(CCOMP4PREFIX))) +endif + +measures.csv: $(OUTFILES) + @echo $(FIRSTLINE) > $@ + @for i in "$(MEASURES)"; do\ + first=$$(grep "$$i cycles" $(firstword $(OUTFILES)));\ + if test ! -z "$$first"; then\ + if [ "$$i" != "time" ]; then\ + line="$(TARGET) $$i";\ + else\ + line="$(TARGET)";\ + fi;\ + $(foreach outfile,$(OUTFILES),line="$$line, $$(grep "$$i cycles" $(outfile) | cut -d':' -f2)"; ):;\ + echo "$$line" >> $@;\ + fi;\ + done;\ + echo "$@ created!" + +.PHONY: all clean run +all: $(BINFILES) + +run: measures.csv + +clean: + rm -f *.o *.s *.bin *.out + rm -rf asm/ bin/ obj/ out/ + |