[WebAssembly] Get rid of legacy compilation pipeline.

This commit is contained in:
Sergey Bogolepov
2019-10-01 17:03:47 +03:00
committed by Sergey Bogolepov
parent fdde59bf52
commit dc14efebdd
8 changed files with 40 additions and 95 deletions
@@ -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<String>.addNonEmpty(elements: List<String>) {
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 ->
@@ -75,7 +75,7 @@ private fun linkAllDependencies(context: Context, generatedBitcodeFiles: List<St
}
private fun shouldOptimizeWithLlvmApi(context: Context) =
(context.config.target.family != Family.ZEPHYR && context.config.target.family != Family.WASM)
context.config.target.family != Family.ZEPHYR
private fun shoudRunClosedWorldCleanUp(context: Context) =
// GlobalDCE will kill coverage-related globals.
@@ -69,7 +69,7 @@ private class LlvmPipelineConfiguration(context: Context) {
KonanTarget.ANDROID_X86 -> "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.")
}
+21 -20
View File
@@ -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 \
+4 -8
View File
@@ -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
@@ -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
@@ -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.
@@ -426,12 +426,15 @@ open class WasmLinker(targetProperties: WasmConfigurables)
needsProfileLibrary: Boolean): List<Command> {
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)
}
}