[K/N][caches] Removed old slow and hacky version of per-file caches building

This commit is contained in:
Igor Chevdar
2022-09-09 14:20:54 +03:00
committed by Space
parent 9250de42a5
commit 1963860a92
14 changed files with 29 additions and 93 deletions
@@ -224,9 +224,6 @@ class K2NativeCompilerArguments : CommonCompilerArguments() {
@Argument(value = "-Xmake-per-file-cache", description = "Force compiler to produce per-file cache")
var makePerFileCache: Boolean = false
@Argument(value = "-Xbatched-per-file-cache-build", valueDescription = "{disable|enable}", description = "Build per-file cache in one batch")
var batchedPerFileCacheBuild: String? = null
@Argument(value = "-Xexport-kdoc", description = "Export KDoc in framework header")
var exportKDoc: Boolean = false
@@ -286,19 +286,8 @@ class K2Native : CLICompiler<K2NativeCompilerArguments>() {
put(CACHE_DIRECTORIES, cacheDirectories)
put(CACHED_LIBRARIES, parseCachedLibraries(arguments, configuration))
val filesToCache = arguments.filesToCache
if (outputKind == CompilerOutputKind.PRELIMINARY_CACHE && filesToCache.isNullOrEmpty())
configuration.report(ERROR, "preliminary_cache only supported for per-file caches")
filesToCache?.let { put(FILES_TO_CACHE, it.toList()) }
put(MAKE_PER_FILE_CACHE, arguments.makePerFileCache)
putIfNotNull(BATCHED_PER_FILE_CACHE_BUILD, when (arguments.batchedPerFileCacheBuild) {
null -> null
"enable" -> true
"disable" -> false
else -> {
configuration.report(ERROR, "Expected 'enable' or 'disable' for batchedPerFileCacheBuild")
false
}
})
parseShortModuleName(arguments, configuration, outputKind)?.let {
put(SHORT_MODULE_NAME, it)
@@ -72,7 +72,7 @@ class CacheSupport(
?: configuration.reportCompilationError("cache directory $it is not found or not a directory")
}
internal fun tryGetImplicitOutput(explicitlyProducePerFileCache: Boolean): String? {
internal fun tryGetImplicitOutput(): String? {
val libraryToCache = libraryToCache ?: return null
// Put the resulting library in the first cache directory.
val cacheDirectory = implicitCacheDirectories.firstOrNull() ?: return null
@@ -86,14 +86,8 @@ class CacheSupport(
val singleFilePath = singleFileStrategy?.filePath
?: return baseLibraryCacheDirectory.absolutePath
val fqName = singleFileStrategy.fqName
val fileCacheDirectory = baseLibraryCacheDirectory.child(cacheFileId(fqName, singleFilePath))
if (!explicitlyProducePerFileCache)
return fileCacheDirectory.absolutePath
val contentDirName = if (produce == CompilerOutputKind.PRELIMINARY_CACHE)
CachedLibraries.PER_FILE_CACHE_IR_LEVEL_DIR_NAME
else CachedLibraries.PER_FILE_CACHE_BINARY_LEVEL_DIR_NAME
return fileCacheDirectory.child(contentDirName).absolutePath
val fileCacheDirectory = baseLibraryCacheDirectory.child(cacheFileId(singleFileStrategy.fqName, singleFilePath))
return fileCacheDirectory.absolutePath
}
internal val cachedLibraries: CachedLibraries = run {
@@ -148,10 +142,7 @@ class CacheSupport(
val fileReader = IrLibraryFileFromBytes(IrKlibBytesSource(libraryToAddToCache, index))
fileReader.deserializeFqName(fileProtos[index].fqNameList)
}
if (configuration.get(KonanConfigKeys.BATCHED_PER_FILE_CACHE_BUILD) == false)
CacheDeserializationStrategy.SingleFile(filesToCache.single(), fqNames.single())
else
CacheDeserializationStrategy.MultipleFiles(filesToCache, fqNames)
CacheDeserializationStrategy.MultipleFiles(filesToCache, fqNames)
}
PartialCacheInfo(libraryToAddToCache, strategy)
}
@@ -31,9 +31,10 @@ import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
val KonanConfig.isFinalBinary: Boolean get() = when (this.produce) {
CompilerOutputKind.PROGRAM, CompilerOutputKind.DYNAMIC,
CompilerOutputKind.STATIC -> true
CompilerOutputKind.DYNAMIC_CACHE, CompilerOutputKind.STATIC_CACHE, CompilerOutputKind.PRELIMINARY_CACHE,
CompilerOutputKind.DYNAMIC_CACHE, CompilerOutputKind.STATIC_CACHE,
CompilerOutputKind.LIBRARY, CompilerOutputKind.BITCODE -> false
CompilerOutputKind.FRAMEWORK -> !omitFrameworkBinary
else -> error("not supported: ${this.produce}")
}
val CompilerOutputKind.isNativeLibrary: Boolean
@@ -62,16 +63,16 @@ val KonanConfig.involvesLinkStage: Boolean
CompilerOutputKind.PROGRAM, CompilerOutputKind.DYNAMIC,
CompilerOutputKind.DYNAMIC_CACHE, CompilerOutputKind.STATIC_CACHE,
CompilerOutputKind.STATIC -> true
CompilerOutputKind.LIBRARY, CompilerOutputKind.BITCODE, CompilerOutputKind.PRELIMINARY_CACHE -> false
CompilerOutputKind.LIBRARY, CompilerOutputKind.BITCODE -> false
CompilerOutputKind.FRAMEWORK -> !omitFrameworkBinary
else -> error("not supported: ${this.produce}")
}
val CompilerOutputKind.isCache: Boolean
get() = this == CompilerOutputKind.STATIC_CACHE || this == CompilerOutputKind.DYNAMIC_CACHE
|| this == CompilerOutputKind.PRELIMINARY_CACHE
val KonanConfig.involvesCodegen: Boolean
get() = produce != CompilerOutputKind.LIBRARY && produce != CompilerOutputKind.PRELIMINARY_CACHE && !omitFrameworkBinary
get() = produce != CompilerOutputKind.LIBRARY && !omitFrameworkBinary
internal fun llvmIrDumpCallback(state: ActionState, module: IrModuleFragment, context: Context) {
module.let{}
@@ -274,7 +275,7 @@ internal fun produceOutput(context: Context) {
context.bitcodeFileName = output
LLVMWriteBitcodeToFile(context.generationState.llvm.module, output)
}
CompilerOutputKind.PRELIMINARY_CACHE -> {}
else -> error("not supported: $produce")
}
}
@@ -17,14 +17,12 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.konan.CURRENT
import org.jetbrains.kotlin.konan.CompilerVersion
import org.jetbrains.kotlin.konan.MetaVersion
import org.jetbrains.kotlin.konan.TempFiles
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.konan.library.KonanLibrary
import org.jetbrains.kotlin.konan.properties.loadProperties
import org.jetbrains.kotlin.konan.target.*
import org.jetbrains.kotlin.konan.util.KonanHomeProvider
import org.jetbrains.kotlin.konan.util.visibleName
import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.resolver.TopologicalLibraryOrder
import org.jetbrains.kotlin.util.removeSuffixIfPresent
import org.jetbrains.kotlin.utils.addToStdlib.cast
@@ -409,17 +407,13 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration
get() = cacheSupport.libraryToCache
internal val producePerFileCache
get() = libraryToCache?.strategy is CacheDeserializationStrategy.SingleFile
internal val produceBatchedPerFileCache
get() = configuration.get(KonanConfigKeys.MAKE_PER_FILE_CACHE) == true
&& configuration.get(KonanConfigKeys.BATCHED_PER_FILE_CACHE_BUILD) != false
val outputPath get() = configuration.get(KonanConfigKeys.OUTPUT)?.removeSuffixIfPresent(produce.suffix(target)) ?: produce.visibleName
private val implicitModuleName: String
get() = cacheSupport.libraryToCache?.let {
if (configuration.get(KonanConfigKeys.MAKE_PER_FILE_CACHE) == true)
if (producePerFileCache)
CachedLibraries.getPerFileCachedLibraryName(it.klib)
else
CachedLibraries.getCachedLibraryName(it.klib)
@@ -48,8 +48,6 @@ class KonanConfigKeys {
= CompilerConfigurationKey.create<List<String>>("which files should be compiled to cache")
val MAKE_PER_FILE_CACHE: CompilerConfigurationKey<Boolean>
= CompilerConfigurationKey.create<Boolean>("make per-file cache")
val BATCHED_PER_FILE_CACHE_BUILD: CompilerConfigurationKey<Boolean>
= CompilerConfigurationKey.create<Boolean>("build per-file caches in batches")
val FRAMEWORK_IMPORT_HEADERS: CompilerConfigurationKey<List<String>>
= CompilerConfigurationKey.create<List<String>>("headers imported to framework header")
val FRIEND_MODULES: CompilerConfigurationKey<List<String>>
@@ -38,28 +38,12 @@ class KonanDriver(val project: Project, val environment: KotlinCoreEnvironment,
}
}
}
if (fileNames == null) {
KonanConfig(project, configuration).runTopLevelPhases()
} else {
if (fileNames != null) {
configuration.put(KonanConfigKeys.MAKE_PER_FILE_CACHE, true)
if (configuration.get(KonanConfigKeys.BATCHED_PER_FILE_CACHE_BUILD) == false) {
fileNames.forEach { buildFileCache(it, CompilerOutputKind.PRELIMINARY_CACHE) }
fileNames.forEach { buildFileCache(it, configuration.get(KonanConfigKeys.PRODUCE)!!) }
} else {
configuration.put(KonanConfigKeys.FILES_TO_CACHE, fileNames)
KonanConfig(project, configuration).runTopLevelPhases()
}
configuration.put(KonanConfigKeys.FILES_TO_CACHE, fileNames)
}
}
private fun buildFileCache(fileName: String, cacheKind: CompilerOutputKind) {
val phaseConfig = configuration.get(CLIConfigurationKeys.PHASE_CONFIG)!!
val subConfiguration = configuration.copy()
subConfiguration.put(KonanConfigKeys.PRODUCE, cacheKind)
subConfiguration.put(KonanConfigKeys.FILES_TO_CACHE, listOf(fileName))
subConfiguration.put(CLIConfigurationKeys.PHASE_CONFIG, phaseConfig.toBuilder().build())
KonanConfig(project, subConfiguration).runTopLevelPhases()
KonanConfig(project, configuration).runTopLevelPhases()
}
private fun KonanConfig.runTopLevelPhases() {
@@ -35,7 +35,6 @@ internal fun determineLinkerOutput(context: Context): LinkerOutputKind =
}
internal class CacheStorage(val context: Context) {
private val isPreliminaryCache = context.config.produce == CompilerOutputKind.PRELIMINARY_CACHE
private val outputFiles = context.generationState.outputFiles
fun renameOutput() {
@@ -49,12 +48,9 @@ internal class CacheStorage(val context: Context) {
fun saveAdditionalCacheInfo() {
outputFiles.prepareTempDirectories()
if (!isPreliminaryCache)
saveCacheBitcodeDependencies()
if (isPreliminaryCache || !context.config.producePerFileCache || context.config.produceBatchedPerFileCache) {
saveInlineFunctionBodies()
saveClassFields()
}
saveCacheBitcodeDependencies()
saveInlineFunctionBodies()
saveClassFields()
}
private fun saveCacheBitcodeDependencies() {
@@ -30,9 +30,8 @@ internal class InlineFunctionOriginInfo(val irFunction: IrFunction, val irFile:
internal class NativeGenerationState(private val context: Context) {
private val config = context.config
private val explicitlyProducePerFileCache = config.producePerFileCache && !config.produceBatchedPerFileCache
private val outputPath = config.cacheSupport.tryGetImplicitOutput(explicitlyProducePerFileCache) ?: config.outputPath
val outputFiles = OutputFiles(outputPath, config.target, config.produce, explicitlyProducePerFileCache)
private val outputPath = config.cacheSupport.tryGetImplicitOutput() ?: config.outputPath
val outputFiles = OutputFiles(outputPath, config.target, config.produce)
val tempFiles = run {
val pathToTempDir = config.configuration.get(KonanConfigKeys.TEMPORARY_FILES_DIR)?.let {
val singleFileStrategy = config.cacheSupport.libraryToCache?.strategy as? CacheDeserializationStrategy.SingleFile
@@ -17,7 +17,7 @@ import kotlin.random.Random
/**
* Creates and stores terminal compiler outputs.
*/
class OutputFiles(val outputName: String, target: KonanTarget, val produce: CompilerOutputKind, val producePerFileCache: Boolean) {
class OutputFiles(val outputName: String, target: KonanTarget, val produce: CompilerOutputKind) {
private val prefix = produce.prefix(target)
private val suffix = produce.suffix(target)
@@ -42,26 +42,13 @@ class OutputFiles(val outputName: String, target: KonanTarget, val produce: Comp
val mainFile = File(mainFileName)
private val pathToPerFileCache =
if (producePerFileCache)
outputName.substring(0, outputName.lastIndexOf(File.separatorChar) /* skip [PER_FILE_CACHE_BINARY_LEVEL_DIR_NAME]*/)
else null
val perFileCacheFileName = File(outputName).absoluteFile.name
val perFileCacheFileName = File(pathToPerFileCache ?: outputName).absoluteFile.name
val cacheFileName = File((outputName).fullOutputName()).absoluteFile.name
val cacheFileName = File((pathToPerFileCache ?: outputName).fullOutputName()).absoluteFile.name
private fun File.cacheBinaryPart() = this.child(CachedLibraries.PER_FILE_CACHE_BINARY_LEVEL_DIR_NAME)
private fun File.cacheBinaryPart() =
if (producePerFileCache)
this
else
this.child(CachedLibraries.PER_FILE_CACHE_BINARY_LEVEL_DIR_NAME)
private fun File.cacheIrPart() =
if (producePerFileCache)
this
else
this.child(CachedLibraries.PER_FILE_CACHE_IR_LEVEL_DIR_NAME)
private fun File.cacheIrPart() = this.child(CachedLibraries.PER_FILE_CACHE_IR_LEVEL_DIR_NAME)
val dynamicCacheInstallName = File(outputName).cacheBinaryPart().child(cacheFileName).absolutePath
@@ -77,7 +77,7 @@ internal fun Context.psiToIr(
)
val irBuiltInsOverDescriptors = generatorContext.irBuiltIns as IrBuiltInsOverDescriptors
val functionIrClassFactory: KonanIrAbstractDescriptorBasedFunctionFactory =
if (shouldDefineFunctionClasses || (!config.lazyIrForCaches && !config.producePerFileCache))
if (shouldDefineFunctionClasses || !config.lazyIrForCaches)
BuiltInFictitiousFunctionIrClassFactory(symbolTable, irBuiltInsOverDescriptors, reflectionTypes)
else
LazyIrFunctionFactory(symbolTable, stubGenerator, irBuiltInsOverDescriptors, reflectionTypes)
@@ -539,8 +539,8 @@ internal fun PhaseConfig.konanPhasesConfig(config: KonanConfig) {
disable(localEscapeAnalysisPhase)
disableIf(singleCompilation, config.produceBatchedPerFileCache)
disableUnless(umbrellaCompilation, config.produceBatchedPerFileCache)
disableIf(singleCompilation, config.producePerFileCache)
disableUnless(umbrellaCompilation, config.producePerFileCache)
// Don't serialize anything to a final executable.
disableUnless(serializerPhase, config.produce == CompilerOutputKind.LIBRARY)
@@ -45,7 +45,7 @@ internal class NativeInlineFunctionResolver(override val context: Context) : Def
val packageFragment = function.getPackageFragment()
val (possiblyLoweredFunction, shouldLower) = if (packageFragment !is IrExternalPackageFragment) {
context.inlineFunctionsSupport.getNonLoweredInlineFunction(function, copy = context.config.produceBatchedPerFileCache).also {
context.inlineFunctionsSupport.getNonLoweredInlineFunction(function, copy = context.config.producePerFileCache).also {
context.generationState.loweredInlineFunctions[function] =
InlineFunctionOriginInfo(it, packageFragment as IrFile, function.startOffset, function.endOffset)
} to true
@@ -299,7 +299,7 @@ private fun getLibraryCacheDir(
): File {
val cacheBaseName = CachedLibraries.getCachedLibraryName(libraryName)
val cacheOutputKind = CompilerOutputKind.valueOf(cacheKind.uppercase())
return OutputFiles(cacheDirectory.child(cacheBaseName).absolutePath, target, cacheOutputKind, producePerFileCache = false).mainFile
return OutputFiles(cacheDirectory.child(cacheBaseName).absolutePath, target, cacheOutputKind).mainFile
}
private fun buildCache(