Makefile 3.88 KB
# Makefile for building tests for compilation of isolated FPU/SWAR operations

SRCDIR=tests
SCRIPTDIR=scripts
DEFDSTDIR=BUILD
DSTDIR?=$(DEFDSTDIR)

OPTIMS=O0 O1 O2 O3
#OPT?=-O0

#DEBUG=yes

CC=clang
LC=llc
LDIS=llvm-dis

TOOLCHAIN=sparc-daiteq-elf
AS=$(TOOLCHAIN)-as
LD=$(TOOLCHAIN)-ld
OBJDUMP=$(TOOLCHAIN)-objdump

#LCFLAGS=-debug-pass=Structure -debug --asm-verbose --print-after-all 
#--view-legalize-dags
#LCFLAGS=-debug --print-machineinstrs -view-dag-combine1-dags

TESTBASE := $(basename $(notdir $(SOURCE)))
OUTDIR := $(DSTDIR)/$(SRCDIR)/$(TESTBASE)
OUTFILES := $(OUTDIR)/$(TESTBASE)

DEFS = $(shell ./$(SCRIPTDIR)/get_defines $(SOURCE) D)

ASMALLFLAGS = $(shell ./$(SCRIPTDIR)/get_defines $(SOURCE) A)
ASFLAGS = $(ASMALLFLAGS:%=-Xassembler %)

SRCCFLAGS = $(shell ./$(SCRIPTDIR)/get_defines $(SOURCE) C)

SRCDIRSCMD:=find $(SRCDIR) -mindepth 1 -maxdepth 1 -type d
#ALLSOURCES=$(sort $(wildcard $(SRCDIR)/*.c))

#ODFLAGS=--visualize-jumps=color
ODFLAGS=--visualize-jumps


ifeq ($(DEBUG),yes)
  VV=
else
  VV=@
endif

CFLAGS:=$(OPT) $(SRCCFLAGS)

.PHONY: all optimized clean build_dir build_one $(OUTDIR)

# process all test directory
all: $(DSTDIR)
	echo "-> Build in directory $(DSTDIR)"
	@for i in `$(SRCDIRSCMD)`; do \
	  echo " Build in directory $$i"; \
	  make -C $(PWD) -f Makefile build_dir DSTDIR=$(DSTDIR) OPT=$(OPT) SRCDIR=$$i PHASE=dir; \
	done
	@echo "`find $(DSTDIR) -type f -name done | wc -l`/`find $(SRCDIR) -type f -name *.c | wc -l` tests done\n"

optimized:
	@for o in $(OPTIMS); do \
	  echo " Build all tests with optimization '$${o}'"; \
	  make -C $(PWD) -f Makefile all DSTDIR=$(DEFDSTDIR)/$${o} OPT=$${o}; \
	done


build_dir:
	@for i in `ls $(SRCDIR)/*.c`; do \
	  echo " Build for optimization $$i"; \
	  ( make -C $(PWD) -f Makefile build_one SRCDIR=$(notdir $(SRCDIR)) OPT=$(OPT) SOURCE=$$i PHASE=one; exit 0; ) \
	done
	@echo "Built all tests in $(SRCDIR)\n"

build_one: $(OUTDIR)/done
	@echo " Done"


test:
	@echo "Srcs : $(ALLSOURCES)"

clean:
	rm -fr $(DSTDIR)

$(DSTDIR):
	@echo "Create build directory"
	$(VV)mkdir -p $(DSTDIR)

$(OUTDIR):
	@echo "Create output project directory"
	$(VV)mkdir -p $(OUTDIR)


$(OUTFILES).ast: $(SOURCE)
	@echo "Parse $(SOURCE) to $(OUTFILES).ast"
	$(VV)$(CC) -Xclang -ast-dump -fno-color-diagnostics -S $(TEST_CFLAGS) $(DEFS) $(CFLAGS) $(SOURCE) >$(OUTFILES).ast 2>$(OUTFILES).ast_err

$(OUTFILES).ll: $(SOURCE)
	@echo "Create IR $(OUTFILES).ll from $(SOURCE)"
	$(VV)$(CC) -emit-llvm $(TEST_CFLAGS) $(DEFS) $(CFLAGS) $(SOURCE) -S -o $(OUTFILES).ll 2>$(OUTFILES).ll_err

$(OUTFILES).bc: $(SOURCE)
	@echo "Create binary IR $(OUTFILES).bc from $(SOURCE)"
	@echo "$(CC) -emit-llvm $(TEST_CFLAGS) $(DEFS) $(CFLAGS) $(SOURCE) -c -o $(OUTFILES).bc" >$(OUTFILES).bc_cmd
	$(VV)$(CC) -emit-llvm $(TEST_CFLAGS) $(DEFS) $(CFLAGS) $(SOURCE) -c -o $(OUTFILES).bc 2>$(OUTFILES).bc_err

$(OUTFILES)-dis.ll: $(OUTFILES).bc
	@echo "Disassembly IR $(OUTFILES).bc to $(OUTFILES)-dis.ll"
	$(VV)$(LDIS) < $(OUTFILES).bc 1>$(OUTFILES)-dis.ll 2>$(OUTFILES)-dis.ll_err

$(OUTFILES).S: $(OUTFILES).bc
	@echo "Compile IR $(OUTFILES).bc to target ASM $(OUTFILES).S"
	@echo "$(LC) $(OUTFILES).bc $(LCFLAGS) -o $(OUTFILES).S" >$(OUTFILES).S_cmd
	$(VV)$(LC) $(OUTFILES).bc $(LCFLAGS) -o $(OUTFILES).S 2>$(OUTFILES).S_err

$(OUTFILES).o: $(OUTFILES).S
	@echo "Compile $(OUTFILES).S to target object file $(OUTFILES).o"
	$(VV)$(CC) -target $(TOOLCHAIN) $(TEST_CFLAGS) $(DEFS) $(CFLAGS) $(ASFLAGS) -c $(SOURCE) -o $(OUTFILES).o 2>$(OUTFILES).obj_err

$(OUTFILES).dis: $(OUTFILES).o
	@echo "Disassembly object $(OUTFILES).o to $(OUTFILES).dis"
	$(VV)$(OBJDUMP) -Sdt $(ODFLAGS) $(OUTFILES).o >$(OUTFILES).dis 2>$(OUTFILES).dis_err

$(OUTFILES).rci: $(OUTFILES).dis
	@echo "Create report of hardware/soft-float instructions to $@"
	$(VV)./$(SCRIPTDIR)/inspectfp.py $< >$@

$(OUTDIR)/done: $(OUTDIR) $(OUTFILES).ast $(OUTFILES).ll $(OUTFILES)-dis.ll $(OUTFILES).dis $(OUTFILES).rci
	@echo "Build test in $(OUTDIR)"
	@touch $(OUTDIR)/done