[K/N][codegen] Refactored getting types from runtime
This commit is contained in:
-2
@@ -456,8 +456,6 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) : Runti
|
||||
|
||||
private fun importRtFunction(name: String) = importFunction(name, runtime.llvmModule)
|
||||
|
||||
private fun importRtGlobal(name: String) = importGlobal(name, runtime.llvmModule)
|
||||
|
||||
val allocInstanceFunction = importRtFunction("AllocInstance")
|
||||
val allocArrayFunction = importRtFunction("AllocArrayInstance")
|
||||
val initThreadLocalSingleton = importRtFunction("InitThreadLocalSingleton")
|
||||
|
||||
+16
-3
@@ -19,9 +19,9 @@ class Runtime(bitcodeFile: String) {
|
||||
val calculatedLLVMTypes: MutableMap<IrType, LLVMTypeRef> = HashMap()
|
||||
val addedLLVMExternalFunctions: MutableMap<IrFunction, LlvmCallable> = HashMap()
|
||||
|
||||
internal fun getStructTypeOrNull(name: String) = LLVMGetTypeByName(llvmModule, "struct.$name")
|
||||
internal fun getStructType(name: String) = getStructTypeOrNull(name)
|
||||
?: throw Error("struct.$name is not found in the Runtime module.")
|
||||
private fun getStructTypeOrNull(name: String) = LLVMGetTypeByName(llvmModule, "struct.$name")
|
||||
private fun getStructType(name: String) = getStructTypeOrNull(name)
|
||||
?: error("struct.$name is not found in the Runtime module.")
|
||||
|
||||
val typeInfoType = getStructType("TypeInfo")
|
||||
val extendedTypeInfoType = getStructType("ExtendedTypeInfo")
|
||||
@@ -50,6 +50,19 @@ class Runtime(bitcodeFile: String) {
|
||||
val kotlinToObjCMethodAdapter by lazy { getStructType("KotlinToObjCMethodAdapter") }
|
||||
val typeInfoObjCExportAddition by lazy { getStructType("TypeInfoObjCExportAddition") }
|
||||
|
||||
val objCClassObjectType by lazy { getStructType("_class_t") }
|
||||
val objCCache by lazy { getStructType("_objc_cache") }
|
||||
val objCClassRoType by lazy { getStructType("_class_ro_t") }
|
||||
val objCMethodType by lazy { getStructType("_objc_method") }
|
||||
val objCMethodListType by lazy { getStructType("__method_list_t") }
|
||||
val objCProtocolListType by lazy { getStructType("_objc_protocol_list") }
|
||||
val objCIVarListType by lazy { getStructType("_ivar_list_t") }
|
||||
val objCPropListType by lazy { getStructType("_prop_list_t") }
|
||||
|
||||
val kRefSharedHolderType by lazy { LLVMGetTypeByName(llvmModule, "class.KRefSharedHolder")!! }
|
||||
val blockLiteralType by lazy { getStructType("Block_literal_1") }
|
||||
val blockDescriptorType by lazy { getStructType("Block_descriptor_1") }
|
||||
|
||||
val pointerSize: Int by lazy {
|
||||
LLVMABISizeOfType(targetData, objHeaderPtrType).toInt()
|
||||
}
|
||||
|
||||
+8
-9
@@ -57,7 +57,7 @@ internal class ObjCDataGenerator(val codegen: CodeGenerator) {
|
||||
global.pointer.bitcast(pointerType(int8TypePtr))
|
||||
}
|
||||
|
||||
val classObjectType = codegen.runtime.getStructType("_class_t")
|
||||
private val classObjectType = codegen.runtime.objCClassObjectType
|
||||
|
||||
fun exportClass(name: String) {
|
||||
context.llvm.usedGlobals += getClassGlobal(name, isMetaclass = false).llvm
|
||||
@@ -83,7 +83,7 @@ internal class ObjCDataGenerator(val codegen: CodeGenerator) {
|
||||
private val emptyCache = constPointer(
|
||||
codegen.importGlobal(
|
||||
"_objc_empty_cache",
|
||||
codegen.runtime.getStructType("_objc_cache"),
|
||||
codegen.runtime.objCCache,
|
||||
CurrentKlibModuleOrigin
|
||||
)
|
||||
)
|
||||
@@ -96,14 +96,13 @@ internal class ObjCDataGenerator(val codegen: CodeGenerator) {
|
||||
|
||||
fun emitClass(name: String, superName: String, instanceMethods: List<Method>) {
|
||||
val runtime = context.llvm.runtime
|
||||
fun struct(name: String) = runtime.getStructType(name)
|
||||
|
||||
val classRoType = struct("_class_ro_t")
|
||||
val methodType = struct("_objc_method")
|
||||
val methodListType = struct("__method_list_t")
|
||||
val protocolListType = struct("_objc_protocol_list")
|
||||
val ivarListType = struct("_ivar_list_t")
|
||||
val propListType = struct("_prop_list_t")
|
||||
val classRoType = runtime.objCClassRoType
|
||||
val methodType = runtime.objCMethodType
|
||||
val methodListType = runtime.objCMethodListType
|
||||
val protocolListType = runtime.objCProtocolListType
|
||||
val ivarListType = runtime.objCIVarListType
|
||||
val propListType = runtime.objCPropListType
|
||||
|
||||
val classNameLiteral = classNames.get(name)
|
||||
|
||||
|
||||
+4
-8
@@ -123,8 +123,7 @@ private fun FunctionGenerationContext.loadBlockInvoke(
|
||||
blockPtr: LLVMValueRef,
|
||||
bridge: BlockPointerBridge
|
||||
): LLVMValueRef {
|
||||
val blockLiteralType = codegen.runtime.getStructType("Block_literal_1")
|
||||
val invokePtr = structGep(bitcast(pointerType(blockLiteralType), blockPtr), 3)
|
||||
val invokePtr = structGep(bitcast(pointerType(codegen.runtime.blockLiteralType), blockPtr), 3)
|
||||
|
||||
return bitcast(pointerType(bridge.blockType.blockInvokeLlvmType.llvmFunctionType), load(invokePtr))
|
||||
}
|
||||
@@ -157,15 +156,12 @@ private val BlockPointerBridge.nameSuffix: String
|
||||
get() = numberOfParameters.toString() + if (returnsVoid) "V" else ""
|
||||
|
||||
internal class BlockGenerator(private val codegen: CodeGenerator) {
|
||||
private val kRefSharedHolderType = LLVMGetTypeByName(codegen.runtime.llvmModule, "class.KRefSharedHolder")!!
|
||||
|
||||
private val blockLiteralType = structType(
|
||||
codegen.runtime.getStructType("Block_literal_1"),
|
||||
kRefSharedHolderType
|
||||
codegen.runtime.blockLiteralType,
|
||||
codegen.runtime.kRefSharedHolderType
|
||||
)
|
||||
|
||||
private val blockDescriptorType = codegen.runtime.getStructType("Block_descriptor_1")
|
||||
|
||||
val disposeHelper = generateFunction(
|
||||
codegen,
|
||||
functionType(voidType, false, int8TypePtr),
|
||||
@@ -234,7 +230,7 @@ internal class BlockGenerator(private val codegen: CodeGenerator) {
|
||||
}
|
||||
}
|
||||
|
||||
return Struct(blockDescriptorType,
|
||||
return Struct(codegen.runtime.blockDescriptorType,
|
||||
codegen.context.LongInt(0L),
|
||||
codegen.context.LongInt(LLVMStoreSizeOfType(codegen.runtime.targetData, blockLiteralType)),
|
||||
constPointer(copyHelper),
|
||||
|
||||
Reference in New Issue
Block a user