| ##===- Makefile.perfect ------------------------------------*- Makefile -*-===## |
| # |
| # This makefile is a template for building PERFECT as an external test. |
| # |
| ##===----------------------------------------------------------------------===## |
| |
| include $(LEVEL)/Makefile.config |
| |
| ## Information the test should have provided... |
| ifndef STDOUT_FILENAME |
| STDOUT_FILENAME := standard.out |
| endif |
| LDFLAGS += -lm |
| |
| # Get the current directory, the name of the benchmark, and the current |
| # subdirectory of the PERFECT directory we are in |
| # |
| CURRENT_DIR := $(shell cd .; pwd) |
| BENCH_NAME := $(subst $(shell cd .. ; pwd),,$(CURRENT_DIR)) |
| |
| # Remove any leading /'s from the paths |
| BENCH_NAME := $(patsubst /%,%,$(BENCH_NAME)) |
| |
| ifndef PERFECT_BENCH_DIR |
| PERFECT_BENCH_DIR := $(PERFECT_ROOT)/$(BENCH_NAME) |
| endif |
| |
| PROG := $(BENCH_NAME) |
| ifndef Source |
| Source := $(wildcard $(PERFECT_BENCH_DIR)/*.c $(PERFECT_BENCH_DIR)/*.cc) |
| Source += $(wildcard $(PERFECT_BENCH_DIR)/*.f) |
| endif |
| |
| # Disable the default Output/%.out-* targets... |
| PROGRAMS_HAVE_CUSTOM_RUN_RULES := 1 |
| SourceDir := $(PERFECT_BENCH_DIR) |
| |
| include $(LEVEL)/MultiSource/Makefile.multisrc |
| |
| # Do not pass -Wall to compile commands... |
| LCCFLAGS := -O3 |
| LCXXFLAGS := -O3 |
| |
| CPPFLAGS += -I$(PERFECT_BENCH_DIR) |
| PERFECT_SANDBOX := $(PROGDIR)/External/PerfectClub/Sandbox.sh |
| |
| # Information about testing the program... |
| REF_IN_DIR := $(PERFECT_BENCH_DIR) |
| |
| # specify how to generate output from the PERFECT programs. Basically we just |
| # run the program in a sandbox (a special directory we create), then we cat all |
| # of the outputs together. |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.out-nat): \ |
| Output/%.out-nat: Output/%.native |
| $(PERFECT_SANDBOX) nat $@ $(REF_IN_DIR) \ |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ |
| ../$*.native $(RUN_OPTIONS) |
| -(cd Output/nat; cat $(LOCAL_OUTPUTS)) > $@ |
| -cp Output/nat/$(STDOUT_FILENAME).time $@.time |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.out-lli): \ |
| Output/%.out-lli: Output/%.llvm.bc $(LLI) |
| $(PERFECT_SANDBOX) lli $@ $(REF_IN_DIR) \ |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ |
| $(LLI) $(LLI_OPTS) ../$*.llvm.bc $(RUN_OPTIONS) |
| -(cd Output/lli; cat $(LOCAL_OUTPUTS)) > $@ |
| -cp Output/lli/$(STDOUT_FILENAME).time $@.time |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.out-jit): \ |
| Output/%.out-jit: Output/%.llvm.bc $(LLI) |
| $(PERFECT_SANDBOX) jit $@ $(REF_IN_DIR) \ |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ |
| $(LLI) $(JIT_OPTS) ../$*.llvm.bc $(RUN_OPTIONS) |
| -(cd Output/jit; cat $(LOCAL_OUTPUTS)) > $@ |
| -cp Output/jit/$(STDOUT_FILENAME).time $@.time |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.out-jit-beta): \ |
| Output/%.out-jit-beta: Output/%.llvm.bc $(LLI) |
| $(PERFECT_SANDBOX) jit-beta $@ $(REF_IN_DIR) \ |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ |
| $(LLI) $(LLCBETAOPTION) $(JIT_OPTS) ../$*.llvm.bc $(RUN_OPTIONS) |
| -(cd Output/jit-beta; cat $(LOCAL_OUTPUTS)) > $@ |
| -cp Output/jit-beta/$(STDOUT_FILENAME).time $@.time |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.out-llc): \ |
| Output/%.out-llc: Output/%.llc |
| $(PERFECT_SANDBOX) llc $@ $(REF_IN_DIR) \ |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ |
| ../$*.llc $(RUN_OPTIONS) |
| -(cd Output/llc; cat $(LOCAL_OUTPUTS)) > $@ |
| -cp Output/llc/$(STDOUT_FILENAME).time $@.time |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.out-llc-beta): \ |
| Output/%.out-llc-beta: Output/%.llc-beta |
| $(PERFECT_SANDBOX) llc-beta $@ $(REF_IN_DIR) \ |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ |
| ../$*.llc-beta $(RUN_OPTIONS) |
| -(cd Output/llc-beta; cat $(LOCAL_OUTPUTS)) > $@ |
| -cp Output/llc-beta/$(STDOUT_FILENAME).time $@.time |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.out-cbe): \ |
| Output/%.out-cbe: Output/%.cbe |
| $(PERFECT_SANDBOX) cbe $@ $(REF_IN_DIR) \ |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) \ |
| ../$*.cbe $(RUN_OPTIONS) |
| -(cd Output/cbe; cat $(LOCAL_OUTPUTS)) > $@ |
| -cp Output/cbe/$(STDOUT_FILENAME).time $@.time |
| |
| # perfectify stdin, reference output, and command line options for the program... |
| BUGPOINT_OPTIONS += -input=$(STDIN_FILENAME) -output=../$*.out-nat |
| BUGPOINT_OPTIONS += -timeout=$(RUNTIMELIMIT) |
| BUGPOINT_OPTIONS += --tool-args $(LLCFLAGS) |
| BUGPOINT_ARGS += --args -- $(RUN_OPTIONS) |
| |
| # Rules to bugpoint the GCCAS, GCCLD, LLC, or LLI commands... |
| $(PROGRAMS_TO_TEST:%=Output/%.bugpoint-gccas): \ |
| Output/%.bugpoint-gccas: Output/%.noopt-llvm.bc $(LBUGPOINT) \ |
| Output/gccas-pass-args Output/%.out-nat |
| $(PERFECT_SANDBOX) bugpoint $@ $(REF_IN_DIR) \ |
| $(LBUGPOINT) ../$*.noopt-llvm.bc `cat Output/gccas-pass-args` $(OPTPASSES) \ |
| $(BUGPOINT_OPTIONS) $(BUGPOINT_ARGS) |
| @echo "===> Leaving Output/bugpoint" |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.bugpoint-gccld): \ |
| Output/%.bugpoint-gccld: Output/%.nogccldopt-llvm.bc $(LBUGPOINT) \ |
| Output/gccld-pass-args Output/%.out-nat |
| $(PERFECT_SANDBOX) bugpoint $@ $(REF_IN_DIR) \ |
| $(LBUGPOINT) ../$*.nogccldopt-llvm.bc `cat Output/gccld-pass-args` $(OPTPASSES) \ |
| $(BUGPOINT_OPTIONS) $(BUGPOINT_ARGS) |
| @echo "===> Leaving Output/bugpoint" |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.bugpoint-llc): \ |
| Output/%.bugpoint-llc: Output/%.llvm.bc $(LBUGPOINT) Output/%.out-nat |
| $(PERFECT_SANDBOX) bugpoint $@ $(REF_IN_DIR) \ |
| $(LBUGPOINT) ../$*.llvm.bc -run-llc $(BUGPOINT_OPTIONS) $(BUGPOINT_ARGS) |
| @echo "===> Leaving Output/bugpoint" |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.bugpoint-llc-beta): \ |
| Output/%.bugpoint-llc-beta: Output/%.llvm.bc $(LBUGPOINT) Output/%.out-nat |
| $(PERFECT_SANDBOX) bugpoint $@ $(REF_IN_DIR) \ |
| $(LBUGPOINT) ../$*.llvm.bc -run-llc $(BUGPOINT_OPTIONS) \ |
| $(LLCBETAOPTION) $(BUGPOINT_ARGS) |
| @echo "===> Leaving Output/bugpoint" |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.bugpoint-jit): \ |
| Output/%.bugpoint-jit: Output/%.llvm.bc $(LBUGPOINT) Output/%.out-nat |
| $(PERFECT_SANDBOX) bugpoint $@ $(REF_IN_DIR) \ |
| $(LBUGPOINT) ../$*.llvm.bc -run-jit $(BUGPOINT_OPTIONS) $(BUGPOINT_ARGS) |
| @echo "===> Leaving Output/bugpoint" |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.bugpoint-jit-beta): \ |
| Output/%.bugpoint-jit-beta: Output/%.llvm.bc $(LBUGPOINT) Output/%.out-nat |
| $(PERFECT_SANDBOX) bugpoint $@ $(REF_IN_DIR) \ |
| $(LBUGPOINT) ../$*.llvm.bc -run-jit $(BUGPOINT_OPTIONS) \ |
| $(LLCBETAOPTION) $(BUGPOINT_ARGS) |
| @echo "===> Leaving Output/bugpoint" |
| |
| |
| |
| LIBPROFILESO = $(LLVM_OBJ_ROOT)/Debug/lib/libprofile_rt.so |
| |
| $(PROGRAMS_TO_TEST:%=Output/%.prof): \ |
| Output/%.prof: Output/%.llvm-prof.bc Output/%.out-nat $(LIBPROFILESO) |
| @rm -f $@ |
| $(PERFECT_SANDBOX) profile Output/$*.out-prof $(REF_IN_DIR) \ |
| $(RUNSAFELY) $(STDIN_FILENAME) $(STDOUT_FILENAME) $(LLI) $(JIT_OPTS)\ |
| -fake-argv0 '../$*.llvm.bc' -load $(LIBPROFILESO) ../../$< -llvmprof-output ../../$@ $(RUN_OPTIONS) |
| -(cd Output/profile; cat $(LOCAL_OUTPUTS)) > Output/$*.out-prof |
| -cp Output/profile/$(STDOUT_FILENAME).time $@.time |
| -cp Output/profile/llvmprof.out $@ |
| @cmp -s Output/$*.out-prof Output/$*.out-nat || \ |
| printf "***\n***\n*** WARNING: Output of profiled program (Output/$*.out-prof)\n*** doesn't match the output of the native program (Output/$*.out-nat)!\n***\n***\n"; |