Mimalloc allocator integration
This commit is contained in:
committed by
LepilkinaElena
parent
08e05bb10b
commit
5d6af6e806
@@ -153,6 +153,7 @@ class K2Native : CLICompiler<K2NativeCompilerArguments>() {
|
|||||||
put(LIGHT_DEBUG, arguments.lightDebug)
|
put(LIGHT_DEBUG, arguments.lightDebug)
|
||||||
put(STATIC_FRAMEWORK, selectFrameworkType(configuration, arguments, outputKind))
|
put(STATIC_FRAMEWORK, selectFrameworkType(configuration, arguments, outputKind))
|
||||||
put(OVERRIDE_CLANG_OPTIONS, arguments.clangOptions.toNonNullList())
|
put(OVERRIDE_CLANG_OPTIONS, arguments.clangOptions.toNonNullList())
|
||||||
|
put(ALLOCATION_MODE, arguments.allocator)
|
||||||
|
|
||||||
put(PRINT_IR, arguments.printIr)
|
put(PRINT_IR, arguments.printIr)
|
||||||
put(PRINT_IR_WITH_DESCRIPTORS, arguments.printIrWithDescriptors)
|
put(PRINT_IR_WITH_DESCRIPTORS, arguments.printIrWithDescriptors)
|
||||||
|
|||||||
@@ -242,6 +242,9 @@ class K2NativeCompilerArguments : CommonCompilerArguments() {
|
|||||||
@Argument(value="-Xoverride-clang-options", valueDescription = "<arg1,arg2,...>", description = "Explicit list of Clang options")
|
@Argument(value="-Xoverride-clang-options", valueDescription = "<arg1,arg2,...>", description = "Explicit list of Clang options")
|
||||||
var clangOptions: Array<String>? = null
|
var clangOptions: Array<String>? = null
|
||||||
|
|
||||||
|
@Argument(value="-Xallocator", valueDescription = "std | mimalloc", description = "Allocator used in runtime")
|
||||||
|
var allocator: String = "std"
|
||||||
|
|
||||||
override fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> =
|
override fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> =
|
||||||
super.configureAnalysisFlags(collector).also {
|
super.configureAnalysisFlags(collector).also {
|
||||||
val useExperimental = it[AnalysisFlags.useExperimental] as List<*>
|
val useExperimental = it[AnalysisFlags.useExperimental] as List<*>
|
||||||
|
|||||||
+13
-8
@@ -13,20 +13,13 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
|||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.konan.CURRENT
|
import org.jetbrains.kotlin.konan.CURRENT
|
||||||
|
import org.jetbrains.kotlin.konan.CompilerVersion
|
||||||
import org.jetbrains.kotlin.konan.MetaVersion
|
import org.jetbrains.kotlin.konan.MetaVersion
|
||||||
import org.jetbrains.kotlin.konan.TempFiles
|
import org.jetbrains.kotlin.konan.TempFiles
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
||||||
import org.jetbrains.kotlin.konan.properties.loadProperties
|
import org.jetbrains.kotlin.konan.properties.loadProperties
|
||||||
import org.jetbrains.kotlin.konan.target.Distribution
|
|
||||||
import org.jetbrains.kotlin.konan.target.HostManager
|
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
|
||||||
import org.jetbrains.kotlin.konan.target.PlatformManager
|
|
||||||
import org.jetbrains.kotlin.konan.target.*
|
import org.jetbrains.kotlin.konan.target.*
|
||||||
import org.jetbrains.kotlin.util.Logger
|
|
||||||
import kotlin.system.exitProcess
|
|
||||||
import org.jetbrains.kotlin.library.toUnresolvedLibraries
|
|
||||||
import org.jetbrains.kotlin.konan.CompilerVersion
|
|
||||||
import org.jetbrains.kotlin.library.KotlinLibrary
|
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||||
import org.jetbrains.kotlin.library.resolver.TopologicalLibraryOrder
|
import org.jetbrains.kotlin.library.resolver.TopologicalLibraryOrder
|
||||||
|
|
||||||
@@ -116,6 +109,18 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration
|
|||||||
add(if (debug) "debug.bc" else "release.bc")
|
add(if (debug) "debug.bc" else "release.bc")
|
||||||
add(if (memoryModel == MemoryModel.STRICT) "strict.bc" else "relaxed.bc")
|
add(if (memoryModel == MemoryModel.STRICT) "strict.bc" else "relaxed.bc")
|
||||||
if (shouldCoverLibraries || shouldCoverSources) add("profileRuntime.bc")
|
if (shouldCoverLibraries || shouldCoverSources) add("profileRuntime.bc")
|
||||||
|
if (configuration.get(KonanConfigKeys.ALLOCATION_MODE) == "mimalloc") {
|
||||||
|
if (!target.supportsMimallocAllocator()) {
|
||||||
|
configuration.report(CompilerMessageSeverity.STRONG_WARNING,
|
||||||
|
"Mimalloc allocator isn't supported on target ${target.name}. Used standard mode.")
|
||||||
|
add("std_alloc.bc")
|
||||||
|
} else {
|
||||||
|
add("opt_alloc.bc")
|
||||||
|
add("mimalloc.bc")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
add("std_alloc.bc")
|
||||||
|
}
|
||||||
}.map {
|
}.map {
|
||||||
File(distribution.defaultNatives(target)).child(it).absolutePath
|
File(distribution.defaultNatives(target)).child(it).absolutePath
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -88,6 +88,8 @@ class KonanConfigKeys {
|
|||||||
= CompilerConfigurationKey.create("program or library name")
|
= CompilerConfigurationKey.create("program or library name")
|
||||||
val OVERRIDE_CLANG_OPTIONS: CompilerConfigurationKey<List<String>>
|
val OVERRIDE_CLANG_OPTIONS: CompilerConfigurationKey<List<String>>
|
||||||
= CompilerConfigurationKey.create("arguments for clang")
|
= CompilerConfigurationKey.create("arguments for clang")
|
||||||
|
val ALLOCATION_MODE: CompilerConfigurationKey<String>
|
||||||
|
= CompilerConfigurationKey.create("allocation mode")
|
||||||
val PRINT_BITCODE: CompilerConfigurationKey<Boolean>
|
val PRINT_BITCODE: CompilerConfigurationKey<Boolean>
|
||||||
= CompilerConfigurationKey.create("print bitcode")
|
= CompilerConfigurationKey.create("print bitcode")
|
||||||
val PRINT_DESCRIPTORS: CompilerConfigurationKey<Boolean>
|
val PRINT_DESCRIPTORS: CompilerConfigurationKey<Boolean>
|
||||||
|
|||||||
@@ -1,146 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2017 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin
|
|
||||||
|
|
||||||
import org.gradle.api.DefaultTask
|
|
||||||
import org.gradle.api.tasks.*
|
|
||||||
import org.gradle.api.tasks.InputDirectory
|
|
||||||
import org.gradle.api.tasks.OutputFile
|
|
||||||
import org.gradle.api.tasks.TaskAction
|
|
||||||
import org.jetbrains.kotlin.konan.target.Family
|
|
||||||
import org.jetbrains.kotlin.konan.target.HostManager
|
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
|
||||||
|
|
||||||
class CompileCppToBitcode extends DefaultTask {
|
|
||||||
private String name = "main"
|
|
||||||
private String target = "host"
|
|
||||||
private File srcRoot;
|
|
||||||
|
|
||||||
protected List<String> compilerArgs = []
|
|
||||||
protected List<String> linkerArgs = []
|
|
||||||
|
|
||||||
@InputDirectory
|
|
||||||
File getSrcRoot() {
|
|
||||||
return srcRoot ?: project.file("src/$name")
|
|
||||||
}
|
|
||||||
|
|
||||||
@OutputFile
|
|
||||||
File getOutFile() {
|
|
||||||
return new File(getTargetDir(), "${name}.bc")
|
|
||||||
}
|
|
||||||
|
|
||||||
private File getSrcDir() {
|
|
||||||
return new File(this.getSrcRoot(), "cpp")
|
|
||||||
}
|
|
||||||
|
|
||||||
private File getHeadersDir() {
|
|
||||||
return new File(this.getSrcRoot(), "headers")
|
|
||||||
}
|
|
||||||
|
|
||||||
private File getTargetDir() {
|
|
||||||
return new File(project.buildDir, target)
|
|
||||||
}
|
|
||||||
|
|
||||||
private File getObjDir() {
|
|
||||||
return new File(getTargetDir(), name)
|
|
||||||
}
|
|
||||||
|
|
||||||
void name(String value) {
|
|
||||||
name = value
|
|
||||||
}
|
|
||||||
|
|
||||||
void target(String value) {
|
|
||||||
target = value
|
|
||||||
}
|
|
||||||
|
|
||||||
void srcRoot(File value) {
|
|
||||||
srcRoot = value
|
|
||||||
}
|
|
||||||
|
|
||||||
protected List<String> getCompilerArgs() {
|
|
||||||
return compilerArgs
|
|
||||||
}
|
|
||||||
|
|
||||||
protected List<String> getLinkerArgs() {
|
|
||||||
return linkerArgs
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getTarget() {
|
|
||||||
return target
|
|
||||||
}
|
|
||||||
|
|
||||||
void compilerArgs(String... args) {
|
|
||||||
compilerArgs.addAll(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
void compilerArgs(List<String> args) {
|
|
||||||
compilerArgs.addAll(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
void linkerArgs(String... args) {
|
|
||||||
linkerArgs.addAll(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
void linkerArgs(List<String> args) {
|
|
||||||
linkerArgs.addAll(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
private Boolean targetingMinGW() {
|
|
||||||
def hostManager = new HostManager()
|
|
||||||
return hostManager.targetByName(this.target).family == Family.MINGW
|
|
||||||
}
|
|
||||||
|
|
||||||
@TaskAction
|
|
||||||
void compile() {
|
|
||||||
// the strange code below seems to be required due to some Gradle (Groovy?) behaviour
|
|
||||||
File headersDir = this.getHeadersDir()
|
|
||||||
File srcDir = this.getSrcDir()
|
|
||||||
List<String> compilerArgs = this.getCompilerArgs()
|
|
||||||
List<String> linkerArgs = this.getLinkerArgs()
|
|
||||||
File objDir = this.getObjDir()
|
|
||||||
objDir.mkdirs()
|
|
||||||
Boolean targetingMinGW = this.targetingMinGW()
|
|
||||||
|
|
||||||
project.execKonanClang(this.target) {
|
|
||||||
workingDir objDir
|
|
||||||
executable "clang++"
|
|
||||||
args '-std=c++14'
|
|
||||||
args '-Werror'
|
|
||||||
args '-O2'
|
|
||||||
if (!targetingMinGW) {
|
|
||||||
args '-fPIC'
|
|
||||||
}
|
|
||||||
args compilerArgs
|
|
||||||
|
|
||||||
args "-I$headersDir"
|
|
||||||
args '-c', '-emit-llvm'
|
|
||||||
args project.fileTree(srcDir) {
|
|
||||||
include('**/*.cpp')
|
|
||||||
include('**/*.mm') // Objective-C++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
project.exec {
|
|
||||||
executable "$project.llvmDir/bin/llvm-link"
|
|
||||||
args project.fileTree(objDir).include('**/*.bc').sort { a, b -> (a.name <=> b.name) }
|
|
||||||
|
|
||||||
args linkerArgs
|
|
||||||
|
|
||||||
args '-o', outFile
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin
|
||||||
|
|
||||||
|
import org.gradle.api.Action
|
||||||
|
import org.gradle.api.DefaultTask
|
||||||
|
import org.gradle.api.tasks.InputDirectory
|
||||||
|
import org.gradle.api.tasks.OutputFile
|
||||||
|
import org.gradle.api.tasks.TaskAction
|
||||||
|
import org.jetbrains.kotlin.konan.target.Family
|
||||||
|
import org.jetbrains.kotlin.konan.target.HostManager
|
||||||
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
open class CompileToBitcode @Inject constructor(@InputDirectory val srcRoot: File,
|
||||||
|
val folderName: String,
|
||||||
|
val target: String) : DefaultTask() {
|
||||||
|
enum class Language {
|
||||||
|
C, CPP
|
||||||
|
}
|
||||||
|
|
||||||
|
val compilerArgs = mutableListOf<String>()
|
||||||
|
val linkerArgs = mutableListOf<String>()
|
||||||
|
val excludeFiles = mutableListOf<String>()
|
||||||
|
var srcDir = File(srcRoot, "cpp")
|
||||||
|
var headersDir = File(srcRoot, "headers")
|
||||||
|
var skipLinkagePhase = false
|
||||||
|
var excludedTargets = mutableListOf<String>()
|
||||||
|
var language = Language.CPP
|
||||||
|
|
||||||
|
private val targetDir by lazy { File(project.buildDir, target) }
|
||||||
|
|
||||||
|
private val objDir by lazy { File(targetDir, folderName) }
|
||||||
|
|
||||||
|
private val KonanTarget.isMINGW
|
||||||
|
get() = this.family == Family.MINGW
|
||||||
|
|
||||||
|
@OutputFile
|
||||||
|
val outFile = File(targetDir, "${folderName}.bc")
|
||||||
|
|
||||||
|
@TaskAction
|
||||||
|
fun compile() {
|
||||||
|
if (target in excludedTargets) return
|
||||||
|
objDir.mkdirs()
|
||||||
|
val plugin = project.convention.getPlugin(ExecClang::class.java)
|
||||||
|
val commonFlags = listOf("-c", "-emit-llvm", "-I$headersDir")
|
||||||
|
val (executable, defaultFlags, srcFilesPatterns) =
|
||||||
|
when (language) {
|
||||||
|
Language.C -> Triple("clang",
|
||||||
|
// Used flags provided by original build of allocator C code.
|
||||||
|
commonFlags + listOf("-std=gnu11", "-O3", "-Wall", "-Wextra", "-Wno-unknown-pragmas",
|
||||||
|
"-ftls-model=initial-exec"),
|
||||||
|
listOf("**/*.c"))
|
||||||
|
Language.CPP -> Triple("clang++",
|
||||||
|
commonFlags + listOfNotNull("-std=c++14", "-Werror", "-O2",
|
||||||
|
"-fPIC".takeIf { !HostManager().targetByName(target).isMINGW }),
|
||||||
|
listOf("**/*.cpp", "**/*.mm"))
|
||||||
|
}
|
||||||
|
|
||||||
|
plugin.execKonanClang(target, Action {
|
||||||
|
it.workingDir = objDir
|
||||||
|
it.executable = executable
|
||||||
|
it.args = defaultFlags + compilerArgs +
|
||||||
|
project.fileTree(srcDir) {
|
||||||
|
it.include(srcFilesPatterns)
|
||||||
|
it.exclude(excludeFiles)
|
||||||
|
}.files.map { it.absolutePath }
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!skipLinkagePhase) {
|
||||||
|
project.exec {
|
||||||
|
val llvmDir = project.findProperty("llvmDir")
|
||||||
|
it.executable = "$llvmDir/bin/llvm-link"
|
||||||
|
it.args = listOf("-o", outFile.absolutePath) + linkerArgs +
|
||||||
|
project.fileTree(objDir) {
|
||||||
|
it.include("**/*.bc")
|
||||||
|
}.files.map { it.absolutePath }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -241,3 +241,6 @@ fun compileSwift(project: Project, target: KonanTarget, sources: List<String>, o
|
|||||||
check(exitCode == 0, { "Compilation failed" })
|
check(exitCode == 0, { "Compilation failed" })
|
||||||
check(output.toFile().exists(), { "Compiler swiftc hasn't produced an output file: $output" })
|
check(output.toFile().exists(), { "Compiler swiftc hasn't produced an output file: $output" })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun targetSupportsMimallocAllocator(targetName: String) =
|
||||||
|
HostManager().targetByName(targetName).supportsMimallocAllocator()
|
||||||
+3
-9
@@ -2,22 +2,16 @@
|
|||||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
* that can be found in the LICENSE file.
|
* that can be found in the LICENSE file.
|
||||||
*/
|
*/
|
||||||
import org.jetbrains.kotlin.CompileCppToBitcode
|
import org.jetbrains.kotlin.CompileToBitcode
|
||||||
|
|
||||||
// TODO: consider using some Gradle plugins to build and test
|
// TODO: consider using some Gradle plugins to build and test
|
||||||
|
|
||||||
targetList.each { targetName ->
|
targetList.each { targetName ->
|
||||||
task ("${targetName}Hash", type: CompileCppToBitcode) {
|
tasks.create("${targetName}Hash", CompileToBitcode, file("src/hash"), 'hash', targetName)
|
||||||
name 'hash'
|
|
||||||
target targetName
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
targetList.each { targetName ->
|
targetList.each { targetName ->
|
||||||
task ("${targetName}Files", type: CompileCppToBitcode) {
|
tasks.create("${targetName}Files", CompileToBitcode, file("src/files"), 'files', targetName)
|
||||||
name 'files'
|
|
||||||
target targetName
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
task build {
|
task build {
|
||||||
|
|||||||
+35
-43
@@ -1,21 +1,23 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
* that can be found in the LICENSE file.
|
* that can be found in the LICENSE file.
|
||||||
*/
|
*/
|
||||||
import org.jetbrains.kotlin.CompileCppToBitcode
|
import org.jetbrains.kotlin.CompileToBitcode
|
||||||
|
import org.jetbrains.kotlin.UtilsKt
|
||||||
|
|
||||||
// TODO: consider using some Gradle plugins to build and test
|
// TODO: consider using some Gradle plugins to build and test
|
||||||
|
|
||||||
void includeRuntime(CompileCppToBitcode task) {
|
void includeRuntime(CompileToBitcode task) {
|
||||||
task.compilerArgs '-I' + project.file('../common/src/hash/headers')
|
task.compilerArgs.add('-I' + project.file('../common/src/hash/headers'))
|
||||||
task.compilerArgs '-I' + project.file('src/main/cpp')
|
task.compilerArgs.add('-I' + project.file('src/main/cpp'))
|
||||||
}
|
}
|
||||||
|
|
||||||
targetList.each { targetName ->
|
targetList.each { targetName ->
|
||||||
task("${targetName}Runtime", type: CompileCppToBitcode) {
|
tasks.create("${targetName}Runtime", CompileToBitcode, file('src/main'), "runtime", targetName).configure {
|
||||||
name "runtime"
|
|
||||||
srcRoot file('src/main')
|
|
||||||
dependsOn ":common:${targetName}Hash"
|
dependsOn ":common:${targetName}Hash"
|
||||||
|
dependsOn "${targetName}StdAlloc"
|
||||||
|
dependsOn "${targetName}OptAlloc"
|
||||||
|
dependsOn "${targetName}Mimalloc"
|
||||||
dependsOn "${targetName}Launcher"
|
dependsOn "${targetName}Launcher"
|
||||||
dependsOn "${targetName}Debug"
|
dependsOn "${targetName}Debug"
|
||||||
dependsOn "${targetName}Release"
|
dependsOn "${targetName}Release"
|
||||||
@@ -24,63 +26,53 @@ targetList.each { targetName ->
|
|||||||
dependsOn "${targetName}ProfileRuntime"
|
dependsOn "${targetName}ProfileRuntime"
|
||||||
dependsOn "${targetName}ObjC"
|
dependsOn "${targetName}ObjC"
|
||||||
dependsOn "${targetName}ExceptionsSupport"
|
dependsOn "${targetName}ExceptionsSupport"
|
||||||
target targetName
|
|
||||||
includeRuntime(delegate)
|
includeRuntime(delegate)
|
||||||
linkerArgs project.file("../common/build/$targetName/hash.bc").path
|
linkerArgs.add(project.file("../common/build/$targetName/hash.bc").path)
|
||||||
}
|
}
|
||||||
|
|
||||||
task("${targetName}Launcher", type: CompileCppToBitcode) {
|
tasks.create("${targetName}Mimalloc", CompileToBitcode, file('src/mimalloc'), "mimalloc", targetName).configure {
|
||||||
name "launcher"
|
language = CompileToBitcode.Language.C
|
||||||
srcRoot file('src/launcher')
|
excludeFiles.addAll(["**/alloc-override*.c", "**/page-queue.c", "**/static.c"])
|
||||||
target targetName
|
if (!UtilsKt.targetSupportsMimallocAllocator(targetName))
|
||||||
|
excludedTargets.add(targetName)
|
||||||
|
srcDir = new File(srcRoot, "c")
|
||||||
|
compilerArgs.add("-DKONAN_MI_MALLOC=1")
|
||||||
|
headersDir = new File(srcDir, "include")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.create("${targetName}Launcher", CompileToBitcode, file('src/launcher'), "launcher", targetName).configure {
|
||||||
includeRuntime(delegate)
|
includeRuntime(delegate)
|
||||||
}
|
}
|
||||||
|
|
||||||
task ("${targetName}Debug", type: CompileCppToBitcode) {
|
tasks.create("${targetName}Debug", CompileToBitcode, file('src/debug'), "debug", targetName).configure {
|
||||||
name "debug"
|
|
||||||
srcRoot file('src/debug')
|
|
||||||
target targetName
|
|
||||||
includeRuntime(delegate)
|
includeRuntime(delegate)
|
||||||
}
|
}
|
||||||
|
|
||||||
task ("${targetName}ExceptionsSupport", type: CompileCppToBitcode) {
|
tasks.create("${targetName}StdAlloc", CompileToBitcode, file('src/std_alloc'), "std_alloc", targetName)
|
||||||
name "exceptionsSupport"
|
|
||||||
srcRoot file('src/exceptions_support')
|
tasks.create("${targetName}OptAlloc", CompileToBitcode, file('src/opt_alloc'), "opt_alloc", targetName)
|
||||||
target targetName
|
|
||||||
|
tasks.create("${targetName}ExceptionsSupport", CompileToBitcode, file('src/exceptions_support'),
|
||||||
|
"exceptionsSupport", targetName).configure {
|
||||||
includeRuntime(delegate)
|
includeRuntime(delegate)
|
||||||
}
|
}
|
||||||
|
|
||||||
task ("${targetName}Release", type: CompileCppToBitcode) {
|
tasks.create("${targetName}Release", CompileToBitcode, file('src/release'), "release", targetName).configure {
|
||||||
name "release"
|
|
||||||
srcRoot file('src/release')
|
|
||||||
target targetName
|
|
||||||
includeRuntime(delegate)
|
includeRuntime(delegate)
|
||||||
}
|
}
|
||||||
|
|
||||||
task ("${targetName}Strict", type: CompileCppToBitcode) {
|
tasks.create("${targetName}Strict", CompileToBitcode, file('src/strict'), "strict", targetName).configure {
|
||||||
name "strict"
|
|
||||||
srcRoot file('src/strict')
|
|
||||||
target targetName
|
|
||||||
includeRuntime(delegate)
|
includeRuntime(delegate)
|
||||||
}
|
}
|
||||||
|
|
||||||
task ("${targetName}Relaxed", type: CompileCppToBitcode) {
|
tasks.create("${targetName}Relaxed", CompileToBitcode, file('src/relaxed'), "relaxed", targetName).configure {
|
||||||
name "relaxed"
|
|
||||||
srcRoot file('src/relaxed')
|
|
||||||
target targetName
|
|
||||||
includeRuntime(delegate)
|
includeRuntime(delegate)
|
||||||
}
|
}
|
||||||
|
|
||||||
task ("${targetName}ProfileRuntime", type: CompileCppToBitcode) {
|
tasks.create("${targetName}ProfileRuntime", CompileToBitcode, file('src/profile_runtime'),
|
||||||
name "profileRuntime"
|
"profileRuntime", targetName)
|
||||||
srcRoot file('src/profile_runtime')
|
|
||||||
target targetName
|
|
||||||
}
|
|
||||||
|
|
||||||
task ("${targetName}ObjC", type: CompileCppToBitcode) {
|
tasks.create("${targetName}ObjC", CompileToBitcode, file('src/objc'), "objc", targetName).configure {
|
||||||
name "objc"
|
|
||||||
srcRoot file('src/objc')
|
|
||||||
target targetName
|
|
||||||
includeRuntime(delegate)
|
includeRuntime(delegate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -216,8 +216,10 @@ extern "C" void dlfree(void*);
|
|||||||
#define calloc_impl dlcalloc
|
#define calloc_impl dlcalloc
|
||||||
#define free_impl dlfree
|
#define free_impl dlfree
|
||||||
#else
|
#else
|
||||||
#define calloc_impl ::calloc
|
extern "C" void* konan_calloc_impl(size_t, size_t);
|
||||||
#define free_impl ::free
|
extern "C" void konan_free_impl(void*);
|
||||||
|
#define calloc_impl konan_calloc_impl
|
||||||
|
#define free_impl konan_free_impl
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void* calloc(size_t count, size_t size) {
|
void* calloc(size_t count, size_t size) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ terms of the MIT license. A copy of the license can be found in the file
|
|||||||
"LICENSE" at the root of this distribution.
|
"LICENSE" at the root of this distribution.
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if !KONAN_MI_MALLOC
|
||||||
#include "mimalloc.h"
|
#include "mimalloc.h"
|
||||||
#include "mimalloc-internal.h"
|
#include "mimalloc-internal.h"
|
||||||
|
|
||||||
@@ -228,3 +229,4 @@ static void __attribute__((constructor)) _mi_macos_override_malloc()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif // MI_MALLOC_OVERRIDE
|
#endif // MI_MALLOC_OVERRIDE
|
||||||
|
#endif
|
||||||
@@ -4,7 +4,7 @@ This is free software; you can redistribute it and/or modify it under the
|
|||||||
terms of the MIT license. A copy of the license can be found in the file
|
terms of the MIT license. A copy of the license can be found in the file
|
||||||
"LICENSE" at the root of this distribution.
|
"LICENSE" at the root of this distribution.
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
#if !KONAN_MI_MALLOC
|
||||||
#if !defined(MI_IN_ALLOC_C)
|
#if !defined(MI_IN_ALLOC_C)
|
||||||
#error "this file should be included from 'alloc.c' (so aliases can work)"
|
#error "this file should be included from 'alloc.c' (so aliases can work)"
|
||||||
#endif
|
#endif
|
||||||
@@ -194,4 +194,4 @@ int posix_memalign(void** p, size_t alignment, size_t size) { return mi_posix_me
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // MI_MALLOC_OVERRIDE && !_WIN32
|
#endif // MI_MALLOC_OVERRIDE && !_WIN32
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ static inline void mi_atomic_write(volatile _Atomic(uintptr_t)* p, uintptr_t x)
|
|||||||
asm volatile ("pause" ::: "memory");
|
asm volatile ("pause" ::: "memory");
|
||||||
}
|
}
|
||||||
#elif defined(__arm__) || defined(__aarch64__)
|
#elif defined(__arm__) || defined(__aarch64__)
|
||||||
#if defined(KONAN_MI_MALLOC)
|
#if KONAN_MI_MALLOC
|
||||||
#if defined(__arm__)
|
#if defined(__arm__)
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
static inline void mi_atomic_yield(void) {
|
static inline void mi_atomic_yield(void) {
|
||||||
|
|||||||
@@ -457,7 +457,7 @@ static inline uintptr_t _mi_thread_id(void) mi_attr_noexcept {
|
|||||||
}
|
}
|
||||||
#elif (defined(__GNUC__) || defined(__clang__)) && \
|
#elif (defined(__GNUC__) || defined(__clang__)) && \
|
||||||
(defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__))
|
(defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__))
|
||||||
#if defined(KONAN_MI_MALLOC)
|
#if KONAN_MI_MALLOC
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
pthread_t pthread_self(void);
|
pthread_t pthread_self(void);
|
||||||
#endif
|
#endif
|
||||||
@@ -468,7 +468,7 @@ static inline uintptr_t _mi_thread_id(void) mi_attr_noexcept {
|
|||||||
#if defined(__i386__)
|
#if defined(__i386__)
|
||||||
__asm__("movl %%gs:0, %0" : "=r" (tid) : : ); // 32-bit always uses GS
|
__asm__("movl %%gs:0, %0" : "=r" (tid) : : ); // 32-bit always uses GS
|
||||||
#elif defined(__MACH__)
|
#elif defined(__MACH__)
|
||||||
#if defined(KONAN_MI_MALLOC)
|
#if KONAN_MI_MALLOC
|
||||||
#include <TargetConditionals.h>
|
#include <TargetConditionals.h>
|
||||||
#if TARGET_OS_EMBEDDED // iOS/tvOS/watchOS devices.
|
#if TARGET_OS_EMBEDDED // iOS/tvOS/watchOS devices.
|
||||||
tid = pthread_self();
|
tid = pthread_self();
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ terms of the MIT license. A copy of the license can be found in the file
|
|||||||
// ------------------------------------------------------
|
// ------------------------------------------------------
|
||||||
|
|
||||||
// Define NDEBUG in the release version to disable assertions.
|
// Define NDEBUG in the release version to disable assertions.
|
||||||
#if !defined(KONAN_MI_MALLOC)
|
#if !KONAN_MI_MALLOC
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ This is free software; you can redistribute it and/or modify it under the
|
|||||||
terms of the MIT license. A copy of the license can be found in the file
|
terms of the MIT license. A copy of the license can be found in the file
|
||||||
"LICENSE" at the root of this distribution.
|
"LICENSE" at the root of this distribution.
|
||||||
-----------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------*/
|
||||||
|
#if !KONAN_MI_MALLOC
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
#include "mimalloc.h"
|
#include "mimalloc.h"
|
||||||
@@ -24,3 +25,4 @@ terms of the MIT license. A copy of the license can be found in the file
|
|||||||
#include "alloc-posix.c"
|
#include "alloc-posix.c"
|
||||||
#include "init.c"
|
#include "init.c"
|
||||||
#include "options.c"
|
#include "options.c"
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the LICENSE file.
|
||||||
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void* mi_calloc(size_t, size_t);
|
||||||
|
void mi_free(void*);
|
||||||
|
void* konan_calloc_impl(size_t n_elements, size_t elem_size) {
|
||||||
|
return mi_calloc(n_elements, elem_size);
|
||||||
|
}
|
||||||
|
void konan_free_impl (void* mem) {
|
||||||
|
mi_free(mem);
|
||||||
|
}
|
||||||
|
} // extern "C"
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the LICENSE file.
|
||||||
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
// Memory operations.
|
||||||
|
void* konan_calloc_impl(size_t n_elements, size_t elem_size) {
|
||||||
|
return calloc(n_elements, elem_size);
|
||||||
|
}
|
||||||
|
void konan_free_impl (void* mem) {
|
||||||
|
free(mem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -5,3 +5,19 @@ fun KonanTarget.supportsCodeCoverage(): Boolean =
|
|||||||
this == KonanTarget.LINUX_X64 ||
|
this == KonanTarget.LINUX_X64 ||
|
||||||
this == KonanTarget.MACOS_X64 ||
|
this == KonanTarget.MACOS_X64 ||
|
||||||
this == KonanTarget.IOS_X64
|
this == KonanTarget.IOS_X64
|
||||||
|
|
||||||
|
fun KonanTarget.supportsMimallocAllocator(): Boolean =
|
||||||
|
when(this) {
|
||||||
|
is KonanTarget.LINUX_X64 -> true
|
||||||
|
is KonanTarget.MINGW_X86 -> true
|
||||||
|
is KonanTarget.MINGW_X64 -> true
|
||||||
|
is KonanTarget.MACOS_X64 -> true
|
||||||
|
is KonanTarget.LINUX_ARM64 -> true
|
||||||
|
is KonanTarget.LINUX_ARM32_HFP -> true
|
||||||
|
is KonanTarget.ANDROID_X64 -> true
|
||||||
|
is KonanTarget.ANDROID_ARM64 -> true
|
||||||
|
is KonanTarget.IOS_ARM32 -> true
|
||||||
|
is KonanTarget.IOS_ARM64 -> true
|
||||||
|
is KonanTarget.IOS_X64 -> true
|
||||||
|
else -> false // watchOS/tvOS/android_x86/android_arm32 aren't tested; linux_mips32/linux_mipsel32 need linking with libatomic.
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user