From ddc525f8f6c9f9993fcdc4f2bf552ce566ee0e4c Mon Sep 17 00:00:00 2001 From: e5l Date: Thu, 18 Aug 2016 11:53:28 +0300 Subject: [PATCH] kotstd: memory analytics, car_fmw: dynamic heap tests --- car_fmw/src/echo.kt | 2 + car_fmw/src/include/memory.kt | 6 + kotstd/Makefile | 4 +- kotstd/lib/arm/memory.ll | 142 ++++++++++++++---- kotstd/libc/memory.c | 8 + .../2.9/taskArtifacts/cache.properties.lock | Bin 17 -> 17 bytes .../.gradle/2.9/taskArtifacts/fileHashes.bin | Bin 37333 -> 37333 bytes .../2.9/taskArtifacts/fileSnapshots.bin | Bin 297678 -> 308964 bytes .../2.9/taskArtifacts/taskArtifacts.bin | Bin 26026 -> 26026 bytes 9 files changed, 134 insertions(+), 28 deletions(-) create mode 100644 car_fmw/src/include/memory.kt diff --git a/car_fmw/src/echo.kt b/car_fmw/src/echo.kt index da8ba527f7e..64ed1a0948d 100644 --- a/car_fmw/src/echo.kt +++ b/car_fmw/src/echo.kt @@ -13,12 +13,14 @@ fun echoUsb() { fun echoProto() { clear_buffer() + set_active_heap(MEMORY_DYNAMIC_HEAP) while (true) { val route = readRoute() blink() go(route) blink() wait(PROGRAM_DURATION) + clean_dynamic_heap() } } diff --git a/car_fmw/src/include/memory.kt b/car_fmw/src/include/memory.kt new file mode 100644 index 00000000000..80a2088c0b8 --- /dev/null +++ b/car_fmw/src/include/memory.kt @@ -0,0 +1,6 @@ + +val MEMORY_STATIC_HEAP = 0 +val MEMORY_DYNAMIC_HEAP = 1 + +external fun set_active_heap(heap: Int) +external fun clean_dynamic_heap() \ No newline at end of file diff --git a/kotstd/Makefile b/kotstd/Makefile index f73467ffa91..dee7afeeff7 100644 --- a/kotstd/Makefile +++ b/kotstd/Makefile @@ -9,8 +9,8 @@ KT=$(PWD)/../translator/build/libs/translator-1.0.jar LLINK=llvm-link-3.6 CC=clang-3.6 -CCFLAGS_ARM=-S -Wall -m32 -emit-llvm -nostdlib -ffreestanding -march=armv7-m -mthumb -flto -O0 -target arm-none-eabi -DARM -CCFLAGS=-O0 -S -Wall -emit-llvm -nostdlib -ffreestanding +CCFLAGS_ARM=-g -S -Wall -m32 -emit-llvm -nostdlib -ffreestanding -march=armv7-m -mthumb -flto -O0 -target arm-none-eabi -DARM +CCFLAGS=-g -O0 -S -Wall -emit-llvm -nostdlib -ffreestanding LLINK_FLAGS=-S KT_ALL_DEPS=java -jar $(KT) diff --git a/kotstd/lib/arm/memory.ll b/kotstd/lib/arm/memory.ll index 4a7be5c0384..5fa8b087cb9 100644 --- a/kotstd/lib/arm/memory.ll +++ b/kotstd/lib/arm/memory.ll @@ -7,50 +7,140 @@ target triple = "thumbv7m-none--eabi" @heaps = global [2 x i8*] [i8* getelementptr inbounds ([30000 x i8]* @static_area, i32 0, i32 0), i8* getelementptr inbounds ([30000 x i8]* @dynamic_area, i32 0, i32 0)], align 4 @heap_tails = global [2 x i32] zeroinitializer, align 4 @active_heap = global i32 0, align 4 +@dynamic_heap_consume = global i32 0, align 4 +@dynamic_heap_max = global i32 0, align 4 ; Function Attrs: nounwind define i8* @malloc_heap(i32 %size) #0 { %1 = alloca i32, align 4 %ptr = alloca i8*, align 4 store i32 %size, i32* %1, align 4 - %2 = load i32* @active_heap, align 4 - %3 = getelementptr inbounds [2 x i8*]* @heaps, i32 0, i32 %2 - %4 = load i8** %3, align 4 - %5 = load i32* @active_heap, align 4 - %6 = getelementptr inbounds [2 x i32]* @heap_tails, i32 0, i32 %5 - %7 = load i32* %6, align 4 - %8 = getelementptr inbounds i8* %4, i32 %7 - store i8* %8, i8** %ptr, align 4 - %9 = load i32* %1, align 4 - %10 = load i32* @active_heap, align 4 - %11 = getelementptr inbounds [2 x i32]* @heap_tails, i32 0, i32 %10 - %12 = load i32* %11, align 4 - %13 = add nsw i32 %12, %9 - store i32 %13, i32* %11, align 4 - %14 = load i8** %ptr, align 4 - ret i8* %14 + call void @llvm.dbg.declare(metadata i32* %1, metadata !37, metadata !38), !dbg !39 + call void @llvm.dbg.declare(metadata i8** %ptr, metadata !40, metadata !38), !dbg !41 + %2 = load i32* @active_heap, align 4, !dbg !42 + %3 = getelementptr inbounds [2 x i8*]* @heaps, i32 0, i32 %2, !dbg !43 + %4 = load i8** %3, align 4, !dbg !43 + %5 = load i32* @active_heap, align 4, !dbg !44 + %6 = getelementptr inbounds [2 x i32]* @heap_tails, i32 0, i32 %5, !dbg !45 + %7 = load i32* %6, align 4, !dbg !45 + %8 = getelementptr inbounds i8* %4, i32 %7, !dbg !43 + store i8* %8, i8** %ptr, align 4, !dbg !41 + %9 = load i32* %1, align 4, !dbg !46 + %10 = load i32* @active_heap, align 4, !dbg !47 + %11 = getelementptr inbounds [2 x i32]* @heap_tails, i32 0, i32 %10, !dbg !48 + %12 = load i32* %11, align 4, !dbg !48 + %13 = add nsw i32 %12, %9, !dbg !48 + store i32 %13, i32* %11, align 4, !dbg !48 + %14 = load i8** %ptr, align 4, !dbg !49 + ret i8* %14, !dbg !50 } +; Function Attrs: nounwind readnone +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 + ; Function Attrs: nounwind define void @set_active_heap(i32 %heap) #0 { %1 = alloca i32, align 4 store i32 %heap, i32* %1, align 4 - %2 = load i32* %1, align 4 - store i32 %2, i32* @active_heap, align 4 - ret void + call void @llvm.dbg.declare(metadata i32* %1, metadata !51, metadata !38), !dbg !52 + %2 = load i32* %1, align 4, !dbg !53 + store i32 %2, i32* @active_heap, align 4, !dbg !54 + ret void, !dbg !55 } ; Function Attrs: nounwind define void @clean_dynamic_heap() #0 { - store i32 0, i32* getelementptr inbounds ([2 x i32]* @heap_tails, i32 0, i32 1), align 4 - ret void + %1 = load i32* getelementptr inbounds ([2 x i32]* @heap_tails, i32 0, i32 1), align 4, !dbg !56 + %2 = load i32* @dynamic_heap_consume, align 4, !dbg !57 + %3 = add nsw i32 %2, %1, !dbg !57 + store i32 %3, i32* @dynamic_heap_consume, align 4, !dbg !57 + %4 = load i32* getelementptr inbounds ([2 x i32]* @heap_tails, i32 0, i32 1), align 4, !dbg !58 + %5 = load i32* @dynamic_heap_max, align 4, !dbg !60 + %6 = icmp sgt i32 %4, %5, !dbg !58 + br i1 %6, label %7, label %9, !dbg !61 + +;