translator: llvm multifile build, static and dynamic malloc

This commit is contained in:
e5l
2016-07-18 12:55:21 +03:00
parent 5147b63080
commit 314dbcbcd0
8 changed files with 193 additions and 103 deletions
+14 -5
View File
@@ -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
+78
View File
@@ -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
+89
View File
@@ -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
; <label>:7 ; preds = %0
store i8* null, i8** %1
br label %15
; <label>:8 ; preds = %0
%9 = load i32* @static_area_ptr, align 4
store i32 %9, i32* %result, align 4
%10 = load i32* %2, align 4
%11 = load i32* @static_area_ptr, align 4
%12 = add nsw i32 %11, %10
store i32 %12, i32* @static_area_ptr, align 4
%13 = load i32* %result, align 4
%14 = inttoptr i32 %13 to i8*
store i8* %14, i8** %1
br label %15
; <label>:15 ; preds = %8, %7
%16 = load i8** %1
ret i8* %16
}
; Function Attrs: nounwind
define i8* @malloc_dynamic(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* @dynamic_area_ptr, align 4
%5 = add nsw i32 %3, %4
%6 = icmp sgt i32 %5, 1000
br i1 %6, label %7, label %8
; <label>:7 ; preds = %0
store i8* null, i8** %1
br label %15
; <label>:8 ; preds = %0
%9 = load i32* @dynamic_area_ptr, align 4
store i32 %9, i32* %result, align 4
%10 = load i32* %2, align 4
%11 = load i32* @dynamic_area_ptr, align 4
%12 = add nsw i32 %11, %10
store i32 %12, i32* @dynamic_area_ptr, align 4
%13 = load i32* %result, align 4
%14 = inttoptr i32 %13 to i8*
store i8* %14, i8** %1
br label %15
; <label>:15 ; preds = %8, %7
%16 = load i8** %1
ret i8* %16
}
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.module.flags = !{!0, !1}
!llvm.ident = !{!2}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 1, !"min_enum_size", i32 4}
!2 = !{!"Ubuntu clang version 3.6.2-3ubuntu2 (tags/RELEASE_362/final) (based on LLVM 3.6.2)"}
Binary file not shown.
-49
View File
@@ -1,49 +0,0 @@
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
@CAR_MODE_LAST = global i32 2, align 4
@CAR_MODE_PROGRAMMED = global i32 0, align 4
declare i32 @get_mode() #0
declare void @start_current_mode() #0
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 i32 @kotlin_main() #0
{
%managed.i.1 = alloca i32, align 4
store i32 0, i32* %managed.i.1, align 4
%managed.mode.1 = alloca i32, align 4
store i32 0, i32* %managed.mode.1, align 4
br label %label.while.1
label.while.1:
%var1 = icmp slt i32 2, 3
br i1 %var1, label %label.while.2, label %label.while.3
label.while.2:
%var2 = load i32* %managed.mode.1, align 4
%var3 = load i32* @CAR_MODE_PROGRAMMED, align 4
%var4 = icmp eq i32 %var2, %var3
br i1 %var4, label %label.if.4, label %label.if.5
label.if.4:
call void @run_programmed_car(void ()* @stop_current_mode)
br label %label.if.6
label.if.5:
%var5 = load i32* %managed.i.1, align 4
store i32 1, i32* %managed.i.1, align 4
br label %label.if.6
label.if.6:
br label %label.while.1
label.while.3:
ret i32 0
}
declare void @stop_current_mode() #0
declare void @VCP_init() #0
declare void @engine_stop() #0
declare void @user_brn_init(void ()* %i) #0
declare void @set_mode(i32 %mode) #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
-49
View File
@@ -1,49 +0,0 @@
.text
.file "src/kotlin_main.ll"
.globl test
.align 16, 0x90
.type test,@function
test: # @test
# BB#0:
leal 1(%rdi), %eax
movl %edi, -4(%rsp)
retq
.Lfunc_end0:
.size test, .Lfunc_end0-test
.globl kotlin_main
.align 16, 0x90
.type kotlin_main,@function
kotlin_main: # @kotlin_main
# BB#0:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $0, -4(%rbp)
xorl %edi, %edi
callq test
movl %eax, -8(%rbp)
jmp .LBB1_1
.align 16, 0x90
.LBB1_2: # %label.while.2
# in Loop: Header=BB1_1 Depth=1
movl -4(%rbp), %edi
callq test
movq %rsp, %rcx
leaq -16(%rcx), %rsp
movl %eax, -16(%rcx)
.LBB1_1: # %label.while.1
# =>This Inner Loop Header: Depth=1
movl %eax, -4(%rbp)
cmpl $100, -4(%rbp)
jne .LBB1_2
# BB#3: # %label.while.3
xorl %eax, %eax
movq %rbp, %rsp
popq %rbp
retq
.Lfunc_end1:
.size kotlin_main, .Lfunc_end1-kotlin_main
.section ".note.GNU-stack","",@progbits
+2
View File
@@ -1,6 +1,8 @@
#include <stddef.h>
#include <stdbool.h>
#include "memory.h"
#include "car_leds.h"
#include "car_engine.h"
#include "time.h"
+10
View File
@@ -0,0 +1,10 @@
#pragma once
#define STATIC_AREA_SIZE 1000
#define DYNAMIC_AREA_SIZE 1000
void init_dynamic_area();
void* malloc_static(int size);
void* malloc_dynamic(int size);