translator: llvm multifile build, static and dynamic malloc
This commit is contained in:
+14
-5
@@ -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
|
||||
|
||||
@@ -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 <stdbool.h>
|
||||
|
||||
#include "memory.h"
|
||||
|
||||
#include "car_leds.h"
|
||||
#include "car_engine.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