CC = gcc CFLAGS = -Wall -Wextra -Werror -std=gnu99 -O3 -march=native -I. LDFLAGS = -ldl LEXER_SOURCES = lexer/lexer_tokenizer.c lexer/lexer_keywords.c lexer/lexer_literals.c LEXER_OBJECTS = $(LEXER_SOURCES:.c=.o) PARSER_SOURCES = parser/parser.c parser/parser_expressions.c parser/parser_statements.c parser/parser_declarations.c parser/parser_printer.c PARSER_OBJECTS = $(PARSER_SOURCES:.c=.o) TYPES_SOURCES = types/types.c TYPES_OBJECTS = $(TYPES_SOURCES:.c=.o) SEMANTIC_SOURCES = semantic/symbol_table.c semantic/semantic.c SEMANTIC_OBJECTS = $(SEMANTIC_SOURCES:.c=.o) IR_SOURCES = ir/ir.c ir/ir_gen.c IR_OBJECTS = $(IR_SOURCES:.c=.o) RUNTIME_SOURCES = runtime/runtime.c runtime/labeltable.c runtime/methodcache.c runtime/fastframe.c runtime/superinst.c RUNTIME_OBJECTS = $(RUNTIME_SOURCES:.c=.o) PHASE0_SOURCES = runtime/fastframe.c runtime/labeltable.c runtime/methodcache.c PHASE0_OBJECTS = $(PHASE0_SOURCES:.c=.o) TEST_LEXER_SOURCES = tests/test_lexer.c TEST_LEXER_OBJECTS = $(TEST_LEXER_SOURCES:.c=.o) TEST_PARSER_SOURCES = tests/test_parser.c TEST_PARSER_OBJECTS = $(TEST_PARSER_SOURCES:.c=.o) TEST_SEMANTIC_SOURCES = tests/test_semantic.c TEST_SEMANTIC_OBJECTS = $(TEST_SEMANTIC_SOURCES:.c=.o) TEST_IR_SOURCES = tests/test_ir.c TEST_IR_OBJECTS = $(TEST_IR_SOURCES:.c=.o) TEST_RUNTIME_SOURCES = tests/test_runtime.c TEST_RUNTIME_OBJECTS = $(TEST_RUNTIME_SOURCES:.c=.o) TEST_STRINGS_SOURCES = tests/test_strings.c TEST_STRINGS_OBJECTS = $(TEST_STRINGS_SOURCES:.c=.o) TEST_ARRAYS_SOURCES = tests/test_arrays.c TEST_ARRAYS_OBJECTS = $(TEST_ARRAYS_SOURCES:.c=.o) TEST_OBJECTS_SOURCES = tests/test_objects.c TEST_OBJECTS_OBJECTS = $(TEST_OBJECTS_SOURCES:.c=.o) TEST_INSTANCE_SOURCES = tests/test_instance_methods.c TEST_INSTANCE_OBJECTS = $(TEST_INSTANCE_SOURCES:.c=.o) TEST_FILEIO_SOURCES = tests/test_fileio.c TEST_FILEIO_OBJECTS = $(TEST_FILEIO_SOURCES:.c=.o) all: test_lexer test_parser test_semantic test_ir test_runtime test_strings test_arrays test_objects test_instance_methods test_fileio test_lexer: $(LEXER_OBJECTS) $(TEST_LEXER_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_parser: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TEST_PARSER_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_semantic: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(TEST_SEMANTIC_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_ir: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) runtime/labeltable.o $(TEST_IR_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_runtime: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(TEST_RUNTIME_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_strings: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(TEST_STRINGS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_arrays: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(TEST_ARRAYS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_objects: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(TEST_OBJECTS_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_instance_methods: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(TEST_INSTANCE_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test_fileio: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(TEST_FILEIO_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ TEST_BENCHMARK_SOURCES = tests/test_benchmark.c TEST_BENCHMARK_OBJECTS = $(TEST_BENCHMARK_SOURCES:.c=.o) test_benchmark: $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) $(TEST_BENCHMARK_OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) benchmark: test_benchmark @echo "" @echo "========================================" @echo " RAVA INTERPRETER" @echo "========================================" @./test_benchmark @echo "" @echo "========================================" @echo " PYTHON 3" @echo "========================================" @python3 examples/benchmark.py @echo "" test_nanbox: tests/test_nanbox.c runtime/nanbox.h $(CC) $(CFLAGS) -o $@ tests/test_nanbox.c $(LDFLAGS) test_fastframe: tests/test_fastframe.c runtime/fastframe.c runtime/nanbox.h runtime/fastframe.h $(CC) $(CFLAGS) -o $@ tests/test_fastframe.c runtime/fastframe.c $(LDFLAGS) test_labeltable: tests/test_labeltable.c runtime/labeltable.c $(IR_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(CC) $(CFLAGS) -o $@ tests/test_labeltable.c runtime/labeltable.c $(IR_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(LDFLAGS) test_methodcache: tests/test_methodcache.c runtime/methodcache.c runtime/methodcache.h $(CC) $(CFLAGS) -o $@ tests/test_methodcache.c runtime/methodcache.c $(LDFLAGS) test_phase0: test_nanbox test_fastframe test_labeltable test_methodcache @echo "=== Running Phase 0 Tests ===" @./test_nanbox @./test_fastframe @./test_labeltable @./test_methodcache @echo "=== All Phase 0 Tests Passed ===" ALL_SOURCES = $(LEXER_SOURCES) $(PARSER_SOURCES) $(TYPES_SOURCES) $(SEMANTIC_SOURCES) $(IR_SOURCES) $(RUNTIME_SOURCES) $(TEST_BENCHMARK_SOURCES) test_benchmark_pgo_gen: rm -f *.gcda */*.gcda $(CC) -Wall -Wextra -std=gnu99 -O3 -march=native -I. -fprofile-generate -o test_benchmark_pgo $(ALL_SOURCES) $(LDFLAGS) pgo_run: test_benchmark_pgo_gen ./test_benchmark_pgo ./test_benchmark_pgo ./test_benchmark_pgo test_benchmark_pgo: pgo_run $(CC) -Wall -Wextra -std=gnu99 -O3 -march=native -I. -fprofile-use -fprofile-correction -o test_benchmark_pgo $(ALL_SOURCES) $(LDFLAGS) pgo: test_benchmark_pgo @echo "=== PGO Benchmark ===" ./test_benchmark_pgo clean: rm -f $(LEXER_OBJECTS) $(PARSER_OBJECTS) $(TYPES_OBJECTS) $(SEMANTIC_OBJECTS) $(IR_OBJECTS) $(RUNTIME_OBJECTS) \ $(PHASE0_OBJECTS) \ $(TEST_LEXER_OBJECTS) $(TEST_PARSER_OBJECTS) $(TEST_SEMANTIC_OBJECTS) $(TEST_IR_OBJECTS) $(TEST_RUNTIME_OBJECTS) \ $(TEST_STRINGS_OBJECTS) $(TEST_ARRAYS_OBJECTS) $(TEST_OBJECTS_OBJECTS) $(TEST_INSTANCE_OBJECTS) $(TEST_FILEIO_OBJECTS) \ $(TEST_BENCHMARK_OBJECTS) \ test_lexer test_parser test_semantic test_ir test_runtime test_strings test_arrays test_objects test_instance_methods test_fileio test_benchmark \ test_nanbox test_fastframe test_labeltable test_methodcache test_benchmark_pgo *.gcda */*.gcda .PHONY: all clean benchmark test_phase0 pgo test_benchmark_pgo_gen pgo_run test_benchmark_pgo