From 764f5c39856bbef9ca09c8ffac18a14c2d505777 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 26 Apr 2023 01:47:47 +0200 Subject: [PATCH] examples: Add examples and makefiles Signed-off-by: Anatol Belski --- Makefile | 11 +++++ examples/0001-basic.c | 52 +++++++++++++++++++++++ examples/0005-basic-runner-func.c | 68 +++++++++++++++++++++++++++++++ win32/Makefile | 15 ++++++- 4 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 examples/0001-basic.c create mode 100644 examples/0005-basic-runner-func.c diff --git a/Makefile b/Makefile index d9bd190..4f1e081 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,8 @@ TARGET = x86_64 BUILD = debug BUILD_DIR = . SRC_DIR = . +EXAMPLES_SRC_DIR = $(SRC_DIR)/examples +EXAMPLES_BUILD_DIR = $(BUILD_DIR)/examples CC = gcc CXX = g++ @@ -45,12 +47,16 @@ OBJS_COMMON = $(BUILD_DIR)/ir.o $(BUILD_DIR)/ir_strtab.o $(BUILD_DIR)/ir_cfg.o \ $(BUILD_DIR)/ir_cpuinfo.o OBJS_IR = $(BUILD_DIR)/ir_main.o OBJS_IR_TEST = $(BUILD_DIR)/ir_test.o +EXAMPLE_EXES = $(EXAMPLES_BUILD_DIR)/0001-basic $(EXAMPLES_BUILD_DIR)/0005-basic-runner-func all: $(BUILD_DIR) $(BUILD_DIR)/ir $(BUILD_DIR)/ir_test $(BUILD_DIR): @mkdir -p $(BUILD_DIR) +$(EXAMPLES_BUILD_DIR): + @mkdir -p $(EXAMPLES_BUILD_DIR) + $(BUILD_DIR)/ir: $(OBJS_COMMON) $(OBJS_IR) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -lcapstone @@ -84,6 +90,9 @@ $(BUILD_DIR)/ir_emit_$(DASM_ARCH).h: $(SRC_DIR)/ir_$(DASM_ARCH).dasc $(SRC_DIR)/ $(OBJS_COMMON) $(OBJS_IR) $(OBJS_IR_TEST): $(BUILD_DIR)/$(notdir %.o): $(SRC_DIR)/$(notdir %.c) $(CC) $(CFLAGS) -I$(BUILD_DIR) -o $@ -c $< +$(EXAMPLE_EXES): $(EXAMPLES_BUILD_DIR)/$(notdir %): $(EXAMPLES_SRC_DIR)/$(notdir %.c) + $(CC) $(CFLAGS) -I$(BUILD_DIR) $< -o $@ $(OBJS_COMMON) $(LDFLAGS) -lcapstone + $(BUILD_DIR)/ir-test: $(SRC_DIR)/ir-test.cxx $(CXX) -O3 -std=c++17 $(SRC_DIR)/ir-test.cxx -o $(BUILD_DIR)/ir-test @@ -96,6 +105,8 @@ test: $(BUILD_DIR)/ir $(BUILD_DIR)/ir-test test-ci: $(BUILD_DIR)/ir $(BUILD_DIR)/ir-test $(BUILD_DIR)/ir-test --show-diff $(SRC_DIR)/tests +examples: $(OBJS_COMMON) $(EXAMPLES_BUILD_DIR) $(EXAMPLE_EXES) + clean: rm -rf $(BUILD_DIR)/ir $(BUILD_DIR)/ir_test $(BUILD_DIR)/*.o \ $(BUILD_DIR)/minilua $(BUILD_DIR)/ir_emit_$(DASM_ARCH).h \ diff --git a/examples/0001-basic.c b/examples/0001-basic.c new file mode 100644 index 0000000..f36b6ab --- /dev/null +++ b/examples/0001-basic.c @@ -0,0 +1,52 @@ +/* + * IR - Lightweight JIT Compilation Framework + * (Exmaples package) + * Copyright (C) 2023 by IR project. + * Authors: Anatol Belski + */ + +#include "ir.h" +#include "ir_builder.h" +#include + +/* + * int32_t myfunc(int32_t x, int32_t y) { + * return x - y; + * } + */ +typedef int32_t (*myfunc_t)(int32_t, int32_t); + +void gen_myfunc(ir_ctx *ctx) +{ + ir_START(); + ir_ref x = ir_PARAM(IR_I32, "x", 1); + ir_ref y = ir_PARAM(IR_I32, "y", 2); + ir_ref cr = ir_SUB_I32(x, y); + ir_RETURN(cr); +} + +int main(int argc, char **argv) +{ + ir_ctx ctx = {0}; + + ir_consistency_check(); + + ir_init(&ctx, IR_FUNCTION, IR_CONSTS_LIMIT_MIN, IR_INSNS_LIMIT_MIN); + + gen_myfunc(&ctx); + + ir_build_def_use_lists(&ctx); + ir_build_cfg(&ctx); + ir_match(&ctx); + ir_assign_virtual_registers(&ctx); + + size_t size; + void *entry = ir_emit_code(&ctx, &size); + if (entry) { + printf("42 - 24 = %d\n", ((myfunc_t)entry)(42, 24)); + } + + ir_free(&ctx); + + return 0; +} diff --git a/examples/0005-basic-runner-func.c b/examples/0005-basic-runner-func.c new file mode 100644 index 0000000..cb6b71e --- /dev/null +++ b/examples/0005-basic-runner-func.c @@ -0,0 +1,68 @@ +/* + * IR - Lightweight JIT Compilation Framework + * (Exmaples package) + * Copyright (C) 2023 by IR project. + * Authors: Anatol Belski + */ + +#include "ir.h" +#include "ir_builder.h" +#include + +/* + * double myfunc(double x, double y) { + * return x - y + .3; + * } + */ +typedef double (*myfunc_t)(double, double); + +void gen_myfunc(ir_ctx *ctx) +{ + ir_START(); + ir_ref x = ir_PARAM(IR_DOUBLE, "x", 1); + ir_ref y = ir_PARAM(IR_DOUBLE, "y", 2); + ir_ref cr0 = ir_SUB_D(x, y); + + ir_ref cd = ir_CONST_DOUBLE(.3); + cr0 = ir_ADD_D(cr0, cd); + + ir_RETURN(cr0); +} + +void run(myfunc_t func) +{ + const double N = 2; + double x, y; + for (y = -N; y < N; y++) { + for (x = -N; x < N; x++) { + double ret = func(x, y); + printf("%4.1f - %4.1f = %4.1f\n", x, y, ret); + } + } +} + +int main(int argc, char **argv) +{ + ir_ctx ctx = {0}; + + ir_consistency_check(); + + ir_init(&ctx, IR_FUNCTION, 256, 1024); + + gen_myfunc(&ctx); + + ir_build_def_use_lists(&ctx); + ir_build_cfg(&ctx); + ir_match(&ctx); + ir_assign_virtual_registers(&ctx); + + size_t size; + void *entry = ir_emit_code(&ctx, &size); + if (entry) { + run(entry); + } + + ir_free(&ctx); + + return 0; +} diff --git a/win32/Makefile b/win32/Makefile index 0b8b23f..50988a7 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -12,12 +12,15 @@ BUILD_DIR=win32\build_$(VCPKG_TRIPLET) !endif SRC_DIR=. +EXAMPLES_SRC_DIR=$(SRC_DIR)\examples +EXAMPLES_BUILD_DIR=$(BUILD_DIR)\examples + !if "$(VCPKG_DIR)" == "" VCPKG_DIR=win32\vcpkg !endif PATH=$(PATH);$(VCPKG_DIR)\installed\$(VCPKG_TRIPLET)\bin -CFLAGS=/nologo /utf-8 /W3 /EHsc /Zi /I$(BUILD_DIR) /I$(VCPKG_DIR)\installed\$(VCPKG_TRIPLET)\include +CFLAGS=/nologo /utf-8 /W3 /EHsc /Zi /I$(SRC_DIR) /I$(BUILD_DIR) /I$(VCPKG_DIR)\installed\$(VCPKG_TRIPLET)\include LDFLAGS=/nologo !if "$(BUILD)" == "release" CFLAGS=$(CFLAGS) /MT /Ox @@ -68,6 +71,7 @@ OBJS_COMMON=$(BUILD_DIR)\ir.obj $(BUILD_DIR)\ir_strtab.obj $(BUILD_DIR)\ir_cfg.o $(BUILD_DIR)\ir_disasm.obj $(BUILD_DIR)\ir_check.obj $(BUILD_DIR)\ir_cpuinfo.obj OBJS_IR = $(BUILD_DIR)\ir_main.obj OBJS_IR_TEST = $(BUILD_DIR)\ir_test.obj +EXAMPLE_EXES = $(EXAMPLES_BUILD_DIR)\0001-basic.exe $(EXAMPLES_BUILD_DIR)\0005-basic-runner-func.exe all: $(BUILD_DIR) $(BUILD_DIR)\ir.exe $(BUILD_DIR)\ir_test.exe @@ -101,6 +105,10 @@ $(BUILD_DIR)\ir_disasm.obj: $(VCPKG_CAPSTONE) {$(SRC_DIR)}.c{$(BUILD_DIR)}.obj: "$(CC)" $(CFLAGS) /Fo$@ /c $< +{$(EXAMPLES_SRC_DIR)}.c{$(EXAMPLES_BUILD_DIR)}.exe: + "$(CC)" $(CFLAGS) /Fo$*.obj /c $< + "$(LD)" $(LDFLAGS) $(OBJS_COMMON) $*.obj $(LIBS) /out:$@ + # If the vcpkg dir exists, lets assume we're good with the deps. $(VCPKG_DIR)\vcpkg.exe: git clone https://github.com/Microsoft/vcpkg.git "$(VCPKG_DIR)" @@ -112,6 +120,9 @@ $(VCPKG_CAPSTONE): $(VCPKG_DIR)\vcpkg.exe $(BUILD_DIR): md "$(BUILD_DIR)" +$(EXAMPLES_BUILD_DIR): + md "$(EXAMPLES_BUILD_DIR)" + $(BUILD_DIR)\ir-test.exe: $(SRC_DIR)/ir-test.cxx "$(CXX)" /std:c++17 $(SRC_DIR)\ir-test.cxx /Fe:$@ @@ -124,6 +135,8 @@ test-ci: $(BUILD_DIR)\ir.exe $(BUILD_DIR)\ir-test.exe set PATH=$(VCPKG_DIR)\installed\$(VCPKG_TRIPLET)\bin:%%PATH%% $(BUILD_DIR)\ir-test.exe --show-diff $(SRC_DIR)\tests +examples: $(OBJS_COMMON) $(EXAMPLES_BUILD_DIR) $(EXAMPLE_EXES) + clean: del /f /q $(BUILD_DIR)\*.obj $(BUILD_DIR)\*.exe $(BUILD_DIR)\*.pdb $(BUILD_DIR)\*.ilk $(BUILD_DIR)\*.h