compiler/
kernel/
lib/
scripts/
seed/
sublime/
test/
vim/
.gitignore
336 B
.gitsigners
112 B
CONTRIBUTING
2.1 KiB
LICENSE
1.1 KiB
Makefile
9.2 KiB
README
2.5 KiB
STYLE
2.5 KiB
std.lib
1.5 KiB
std.lib.test
662 B
Makefile
raw
| 1 | # Radiance build file. |
| 2 | |
| 3 | # Core standard library modules. |
| 4 | STD := -pkg std $(patsubst %,-mod %,$(shell cat std.lib)) |
| 5 | # Session allocation support for standalone lowering fixtures. |
| 6 | TEST_FIXTURE_STD_LIB := $(shell cat test/support/std.lib) |
| 7 | TEST_FIXTURE_STD := -pkg std $(patsubst %,-mod %,$(TEST_FIXTURE_STD_LIB)) |
| 8 | |
| 9 | # Full standard library with test modules. |
| 10 | STD_TEST := $(STD) $(patsubst %,-mod %,$(shell cat std.lib.test)) |
| 11 | |
| 12 | # Standard library support for tests in another package. |
| 13 | STD_TEST_SUPPORT := $(STD) -mod lib/std/testing.rad |
| 14 | |
| 15 | # Source files. |
| 16 | STD_LIB := $(shell find lib -name '*.rad') |
| 17 | BIN_DIR := bin |
| 18 | RAD_BIN := $(BIN_DIR)/radiance.rv64.dev |
| 19 | |
| 20 | # Emulator command used to invoke the self-hosted compiler. |
| 21 | EMU := $(or $(RAD_EMULATOR),emulator) |
| 22 | EMU_FLAGS := -memory-size=385024 \ |
| 23 | -data-size=348160 \ |
| 24 | -stack-size=1024 \ |
| 25 | -count-instructions |
| 26 | RADIANCE := $(EMU) $(EMU_FLAGS) -run $(RAD_BIN) |
| 27 | |
| 28 | # Verify the emulator binary exists. |
| 29 | EMU_PATH := $(shell command -v $(EMU) 2>/dev/null) |
| 30 | |
| 31 | default: emulator $(RAD_BIN) |
| 32 | test: emulator seed-test std-test bin-test kernel-test package-test machine-test kernel-acceptance kernel-size-check |
| 33 | |
| 34 | seed-test: |
| 35 | @seed/test |
| 36 | |
| 37 | # Emulator command check |
| 38 | |
| 39 | emulator: |
| 40 | ifeq ($(EMU_PATH),) |
| 41 | $(error Emulator not found. Install it or set RAD_EMULATOR to its path) |
| 42 | endif |
| 43 | |
| 44 | # Compiler build |
| 45 | |
| 46 | SEED := seed/radiance.rv64 |
| 47 | COMPILER_SRC := compiler/radiance.rad compiler/radiance/codegen.rad |
| 48 | SEED_OPTS := $(STD) -pkg radiance $(patsubst %,-mod %,$(COMPILER_SRC)) -entry radiance |
| 49 | |
| 50 | $(RAD_BIN): $(STD_LIB) $(COMPILER_SRC) std.lib | $(BIN_DIR) |
| 51 | @echo "radiance $(SEED) => $@" |
| 52 | @$(EMU) $(EMU_FLAGS) -run $(SEED) $(SEED_OPTS) -o $@ |
| 53 | |
| 54 | $(BIN_DIR): |
| 55 | @mkdir -p $@ |
| 56 | |
| 57 | # Standard Library Tests |
| 58 | |
| 59 | STD_LIB_TEST := lib/std.test.rv64 |
| 60 | |
| 61 | std-test: $(STD_LIB_TEST) |
| 62 | @echo |
| 63 | @$(EMU) $(EMU_FLAGS) -run $(STD_LIB_TEST) |
| 64 | |
| 65 | $(STD_LIB_TEST): $(STD_LIB) $(RAD_BIN) std.lib std.lib.test |
| 66 | @echo "radiance -test $(STD_TEST) -entry std -o $@" |
| 67 | @$(RADIANCE) -test $(STD_TEST) -entry std -o $@ |
| 68 | |
| 69 | clean-std-test: |
| 70 | @rm -f lib/std.test.rv64 \ |
| 71 | lib/std.test.rv64.debug \ |
| 72 | lib/std.test.rv64.s \ |
| 73 | lib/std.test.rv64.o |
| 74 | |
| 75 | # Kernel modules and tests use a separate package and test entry point. |
| 76 | KERNEL_SRC := kernel/kernel.rad $(shell find kernel/kernel -name '*.rad' ! -name 'tests.rad' ! -path '*/tests/*' 2>/dev/null) |
| 77 | KERNEL_ASM := kernel/kernel/boot.ras kernel/kernel/sync.ras kernel/kernel/trap.ras kernel/kernel/pages.ras kernel/kernel/loader.ras kernel/kernel/instances.ras kernel/kernel/domains.ras kernel/kernel/dispatch.ras kernel/kernel/calls.ras kernel/kernel/plic.ras |
| 78 | KERNEL_TEST_SRC := kernel/kernel/tests.rad $(shell find kernel/kernel/tests -name '*.rad' 2>/dev/null) |
| 79 | KERNEL := -pkg kernel $(patsubst %,-mod %,$(sort $(KERNEL_SRC))) |
| 80 | KERNEL_TEST := $(BIN_DIR)/kernel.test.rv64 |
| 81 | |
| 82 | kernel-test: emulator $(KERNEL_TEST) |
| 83 | @$(EMU) $(EMU_FLAGS) -run $(KERNEL_TEST) |
| 84 | @sh test/slots/run "$(EMU)" $(STD_TEST_SUPPORT) $(KERNEL) $(patsubst %,-mod %,$(KERNEL_TEST_SRC)) |
| 85 | |
| 86 | $(KERNEL_TEST): $(KERNEL_SRC) $(KERNEL_TEST_SRC) $(KERNEL_ASM) $(STD_LIB) $(RAD_BIN) |
| 87 | @echo "radiance kernel tests => $@" |
| 88 | @$(RADIANCE) -test $(STD_TEST_SUPPORT) $(KERNEL) $(patsubst %,-mod %,$(KERNEL_TEST_SRC) $(KERNEL_ASM)) -entry kernel -o $@ |
| 89 | |
| 90 | $(BIN_DIR)/kernel.ril $(BIN_DIR)/std.ril &: $(KERNEL_SRC) $(STD_LIB) $(RAD_BIN) |
| 91 | @$(RADIANCE) $(STD) $(KERNEL) -entry kernel -ril $(BIN_DIR) |
| 92 | |
| 93 | $(BIN_DIR)/kernel.build.rv64: kernel/tools/build.rad $(STD_LIB) $(RAD_BIN) |
| 94 | @$(RADIANCE) $(STD) -pkg build -mod $< -entry build -o $@ |
| 95 | |
| 96 | # User packages share the ABI source through a staged package module tree. |
| 97 | $(BIN_DIR)/root.ril $(BIN_DIR)/scheduler.ril &: kernel/root.rad kernel/scheduler.rad kernel/mmio.rad kernel/kernel/abi.rad kernel/kernel/sys.rad $(RAD_BIN) |
| 98 | @mkdir -p $(BIN_DIR)/user/root $(BIN_DIR)/user/scheduler |
| 99 | @cp kernel/root.rad kernel/scheduler.rad $(BIN_DIR)/user/ |
| 100 | @cp kernel/kernel/abi.rad kernel/kernel/sys.rad $(BIN_DIR)/user/root/ |
| 101 | @cp kernel/kernel/abi.rad kernel/kernel/sys.rad kernel/mmio.rad $(BIN_DIR)/user/scheduler/ |
| 102 | @$(RADIANCE) -pkg root -mod $(BIN_DIR)/user/root.rad -mod $(BIN_DIR)/user/root/abi.rad -mod $(BIN_DIR)/user/root/sys.rad -entry root -ril $(BIN_DIR) |
| 103 | @$(RADIANCE) -pkg scheduler -mod $(BIN_DIR)/user/scheduler.rad -mod $(BIN_DIR)/user/scheduler/abi.rad -mod $(BIN_DIR)/user/scheduler/sys.rad -mod $(BIN_DIR)/user/scheduler/mmio.rad -entry scheduler -ril $(BIN_DIR) |
| 104 | |
| 105 | $(BIN_DIR)/kernel.rv64: $(BIN_DIR)/root.ril $(BIN_DIR)/scheduler.ril $(BIN_DIR)/std.ril $(BIN_DIR)/kernel.ril $(BIN_DIR)/kernel.build.rv64 $(KERNEL_ASM) |
| 106 | @cat $(KERNEL_ASM) > $(BIN_DIR)/kernel.ras |
| 107 | @$(EMU) $(EMU_FLAGS) -run $(BIN_DIR)/kernel.build.rv64 -- $(BIN_DIR)/std.ril $(BIN_DIR)/kernel.ril $(BIN_DIR)/kernel.ras $@ $(BIN_DIR)/root.ril $(BIN_DIR)/scheduler.ril |
| 108 | |
| 109 | # Separate binary package emission, linkage, and decode checks. |
| 110 | package-test: emulator $(BIN_DIR)/packages.check.rv64 $(BIN_DIR)/shared.build.rv64 |
| 111 | @sh test/packages/run |
| 112 | @RAD_EMULATOR="$(EMU)" test/shared/run |
| 113 | |
| 114 | $(BIN_DIR)/packages.check.rv64: test/packages/check.rad $(STD_LIB) $(RAD_BIN) |
| 115 | @$(RADIANCE) $(STD) -pkg check -mod $< -entry check -o $@ |
| 116 | |
| 117 | $(BIN_DIR)/native.build.rv64: test/native/build.rad $(STD_LIB) $(RAD_BIN) |
| 118 | @$(RADIANCE) $(STD) -pkg build -mod $< -entry build -o $@ |
| 119 | |
| 120 | $(BIN_DIR)/native.fixture.rv64: $(BIN_DIR)/native.build.rv64 |
| 121 | @$(EMU) -run $< -- $@ |
| 122 | |
| 123 | $(BIN_DIR)/shared.build.rv64: test/shared/build.rad $(STD_LIB) $(RAD_BIN) |
| 124 | @$(RADIANCE) $(STD) -pkg build -mod $< -entry build -o $@ |
| 125 | |
| 126 | # Native architecture and machine-boundary checks. |
| 127 | machine-test: emulator $(BIN_DIR)/native.fixture.rv64 $(BIN_DIR)/sync.build.rv64 |
| 128 | @$(EMU) -machine -run $(BIN_DIR)/native.fixture.rv64 |
| 129 | @RAD_EMULATOR="$(EMU)" test/sync/run |
| 130 | @RAD_EMULATOR="$(EMU)" sh test/trap/run |
| 131 | @RAD_EMULATOR="$(EMU)" sh test/pages/run |
| 132 | |
| 133 | $(BIN_DIR)/sync.build.rv64: test/sync/build.rad $(STD_LIB) $(RAD_BIN) |
| 134 | @$(RADIANCE) $(STD) -pkg build -mod $< -entry build -o $@ |
| 135 | |
| 136 | # Binary Tests |
| 137 | |
| 138 | BIN_TEST_DIR := test/tests |
| 139 | # Only tests with `//! returns:` are compiled to binaries and executed. |
| 140 | BIN_TEST_EXE_SRC := $(shell grep -rl '^//! returns:' $(BIN_TEST_DIR)) |
| 141 | BIN_TEST_RAD_EXE_SRC := $(filter %.rad,$(BIN_TEST_EXE_SRC)) |
| 142 | BIN_TEST_RAS_EXE_SRC := $(filter %.ras,$(BIN_TEST_EXE_SRC)) |
| 143 | BIN_TEST_RAD_ASM_SRC := $(wildcard $(BIN_TEST_RAD_EXE_SRC:.rad=.ras)) |
| 144 | BIN_TEST_RAD_START_SRC := $(wildcard $(BIN_TEST_RAD_EXE_SRC:.rad=.start.ras)) |
| 145 | BIN_TEST_EXE_BIN := $(patsubst %.rad,%.rv64,$(BIN_TEST_RAD_EXE_SRC)) \ |
| 146 | $(patsubst %.ras,%.rv64,$(BIN_TEST_RAS_EXE_SRC)) |
| 147 | BIN_RUNNER := test/runner.rv64 |
| 148 | BIN_TEST_RUN := test/run |
| 149 | |
| 150 | bin-test: $(BIN_RUNNER) $(BIN_TEST_EXE_BIN) |
| 151 | @echo |
| 152 | @$(BIN_TEST_RUN) |
| 153 | |
| 154 | # Runner binary: the lowering IL checker. |
| 155 | $(BIN_RUNNER): test/runner.rad $(STD_LIB) $(RAD_BIN) |
| 156 | @echo "radiance test/runner.rad => $@" |
| 157 | @$(RADIANCE) $(STD) -pkg runner -mod test/runner.rad -entry runner -o $@ |
| 158 | |
| 159 | # A `.rad` executable test can have a same-basename `.ras` module. |
| 160 | $(patsubst %.ras,%.rv64,$(BIN_TEST_RAD_ASM_SRC)): %.rv64: %.ras |
| 161 | $(patsubst %.start.ras,%.rv64,$(BIN_TEST_RAD_START_SRC)): %.rv64: %.start.ras |
| 162 | |
| 163 | # Package fixtures can request session support. |
| 164 | BIN_TEST_SESSION_SRC := $(shell grep -l '^//! session-support$$' $(BIN_TEST_RAD_EXE_SRC)) |
| 165 | $(BIN_TEST_SESSION_SRC:.rad=.rv64): TEST_STD_FLAGS := $(TEST_FIXTURE_STD) |
| 166 | $(BIN_TEST_SESSION_SRC:.rad=.rv64): TEST_ENTRY_FLAGS := -entry test |
| 167 | $(BIN_TEST_SESSION_SRC:.rad=.rv64): $(TEST_FIXTURE_STD_LIB) test/support/std.lib |
| 168 | |
| 169 | # Compile each executable test to a binary. |
| 170 | $(BIN_TEST_DIR)/%.rv64: $(BIN_TEST_DIR)/%.rad $(RAD_BIN) |
| 171 | @echo "radiance $< => $@" |
| 172 | @$(RADIANCE) $(TEST_STD_FLAGS) -pkg test -mod $< $(TEST_ENTRY_FLAGS) $(patsubst %,-mod %,$(wildcard $(@:.rv64=)/*.rad)) $(patsubst %,-start %,$(wildcard $(@:.rv64=.start.ras))) $(patsubst %,-mod %,$(wildcard $(@:.rv64=.ras))) -o $@ |
| 173 | |
| 174 | $(BIN_TEST_DIR)/%.rv64: $(BIN_TEST_DIR)/%.ras $(BIN_RUNNER) |
| 175 | @echo "asm $< => $@" |
| 176 | @$(EMU) $(EMU_FLAGS) -run $(BIN_RUNNER) -- assemble $< $@ |
| 177 | |
| 178 | clean-bin-test: |
| 179 | @rm -f $(BIN_RUNNER) \ |
| 180 | $(BIN_RUNNER:.rv64=.rv64.debug) \ |
| 181 | $(BIN_RUNNER:.rv64=.rv64.s) \ |
| 182 | $(BIN_RUNNER:.rv64=.rv64.o) \ |
| 183 | $(BIN_TEST_EXE_BIN) \ |
| 184 | $(wildcard $(BIN_TEST_DIR)/*.rv64.debug) \ |
| 185 | $(wildcard $(BIN_TEST_DIR)/*.rv64.s) |
| 186 | |
| 187 | seed: |
| 188 | seed/update |
| 189 | |
| 190 | clean-rad: |
| 191 | rm -rf bin/* |
| 192 | rm -f seed/radiance.rv64.s[0-9]* |
| 193 | |
| 194 | clean: clean-std-test clean-bin-test clean-rad |
| 195 | |
| 196 | t: test |
| 197 | c: clean |
| 198 | |
| 199 | .PHONY: test clean default seed-test std-test bin-test kernel-test package-test machine-test kernel-acceptance \ |
| 200 | kernel-size-check acceptance seed \ |
| 201 | clean-std-test clean-bin-test clean-rad emulator |
| 202 | .SUFFIXES: |
| 203 | .DELETE_ON_ERROR: |
| 204 | .SILENT: |
| 205 | |
| 206 | # Full-kernel scenarios that require native execution or distinct fixture images. |
| 207 | kernel-acceptance: emulator $(RAD_BIN) $(BIN_DIR)/kernel.build.rv64 $(BIN_DIR)/kernel.rv64 |
| 208 | @RAD_EMULATOR="$(EMU)" sh test/boot/run |
| 209 | @RAD_EMULATOR="$(EMU)" sh test/loader/run |
| 210 | @RAD_EMULATOR="$(EMU)" sh test/dispatch/run |
| 211 | @RAD_EMULATOR="$(EMU)" sh test/dispatch/run smp "1 2 8" 7 |
| 212 | @RAD_EMULATOR="$(EMU)" sh test/dispatch/run termination |
| 213 | @RAD_EMULATOR="$(EMU)" sh test/runtime/run |
| 214 | @RAD_EMULATOR="$(EMU)" sh test/bootstrap/run |
| 215 | @RAD_EMULATOR="$(EMU)" sh test/dispatch/run mmio |
| 216 | @RAD_EMULATOR="$(EMU)" sh test/cycles/run |
| 217 | @RAD_EMULATOR="$(EMU)" sh test/scheduling/run |
| 218 | |
| 219 | # Physical source-line limits and fixed native image memory. |
| 220 | .PHONY: kernel-size-check |
| 221 | kernel-size-check: $(BIN_DIR)/kernel.rv64 |
| 222 | @python3 test/acceptance/sizes |
| 223 | |
| 224 | # Full sibling-emulator validation with retained acceptance reports. |
| 225 | acceptance: |
| 226 | @sh test/acceptance/run |