From b8e31c2f6b67218933b926a6f33aaa1e69adf499 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Wed, 31 Jan 2018 11:45:46 +0700 Subject: [PATCH] Fix wasm target --- .../jetbrains/kotlin/backend/konan/Context.kt | 5 ++++ .../kotlin/backend/konan/LinkStage.kt | 7 +++-- .../backend/konan/llvm/BinaryInterface.kt | 3 ++ .../kotlin/backend/konan/llvm/IrToBitcode.kt | 6 +++- .../backend/konan/llvm/RTTIGenerator.kt | 5 ++++ runtime/src/main/cpp/Porting.h | 28 +++++++++++++++++++ 6 files changed, 50 insertions(+), 4 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index cd6a8f60d15..642a59a76da 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -45,6 +45,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.konan.target.CompilerOutputKind +import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -384,5 +385,9 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { val isDynamicLibrary: Boolean by lazy { config.configuration.get(KonanConfigKeys.PRODUCE) == CompilerOutputKind.DYNAMIC } + + val isWasmTarget: Boolean by lazy { + config.targetManager.target == KonanTarget.WASM32 + } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt index 6277b3bb179..2bd9b4d9816 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt @@ -86,10 +86,11 @@ internal class LinkStage(val context: Context) { private fun bitcodeToWasm(bitcodeFiles: List): String { val combinedBc = temporary("combined", ".bc") - hostLlvmTool("llvm-link", bitcodeFiles + listOf("-o", combinedBc)) - + hostLlvmTool("llvm-link", bitcodeFiles + listOf("-o", combinedBc, "-internalize")) + val optimizedBc = temporary("opted", ".bc") + hostLlvmTool("opt", listOf(combinedBc, "-o", optimizedBc, "-O2")) val combinedS = temporary("combined", ".s") - targetTool("llc", combinedBc, "-o", combinedS) + targetTool("llc", optimizedBc, "-o", combinedS) val s2wasmFlags = (platform.configurables as WasmConfigurables).s2wasmFlags.toTypedArray() val combinedWast = temporary( "combined", ".wast") diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt index 7f53f40357c..05b1ab9b74c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt @@ -270,3 +270,6 @@ internal val ClassDescriptor.objectInstanceFieldSymbolName: String internal val ClassDescriptor.typeInfoHasVtableAttached: Boolean get() = !this.isAbstract() && !this.isExternalObjCClass() + +internal fun FunctionDescriptor.isExportedForCppRuntime() = + annotations.hasAnnotation(exportForCppRuntimeAnnotation) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index f3e8a699291..8eddecd3056 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -629,6 +629,10 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map #include +#include "Common.h" + namespace konan { // Console operations. @@ -43,6 +45,32 @@ void* memmem(const void *big, size_t bigLen, const void *little, size_t littleLe int snprintf(char* buffer, size_t size, const char* format, ...); size_t strnlen(const char* buffer, size_t maxSize); + + +extern "C" { +#ifdef KONAN_WASM + +RUNTIME_USED +double pow(double x, double y); + +RUNTIME_USED +void *memcpy(void *dst, const void *src, size_t n); + +RUNTIME_USED +void *memmove(void *dst, const void *src, size_t len); + +RUNTIME_USED +int memcmp(const void *s1, const void *s2, size_t n); + +RUNTIME_USED +void *memset(void *b, int c, size_t len); + +RUNTIME_USED +size_t strlen(const char *s); + +#endif +} + // Memory operations. void* calloc(size_t count, size_t size); void free(void* ptr);