translator: llvm multifile build, static and dynamic malloc
This commit is contained in:
+14
-5
@@ -1,5 +1,6 @@
|
|||||||
BIN_DIR=$(PWD)/bin
|
BIN_DIR=$(PWD)/bin
|
||||||
SRC_DIR=$(PWD)/src
|
SRC_DIR=$(PWD)/src
|
||||||
|
SRC_KOT=$(PWD)/kotlib
|
||||||
LIB_DIR=$(SRC_DIR)/lib
|
LIB_DIR=$(SRC_DIR)/lib
|
||||||
OS_ARCH=linux-arm
|
OS_ARCH=linux-arm
|
||||||
|
|
||||||
@@ -22,15 +23,17 @@ CAR_FMW_ELF=$(BIN_DIR)/car_fmw.elf
|
|||||||
CAR_FMW_BIN=$(BIN_DIR)/car_fmw.bin
|
CAR_FMW_BIN=$(BIN_DIR)/car_fmw.bin
|
||||||
ST_DIR=$(SRC_DIR)/../../devloader/data/$(OS_ARCH)
|
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
|
CC=arm-none-eabi-gcc
|
||||||
AS=arm-none-eabi-as
|
AS=arm-none-eabi-as
|
||||||
LD=arm-none-eabi-ld
|
LD=arm-none-eabi-ld
|
||||||
LL=llc-3.6
|
|
||||||
OBJ_COPY=arm-none-eabi-objcopy
|
OBJ_COPY=arm-none-eabi-objcopy
|
||||||
GDB=arm-none-eabi-gdb
|
GDB=arm-none-eabi-gdb
|
||||||
|
|
||||||
|
LL=llc-3.6
|
||||||
|
LLINK=llvm-link-3.6
|
||||||
|
|
||||||
USB_CONF_DIR=$(LIB_DIR)/usb_conf
|
USB_CONF_DIR=$(LIB_DIR)/usb_conf
|
||||||
|
|
||||||
INCLUDES=-I$(LIB_CMSIS_DIR) \
|
INCLUDES=-I$(LIB_CMSIS_DIR) \
|
||||||
@@ -47,15 +50,18 @@ CFLAGS=-g -nostdlib -ffreestanding -O0 \
|
|||||||
-mcpu=cortex-m3 -mfloat-abi=soft -mthumb \
|
-mcpu=cortex-m3 -mfloat-abi=soft -mthumb \
|
||||||
$(DEFINES)
|
$(DEFINES)
|
||||||
LLFLAGS=-march=thumb -mtriple=arm-none-eabi -mcpu=cortex-m3
|
LLFLAGS=-march=thumb -mtriple=arm-none-eabi -mcpu=cortex-m3
|
||||||
|
LLINK_FLAGS=-S
|
||||||
ASMFLAGS=-g -mthumb
|
ASMFLAGS=-g -mthumb
|
||||||
|
|
||||||
LD_ALL_DEPS=$(LD) -r $(filter %.o,$^) -o $@
|
LD_ALL_DEPS=$(LD) -r $(filter %.o,$^) -o $@
|
||||||
CC_ALL_DEPS=$(CC) $(CFLAGS) -c $(INCLUDES) $(filter %.c,$^) -o $@
|
CC_ALL_DEPS=$(CC) $(CFLAGS) -c $(INCLUDES) $(filter %.c,$^) -o $@
|
||||||
AS_ALL_DEPS=$(AS) $(ASMFLAGS) $(filter %.s,$^) -o $@
|
AS_ALL_DEPS=$(AS) $(ASMFLAGS) $(filter %.s,$^) -o $@
|
||||||
LL_ALL_DEPS=$(LL) $(LLFLAGS) $(filter %.ll, $^) -o $@
|
LL_ALL_DEPS=$(LL) $(LLFLAGS) $(filter %.ll, $^) -o $@
|
||||||
|
LLINK_ALL_DEPS=$(LLINK) $(LLINK_FLAGS) $(filter %.ll,$^) > $@
|
||||||
|
|
||||||
dirhs=$(wildcard $(1)/*.h)
|
dirhs=$(wildcard $(1)/*.h)
|
||||||
dircs=$(wildcard $(1)/*.c)
|
dircs=$(wildcard $(1)/*.c)
|
||||||
|
dirls=$(wildcard $(1)/*.ll)
|
||||||
dircs_to_prefxd_objs=\
|
dircs_to_prefxd_objs=\
|
||||||
$(patsubst $(1)/%.c,$(BIN_DIR)/$(2)%.o,$(call dircs,$1))
|
$(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) \
|
$(CAR_FMW_ELF): $(CAR_FMW_OBJ) $(LIB_STM32F4D_OBJ) \
|
||||||
$(LIB_CMSIS_OBJ) $(LIB_STDPERIPH_OBJ) \
|
$(LIB_CMSIS_OBJ) $(LIB_STDPERIPH_OBJ) \
|
||||||
$(LIB_USB_DEV_OBJ) $(LIB_USB_OTG_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 $@
|
$(CC) $(CFLAGS) $^ -T $(SRC_DIR)/stm32_flash.ld -o $@
|
||||||
|
|
||||||
CAR_OBJ_PREFIX=car_
|
CAR_OBJ_PREFIX=car_
|
||||||
|
|
||||||
$(CAR_FMW_OBJ): \
|
$(CAR_FMW_OBJ): \
|
||||||
$(call dircs_to_prefxd_objs,$(SRC_DIR),$(CAR_OBJ_PREFIX))
|
$(call dircs_to_prefxd_objs,$(SRC_DIR),$(CAR_OBJ_PREFIX))
|
||||||
$(LD_ALL_DEPS)
|
$(LD_ALL_DEPS)
|
||||||
@@ -81,12 +88,14 @@ $(BIN_DIR):
|
|||||||
mkdir -p $(BIN_DIR)
|
mkdir -p $(BIN_DIR)
|
||||||
|
|
||||||
|
|
||||||
$(LIB_KOTLIN): $(BIN_DIR)/kotlin_main.s
|
$(LIB_KOT): $(BIN_DIR)/kotlib.s
|
||||||
$(AS_ALL_DEPS)
|
$(AS_ALL_DEPS)
|
||||||
|
|
||||||
$(BIN_DIR)/kotlin_main.s: $(SRC_DIR)/kotlin_main.ll
|
$(BIN_DIR)/kotlib.s: $(BIN_DIR)/kotlib.ll
|
||||||
$(LL_ALL_DEPS)
|
$(LL_ALL_DEPS)
|
||||||
|
|
||||||
|
$(BIN_DIR)/kotlib.ll: $(call dirls,$(SRC_KOT))
|
||||||
|
$(LLINK_ALL_DEPS)
|
||||||
|
|
||||||
flash: $(CAR_FMW_BIN)
|
flash: $(CAR_FMW_BIN)
|
||||||
$(ST_DIR)/st-flash write $(CAR_FMW_BIN) 0x8000000
|
$(ST_DIR)/st-flash write $(CAR_FMW_BIN) 0x8000000
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
@@ -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.
@@ -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
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "memory.h"
|
||||||
|
|
||||||
#include "car_leds.h"
|
#include "car_leds.h"
|
||||||
#include "car_engine.h"
|
#include "car_engine.h"
|
||||||
#include "time.h"
|
#include "time.h"
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user