Support emitting non-IR static initializers in codegen
This commit is contained in:
committed by
SvyatoslavScherbina
parent
5081adbf87
commit
806bd37d67
+3
-2
@@ -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)
|
||||
|
||||
+6
-3
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user