blob: a9a4160c98811c00edf3e8aa334d2f3ba4034f19 [file] [log] [blame]
##===- 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";