diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index b968b3b1e24..bb27b9f83fb 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -1761,16 +1761,16 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid //-------------------------------------------------------------------------// private fun evaluateIntrinsicCall(callee: IrCall, args: List): LLVMValueRef { - val descriptor = callee.descriptor + val descriptor = callee.descriptor.original val name = descriptor.fqNameUnsafe.asString() - return when (name) { + when (name) { "konan.internal.areEqualByValue" -> { val arg0 = args[0] val arg1 = args[1] assert (arg0.type == arg1.type) - when (LLVMGetTypeKind(arg0.type)) { + return when (LLVMGetTypeKind(arg0.type)) { LLVMTypeKind.LLVMFloatTypeKind, LLVMTypeKind.LLVMDoubleTypeKind -> codegen.fcmpEq(arg0, arg1) @@ -1778,8 +1778,28 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid codegen.icmpEq(arg0, arg1) } } + } - else -> TODO(name) + val interop = context.interopBuiltIns + + return when (descriptor) { + in interop.readPrimitive -> { + val pointerType = pointerType(codegen.getLLVMType(descriptor.returnType!!)) + val rawPointer = args.last() + val pointer = codegen.bitcast(pointerType, rawPointer) + codegen.load(pointer) + } + in interop.writePrimitive -> { + val pointerType = pointerType(codegen.getLLVMType(descriptor.valueParameters.last().type)) + val rawPointer = args[1] + val pointer = codegen.bitcast(pointerType, rawPointer) + codegen.store(args[2], pointer) + codegen.theUnitInstanceRef.llvm + } + interop.nativePtrPlusLong -> codegen.gep(args[0], args[1]) + interop.getNativeNullPtr -> kNullInt8Ptr + interop.getPointerSize -> Int32(LLVMPointerSize(codegen.llvmTargetData)).llvm + else -> TODO(callee.descriptor.original.toString()) } } diff --git a/runtime/src/main/cpp/Natives.cpp b/runtime/src/main/cpp/Natives.cpp index b28137369a2..81dc436da95 100644 --- a/runtime/src/main/cpp/Natives.cpp +++ b/runtime/src/main/cpp/Natives.cpp @@ -1,3 +1,6 @@ +#include +#include +#include #include #include #include @@ -187,4 +190,22 @@ OBJ_GETTER0(Kotlin_konan_internal_undefined) { RETURN_OBJ(nullptr); } +void* Kotlin_interop_malloc(KLong size, KInt align) { + if (size > SIZE_MAX) { + return nullptr; + } + + void* result = malloc(size); + if ((reinterpret_cast(result) & (align - 1)) != 0) { + // Unaligned! + RuntimeAssert(false, "unsupported alignment"); + } + + return result; +} + +void Kotlin_interop_free(void* ptr) { + free(ptr); +} + } // extern "C"