Skip to content

Commit

Permalink
Use clang codegen for android, linux, mingw.
Browse files Browse the repository at this point in the history
  • Loading branch information
sbogolepov committed May 27, 2019
1 parent a85b474 commit 970f2a9
Show file tree
Hide file tree
Showing 9 changed files with 78 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,8 @@ typealias BitcodeFile = String
typealias ObjectFile = String
typealias ExecutableFile = String

private fun mangleSymbol(target: KonanTarget,symbol: String) =
if (target.family == Family.IOS || target.family == Family.OSX) {
"_$symbol"
} else {
symbol
}

internal class BitcodeCompiler(val context: Context) {

private val target = context.config.target
private val platform = context.config.platform
private val optimize = context.shouldOptimize()
private val debug = context.config.debug
Expand All @@ -32,8 +24,6 @@ internal class BitcodeCompiler(val context: Context) {
addAll(elements.filter { !it.isEmpty() })
}

private val exportedSymbols = context.coverage.addExportedSymbols()

private fun runTool(vararg command: String) =
Command(*command)
.logWith(context::log)
Expand All @@ -56,25 +46,6 @@ internal class BitcodeCompiler(val context: Context) {
runTool(absoluteToolName, *arg)
}

private fun llvmLto(configurables: LlvmLtoFlags, file: BitcodeFile): ObjectFile {
val combined = temporary("combined", ".o")
val arguments = mutableListOf<String>().apply {
addNonEmpty(configurables.llvmLtoFlags)
addNonEmpty(llvmProfilingFlags())
when {
optimize -> addNonEmpty(configurables.llvmLtoOptFlags)
debug -> addNonEmpty(platform.llvmDebugOptFlags)
else -> addNonEmpty(configurables.llvmLtoNooptFlags)
}
addNonEmpty(configurables.llvmLtoDynamicFlags)
add(file)
// Prevent symbols from being deleted by DCE.
addNonEmpty(exportedSymbols.map { "-exported-symbol=${mangleSymbol(target, it)}"} )
}
hostLlvmTool("llvm-lto", "-o", combined, *arguments.toTypedArray())
return combined
}

private fun opt(optFlags: OptFlags, bitcodeFile: BitcodeFile): BitcodeFile {
val flags = (optFlags.optFlags + when {
optimize -> optFlags.optOptFlags
Expand Down Expand Up @@ -127,7 +98,7 @@ internal class BitcodeCompiler(val context: Context) {
return combinedO
}

private fun clang(configurables: AppleConfigurables, file: BitcodeFile): ObjectFile {
private fun clang(configurables: ClangFlags, file: BitcodeFile): ObjectFile {
val objectFile = temporary("result", ".o")

val profilingFlags = llvmProfilingFlags().map { listOf("-mllvm", it) }.flatten()
Expand All @@ -146,7 +117,11 @@ internal class BitcodeCompiler(val context: Context) {
}
addNonEmpty(profilingFlags)
}
targetTool("clang++", *flags.toTypedArray(), file, "-o", objectFile)
if (configurables is AppleConfigurables) {
targetTool("clang++", *flags.toTypedArray(), file, "-o", objectFile)
} else {
hostLlvmTool("clang++", *flags.toTypedArray(), file, "-o", objectFile)
}
return objectFile
}

Expand All @@ -165,14 +140,12 @@ internal class BitcodeCompiler(val context: Context) {

fun makeObjectFiles(bitcodeFile: BitcodeFile): List<ObjectFile> =
listOf(when (val configurables = platform.configurables) {
is AppleConfigurables ->
is ClangFlags ->
clang(configurables, bitcodeFile)
is WasmConfigurables ->
bitcodeToWasm(configurables, bitcodeFile)
is ZephyrConfigurables ->
optAndLlc(configurables, bitcodeFile)
is LlvmLtoFlags ->
llvmLto(configurables, bitcodeFile)
else ->
error("Unsupported configurables kind: ${configurables::class.simpleName}!")
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ private fun linkAllDependecies(context: Context, generatedBitcodeFiles: List<Str
}

private fun shouldOptimizeWithLlvmApi(context: Context) =
(context.config.target.family == Family.IOS || context.config.target.family == Family.OSX)
(context.config.target.family != Family.ZEPHYR && context.config.target.family != Family.WASM)

private fun shoudRunClosedWorldCleanUp(context: Context) =
// GlobalDCE will kill coverage-related globals.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ internal fun shouldRunLateBitcodePasses(context: Context): Boolean {

internal fun runLateBitcodePasses(context: Context, llvmModule: LLVMModuleRef) {
val passManager = LLVMCreatePassManager()!!
val targetLibraryInfo = LLVMGetTargetLibraryInfo(llvmModule)
LLVMAddTargetLibraryInfo(targetLibraryInfo, passManager)
LLVMKotlinAddTargetLibraryInfoWrapperPass(passManager, context.llvm.targetTriple)
context.coverage.addLateLlvmPasses(passManager)
LLVMRunPassManager(passManager, llvmModule)
LLVMDisposePassManager(passManager)
Expand All @@ -46,8 +45,18 @@ private class LlvmPipelineConfiguration(context: Context) {
KonanTarget.IOS_ARM32 -> "armv7"
KonanTarget.IOS_ARM64 -> "arm64"
KonanTarget.IOS_X64 -> "core2"
KonanTarget.LINUX_X64 -> "x86-64"
KonanTarget.MINGW_X86 -> "pentium4"
KonanTarget.MINGW_X64 -> "x86-64"
KonanTarget.MACOS_X64 -> "core2"
else -> error("There is no support for ${target.name} target yet.")
KonanTarget.LINUX_ARM32_HFP -> "arm1136jf-s"
KonanTarget.LINUX_ARM64 -> "cortex-a57"
KonanTarget.ANDROID_ARM32 -> "armv7"
KonanTarget.ANDROID_ARM64 -> "arm64"
KonanTarget.LINUX_MIPS32 -> "mips32r2"
KonanTarget.LINUX_MIPSEL32 -> "mips32r2"
KonanTarget.WASM32,
is KonanTarget.ZEPHYR -> error("There is no support for ${target.name} target yet.")
}

val cpuFeatures: String = ""
Expand Down Expand Up @@ -119,8 +128,7 @@ internal fun runLlvmOptimizationPipeline(context: Context) {
config.relocMode,
config.codeModel)

val targetLibraryInfo = LLVMGetTargetLibraryInfo(llvmModule)
LLVMAddTargetLibraryInfo(targetLibraryInfo, modulePasses)
LLVMKotlinAddTargetLibraryInfoWrapperPass(modulePasses, config.targetTriple)
// TargetTransformInfo pass.
LLVMAddAnalysisPasses(targetMachine, modulePasses)
// Since we are in a "closed world" internalization and global dce
Expand All @@ -134,10 +142,10 @@ internal fun runLlvmOptimizationPipeline(context: Context) {
// Pipeline that is similar to `llvm-lto`.
// TODO: Add ObjC optimization passes.
LLVMPassManagerBuilderPopulateLTOPassManager(passBuilder, modulePasses, Internalize = 0, RunInliner = 1)
LLVMPassManagerBuilderDispose(passBuilder)

LLVMRunPassManager(modulePasses, llvmModule)

LLVMPassManagerBuilderDispose(passBuilder)
LLVMDisposeTargetMachine(targetMachine)
LLVMDisposePassManager(modulePasses)
}
Expand Down
8 changes: 4 additions & 4 deletions backend.native/llvm.def
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ linkerOpts.osx = -fPIC \
-lpthread -lz -lm -lcurses -Wl,-U,_futimens -Wl,-U,_LLVMDumpType \
-lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMIRReader -lLLVMAsmParser -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMWebAssemblyDisassembler -lLLVMWebAssemblyCodeGen -lLLVMWebAssemblyDesc -lLLVMWebAssemblyInfo -lLLVMWebAssemblyAsmPrinter -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle

# ./llvm-config --libs analysis bitreader bitwriter core linker target coverage analysis ipo instrumentation lto
linkerOpts.linux= -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts -lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader -lLLVMAsmParser -lLLVMInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle \
# ./llvm-config --libs analysis bitreader bitwriter core linker target coverage analysis ipo instrumentation lto arm aarch64 x86 mips
linkerOpts.linux= -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 -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts -lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader -lLLVMAsmParser -lLLVMInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle \
-fPIC \
-Wl,-z,noexecstack \
-lrt -ldl -lpthread -lz -lm

# ./llvm-config --libs analysis bitreader bitwriter core linker target coverage analysis ipo instrumentation lto
linkerOpts.mingw = -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts -lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader -lLLVMAsmParser -lLLVMInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle \
# ./llvm-config --libs analysis bitreader bitwriter core linker target coverage analysis ipo instrumentation lto arm aarch64 x86
linkerOpts.mingw = -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMMCDisassembler -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMARMUtils -lLLVMLTO -lLLVMPasses -lLLVMObjCARCOpts -lLLVMCodeGen -lLLVMipo -lLLVMInstrumentation -lLLVMVectorize -lLLVMScalarOpts -lLLVMIRReader -lLLVMAsmParser -lLLVMInstCombine -lLLVMCoverage -lLLVMTarget -lLLVMLinker -lLLVMTransformUtils -lLLVMBitWriter -lLLVMAnalysis -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMBitReader -lLLVMCore -lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle \
-lole32 -luuid -static-libgcc -static-libstdc++ \
-Wl,-Bstatic -lz \
-Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive,-Bdynamic \
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ kotlinStdlibVersion=1.3.50-dev-368
testKotlinCompilerVersion=1.3.50-dev-328
# See https://teamcity.jetbrains.com/project.html?projectId=Kotlin_KotlinNativeShared&tab=projectOverview
sharedRepo=https://dl.bintray.com/jetbrains/kotlin-native-dependencies
sharedVersion=1.0-dev-96
sharedVersion=1.0-dev-99
konanVersion=1.3.50
org.gradle.jvmargs='-Dfile.encoding=UTF-8'
org.gradle.workers.max=4
Expand Down
Loading

0 comments on commit 970f2a9

Please sign in to comment.