Fix iOS ARM32 ABI support in Objective-C interop
This commit is contained in:
committed by
SvyatoslavScherbina
parent
d3e4531602
commit
8591f13b94
+1
-1
@@ -173,7 +173,7 @@ internal class InteropBuiltIns(builtIns: KonanBuiltIns) {
|
||||
val getObjCReceiverOrSuper = packageScope.getContributedFunctions("getReceiverOrSuper").single()
|
||||
|
||||
val getObjCMessenger = packageScope.getContributedFunctions("getMessenger").single()
|
||||
val getObjCMessengerLU = packageScope.getContributedFunctions("getMessengerLU").single()
|
||||
val getObjCMessengerStret = packageScope.getContributedFunctions("getMessengerStret").single()
|
||||
|
||||
val interpretObjCPointerOrNull = packageScope.getContributedFunctions("interpretObjCPointerOrNull").single()
|
||||
val interpretObjCPointer = packageScope.getContributedFunctions("interpretObjCPointer").single()
|
||||
|
||||
+4
-21
@@ -42,7 +42,6 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
|
||||
|
||||
val IrClassSymbol.objectIsShared get() = owner.origin == DECLARATION_ORIGIN_ENUM
|
||||
@@ -2165,10 +2164,10 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
}
|
||||
|
||||
interop.getObjCMessenger -> {
|
||||
genGetObjCMessenger(args, isLU = false)
|
||||
genGetObjCMessenger(args, isStret = false)
|
||||
}
|
||||
interop.getObjCMessengerLU -> {
|
||||
genGetObjCMessenger(args, isLU = true)
|
||||
interop.getObjCMessengerStret -> {
|
||||
genGetObjCMessenger(args, isStret = true)
|
||||
}
|
||||
|
||||
interop.readBits -> genReadBits(args)
|
||||
@@ -2327,25 +2326,9 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
||||
return call(protocolGetter, emptyList())
|
||||
}
|
||||
|
||||
private fun genGetObjCMessenger(args: List<LLVMValueRef>, isLU: Boolean): LLVMValueRef {
|
||||
private fun genGetObjCMessenger(args: List<LLVMValueRef>, isStret: Boolean): LLVMValueRef {
|
||||
val gen = functionGenerationContext
|
||||
|
||||
// 'LU' means "large or unaligned".
|
||||
|
||||
// objc_msgSend*_stret functions must be used when return value is returned through memory
|
||||
// pointed by implicit argument, which is passed on the register that would otherwise be used for receiver.
|
||||
// On aarch64 it is never the case, since such implicit argument gets passed on x8.
|
||||
// On x86_64 it is the case if the return value takes more than 16 bytes or is the structure with
|
||||
// unaligned fields (there are some complicated exceptions currently ignored). The latter condition
|
||||
// is "encoded" by stub generator by emitting either `getMessenger` or `getMessengerLU` intrinsic call.
|
||||
val isStret = when (context.config.target) {
|
||||
KonanTarget.MACOS_X64, KonanTarget.IOS_X64 -> isLU // x86_64
|
||||
KonanTarget.IOS_ARM64 -> false // aarch64
|
||||
// TODO: what is the correct value?
|
||||
KonanTarget.IOS_ARM32 -> false // armv7
|
||||
else -> TODO()
|
||||
}
|
||||
|
||||
val messengerNameSuffix = if (isStret) "_stret" else ""
|
||||
|
||||
val functionType = functionType(int8TypePtr, true, int8TypePtr, int8TypePtr)
|
||||
|
||||
Reference in New Issue
Block a user