32-bit iOS support (#1708)
This commit is contained in:
+1
-1
@@ -187,7 +187,7 @@ internal class LinkStage(val context: Context) {
|
|||||||
val framework = File(context.config.outputFile)
|
val framework = File(context.config.outputFile)
|
||||||
val dylibName = framework.name.removeSuffix(".framework")
|
val dylibName = framework.name.removeSuffix(".framework")
|
||||||
val dylibRelativePath = when (target) {
|
val dylibRelativePath = when (target) {
|
||||||
KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 -> dylibName
|
KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 -> dylibName
|
||||||
KonanTarget.MACOS_X64 -> "Versions/A/$dylibName"
|
KonanTarget.MACOS_X64 -> "Versions/A/$dylibName"
|
||||||
else -> error(target)
|
else -> error(target)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -96,7 +96,8 @@ internal class CodeGenerator(override val context: Context) : ContextUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val objCDataGenerator = when (context.config.target) {
|
val objCDataGenerator = when (context.config.target) {
|
||||||
KonanTarget.IOS_ARM64, KonanTarget.IOS_X64, KonanTarget.MACOS_X64 -> ObjCDataGenerator(this)
|
KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64,
|
||||||
|
KonanTarget.IOS_X64, KonanTarget.MACOS_X64 -> ObjCDataGenerator(this)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
@@ -451,6 +451,7 @@ internal class Llvm(val context: Context, val llvmModule: LLVMModuleRef) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val personalityFunctionName = when (target) {
|
private val personalityFunctionName = when (target) {
|
||||||
|
KonanTarget.IOS_ARM32 -> "__gxx_personality_sj0"
|
||||||
KonanTarget.MINGW_X64 -> "__gxx_personality_seh0"
|
KonanTarget.MINGW_X64 -> "__gxx_personality_seh0"
|
||||||
else -> "__gxx_personality_v0"
|
else -> "__gxx_personality_v0"
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-3
@@ -2253,9 +2253,9 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
return if (bitsWithPaddingNum == 64) {
|
return if (bitsWithPaddingNum == 64) {
|
||||||
bits
|
bits
|
||||||
} else if (bitsWithPaddingNum > 64) {
|
} else if (bitsWithPaddingNum > 64) {
|
||||||
trunc(bits, kInt64)
|
trunc(bits, int64Type)
|
||||||
} else {
|
} else {
|
||||||
ext(bits, kInt64, signed)
|
ext(bits, int64Type, signed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2268,7 +2268,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
val size = extractConstUnsignedInt(args[2]).toInt()
|
val size = extractConstUnsignedInt(args[2]).toInt()
|
||||||
|
|
||||||
val value = args[3]
|
val value = args[3]
|
||||||
assert(value.type == kInt64)
|
assert(value.type == int64Type)
|
||||||
|
|
||||||
val bitsType = LLVMIntType(size)!!
|
val bitsType = LLVMIntType(size)!!
|
||||||
|
|
||||||
@@ -2350,6 +2350,8 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
|
|||||||
val isStret = when (context.config.target) {
|
val isStret = when (context.config.target) {
|
||||||
KonanTarget.MACOS_X64, KonanTarget.IOS_X64 -> isLU // x86_64
|
KonanTarget.MACOS_X64, KonanTarget.IOS_X64 -> isLU // x86_64
|
||||||
KonanTarget.IOS_ARM64 -> false // aarch64
|
KonanTarget.IOS_ARM64 -> false // aarch64
|
||||||
|
// TODO: what is the correct value?
|
||||||
|
KonanTarget.IOS_ARM32 -> false // armv7
|
||||||
else -> TODO()
|
else -> TODO()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -122,6 +122,7 @@ internal val int1Type = LLVMInt1Type()!!
|
|||||||
internal val int8Type = LLVMInt8Type()!!
|
internal val int8Type = LLVMInt8Type()!!
|
||||||
internal val int16Type = LLVMInt16Type()!!
|
internal val int16Type = LLVMInt16Type()!!
|
||||||
internal val int32Type = LLVMInt32Type()!!
|
internal val int32Type = LLVMInt32Type()!!
|
||||||
|
internal val int64Type = LLVMInt64Type()!!
|
||||||
internal val int8TypePtr = pointerType(int8Type)
|
internal val int8TypePtr = pointerType(int8Type)
|
||||||
|
|
||||||
internal val voidType = LLVMVoidType()!!
|
internal val voidType = LLVMVoidType()!!
|
||||||
@@ -142,7 +143,6 @@ internal val RuntimeAware.kTypeInfoPtr: LLVMTypeRef
|
|||||||
get() = pointerType(kTypeInfo)
|
get() = pointerType(kTypeInfo)
|
||||||
internal val kInt1 = LLVMInt1Type()!!
|
internal val kInt1 = LLVMInt1Type()!!
|
||||||
internal val kBoolean = kInt1
|
internal val kBoolean = kInt1
|
||||||
internal val kInt64 = LLVMInt64Type()!!
|
|
||||||
internal val kInt8Ptr = pointerType(int8Type)
|
internal val kInt8Ptr = pointerType(int8Type)
|
||||||
internal val kInt8PtrPtr = pointerType(kInt8Ptr)
|
internal val kInt8PtrPtr = pointerType(kInt8Ptr)
|
||||||
internal val kNullInt8Ptr = LLVMConstNull(kInt8Ptr)!!
|
internal val kNullInt8Ptr = LLVMConstNull(kInt8Ptr)!!
|
||||||
|
|||||||
+7
-4
@@ -100,6 +100,9 @@ internal class BlockAdapterToFunctionGenerator(val objCExportCodeGenerator: ObjC
|
|||||||
LLVMSetLinkage(it, LLVMLinkage.LLVMInternalLinkage)
|
LLVMSetLinkage(it, LLVMLinkage.LLVMInternalLinkage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun org.jetbrains.kotlin.backend.konan.Context.LongInt(value: Long) =
|
||||||
|
if (is64Bit()) Int64(value) else Int32(value.toInt())
|
||||||
|
|
||||||
private fun generateDescriptorForBlockAdapterToFunction(numberOfParameters: Int): ConstValue {
|
private fun generateDescriptorForBlockAdapterToFunction(numberOfParameters: Int): ConstValue {
|
||||||
val signature = buildString {
|
val signature = buildString {
|
||||||
append('@')
|
append('@')
|
||||||
@@ -116,11 +119,9 @@ internal class BlockAdapterToFunctionGenerator(val objCExportCodeGenerator: ObjC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(codegen.context.is64Bit())
|
|
||||||
|
|
||||||
return Struct(blockDescriptorType,
|
return Struct(blockDescriptorType,
|
||||||
Int64(0),
|
codegen.context.LongInt(0L),
|
||||||
Int64(LLVMStoreSizeOfType(codegen.runtime.targetData, blockLiteralType)),
|
codegen.context.LongInt(LLVMStoreSizeOfType(codegen.runtime.targetData, blockLiteralType)),
|
||||||
constPointer(copyHelper),
|
constPointer(copyHelper),
|
||||||
constPointer(disposeHelper),
|
constPointer(disposeHelper),
|
||||||
codegen.staticData.cStringLiteral(signature),
|
codegen.staticData.cStringLiteral(signature),
|
||||||
@@ -128,6 +129,8 @@ internal class BlockAdapterToFunctionGenerator(val objCExportCodeGenerator: ObjC
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun FunctionGenerationContext.storeRefUnsafe(value: LLVMValueRef, slot: LLVMValueRef) {
|
private fun FunctionGenerationContext.storeRefUnsafe(value: LLVMValueRef, slot: LLVMValueRef) {
|
||||||
assert(value.type == kObjHeaderPtr)
|
assert(value.type == kObjHeaderPtr)
|
||||||
assert(slot.type == kObjHeaderPtrPtr)
|
assert(slot.type == kObjHeaderPtrPtr)
|
||||||
|
|||||||
+24
-20
@@ -450,7 +450,7 @@ private inline fun ObjCExportCodeGenerator.generateObjCImpBy(
|
|||||||
methodBridge: MethodBridge,
|
methodBridge: MethodBridge,
|
||||||
genBody: FunctionGenerationContext.() -> Unit
|
genBody: FunctionGenerationContext.() -> Unit
|
||||||
): LLVMValueRef {
|
): LLVMValueRef {
|
||||||
val result = LLVMAddFunction(context.llvmModule, "", objCFunctionType(methodBridge))!!
|
val result = LLVMAddFunction(context.llvmModule, "", objCFunctionType(context, methodBridge))!!
|
||||||
|
|
||||||
generateFunction(codegen, result) {
|
generateFunction(codegen, result) {
|
||||||
genBody()
|
genBody()
|
||||||
@@ -579,8 +579,7 @@ private fun ObjCExportCodeGenerator.generateObjCImp(
|
|||||||
tailrec fun genReturnValueOnSuccess(returnBridge: MethodBridge.ReturnValue): LLVMValueRef? = when (returnBridge) {
|
tailrec fun genReturnValueOnSuccess(returnBridge: MethodBridge.ReturnValue): LLVMValueRef? = when (returnBridge) {
|
||||||
MethodBridge.ReturnValue.Void -> null
|
MethodBridge.ReturnValue.Void -> null
|
||||||
MethodBridge.ReturnValue.HashCode -> {
|
MethodBridge.ReturnValue.HashCode -> {
|
||||||
assert(codegen.context.is64Bit())
|
zext(targetResult!!, if (codegen.context.is64Bit()) int64Type else int32Type)
|
||||||
zext(targetResult!!, kInt64)
|
|
||||||
}
|
}
|
||||||
is MethodBridge.ReturnValue.Mapped -> kotlinToObjC(targetResult!!, returnBridge.bridge)
|
is MethodBridge.ReturnValue.Mapped -> kotlinToObjC(targetResult!!, returnBridge.bridge)
|
||||||
MethodBridge.ReturnValue.WithError.Success -> Int8(1).llvm // true
|
MethodBridge.ReturnValue.WithError.Success -> Int8(1).llvm // true
|
||||||
@@ -618,7 +617,7 @@ private fun ObjCExportCodeGenerator.generateKotlinToObjCBridge(
|
|||||||
|
|
||||||
val parameterToBase = descriptor.allParameters.zip(baseMethod.allParameters).toMap()
|
val parameterToBase = descriptor.allParameters.zip(baseMethod.allParameters).toMap()
|
||||||
|
|
||||||
val objcMsgSend = msgSender(objCFunctionType(methodBridge))
|
val objcMsgSend = msgSender(objCFunctionType(context, methodBridge))
|
||||||
|
|
||||||
val functionType = codegen.getLlvmFunctionType(context.ir.get(descriptor))
|
val functionType = codegen.getLlvmFunctionType(context.ir.get(descriptor))
|
||||||
|
|
||||||
@@ -679,10 +678,13 @@ private fun ObjCExportCodeGenerator.generateKotlinToObjCBridge(
|
|||||||
MethodBridge.ReturnValue.Void -> null
|
MethodBridge.ReturnValue.Void -> null
|
||||||
|
|
||||||
MethodBridge.ReturnValue.HashCode -> {
|
MethodBridge.ReturnValue.HashCode -> {
|
||||||
assert(codegen.context.is64Bit())
|
if (codegen.context.is64Bit()) {
|
||||||
val low = trunc(targetResult, int32Type)
|
val low = trunc(targetResult, int32Type)
|
||||||
val high = trunc(shr(targetResult, 32, signed = false), int32Type)
|
val high = trunc(shr(targetResult, 32, signed = false), int32Type)
|
||||||
xor(low, high)
|
xor(low, high)
|
||||||
|
} else {
|
||||||
|
trunc(targetResult, int32Type)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is MethodBridge.ReturnValue.Mapped -> {
|
is MethodBridge.ReturnValue.Mapped -> {
|
||||||
@@ -1013,7 +1015,7 @@ private inline fun ObjCExportCodeGenerator.generateObjCToKotlinSyntheticGetter(
|
|||||||
)
|
)
|
||||||
|
|
||||||
val encoding = getEncoding(methodBridge)
|
val encoding = getEncoding(methodBridge)
|
||||||
val imp = generateFunction(codegen, objCFunctionType(methodBridge), "") {
|
val imp = generateFunction(codegen, objCFunctionType(context, methodBridge), "") {
|
||||||
block()
|
block()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1070,10 +1072,10 @@ private fun List<CallableMemberDescriptor>.toMethods(): List<FunctionDescriptor>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun objCFunctionType(methodBridge: MethodBridge): LLVMTypeRef {
|
private fun objCFunctionType(context: Context, methodBridge: MethodBridge): LLVMTypeRef {
|
||||||
val paramTypes = methodBridge.paramBridges.map { it.objCType }
|
val paramTypes = methodBridge.paramBridges.map { it.objCType }
|
||||||
|
|
||||||
val returnType = methodBridge.returnBridge.objCType
|
val returnType = methodBridge.returnBridge.objCType(context)
|
||||||
|
|
||||||
return functionType(returnType, false, *(paramTypes.toTypedArray()))
|
return functionType(returnType, false, *(paramTypes.toTypedArray()))
|
||||||
}
|
}
|
||||||
@@ -1084,7 +1086,7 @@ private val ObjCValueType.llvmType: LLVMTypeRef get() = when (this) {
|
|||||||
ObjCValueType.UNSIGNED_SHORT -> int16Type
|
ObjCValueType.UNSIGNED_SHORT -> int16Type
|
||||||
ObjCValueType.SHORT -> int16Type
|
ObjCValueType.SHORT -> int16Type
|
||||||
ObjCValueType.INT -> int32Type
|
ObjCValueType.INT -> int32Type
|
||||||
ObjCValueType.LONG_LONG -> kInt64
|
ObjCValueType.LONG_LONG -> int64Type
|
||||||
ObjCValueType.FLOAT -> LLVMFloatType()!!
|
ObjCValueType.FLOAT -> LLVMFloatType()!!
|
||||||
ObjCValueType.DOUBLE -> LLVMDoubleType()!!
|
ObjCValueType.DOUBLE -> LLVMDoubleType()!!
|
||||||
}
|
}
|
||||||
@@ -1097,15 +1099,17 @@ private val MethodBridgeParameter.objCType: LLVMTypeRef get() = when (this) {
|
|||||||
is MethodBridgeValueParameter.KotlinResultOutParameter -> pointerType(this.bridge.objCType)
|
is MethodBridgeValueParameter.KotlinResultOutParameter -> pointerType(this.bridge.objCType)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val MethodBridge.ReturnValue.objCType: LLVMTypeRef get() = when (this) {
|
private fun MethodBridge.ReturnValue.objCType(context: Context): LLVMTypeRef {
|
||||||
MethodBridge.ReturnValue.Void -> voidType
|
return when (this) {
|
||||||
MethodBridge.ReturnValue.HashCode -> kInt64 // TODO: only for 64-bit platforms
|
MethodBridge.ReturnValue.Void -> voidType
|
||||||
is MethodBridge.ReturnValue.Mapped -> this.bridge.objCType
|
MethodBridge.ReturnValue.HashCode -> if (context.is64Bit()) int64Type else int32Type
|
||||||
MethodBridge.ReturnValue.WithError.Success -> ObjCValueType.BOOL.llvmType
|
is MethodBridge.ReturnValue.Mapped -> this.bridge.objCType
|
||||||
|
MethodBridge.ReturnValue.WithError.Success -> ObjCValueType.BOOL.llvmType
|
||||||
|
|
||||||
MethodBridge.ReturnValue.Instance.InitResult,
|
MethodBridge.ReturnValue.Instance.InitResult,
|
||||||
MethodBridge.ReturnValue.Instance.FactoryResult,
|
MethodBridge.ReturnValue.Instance.FactoryResult,
|
||||||
is MethodBridge.ReturnValue.WithError.RefOrNull -> ReferenceBridge.objCType
|
is MethodBridge.ReturnValue.WithError.RefOrNull -> ReferenceBridge.objCType
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val TypeBridge.objCType: LLVMTypeRef get() = when (this) {
|
private val TypeBridge.objCType: LLVMTypeRef get() = when (this) {
|
||||||
|
|||||||
+21
-9
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
|
import org.jetbrains.kotlin.konan.target.Family
|
||||||
import org.jetbrains.kotlin.konan.target.AppleConfigurables
|
import org.jetbrains.kotlin.konan.target.AppleConfigurables
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -37,7 +38,7 @@ internal class ObjCExport(val codegen: CodeGenerator) {
|
|||||||
private val target get() = context.config.target
|
private val target get() = context.config.target
|
||||||
|
|
||||||
internal fun produce() {
|
internal fun produce() {
|
||||||
if (target != KonanTarget.IOS_ARM64 && target != KonanTarget.IOS_X64 && target != KonanTarget.MACOS_X64) return
|
if (target.family != Family.IOS && target.family != Family.OSX) return
|
||||||
|
|
||||||
if (!context.config.produce.isNativeBinary) return // TODO: emit RTTI to the same modules as classes belong to.
|
if (!context.config.produce.isNativeBinary) return // TODO: emit RTTI to the same modules as classes belong to.
|
||||||
|
|
||||||
@@ -77,9 +78,9 @@ internal class ObjCExport(val codegen: CodeGenerator) {
|
|||||||
headerGenerator.translateModule()
|
headerGenerator.translateModule()
|
||||||
|
|
||||||
val framework = File(context.config.outputFile)
|
val framework = File(context.config.outputFile)
|
||||||
val frameworkContents = when (target) {
|
val frameworkContents = when(target.family) {
|
||||||
KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 -> framework
|
Family.IOS -> framework
|
||||||
KonanTarget.MACOS_X64 -> framework.child("Versions/A")
|
Family.OSX -> framework.child("Versions/A")
|
||||||
else -> error(target)
|
else -> error(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,10 +117,9 @@ internal class ObjCExport(val codegen: CodeGenerator) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun emitInfoPlist(frameworkContents: File, name: String) {
|
private fun emitInfoPlist(frameworkContents: File, name: String) {
|
||||||
val directory = when (target) {
|
val directory = when {
|
||||||
KonanTarget.IOS_ARM64,
|
target.family == Family.IOS -> frameworkContents
|
||||||
KonanTarget.IOS_X64 -> frameworkContents
|
target == KonanTarget.MACOS_X64 -> frameworkContents.child("Resources").also { it.mkdirs() }
|
||||||
KonanTarget.MACOS_X64 -> frameworkContents.child("Resources").also { it.mkdirs() }
|
|
||||||
else -> error(target)
|
else -> error(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ internal class ObjCExport(val codegen: CodeGenerator) {
|
|||||||
val bundleId = pkg.child(Name.identifier(name)).asString()
|
val bundleId = pkg.child(Name.identifier(name)).asString()
|
||||||
|
|
||||||
val platform = when (target) {
|
val platform = when (target) {
|
||||||
KonanTarget.IOS_ARM64 -> "iPhoneOS"
|
KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64 -> "iPhoneOS"
|
||||||
KonanTarget.IOS_X64 -> "iPhoneSimulator"
|
KonanTarget.IOS_X64 -> "iPhoneSimulator"
|
||||||
KonanTarget.MACOS_X64 -> "MacOSX"
|
KonanTarget.MACOS_X64 -> "MacOSX"
|
||||||
else -> error(target)
|
else -> error(target)
|
||||||
@@ -165,6 +165,7 @@ internal class ObjCExport(val codegen: CodeGenerator) {
|
|||||||
|
|
||||||
|
|
||||||
contents.append(when (target) {
|
contents.append(when (target) {
|
||||||
|
KonanTarget.IOS_ARM32,
|
||||||
KonanTarget.IOS_ARM64,
|
KonanTarget.IOS_ARM64,
|
||||||
KonanTarget.IOS_X64 -> """
|
KonanTarget.IOS_X64 -> """
|
||||||
| <key>MinimumOSVersion</key>
|
| <key>MinimumOSVersion</key>
|
||||||
@@ -191,6 +192,17 @@ internal class ObjCExport(val codegen: CodeGenerator) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (target == KonanTarget.IOS_ARM32) {
|
||||||
|
contents.append("""
|
||||||
|
| <key>UIRequiredDeviceCapabilities</key>
|
||||||
|
| <array>
|
||||||
|
| <string>armv7</string>
|
||||||
|
| </array>
|
||||||
|
|
||||||
|
""".trimMargin()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
contents.append("""
|
contents.append("""
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
+28
-2
@@ -62,7 +62,33 @@ target-sysroot-6-macos_x64.default = \
|
|||||||
target-toolchain-6-macos_x64.default = \
|
target-toolchain-6-macos_x64.default = \
|
||||||
remote:internal
|
remote:internal
|
||||||
|
|
||||||
# Apple iOS.
|
# Apple's 32-bit iOS.
|
||||||
|
targetToolchain.macos_x64-ios_arm32 = target-toolchain-6-macos_x64
|
||||||
|
dependencies.macos_x64-ios_arm32 = \
|
||||||
|
libffi-3.2.1-2-darwin-ios \
|
||||||
|
clang-llvm-5.0.0-darwin-macos
|
||||||
|
|
||||||
|
target-sysroot-6-ios_arm32.default = \
|
||||||
|
remote:internal
|
||||||
|
|
||||||
|
arch.ios_arm32 = armv7
|
||||||
|
entrySelector.ios_arm32 = -alias _Konan_main _main
|
||||||
|
# Shared with 64-bit version.
|
||||||
|
targetSysRoot.ios_arm32 = target-sysroot-6-ios_arm64
|
||||||
|
libffiDir.ios_arm32 = libffi-3.2.1-2-darwin-ios
|
||||||
|
llvmLtoFlags.ios_arm32 =
|
||||||
|
llvmLtoOptFlags.ios_arm32 = -O3 -function-sections
|
||||||
|
linkerNoDebugFlags.ios_arm32 = -S
|
||||||
|
linkerDynamicFlags.ios_arm32 = -dylib
|
||||||
|
llvmLtoNooptFlags.ios_arm32 = -O1
|
||||||
|
llvmLtoDynamicFlags.ios_arm32 = -relocation-model=pic
|
||||||
|
linkerKonanFlags.ios_arm32 = -lc++ -lobjc -framework Foundation -sdk_version 11.2
|
||||||
|
linkerOptimizationFlags.ios_arm32 = -dead_strip
|
||||||
|
osVersionMinFlagLd.ios_arm32 = -iphoneos_version_min
|
||||||
|
osVersionMinFlagClang.ios_arm32 = -miphoneos-version-min
|
||||||
|
osVersionMin.ios_arm32 = 9.0
|
||||||
|
|
||||||
|
# Apple's 64-bit iOS.
|
||||||
targetToolchain.macos_x64-ios_arm64 = target-toolchain-6-macos_x64
|
targetToolchain.macos_x64-ios_arm64 = target-toolchain-6-macos_x64
|
||||||
dependencies.macos_x64-ios_arm64 = \
|
dependencies.macos_x64-ios_arm64 = \
|
||||||
libffi-3.2.1-2-darwin-ios \
|
libffi-3.2.1-2-darwin-ios \
|
||||||
@@ -87,7 +113,7 @@ osVersionMinFlagLd.ios_arm64 = -iphoneos_version_min
|
|||||||
osVersionMinFlagClang.ios_arm64 = -miphoneos-version-min
|
osVersionMinFlagClang.ios_arm64 = -miphoneos-version-min
|
||||||
osVersionMin.ios_arm64 = 8.0
|
osVersionMin.ios_arm64 = 8.0
|
||||||
|
|
||||||
# Apple iOS simulator.
|
# Apple's iOS simulator.
|
||||||
targetToolchain.macos_x64-ios_x64 = target-toolchain-6-macos_x64
|
targetToolchain.macos_x64-ios_x64 = target-toolchain-6-macos_x64
|
||||||
dependencies.macos_x64-ios_x64 = \
|
dependencies.macos_x64-ios_x64 = \
|
||||||
libffi-3.2.1-1-darwin-ios_sim \
|
libffi-3.2.1-1-darwin-ios_sim \
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class AppleConfigurablesImpl(
|
|||||||
override val absoluteTargetSysRoot: String get() = when (xcodePartsProvider) {
|
override val absoluteTargetSysRoot: String get() = when (xcodePartsProvider) {
|
||||||
is XcodePartsProvider.Local -> when (target) {
|
is XcodePartsProvider.Local -> when (target) {
|
||||||
KonanTarget.MACOS_X64 -> xcodePartsProvider.xcode.macosxSdk
|
KonanTarget.MACOS_X64 -> xcodePartsProvider.xcode.macosxSdk
|
||||||
KonanTarget.IOS_ARM64 -> xcodePartsProvider.xcode.iphoneosSdk
|
KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64 -> xcodePartsProvider.xcode.iphoneosSdk
|
||||||
KonanTarget.IOS_X64 -> xcodePartsProvider.xcode.iphonesimulatorSdk
|
KonanTarget.IOS_X64 -> xcodePartsProvider.xcode.iphonesimulatorSdk
|
||||||
else -> error(target)
|
else -> error(target)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
|
|||||||
KonanTarget.MACOS_X64 ->
|
KonanTarget.MACOS_X64 ->
|
||||||
listOf("--sysroot=$absoluteTargetSysRoot", "-mmacosx-version-min=10.11")
|
listOf("--sysroot=$absoluteTargetSysRoot", "-mmacosx-version-min=10.11")
|
||||||
|
|
||||||
|
KonanTarget.IOS_ARM32 ->
|
||||||
|
listOf("-stdlib=libc++", "-arch", "armv7", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=9.0.0")
|
||||||
|
|
||||||
KonanTarget.IOS_ARM64 ->
|
KonanTarget.IOS_ARM64 ->
|
||||||
listOf("-stdlib=libc++", "-arch", "arm64", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=8.0.0")
|
listOf("-stdlib=libc++", "-arch", "arm64", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=8.0.0")
|
||||||
|
|
||||||
@@ -124,7 +127,7 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
|
|||||||
KonanTarget.MACOS_X64 ->
|
KonanTarget.MACOS_X64 ->
|
||||||
listOf("-DKONAN_OSX=1", "-DKONAN_OBJC_INTEROP=1")
|
listOf("-DKONAN_OSX=1", "-DKONAN_OBJC_INTEROP=1")
|
||||||
|
|
||||||
KonanTarget.IOS_ARM64 ->
|
KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64 ->
|
||||||
listOf("-DKONAN_OBJC_INTEROP=1")
|
listOf("-DKONAN_OBJC_INTEROP=1")
|
||||||
|
|
||||||
KonanTarget.IOS_X64 ->
|
KonanTarget.IOS_X64 ->
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ fun loadConfigurables(target: KonanTarget, properties: Properties, baseDir: Stri
|
|||||||
LinuxConfigurablesImpl(target, properties, baseDir)
|
LinuxConfigurablesImpl(target, properties, baseDir)
|
||||||
KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 ->
|
KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 ->
|
||||||
LinuxMIPSConfigurablesImpl(target, properties, baseDir)
|
LinuxMIPSConfigurablesImpl(target, properties, baseDir)
|
||||||
KonanTarget.MACOS_X64, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 ->
|
KonanTarget.MACOS_X64, KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 ->
|
||||||
AppleConfigurablesImpl(target, properties, baseDir)
|
AppleConfigurablesImpl(target, properties, baseDir)
|
||||||
KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64 ->
|
KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64 ->
|
||||||
AndroidConfigurablesImpl(target, properties, baseDir)
|
AndroidConfigurablesImpl(target, properties, baseDir)
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ enum class Architecture(val bitness: Int) {
|
|||||||
sealed class KonanTarget(override val name: String, val family: Family, val architecture: Architecture) : Named {
|
sealed class KonanTarget(override val name: String, val family: Family, val architecture: Architecture) : Named {
|
||||||
object ANDROID_ARM32 : KonanTarget( "android_arm32", Family.ANDROID, Architecture.ARM32)
|
object ANDROID_ARM32 : KonanTarget( "android_arm32", Family.ANDROID, Architecture.ARM32)
|
||||||
object ANDROID_ARM64 : KonanTarget( "android_arm64", Family.ANDROID, Architecture.ARM64)
|
object ANDROID_ARM64 : KonanTarget( "android_arm64", Family.ANDROID, Architecture.ARM64)
|
||||||
|
object IOS_ARM32 : KonanTarget( "ios_arm32", Family.IOS, Architecture.ARM32)
|
||||||
object IOS_ARM64 : KonanTarget( "ios_arm64", Family.IOS, Architecture.ARM64)
|
object IOS_ARM64 : KonanTarget( "ios_arm64", Family.IOS, Architecture.ARM64)
|
||||||
object IOS_X64 : KonanTarget( "ios_x64", Family.IOS, Architecture.X64)
|
object IOS_X64 : KonanTarget( "ios_x64", Family.IOS, Architecture.X64)
|
||||||
object LINUX_X64 : KonanTarget( "linux_x64", Family.LINUX, Architecture.X64)
|
object LINUX_X64 : KonanTarget( "linux_x64", Family.LINUX, Architecture.X64)
|
||||||
@@ -127,7 +128,13 @@ open class HostManager(protected val distribution: Distribution = Distribution()
|
|||||||
fun targetManager(userRequest: String? = null): TargetManager = TargetManagerImpl(userRequest, this)
|
fun targetManager(userRequest: String? = null): TargetManager = TargetManagerImpl(userRequest, this)
|
||||||
|
|
||||||
// TODO: need a better way to enumerated predefined targets.
|
// TODO: need a better way to enumerated predefined targets.
|
||||||
private val predefinedTargets = listOf(ANDROID_ARM32, ANDROID_ARM64, IOS_ARM64, IOS_X64, LINUX_X64, MINGW_X64, MACOS_X64, LINUX_ARM32_HFP, LINUX_MIPS32, LINUX_MIPSEL32, WASM32)
|
private val predefinedTargets = listOf(
|
||||||
|
ANDROID_ARM32, ANDROID_ARM64,
|
||||||
|
IOS_ARM32, IOS_ARM64, IOS_X64,
|
||||||
|
LINUX_X64, LINUX_ARM32_HFP, LINUX_MIPS32, LINUX_MIPSEL32,
|
||||||
|
MINGW_X64,
|
||||||
|
MACOS_X64,
|
||||||
|
WASM32)
|
||||||
|
|
||||||
private val zephyrSubtargets = distribution.availableSubTarget("zephyr").map { ZEPHYR(it) }
|
private val zephyrSubtargets = distribution.availableSubTarget("zephyr").map { ZEPHYR(it) }
|
||||||
|
|
||||||
@@ -177,6 +184,7 @@ open class HostManager(protected val distribution: Distribution = Distribution()
|
|||||||
) + zephyrSubtargets
|
) + zephyrSubtargets
|
||||||
KonanTarget.MACOS_X64 -> listOf(
|
KonanTarget.MACOS_X64 -> listOf(
|
||||||
KonanTarget.MACOS_X64,
|
KonanTarget.MACOS_X64,
|
||||||
|
KonanTarget.IOS_ARM32,
|
||||||
KonanTarget.IOS_ARM64,
|
KonanTarget.IOS_ARM64,
|
||||||
KonanTarget.IOS_X64,
|
KonanTarget.IOS_X64,
|
||||||
KonanTarget.ANDROID_ARM32,
|
KonanTarget.ANDROID_ARM32,
|
||||||
@@ -248,6 +256,7 @@ open class HostManager(protected val distribution: Distribution = Distribution()
|
|||||||
"macos" to "macos_x64",
|
"macos" to "macos_x64",
|
||||||
"imac" to "macos_x64",
|
"imac" to "macos_x64",
|
||||||
"raspberrypi" to "linux_arm32_hfp",
|
"raspberrypi" to "linux_arm32_hfp",
|
||||||
|
"iphone32" to "ios_arm32",
|
||||||
"iphone" to "ios_arm64",
|
"iphone" to "ios_arm64",
|
||||||
"ipad" to "ios_arm64",
|
"ipad" to "ios_arm64",
|
||||||
"ios" to "ios_arm64",
|
"ios" to "ios_arm64",
|
||||||
|
|||||||
@@ -388,7 +388,7 @@ fun linker(configurables: Configurables): LinkerFlags =
|
|||||||
LinuxBasedLinker(configurables as LinuxConfigurables)
|
LinuxBasedLinker(configurables as LinuxConfigurables)
|
||||||
KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 ->
|
KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 ->
|
||||||
LinuxBasedLinker(configurables as LinuxMIPSConfigurables)
|
LinuxBasedLinker(configurables as LinuxMIPSConfigurables)
|
||||||
KonanTarget.MACOS_X64, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 ->
|
KonanTarget.MACOS_X64, KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 ->
|
||||||
MacOSBasedLinker(configurables as AppleConfigurables)
|
MacOSBasedLinker(configurables as AppleConfigurables)
|
||||||
KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64 ->
|
KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64 ->
|
||||||
AndroidLinker(configurables as AndroidConfigurables)
|
AndroidLinker(configurables as AndroidConfigurables)
|
||||||
|
|||||||
+1
-1
@@ -126,7 +126,7 @@ open class KonanFramework(name: String,
|
|||||||
get() = project.konanBinBaseDir
|
get() = project.konanBinBaseDir
|
||||||
|
|
||||||
override fun targetIsSupported(target: KonanTarget): Boolean =
|
override fun targetIsSupported(target: KonanTarget): Boolean =
|
||||||
target == MACOS_X64 || target == IOS_ARM64 || target == IOS_X64
|
target == MACOS_X64 || target == IOS_ARM32 || target == IOS_ARM64 || target == IOS_X64
|
||||||
}
|
}
|
||||||
|
|
||||||
open class KonanLibrary(name: String,
|
open class KonanLibrary(name: String,
|
||||||
|
|||||||
Reference in New Issue
Block a user