[WebAssembly] Get rid of legacy compilation pipeline.
This commit is contained in:
committed by
Sergey Bogolepov
parent
fdde59bf52
commit
dc14efebdd
+1
-45
@@ -5,8 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.konan
|
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.exec.Command
|
||||||
import org.jetbrains.kotlin.konan.target.*
|
import org.jetbrains.kotlin.konan.target.*
|
||||||
|
|
||||||
@@ -21,7 +19,7 @@ internal class BitcodeCompiler(val context: Context) {
|
|||||||
private val debug = context.config.debug
|
private val debug = context.config.debug
|
||||||
|
|
||||||
private fun MutableList<String>.addNonEmpty(elements: List<String>) {
|
private fun MutableList<String>.addNonEmpty(elements: List<String>) {
|
||||||
addAll(elements.filter { !it.isEmpty() })
|
addAll(elements.filter { it.isNotEmpty() })
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun runTool(vararg command: String) =
|
private fun runTool(vararg command: String) =
|
||||||
@@ -46,46 +44,6 @@ internal class BitcodeCompiler(val context: Context) {
|
|||||||
runTool(absoluteToolName, *arg)
|
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 {
|
private fun optAndLlc(configurables: ZephyrConfigurables, file: BitcodeFile): String {
|
||||||
val optimizedBc = temporary("optimized", ".bc")
|
val optimizedBc = temporary("optimized", ".bc")
|
||||||
val optFlags = llvmProfilingFlags() + listOf("-O3", "-internalize", "-globaldce")
|
val optFlags = llvmProfilingFlags() + listOf("-O3", "-internalize", "-globaldce")
|
||||||
@@ -151,8 +109,6 @@ internal class BitcodeCompiler(val context: Context) {
|
|||||||
listOf(when (val configurables = platform.configurables) {
|
listOf(when (val configurables = platform.configurables) {
|
||||||
is ClangFlags ->
|
is ClangFlags ->
|
||||||
clang(configurables, bitcodeFile)
|
clang(configurables, bitcodeFile)
|
||||||
is WasmConfigurables ->
|
|
||||||
bitcodeToWasm(configurables, bitcodeFile)
|
|
||||||
is ZephyrConfigurables ->
|
is ZephyrConfigurables ->
|
||||||
optAndLlc(configurables, bitcodeFile)
|
optAndLlc(configurables, bitcodeFile)
|
||||||
else ->
|
else ->
|
||||||
|
|||||||
+1
-1
@@ -75,7 +75,7 @@ private fun linkAllDependencies(context: Context, generatedBitcodeFiles: List<St
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun shouldOptimizeWithLlvmApi(context: Context) =
|
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) =
|
private fun shoudRunClosedWorldCleanUp(context: Context) =
|
||||||
// GlobalDCE will kill coverage-related globals.
|
// GlobalDCE will kill coverage-related globals.
|
||||||
|
|||||||
+1
-1
@@ -69,7 +69,7 @@ private class LlvmPipelineConfiguration(context: Context) {
|
|||||||
KonanTarget.ANDROID_X86 -> "i686"
|
KonanTarget.ANDROID_X86 -> "i686"
|
||||||
KonanTarget.LINUX_MIPS32 -> "mips32r2"
|
KonanTarget.LINUX_MIPS32 -> "mips32r2"
|
||||||
KonanTarget.LINUX_MIPSEL32 -> "mips32r2"
|
KonanTarget.LINUX_MIPSEL32 -> "mips32r2"
|
||||||
KonanTarget.WASM32,
|
KonanTarget.WASM32 -> "wasm32"
|
||||||
is KonanTarget.ZEPHYR -> error("There is no support for ${target.name} target yet.")
|
is KonanTarget.ZEPHYR -> error("There is no support for ${target.name} target yet.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+21
-20
@@ -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 \
|
linkerOpts.linux = -fPIC \
|
||||||
-Wl,-z,noexecstack \
|
-Wl,-z,noexecstack \
|
||||||
-lrt -ldl -lpthread -lz -lm \
|
-lrt -ldl -lpthread -lz -lm \
|
||||||
-lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo \
|
-lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter \
|
||||||
-lLLVMMipsAsmPrinter -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info \
|
-lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils \
|
||||||
-lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser \
|
-lLLVMWebAssemblyDisassembler -lLLVMWebAssemblyCodeGen -lLLVMWebAssemblyDesc -lLLVMWebAssemblyAsmPrinter -lLLVMWebAssemblyAsmParser \
|
||||||
-lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler \
|
-lLLVMWebAssemblyInfo -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info \
|
||||||
-lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMARMAsmParser -lLLVMARMDesc \
|
-lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG \
|
||||||
-lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts \
|
-lLLVMAsmPrinter -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO \
|
||||||
-lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader -lLLVMAsmParser \
|
-lLLVMPasses -lLLVMObjCARCOpts -lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader \
|
||||||
-lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils \
|
-lLLVMAsmParser -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils \
|
||||||
-lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMDebugInfoCodeView \
|
-lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF \
|
||||||
-lLLVMDebugInfoMSF -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle
|
-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 \
|
linkerOpts.mingw = -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info \
|
||||||
-lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser \
|
-lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMWebAssemblyDisassembler -lLLVMWebAssemblyCodeGen -lLLVMWebAssemblyDesc \
|
||||||
-lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler \
|
-lLLVMWebAssemblyAsmPrinter -lLLVMWebAssemblyAsmParser -lLLVMWebAssemblyInfo -lLLVMAArch64Disassembler \
|
||||||
-lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMARMAsmParser -lLLVMARMDesc \
|
-lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter \
|
||||||
-lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts \
|
-lLLVMAArch64Utils -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter \
|
||||||
-lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader -lLLVMAsmParser \
|
-lLLVMARMAsmParser -lLLVMARMDesc -lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO \
|
||||||
-lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils \
|
-lLLVMPasses -lLLVMObjCARCOpts -lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts \
|
||||||
-lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMDebugInfoCodeView \
|
-lLLVMIRReader -lLLVMAsmParser -lLLVMInstCombine -lLLVMAggressiveInstCombine -lLLVMCoverage -lLLVMTarget \
|
||||||
-lLLVMDebugInfoMSF -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle \
|
-lLLVMLinker -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser \
|
||||||
|
-lLLVMMC -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle \
|
||||||
-lole32 -luuid -static-libgcc -static-libstdc++ \
|
-lole32 -luuid -static-libgcc -static-libstdc++ \
|
||||||
-Wl,-Bstatic -lz \
|
-Wl,-Bstatic -lz \
|
||||||
-Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic \
|
-Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic \
|
||||||
|
|||||||
@@ -680,13 +680,9 @@ dependencies.mingw_x64-wasm32 = \
|
|||||||
|
|
||||||
quadruple.wasm32 = wasm32-unknown-unknown
|
quadruple.wasm32 = wasm32-unknown-unknown
|
||||||
targetSysRoot.wasm32 = target-sysroot-3-wasm
|
targetSysRoot.wasm32 = target-sysroot-3-wasm
|
||||||
optFlags.wasm32 = -internalize -globaldce -mtriple=wasm32-unknown-unknown-wasm
|
clangFlags.wasm32 = -cc1 -emit-obj -disable-llvm-optzns -x ir
|
||||||
optNooptFlags.wasm32 = -O1
|
clangNooptFlags.wasm32 = -O1
|
||||||
optOptFlags.wasm32 = -O3
|
clangOptFlags.wasm32 = -O3
|
||||||
optDebugFlags.wasm32 = -O0
|
clangDebugFlags.wasm32 = -O0
|
||||||
llcFlags.wasm32 = -mtriple=wasm32-unknown-unknown-wasm
|
|
||||||
llcNooptFlags.wasm32 = -O1
|
|
||||||
llcOptFlags.wasm32 = -O3
|
|
||||||
llcDebugFlags.wasm32 = -O0
|
|
||||||
# TODO: make explicit list of external symbols
|
# TODO: make explicit list of external symbols
|
||||||
lld.wasm32 = --allow-undefined --no-entry --global-base=0 --no-threads --export-dynamic
|
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(ARM)
|
||||||
INIT_LLVM_TARGET(Mips)
|
INIT_LLVM_TARGET(Mips)
|
||||||
INIT_LLVM_TARGET(X86)
|
INIT_LLVM_TARGET(X86)
|
||||||
|
INIT_LLVM_TARGET(WebAssembly)
|
||||||
#elif KONAN_WINDOWS
|
#elif KONAN_WINDOWS
|
||||||
INIT_LLVM_TARGET(AArch64)
|
INIT_LLVM_TARGET(AArch64)
|
||||||
INIT_LLVM_TARGET(ARM)
|
INIT_LLVM_TARGET(ARM)
|
||||||
INIT_LLVM_TARGET(X86)
|
INIT_LLVM_TARGET(X86)
|
||||||
|
INIT_LLVM_TARGET(WebAssembly)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef INIT_LLVM_TARGET
|
#undef INIT_LLVM_TARGET
|
||||||
|
|||||||
@@ -26,20 +26,6 @@ interface ClangFlags : TargetableExternalStorage {
|
|||||||
val clangDynamicFlags get() = targetList("clangDynamicFlags")
|
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 {
|
interface LldFlags : TargetableExternalStorage {
|
||||||
val lldFlags get() = targetList("lld")
|
val lldFlags get() = targetList("lld")
|
||||||
}
|
}
|
||||||
@@ -99,7 +85,7 @@ interface LinuxMIPSConfigurables : LinuxBasedConfigurables
|
|||||||
interface RaspberryPiConfigurables : LinuxBasedConfigurables
|
interface RaspberryPiConfigurables : LinuxBasedConfigurables
|
||||||
interface AndroidConfigurables : TargetableConfigurables, ClangFlags
|
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
|
// Codegen for Zephyr calls opt and llc with predefined set of flags
|
||||||
// so there is no need for OptFlags or LlcFlags.
|
// so there is no need for OptFlags or LlcFlags.
|
||||||
|
|||||||
@@ -426,12 +426,15 @@ open class WasmLinker(targetProperties: WasmConfigurables)
|
|||||||
needsProfileLibrary: Boolean): List<Command> {
|
needsProfileLibrary: Boolean): List<Command> {
|
||||||
if (kind != LinkerOutputKind.EXECUTABLE) throw Error("Unsupported linker output kind")
|
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.
|
// TODO(horsh): maybe rethink it.
|
||||||
return listOf(object : Command() {
|
val jsBindingsGeneration = object : Command() {
|
||||||
override fun execute() {
|
override fun execute() {
|
||||||
val src = File(objectFiles.single())
|
|
||||||
val dst = File(executable)
|
|
||||||
src.recursiveCopyTo(dst)
|
|
||||||
javaScriptLink(libraries, executable)
|
javaScriptLink(libraries, executable)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -454,7 +457,8 @@ open class WasmLinker(targetProperties: WasmConfigurables)
|
|||||||
linkedJavaScript.appendBytes(linkerFooter.toByteArray())
|
linkedJavaScript.appendBytes(linkerFooter.toByteArray())
|
||||||
return linkedJavaScript.name
|
return linkedJavaScript.name
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
return listOf(linkage, jsBindingsGeneration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user