zephyr: first attempt

This commit is contained in:
Mike Sinkovsky
2017-12-17 17:50:38 +05:00
committed by alexander-gorshenev
parent a5bc23d706
commit d968fafec0
13 changed files with 173 additions and 14 deletions
+13
View File
@@ -331,3 +331,16 @@ llcOptFlags.wasm32 = -O3
llcDebugFlags.wasm32 = -O0
# The stack size is in bytes.
s2wasmFlags.wasm32 = --allocate-stack 1048576 --import-memory
# Zephyr RTOS.
targetToolchain.linux-zephyr = target-gcc-toolchain-6-2017q2-linux-armemb/arm-none-eabi
dependencies.linux-zephyr = \
clang-llvm-5.0.0-linux-x86-64 \
target-gcc-toolchain-6-2017q2-linux-armemb \
target-sysroot-2-wasm \
zephyr-host-tools-1-linux \
zephyr-zephyr-v1.10.0
quadruple.zephyr = armv7m-none-eabi
targetSysRoot.zephyr = target-sysroot-2-wasm
entrySelector.zephyr = --defsym main=Konan_main
+1 -1
View File
@@ -27,7 +27,7 @@
#define KONAN_NEED_ASINH_ACOSH 0
#endif
#ifdef KONAN_WASM
#if KONAN_WASM || __ZEPHYR__
#define KONAN_NO_MATH 1
#else
#define KONAN_NO_MATH 0
+64 -6
View File
@@ -34,7 +34,7 @@
#include "Porting.h"
#ifdef KONAN_WASM
#if KONAN_WASM || __ZEPHYR__
extern "C" void Konan_abort(const char*);
extern "C" void Konan_exit(int32_t status);
#endif
@@ -124,7 +124,7 @@ static void onThreadExitInit() {
void onThreadExit(void (*destructor)()) {
#if KONAN_NO_THREADS
#ifdef KONAN_WASM
#if KONAN_WASM || __ZEPHYR__
// No way to do that.
#else
#error "How to do onThreadExit()?"
@@ -145,7 +145,7 @@ void abort() {
::abort();
}
#ifdef KONAN_WASM
#if KONAN_WASM || __ZEPHYR__
void exit(int32_t status) {
Konan_exit(status);
}
@@ -159,7 +159,7 @@ void exit(int32_t status) {
// memcpy/memmove are not here intentionally, as frequently implemented/optimized
// by C compiler.
void* memmem(const void *big, size_t bigLen, const void *little, size_t littleLen) {
#if KONAN_WINDOWS || KONAN_WASM
#if KONAN_WINDOWS || KONAN_WASM || __ZEPHYR__
for (size_t i = 0; i + littleLen <= bigLen; ++i) {
void* pos = ((char*)big) + i;
if (::memcmp(little, pos, littleLen) == 0) return pos;
@@ -180,9 +180,11 @@ int snprintf(char* buffer, size_t size, const char* format, ...) {
return rv;
}
#if !__ZEPHYR__
size_t strnlen(const char* buffer, size_t maxSize) {
return ::strnlen(buffer, maxSize);
}
#endif
// Memory operations.
#if KONAN_INTERNAL_DLMALLOC
@@ -241,7 +243,7 @@ uint64_t getTimeMicros() {
#if KONAN_INTERNAL_DLMALLOC
// This function is being called when memory allocator needs more RAM.
#ifdef KONAN_WASM
#if KONAN_WASM || __ZEPHYR__
// This one is an interface to query module.env.memory.buffer.byteLength
extern "C" unsigned long Konan_heap_upper();
@@ -302,7 +304,7 @@ long getpagesize() {
} // namespace konan
extern "C" {
#ifdef KONAN_WASM
#if KONAN_WASM || __ZEPHYR__
// TODO: get rid of these.
void _ZNKSt3__220__vector_base_commonILb1EE20__throw_length_errorEv(void) {
@@ -399,4 +401,60 @@ extern "C" {
}
#endif
#if __ZEPHYR__
/* Support the alias for the __aeabi_memcpy which may
assume memory alignment. */
void __aeabi_memcpy4 (void *dest, const void *source, size_t n)
__attribute__ ((alias ("memcpy")));
void __aeabi_memcpy8 (void *dest, const void *source, size_t n)
__attribute__ ((alias ("memcpy")));
void __aeabi_memcpy (void *dest, const void *source, size_t n)
__attribute__ ((alias ("memcpy")));
/* Support the alias for the __aeabi_memmove which may
assume memory alignment. */
void __aeabi_memmove4 (void *dest, const void *source, size_t n)
__attribute__ ((alias ("memmove")));
void __aeabi_memmove8 (void *dest, const void *source, size_t n)
__attribute__ ((alias ("memmove")));
void __aeabi_memmove (void *dest, const void *source, size_t n)
__attribute__ ((alias ("memmove")));
/* Support the alias for the __aeabi_memset which may
assume memory alignment. */
void __aeabi_memset4 (void *dest, size_t n, int c)
__attribute__ ((alias ("__aeabi_memset")));
void __aeabi_memset8 (void *dest, size_t n, int c)
__attribute__ ((alias ("__aeabi_memset")));
/* Support the routine __aeabi_memset. Can't alias to memset
because it's not defined in the same translation unit. */
void __aeabi_memset (void *dest, size_t n, int c)
{
/*Note that relative to ANSI memset, __aeabi_memset hase the order
of its second and third arguments reversed. */
memset (dest, c, n);
}
/* Support the alias for the __aeabi_memclr which may
assume memory alignment. */
void __aeabi_memclr4 (void *dest, size_t n)
__attribute__ ((alias ("__aeabi_memclr")));
void __aeabi_memclr8 (void *dest, size_t n)
__attribute__ ((alias ("__aeabi_memclr")));
/* Support the routine __aeabi_memclr. */
void __aeabi_memclr (void *dest, size_t n)
{
__aeabi_memset (dest, n, 0);
}
#endif
}
+1 -1
View File
@@ -19,7 +19,7 @@
#include <stdlib.h>
#if KONAN_WASM && !defined(assert)
#if (KONAN_WASM || __ZEPHYR__) && !defined(assert)
// assert() is needed by WASM STL.
#define assert(cond) if (!(cond)) abort()
#endif
+3 -3
View File
@@ -525,13 +525,13 @@ MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP
/**** Start of Konan-specific dlmalloc configuration. ****/
#define USE_DL_PREFIX 1
#if KONAN_WASM
#if KONAN_WASM || __ZEPHYR__
#define USE_LOCKS 0
#define LACKS_TIME_H 1
#define NO_MALLOC_STATS 1
#define HAVE_MMAP 0 // don't try to allocate large chunks of memory using mmap().
#define HAVE_MMAP 0 // don't try to allocate large chunks of memory using mmap().
// It will go to malloc->calloc->sbrk->morecore chain anyways.
#else
#else
#define USE_LOCKS 1
#endif
#define DLMALLOC_EXPORT extern "C"
+4
View File
@@ -0,0 +1,4 @@
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
project(NONE)
target_sources(app PRIVATE build/program.o)
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
DIR=$(cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd )
source "$DIR/../konan.sh"
mkdir -p $DIR/build && cd $DIR/build
konanc $DIR/src/main.kt -target zephyr
DEP="$HOME/.konan/dependencies"
export ZEPHYR_BASE="$DEP/zephyr-zephyr-v1.10.0"
export ZEPHYR_GCC_VARIANT=gccarmemb
export GCCARMEMB_TOOLCHAIN_PATH="$DEP/target-gcc-toolchain-6-2017q2-linux-armemb/"
export PATH="$DEP/zephyr-host-tools-1-linux/bin:$PATH"
[ -f CMakeCache.txt ] || cmake -DBOARD=qemu_cortex_m3 ..
make run
+4
View File
@@ -0,0 +1,4 @@
CONFIG_CPLUSPLUS=y
CONFIG_PRINTK=y
CONFIG_BOOT_BANNER=y
CONFIG_BUILD_OUTPUT_BIN=y
+13
View File
@@ -0,0 +1,13 @@
/*
* Copyright (c) 2012-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr.h>
#include <misc/printk.h>
void main(void)
{
printk("Hello World! %s\n", CONFIG_ARCH);
}
+3
View File
@@ -0,0 +1,3 @@
fun main(args: Array<String>) {
println("Hello World!")
}
@@ -81,6 +81,20 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
"-nostdinc", "-Xclang", "-nobuiltininc", "-Xclang", "-nostdsysteminc",
"-Xclang", "-isystem$absoluteTargetSysRoot/include/libcxx", "-Xclang", "-isystem$absoluteTargetSysRoot/lib/libcxxabi/include",
"-Xclang", "-isystem$absoluteTargetSysRoot/include/compat", "-Xclang", "-isystem$absoluteTargetSysRoot/include/libc")
KonanTarget.ZEPHYR ->
listOf("-target", targetArg!!, "-mabi=aapcs", "-mthumb", "-mcpu=cortex-m3",
"-Os", "-g",
"-fno-rtti",
"-fno-exceptions",
"-fno-asynchronous-unwind-tables",
"-fno-pie",
"-fno-pic",
"-nostdinc",
"-isystem$sysRoot/include/libcxx",
"-isystem$sysRoot/lib/libcxxabi/include",
"-isystem$sysRoot/include/compat",
"-isystem$sysRoot/include/libc")
}
return result
}
@@ -120,6 +134,9 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
KonanTarget.WASM32 ->
listOf("-DKONAN_WASM=1", "-DKONAN_NO_FFI=1", "-DKONAN_NO_THREADS=1", "-DKONAN_NO_EXCEPTIONS=1",
"-DKONAN_INTERNAL_DLMALLOC=1", "-DKONAN_INTERNAL_SNPRINTF=1", "-DKONAN_INTERNAL_NOW=1")
KonanTarget.ZEPHYR ->
listOf( "-D__ZEPHYR__=1", "-DKONAN_NO_FFI=1", "-DKONAN_NO_THREADS=1", "-DKONAN_NO_EXCEPTIONS=1",
"-DKONAN_INTERNAL_DLMALLOC=1", "-DKONAN_INTERNAL_SNPRINTF=1", "-DKONAN_INTERNAL_NOW=1")
}
private val host = TargetManager.host
@@ -26,7 +26,8 @@ enum class Family(val exeSuffix:String, val dynamicPrefix: String, val dynamicSu
LINUX ("kexe", "lib", "so" ),
WINDOWS ("exe" , "" , "dll" ),
ANDROID ("so" , "lib", "so" ),
WASM ("wasm", "" , "wasm" )
WASM ("wasm", "" , "wasm" ),
ZEPHYR ("o" , "lib", "a" )
}
enum class Architecture(val bitness: Int) {
@@ -50,6 +51,8 @@ sealed class KonanTarget(override val name: String, val family: Family, val arch
object LINUX_MIPS32 : KonanTarget( "linux_mips32", Family.LINUX, Architecture.MIPS32, "linux_mips32")
object LINUX_MIPSEL32 : KonanTarget( "linux_mipsel32", Family.LINUX, Architecture.MIPSEL32, "linux_mipsel32")
object WASM32 : KonanTarget( "wasm32", Family.WASM, Architecture.WASM32, "wasm32")
// Tunable targets
class ZEPHYR(val subName: String) : KonanTarget("$zephyr_$subName", Family.ZEPHYR, Architecture.ARM32, "$zephyr_$subName")
companion object {
protected val memberObjects = mutableListOf<KonanTarget>()
@@ -59,6 +62,12 @@ sealed class KonanTarget(override val name: String, val family: Family, val arch
init {
memberObjects.add(this)
}
fun generateZephyrTargets(subtargets: List<String>) {
subtargets.forEach {
object : ZEPHYR(it)
}
}
}
fun hostTargetSuffix(host: KonanTarget, target: KonanTarget) =
@@ -179,12 +188,13 @@ class TargetManager(val userRequest: String? = null) {
when (host) {
KonanTarget.LINUX -> {
KonanTarget.LINUX.enabled = true
KonanTarget.RASPBERRYPI.enabled = true
/*KonanTarget.RASPBERRYPI.enabled = true
KonanTarget.LINUX_MIPS32.enabled = true
KonanTarget.LINUX_MIPSEL32.enabled = true
KonanTarget.ANDROID_ARM32.enabled = true
KonanTarget.ANDROID_ARM64.enabled = true
KonanTarget.WASM32.enabled = true
KonanTarget.WASM32.enabled = true*/
KonanTarget.ZEPHYR.enabled = true
}
KonanTarget.MINGW -> {
KonanTarget.MINGW.enabled = true
@@ -285,6 +285,25 @@ open class WasmLinker(targetProperties: WasmConfigurables)
}
}
open class ZephyrLinker(targetProperties: ZephyrConfigurables)
: LinkerFlags(targetProperties), ZephyrConfigurables by targetProperties {
private val linker = "$targetToolchain/bin/ld"
override val useCompilerDriverAsLinker: Boolean get() = false
override fun filterStaticLibraries(binaries: List<String>)
= emptyList<String>()
override fun linkCommand(objectFiles: List<ObjectFile>, executable: ExecutableFile, optimize: Boolean, debug: Boolean, dynamic: Boolean): Command {
return Command(linker).apply {
+ listOf("-r", "--gc-sections", "--entry", "main")
+ listOf("-o", executable)
+ objectFiles
}
}
}
fun linker(configurables: Configurables): LinkerFlags =
when (configurables.target) {
KonanTarget.LINUX, KonanTarget.RASPBERRYPI ->