[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
|
||||
|
||||
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 ->
|
||||
|
||||
+1
-1
@@ -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.
|
||||
|
||||
+1
-1
@@ -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
@@ -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 \
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user