
# By default, modules are loaded at the address range
# 0x200000--0x400000.  If you uncomment the line below,
# modules will instead be loaded at the address range
# 0x555555200000--0x555555400000.  Note that `target` and
# `demo-runner` will need to be rebuilt and all modules
# will need to be relinked; run `make spotless` to delete
# out-of-date artifacts.
#

#CONFIG_LOADHIGH=y


RELEASE_CFLAGS := -O2 -Wall
DEBUG_CFLAGS   := -O1 -g -Wall -DDEBUG

MODULE_CCFLAGS := -O1 -Wall -ffixed-x26 -ffixed-x27 -ffixed-x28 \
	                    -ffixed-x29 -ffixed-x30 -ffixed-x31
MODULE_ASFLAGS := -march=rv64g

ifdef CONFIG_LOADHIGH
  RELEASE_CFLAGS += -DSFI_HIGHADDR
  DEBUG_CFLAGS   += -DSFI_HIGHADDR
  LDSCRIPT := util/ldscript-highaddr
else
  LDSCRIPT := util/ldscript
endif

MODULE_LDFLAGS := -static -nostdlib -nostartfiles \
                  -Wl,--build-id=none -Wl,-T,$(LDSCRIPT)

.PHONY: default clean modclean spotless
default: release/target release/demo-runner debug/target debug/demo-runner

#
# Release build rules
#

release/target: release/target.o release/sfi.o release/riscv-disas.o
	$(CC) release/target.o release/sfi.o release/riscv-disas.o \
	      -lelf -o release/target

release/target.o: target.c sfi.h
	$(CC) -c $(RELEASE_CFLAGS) target.c -o release/target.o

release/demo-runner: release/demo-runner.o release/sfi.o release/riscv-disas.o
	$(CC) release/demo-runner.o release/sfi.o release/riscv-disas.o \
	      -lelf -o release/demo-runner

release/demo-runner.o: demo-runner.c sfi.h
	$(CC) -c $(RELEASE_CFLAGS) demo-runner.c -o release/demo-runner.o

release/sfi.o: sfi.c sfi.h riscv-disas.h
	$(CC) -c $(RELEASE_CFLAGS) sfi.c -o release/sfi.o

release/riscv-disas.o: riscv-disas.c riscv-disas.h
	$(CC) -c $(RELEASE_CFLAGS) riscv-disas.c -o release/riscv-disas.o

#
# Debug build rules
#

debug/target: debug/target.o debug/sfi.o debug/riscv-disas.o
	$(CC) debug/target.o debug/sfi.o debug/riscv-disas.o \
	      -lelf -o debug/target

debug/target.o: target.c sfi.h
	$(CC) -c $(DEBUG_CFLAGS) target.c -o debug/target.o

debug/demo-runner: debug/demo-runner.o debug/sfi.o debug/riscv-disas.o
	$(CC) debug/demo-runner.o debug/sfi.o debug/riscv-disas.o \
	      -lelf -o debug/demo-runner

debug/demo-runner.o: demo-runner.c sfi.h
	$(CC) -c $(DEBUG_CFLAGS) demo-runner.c -o debug/demo-runner.o

debug/sfi.o: sfi.c sfi.h riscv-disas.h
	$(CC) -c $(DEBUG_CFLAGS) sfi.c -o debug/sfi.o

debug/riscv-disas.o: riscv-disas.c riscv-disas.h
	$(CC) -c $(DEBUG_CFLAGS) riscv-disas.c -o debug/riscv-disas.o
#
# pattern rules for building SFI modules
#

.PRECIOUS: modules/%.s0 modules/%.s

modules/%.sfi: modules/%.s util/ldscript
	$(CC) $(MODULE_ASFLAGS) $(MODULE_LDFLAGS) $< -o $@

modules/%.s: modules/%.s0 util/rewrite.pl
	util/rewrite.pl < $< > $@

modules/%.s0: modules/%.c modules/trampoline.h
	$(CC) -S $(MODULE_CCFLAGS) $(MODULE_ASFLAGS) $< -o $@

#
# pattern rules for building fast-sp SFI modules
#

.PRECIOUS: modules-fastsp/%.s

modules-fastsp/%.sfi: modules-fastsp/%.s util/ldscript
	$(CC) $(MODULE_ASFLAGS) $(MODULE_LDFLAGS) $< -o $@

modules-fastsp/%.s: modules/%.s0 util/rewrite-fastsp.pl
	util/rewrite-fastsp.pl < $< > $@


#
# cleaning rules.
#
# WARNING: if you edited a .s file by hand, running `make spotless`
# or `make modclean` could delete your work!
#

spotless: clean modclean

clean:
	-rm -f release/demo-runner.o release/target.o release/sfi.o
	-rm -f release/riscv-disas.o release/demo-runner
	-rm -f release/target release/demo-runner.core release/target.core
	-rm -f debug/demo-runner.o debug/target.o debug/sfi.o
	-rm -f debug/riscv-disas.o debug/demo-runner
	-rm -f debug/target debug/demo-runner.core debug/target.core

modclean:
	-rm -f modules/*.s0 modules/*.s modules/*.sfi
	-rm -f modules-fastsp/*.s modules-fastsp/*.sfi
