Support emitting non-IR static initializers in codegen

This commit is contained in:
Svyatoslav Scherbina
2019-10-01 16:43:39 +03:00
committed by SvyatoslavScherbina
parent 5081adbf87
commit 806bd37d67
2 changed files with 9 additions and 5 deletions
@@ -540,7 +540,8 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) {
val usedFunctions = mutableListOf<LLVMValueRef>() val usedFunctions = mutableListOf<LLVMValueRef>()
val usedGlobals = mutableListOf<LLVMValueRef>() val usedGlobals = mutableListOf<LLVMValueRef>()
val compilerUsedGlobals = mutableListOf<LLVMValueRef>() val compilerUsedGlobals = mutableListOf<LLVMValueRef>()
val staticInitializers = mutableListOf<StaticInitializer>() val irStaticInitializers = mutableListOf<IrStaticInitializer>()
val otherStaticInitializers = mutableListOf<LLVMValueRef>()
val fileInitializers = mutableListOf<IrField>() val fileInitializers = mutableListOf<IrField>()
val objects = mutableSetOf<LLVMValueRef>() val objects = mutableSetOf<LLVMValueRef>()
val sharedObjects = mutableSetOf<LLVMValueRef>() val sharedObjects = mutableSetOf<LLVMValueRef>()
@@ -563,4 +564,4 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) {
val llvmDouble = LLVMDoubleType()!! val llvmDouble = LLVMDoubleType()!!
} }
class StaticInitializer(val file: IrFile, val initializer: LLVMValueRef) class IrStaticInitializer(val file: IrFile, val initializer: LLVMValueRef)
@@ -478,7 +478,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
// Create global initialization records. // Create global initialization records.
val initNode = createInitNode(createInitBody()) val initNode = createInitNode(createInitBody())
context.llvm.staticInitializers.add(StaticInitializer(declaration, createInitCtor(initNode))) context.llvm.irStaticInitializers.add(IrStaticInitializer(declaration, createInitCtor(initNode)))
} }
} }
@@ -2345,7 +2345,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
mutableListOf<LLVMValueRef>() mutableListOf<LLVMValueRef>()
} }
context.llvm.staticInitializers.forEach { context.llvm.irStaticInitializers.forEach {
val library = it.file.packageFragmentDescriptor.module.konanLibrary val library = it.file.packageFragmentDescriptor.module.konanLibrary
val initializers = libraryToInitializers[library] val initializers = libraryToInitializers[library]
?: error("initializer for not included library ${library?.libraryFile}") ?: error("initializer for not included library ${library?.libraryFile}")
@@ -2366,7 +2366,10 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
val initializers = libraryToInitializers.getValue(library) val initializers = libraryToInitializers.getValue(library)
if (library == null || context.llvmModuleSpecification.containsLibrary(library)) { if (library == null || context.llvmModuleSpecification.containsLibrary(library)) {
appendStaticInitializers(ctorFunction, initializers) val otherInitializers =
context.llvm.otherStaticInitializers.takeIf { library == null }.orEmpty()
appendStaticInitializers(ctorFunction, initializers + otherInitializers)
} else { } else {
check(initializers.isEmpty()) { check(initializers.isEmpty()) {
"found initializer from ${library.libraryFile}, which is not included into compilation" "found initializer from ${library.libraryFile}, which is not included into compilation"