Here goes stdlib separation.

$ gradlew backend.native:stdlib

builds you stdlib.kt.bc now.

The test runs are taught to supply
-library stdlib.kt.bc to kotlin compiler for proper imports resolution,
and then later stdlib.kt.bc is provided to clang for the final link step.
This commit is contained in:
Alexander Gorshenev
2016-11-17 17:37:43 +03:00
committed by alexander-gorshenev
parent b0d10e45d8
commit 1d265bc50c
11 changed files with 294 additions and 62 deletions
@@ -37,25 +37,19 @@ class NativeAnalyzer(
class K2Native : CLICompiler<K2NativeCompilerArguments>() {
val defaultModuleName = "main";
override fun doExecute(arguments : K2NativeCompilerArguments,
configuration : CompilerConfiguration,
rootDisposable: Disposable
): ExitCode {
configuration.put(CommonConfigurationKeys.MODULE_NAME, defaultModuleName )
configuration.put(CommonConfigurationKeys.MODULE_NAME, defaultModuleName)
configuration.addKotlinSourceRoots(arguments.freeArgs)
// TODO: remove, once linker is available.
if (arguments.headers != null) {
configuration.addKotlinSourceRoots(arguments.headers.asList())
}
// As of now we don't have any library mechnanism
var libraryFiles = listOf<String>()
configuration.put(KonanConfigurationKeys.LIBRARY_FILES, libraryFiles)
val libraries = arguments.libraries?.asList<String>() ?: listOf<String>()
configuration.put(KonanConfigurationKeys.LIBRARY_FILES, libraries)
libraries.forEach{println(it)}
val environment = KotlinCoreEnvironment.createForProduction(rootDisposable,
configuration, Arrays.asList<String>("extensions/common.xml"))
@@ -14,9 +14,10 @@ public class K2NativeCompilerArguments extends CommonCompilerArguments {
@ValueDescription("<path>")
public String runtimeFile;
@Argument(value = "headers", description = "Header files used for compilation")
@Argument(value = "library", description = "Bitcode file with metadata attached")
@ValueDescription("<path>")
public String[] headers;
public String[] libraries;
public K2NativeCompilerArguments() {
}
@@ -24,7 +25,7 @@ public class K2NativeCompilerArguments extends CommonCompilerArguments {
public K2NativeCompilerArguments(K2NativeCompilerArguments arguments) {
this.outputFile = arguments.outputFile;
this.runtimeFile = arguments.runtimeFile;
this.headers = arguments.headers;
this.libraries = arguments.libraries;
}
public CommonCompilerArguments copy() {
@@ -23,14 +23,9 @@ import org.jetbrains.kotlin.backend.konan.llvm.KotlinKonanMetadataUtils
class KonanConfig(val project: Project, val configuration: CompilerConfiguration) {
private val storageManager = LockBasedStorageManager()
private val sourceFilesFromLibraries = listOf<KtFile>()
private var metadata = listOf<KotlinKonanMetadata>()
internal var moduleDescriptors: MutableList<JsModuleDescriptor<ModuleDescriptorImpl>>? = null
private val libraries = configuration.getList(KonanConfigurationKeys.LIBRARY_FILES)
init {
val libraries = configuration.getList(KonanConfigurationKeys.LIBRARY_FILES)
metadata = KotlinKonanMetadataUtils.loadLibMetadata(libraries)
}
private val metadata = KotlinKonanMetadataUtils.loadLibMetadata(libraries)
val moduleId: String
get() = configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME)
@@ -38,26 +33,25 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration
val moduleKind: ModuleKind
get() = configuration.get(KonanConfigurationKeys.MODULE_KIND)!!
fun getModuleDescriptors(): MutableList<JsModuleDescriptor<ModuleDescriptorImpl>> {
if (moduleDescriptors != null) return moduleDescriptors!!
// We reuse JsModuleDescriptor for serialization for now, as we haven't got one for Konan yet.
internal val moduleDescriptors: MutableList<JsModuleDescriptor<ModuleDescriptorImpl>> by lazy {
val jsDescriptors = mutableListOf<JsModuleDescriptor<ModuleDescriptorImpl>>()
val descriptors = mutableListOf<ModuleDescriptorImpl>()
moduleDescriptors = mutableListOf<JsModuleDescriptor<ModuleDescriptorImpl>>()
val kotlinModuleDescriptors = mutableListOf<ModuleDescriptorImpl>()
for (metadataEntry in metadata) {
val descriptor = createModuleDescriptor(metadataEntry)
moduleDescriptors!!.add(descriptor)
kotlinModuleDescriptors.add(descriptor.data)
jsDescriptors.add(descriptor)
descriptors.add(descriptor.data)
}
for (module in moduleDescriptors!!) {
setDependencies(module.data, kotlinModuleDescriptors)
for (module in jsDescriptors) {
setDependencies(module.data, descriptors)
}
return moduleDescriptors!!
jsDescriptors
}
// We reuse JsModuleDescriptor for serialization for now, as we haven't got one for Konan yet.
private fun createModuleDescriptor(metadata: KotlinKonanMetadata): JsModuleDescriptor<ModuleDescriptorImpl> {
val moduleDescriptor = ModuleDescriptorImpl(
@@ -77,14 +71,6 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration
private fun setDependencies(module: ModuleDescriptorImpl, modules: List<ModuleDescriptorImpl>) {
module.setDependencies(modules.plus(KonanPlatform.builtIns.builtInsModule))
}
fun withJsLibAdded(files: Collection<KtFile>, config: KonanConfig): Collection<KtFile> {
val allFiles = mutableListOf<KtFile>()
allFiles.addAll(files)
// We don't store source files in the bitcode for Konan, dont't we?
//allFiles.addAll(config.getSourceFilesFromLibraries());
return allFiles
}
}
}
@@ -38,7 +38,7 @@ object TopDownAnalyzerFacadeForKonan {
// Make sure the compiler produced BuiltIns module comes in last
context.setDependencies(
listOf(context.module) +
config.getModuleDescriptors().map { it.data } +
config.moduleDescriptors.map { it.data } +
listOf(compilerBuiltInsModule)
)
return analyzeFilesWithGivenTrace(files, BindingTraceContext(), context, config)
@@ -51,14 +51,12 @@ object TopDownAnalyzerFacadeForKonan {
config: KonanConfig
): AnalysisResult {
val allFiles = KonanConfig.withJsLibAdded(files, config)
// we print out each file we compile for now
allFiles.forEach{println(it)}
files.forEach{println(it)}
val analyzerForKonan = createTopDownAnalyzerForKonan(
moduleContext, trace,
FileBasedDeclarationProviderFactory(moduleContext.storageManager, allFiles),
FileBasedDeclarationProviderFactory(moduleContext.storageManager, files),
config.configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, LanguageVersionSettingsImpl.DEFAULT)
)
@@ -66,9 +64,9 @@ object TopDownAnalyzerFacadeForKonan {
return AnalysisResult.success(trace.bindingContext, moduleContext.module)
}
fun checkForErrors(allFiles: Collection<KtFile>, bindingContext: BindingContext) {
fun checkForErrors(files: Collection<KtFile>, bindingContext: BindingContext) {
AnalyzingUtils.throwExceptionOnErrors(bindingContext)
for (file in allFiles) {
for (file in files) {
AnalyzingUtils.checkForSyntacticErrors(file)
}
}