From dc14efebddaf0937f22c3f015a7e4ec57d3817ab Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Tue, 1 Oct 2019 17:03:47 +0300 Subject: [PATCH] [WebAssembly] Get rid of legacy compilation pipeline. --- .../kotlin/backend/konan/BitcodeCompiler.kt | 46 +------------------ .../kotlin/backend/konan/CompilerOutput.kt | 2 +- .../backend/konan/OptimizationPipeline.kt | 2 +- backend.native/llvm.def | 41 +++++++++-------- konan/konan.properties | 12 ++--- .../src/main/cpp/CoverageMappingC.cpp | 2 + .../kotlin/konan/target/Configurables.kt | 16 +------ .../jetbrains/kotlin/konan/target/Linker.kt | 14 ++++-- 8 files changed, 40 insertions(+), 95 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BitcodeCompiler.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BitcodeCompiler.kt index 5f0405e4dfe..5c36f654dc8 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BitcodeCompiler.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BitcodeCompiler.kt @@ -5,8 +5,6 @@ package org.jetbrains.kotlin.backend.konan -import llvm.* -import org.jetbrains.kotlin.backend.konan.llvm.parseBitcodeFile import org.jetbrains.kotlin.konan.exec.Command import org.jetbrains.kotlin.konan.target.* @@ -21,7 +19,7 @@ internal class BitcodeCompiler(val context: Context) { private val debug = context.config.debug private fun MutableList.addNonEmpty(elements: List) { - addAll(elements.filter { !it.isEmpty() }) + addAll(elements.filter { it.isNotEmpty() }) } private fun runTool(vararg command: String) = @@ -46,46 +44,6 @@ internal class BitcodeCompiler(val context: Context) { runTool(absoluteToolName, *arg) } - private fun opt(optFlags: OptFlags, bitcodeFile: BitcodeFile): BitcodeFile { - val flags = (optFlags.optFlags + when { - optimize -> optFlags.optOptFlags - debug -> optFlags.optDebugFlags - else -> optFlags.optNooptFlags - } + llvmProfilingFlags()).toTypedArray() - val optimizedBc = temporary("opt_output", ".bc") - hostLlvmTool("opt", bitcodeFile, "-o", optimizedBc, *flags) - - if (shouldRunLateBitcodePasses(context)) { - val module = parseBitcodeFile(optimizedBc) - runLateBitcodePasses(context, module) - LLVMWriteBitcodeToFile(module, optimizedBc) - } - - return optimizedBc - } - - private fun llc(llcFlags: LlcFlags, bitcodeFile: BitcodeFile): ObjectFile { - val flags = (llcFlags.llcFlags + when { - optimize -> llcFlags.llcOptFlags - debug -> llcFlags.llcDebugFlags - else -> llcFlags.llcNooptFlags - } + llvmProfilingFlags()).toTypedArray() - val combinedO = temporary("llc_output", ".o") - hostLlvmTool("llc", bitcodeFile, "-o", combinedO, *flags, "-filetype=obj") - return combinedO - } - - private fun bitcodeToWasm(configurables: WasmConfigurables, file: BitcodeFile): String { - val optimizedBc = opt(configurables, file) - val compiled = llc(configurables, optimizedBc) - - // TODO: should be moved to linker. - val linkedWasm = temporary("linked", ".wasm") - hostLlvmTool("wasm-ld", compiled, "-o", linkedWasm, *configurables.lldFlags.toTypedArray()) - - return linkedWasm - } - private fun optAndLlc(configurables: ZephyrConfigurables, file: BitcodeFile): String { val optimizedBc = temporary("optimized", ".bc") val optFlags = llvmProfilingFlags() + listOf("-O3", "-internalize", "-globaldce") @@ -151,8 +109,6 @@ internal class BitcodeCompiler(val context: Context) { listOf(when (val configurables = platform.configurables) { is ClangFlags -> clang(configurables, bitcodeFile) - is WasmConfigurables -> - bitcodeToWasm(configurables, bitcodeFile) is ZephyrConfigurables -> optAndLlc(configurables, bitcodeFile) else -> diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt index f178d7d3740..9c371f1b993 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt @@ -75,7 +75,7 @@ private fun linkAllDependencies(context: Context, generatedBitcodeFiles: List "i686" KonanTarget.LINUX_MIPS32 -> "mips32r2" KonanTarget.LINUX_MIPSEL32 -> "mips32r2" - KonanTarget.WASM32, + KonanTarget.WASM32 -> "wasm32" is KonanTarget.ZEPHYR -> error("There is no support for ${target.name} target yet.") } diff --git a/backend.native/llvm.def b/backend.native/llvm.def index f89051b52aa..785b9f3cdcb 100644 --- a/backend.native/llvm.def +++ b/backend.native/llvm.def @@ -39,31 +39,32 @@ linkerOpts.osx = -fPIC \ -# ./llvm-config --libs analysis bitreader bitwriter core linker target coverage analysis ipo instrumentation lto arm aarch64 x86 mips +# ./llvm-config --libs analysis bitreader bitwriter core linker target coverage analysis ipo instrumentation lto arm aarch64 webassembly x86 mips linkerOpts.linux = -fPIC \ -Wl,-z,noexecstack \ -lrt -ldl -lpthread -lz -lm \ --lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo \ --lLLVMMipsAsmPrinter -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info \ --lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser \ --lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler \ --lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMARMAsmParser -lLLVMARMDesc \ --lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts \ --lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader -lLLVMAsmParser \ --lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils \ --lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMDebugInfoCodeView \ --lLLVMDebugInfoMSF -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle +-lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter \ +-lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils \ +-lLLVMWebAssemblyDisassembler -lLLVMWebAssemblyCodeGen -lLLVMWebAssemblyDesc -lLLVMWebAssemblyAsmPrinter -lLLVMWebAssemblyAsmParser \ +-lLLVMWebAssemblyInfo -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info \ +-lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG \ +-lLLVMAsmPrinter -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO \ +-lLLVMPasses -lLLVMObjCARCOpts -lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader \ +-lLLVMAsmParser -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils \ +-lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF \ +-lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle -# ./llvm-config --libs analysis bitreader bitwriter core linker target coverage analysis ipo instrumentation lto arm aarch64 x86 +# ./llvm-config --libs analysis bitreader bitwriter core linker target coverage analysis ipo instrumentation lto arm aarch64 webassembly x86 linkerOpts.mingw = -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info \ --lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser \ --lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler \ --lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMARMAsmParser -lLLVMARMDesc \ --lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts \ --lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader -lLLVMAsmParser \ --lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils \ --lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMDebugInfoCodeView \ --lLLVMDebugInfoMSF -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle \ +-lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMWebAssemblyDisassembler -lLLVMWebAssemblyCodeGen -lLLVMWebAssemblyDesc \ +-lLLVMWebAssemblyAsmPrinter -lLLVMWebAssemblyAsmParser -lLLVMWebAssemblyInfo -lLLVMAArch64Disassembler \ +-lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter \ +-lLLVMAArch64Utils -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter \ +-lLLVMARMAsmParser -lLLVMARMDesc -lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO \ +-lLLVMPasses -lLLVMObjCARCOpts -lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts \ +-lLLVMIRReader -lLLVMAsmParser -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMCoverage -lLLVMTarget \ +-lLLVMLinker -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser \ +-lLLVMMC -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle \ -lole32 -luuid -static-libgcc -static-libstdc++ \ -Wl,-Bstatic -lz \ -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic \ diff --git a/konan/konan.properties b/konan/konan.properties index 34882bf1972..17e8992289f 100644 --- a/konan/konan.properties +++ b/konan/konan.properties @@ -680,13 +680,9 @@ dependencies.mingw_x64-wasm32 = \ quadruple.wasm32 = wasm32-unknown-unknown targetSysRoot.wasm32 = target-sysroot-3-wasm -optFlags.wasm32 = -internalize -globaldce -mtriple=wasm32-unknown-unknown-wasm -optNooptFlags.wasm32 = -O1 -optOptFlags.wasm32 = -O3 -optDebugFlags.wasm32 = -O0 -llcFlags.wasm32 = -mtriple=wasm32-unknown-unknown-wasm -llcNooptFlags.wasm32 = -O1 -llcOptFlags.wasm32 = -O3 -llcDebugFlags.wasm32 = -O0 +clangFlags.wasm32 = -cc1 -emit-obj -disable-llvm-optzns -x ir +clangNooptFlags.wasm32 = -O1 +clangOptFlags.wasm32 = -O3 +clangDebugFlags.wasm32 = -O0 # TODO: make explicit list of external symbols lld.wasm32 = --allow-undefined --no-entry --global-base=0 --no-threads --export-dynamic diff --git a/llvmCoverageMappingC/src/main/cpp/CoverageMappingC.cpp b/llvmCoverageMappingC/src/main/cpp/CoverageMappingC.cpp index 49c7d9e120a..0b3046d2841 100644 --- a/llvmCoverageMappingC/src/main/cpp/CoverageMappingC.cpp +++ b/llvmCoverageMappingC/src/main/cpp/CoverageMappingC.cpp @@ -245,10 +245,12 @@ void LLVMKotlinInitializeTargets() { INIT_LLVM_TARGET(ARM) INIT_LLVM_TARGET(Mips) INIT_LLVM_TARGET(X86) + INIT_LLVM_TARGET(WebAssembly) #elif KONAN_WINDOWS INIT_LLVM_TARGET(AArch64) INIT_LLVM_TARGET(ARM) INIT_LLVM_TARGET(X86) + INIT_LLVM_TARGET(WebAssembly) #endif #undef INIT_LLVM_TARGET diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt index 34fdd7e39ce..87afdd05a9b 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Configurables.kt @@ -26,20 +26,6 @@ interface ClangFlags : TargetableExternalStorage { val clangDynamicFlags get() = targetList("clangDynamicFlags") } -interface LlcFlags : TargetableExternalStorage { - val llcFlags get() = targetList("llcFlags") - val llcNooptFlags get() = targetList("llcNooptFlags") - val llcOptFlags get() = targetList("llcOptFlags") - val llcDebugFlags get() = targetList("llcDebugFlags") -} - -interface OptFlags : TargetableExternalStorage { - val optFlags get() = targetList("optFlags") - val optNooptFlags get() = targetList("optNooptFlags") - val optOptFlags get() = targetList("optOptFlags") - val optDebugFlags get() = targetList("optDebugFlags") -} - interface LldFlags : TargetableExternalStorage { val lldFlags get() = targetList("lld") } @@ -99,7 +85,7 @@ interface LinuxMIPSConfigurables : LinuxBasedConfigurables interface RaspberryPiConfigurables : LinuxBasedConfigurables interface AndroidConfigurables : TargetableConfigurables, ClangFlags -interface WasmConfigurables : TargetableConfigurables, OptFlags, LlcFlags, LldFlags +interface WasmConfigurables : TargetableConfigurables, ClangFlags, LldFlags // Codegen for Zephyr calls opt and llc with predefined set of flags // so there is no need for OptFlags or LlcFlags. diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt index 9f3582b0c08..01b58919caa 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt @@ -426,12 +426,15 @@ open class WasmLinker(targetProperties: WasmConfigurables) needsProfileLibrary: Boolean): List { if (kind != LinkerOutputKind.EXECUTABLE) throw Error("Unsupported linker output kind") + val linkage = Command("$llvmBin/wasm-ld").apply { + +objectFiles + +listOf("-o", executable) + +lldFlags + } + // TODO(horsh): maybe rethink it. - return listOf(object : Command() { + val jsBindingsGeneration = object : Command() { override fun execute() { - val src = File(objectFiles.single()) - val dst = File(executable) - src.recursiveCopyTo(dst) javaScriptLink(libraries, executable) } @@ -454,7 +457,8 @@ open class WasmLinker(targetProperties: WasmConfigurables) linkedJavaScript.appendBytes(linkerFooter.toByteArray()) return linkedJavaScript.name } - }) + } + return listOf(linkage, jsBindingsGeneration) } }