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 usedGlobals = mutableListOf<LLVMValueRef>()
val compilerUsedGlobals = mutableListOf<LLVMValueRef>()
val staticInitializers = mutableListOf<StaticInitializer>()
val irStaticInitializers = mutableListOf<IrStaticInitializer>()
val otherStaticInitializers = mutableListOf<LLVMValueRef>()
val fileInitializers = mutableListOf<IrField>()
val objects = mutableSetOf<LLVMValueRef>()
val sharedObjects = mutableSetOf<LLVMValueRef>()
@@ -563,4 +564,4 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) {
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.
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>()
}
context.llvm.staticInitializers.forEach {
context.llvm.irStaticInitializers.forEach {
val library = it.file.packageFragmentDescriptor.module.konanLibrary
val initializers = libraryToInitializers[library]
?: 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)
if (library == null || context.llvmModuleSpecification.containsLibrary(library)) {
appendStaticInitializers(ctorFunction, initializers)
val otherInitializers =
context.llvm.otherStaticInitializers.takeIf { library == null }.orEmpty()
appendStaticInitializers(ctorFunction, initializers + otherInitializers)
} else {
check(initializers.isEmpty()) {
"found initializer from ${library.libraryFile}, which is not included into compilation"