From 314dbcbcd06e0a32f8a10b57a6113d7515505202 Mon Sep 17 00:00:00 2001 From: e5l Date: Mon, 18 Jul 2016 12:55:21 +0300 Subject: [PATCH] translator: llvm multifile build, static and dynamic malloc --- car_llvmkot/Makefile | 19 +++++-- car_llvmkot/kotlib/kotlin_main.ll | 78 ++++++++++++++++++++++++++ car_llvmkot/kotlib/memory.ll | 89 ++++++++++++++++++++++++++++++ car_llvmkot/src/a.out | Bin 8592 -> 0 bytes car_llvmkot/src/kotlin_main.ll | 49 ---------------- car_llvmkot/src/kotlin_main.s | 49 ---------------- car_llvmkot/src/main.c | 2 + car_llvmkot/src/memory.h | 10 ++++ 8 files changed, 193 insertions(+), 103 deletions(-) create mode 100644 car_llvmkot/kotlib/kotlin_main.ll create mode 100644 car_llvmkot/kotlib/memory.ll delete mode 100755 car_llvmkot/src/a.out delete mode 100644 car_llvmkot/src/kotlin_main.ll delete mode 100644 car_llvmkot/src/kotlin_main.s create mode 100644 car_llvmkot/src/memory.h diff --git a/car_llvmkot/Makefile b/car_llvmkot/Makefile index 1d1f7e3c000..ce21c035c5f 100644 --- a/car_llvmkot/Makefile +++ b/car_llvmkot/Makefile @@ -1,5 +1,6 @@ BIN_DIR=$(PWD)/bin SRC_DIR=$(PWD)/src +SRC_KOT=$(PWD)/kotlib LIB_DIR=$(SRC_DIR)/lib OS_ARCH=linux-arm @@ -22,15 +23,17 @@ CAR_FMW_ELF=$(BIN_DIR)/car_fmw.elf CAR_FMW_BIN=$(BIN_DIR)/car_fmw.bin ST_DIR=$(SRC_DIR)/../../devloader/data/$(OS_ARCH) -LIB_KOTLIN=$(BIN_DIR)/kotlib.o +LIB_KOT=$(BIN_DIR)/kotlib.o CC=arm-none-eabi-gcc AS=arm-none-eabi-as LD=arm-none-eabi-ld -LL=llc-3.6 OBJ_COPY=arm-none-eabi-objcopy GDB=arm-none-eabi-gdb +LL=llc-3.6 +LLINK=llvm-link-3.6 + USB_CONF_DIR=$(LIB_DIR)/usb_conf INCLUDES=-I$(LIB_CMSIS_DIR) \ @@ -47,15 +50,18 @@ CFLAGS=-g -nostdlib -ffreestanding -O0 \ -mcpu=cortex-m3 -mfloat-abi=soft -mthumb \ $(DEFINES) LLFLAGS=-march=thumb -mtriple=arm-none-eabi -mcpu=cortex-m3 +LLINK_FLAGS=-S ASMFLAGS=-g -mthumb LD_ALL_DEPS=$(LD) -r $(filter %.o,$^) -o $@ CC_ALL_DEPS=$(CC) $(CFLAGS) -c $(INCLUDES) $(filter %.c,$^) -o $@ AS_ALL_DEPS=$(AS) $(ASMFLAGS) $(filter %.s,$^) -o $@ LL_ALL_DEPS=$(LL) $(LLFLAGS) $(filter %.ll, $^) -o $@ +LLINK_ALL_DEPS=$(LLINK) $(LLINK_FLAGS) $(filter %.ll,$^) > $@ dirhs=$(wildcard $(1)/*.h) dircs=$(wildcard $(1)/*.c) +dirls=$(wildcard $(1)/*.ll) dircs_to_prefxd_objs=\ $(patsubst $(1)/%.c,$(BIN_DIR)/$(2)%.o,$(call dircs,$1)) @@ -65,10 +71,11 @@ $(CAR_FMW_BIN): $(CAR_FMW_ELF) $(BIN_DIR) $(CAR_FMW_ELF): $(CAR_FMW_OBJ) $(LIB_STM32F4D_OBJ) \ $(LIB_CMSIS_OBJ) $(LIB_STDPERIPH_OBJ) \ $(LIB_USB_DEV_OBJ) $(LIB_USB_OTG_OBJ) \ - $(LIB_USB_VCP_OBJ) $(LIB_KOTLIN) + $(LIB_USB_VCP_OBJ) $(LIB_KOT) $(CC) $(CFLAGS) $^ -T $(SRC_DIR)/stm32_flash.ld -o $@ CAR_OBJ_PREFIX=car_ + $(CAR_FMW_OBJ): \ $(call dircs_to_prefxd_objs,$(SRC_DIR),$(CAR_OBJ_PREFIX)) $(LD_ALL_DEPS) @@ -81,12 +88,14 @@ $(BIN_DIR): mkdir -p $(BIN_DIR) -$(LIB_KOTLIN): $(BIN_DIR)/kotlin_main.s +$(LIB_KOT): $(BIN_DIR)/kotlib.s $(AS_ALL_DEPS) -$(BIN_DIR)/kotlin_main.s: $(SRC_DIR)/kotlin_main.ll +$(BIN_DIR)/kotlib.s: $(BIN_DIR)/kotlib.ll $(LL_ALL_DEPS) +$(BIN_DIR)/kotlib.ll: $(call dirls,$(SRC_KOT)) + $(LLINK_ALL_DEPS) flash: $(CAR_FMW_BIN) $(ST_DIR)/st-flash write $(CAR_FMW_BIN) 0x8000000 diff --git a/car_llvmkot/kotlib/kotlin_main.ll b/car_llvmkot/kotlib/kotlin_main.ll new file mode 100644 index 00000000000..666eaf2c981 --- /dev/null +++ b/car_llvmkot/kotlib/kotlin_main.ll @@ -0,0 +1,78 @@ +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) +attributes #0 = { nounwind "stack-protector-buffer-size"="8" "target-cpu"="cortex-m3" "target-features"="+hwdiv,+strict-align" } +@CAR_MODE_REMOTE_CONTROL = global i32 1, align 4 +@PROGRAM_DURATIOH_MS = global i32 3000, align 4 +@CAR_MODE_LAST = global i32 2, align 4 +@CAR_MODE_PROGRAMMED = global i32 0, align 4 +%class.MyClass = type { i32, i16, i8 } +define void @MyClass(%class.MyClass* %instance, i32 %i, i16 %j, i8 %k) #0 +{ +%instance.addr = alloca %class.MyClass, align 4 +%i.addr = alloca i32, align 4 +store i32 %i, i32* %i.addr, align 4 +%j.addr = alloca i16, align 2 +store i16 %j, i16* %j.addr, align 2 +%k.addr = alloca i8, align 1 +store i8 %k, i8* %k.addr, align 1 +%var1 = load i32* %i.addr, align 4 +%var2 = getelementptr inbounds %class.MyClass* %instance.addr, i32 0, i32 0 +store i32 %var1, i32* %var2, align 4 +%var3 = load i16* %j.addr, align 2 +%var4 = getelementptr inbounds %class.MyClass* %instance.addr, i32 0, i32 1 +store i16 %var3, i16* %var4, align 2 +%var5 = load i8* %k.addr, align 1 +%var6 = getelementptr inbounds %class.MyClass* %instance.addr, i32 0, i32 2 +store i8 %var5, i8* %var6, align 1 +%var7 = bitcast %class.MyClass* %instance to i8* +%var8 = bitcast %class.MyClass* %instance.addr to i8* +call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var7, i8* %var8, i64 7, i32 4, i1 false) +ret void +} +declare void @wait(i32 %i) #0 +define void @engine_program() #0 +{ +call void @engine_init() +br label %label.while.1 +label.while.1: +%var9 = icmp slt i32 2, 3 +br i1 %var9, label %label.while.2, label %label.while.3 +label.while.2: +call void @engine_forward() +%var10 = load i32* @PROGRAM_DURATIOH_MS, align 4 +call void @wait(i32 %var10) +call void @engine_stop() +call void @engine_backward() +%var11 = load i32* @PROGRAM_DURATIOH_MS, align 4 +call void @wait(i32 %var11) +call void @engine_stop() +call void @engine_turn_right() +%var12 = load i32* @PROGRAM_DURATIOH_MS, align 4 +call void @wait(i32 %var12) +call void @engine_stop() +call void @engine_turn_right() +%var13 = load i32* @PROGRAM_DURATIOH_MS, align 4 +call void @wait(i32 %var13) +call void @engine_stop() +br label %label.while.1 +label.while.3: +ret void +} +declare void @time_init() #0 +declare void @leds_init() #0 +declare void @engine_init() #0 +declare void @run_rc_car(void ()* %i) #0 +declare void @engine_backward() #0 +define void @kotlin_main() #0 +{ +call void @time_init() +call void @engine_program() +ret void +} +declare void @VCP_init() #0 +declare void @engine_stop() #0 +declare void @user_brn_init(void ()* %i) #0 +declare void @engine_forward() #0 +declare void @run_programmed_car(void ()* %i) #0 +declare void @engine_turn_left() #0 +declare void @engine_turn_right() #0 + diff --git a/car_llvmkot/kotlib/memory.ll b/car_llvmkot/kotlib/memory.ll new file mode 100644 index 00000000000..10b202e0c64 --- /dev/null +++ b/car_llvmkot/kotlib/memory.ll @@ -0,0 +1,89 @@ +; ModuleID = 'memory.c' +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv7m-none--eabi" + +@static_area_ptr = global i32 0, align 4 +@dynamic_area_ptr = global i32 0, align 4 +@static_area = common global [1000 x i8] zeroinitializer, align 1 +@dynamic_area = common global [1000 x i8] zeroinitializer, align 1 + +; Function Attrs: nounwind +define void @init_dynamic_area() #0 { + store i32 0, i32* @dynamic_area_ptr, align 4 + ret void +} + +; Function Attrs: nounwind +define i8* @malloc_static(i32 %size) #0 { + %1 = alloca i8*, align 4 + %2 = alloca i32, align 4 + %result = alloca i32, align 4 + store i32 %size, i32* %2, align 4 + %3 = load i32* %2, align 4 + %4 = load i32* @static_area_ptr, align 4 + %5 = add nsw i32 %3, %4 + %6 = icmp sgt i32 %5, 1000 + br i1 %6, label %7, label %8 + +;