backend/codegen, runtime: support interop intrinsics and natives
This commit is contained in:
committed by
SvyatoslavScherbina
parent
3892820052
commit
4b694225c1
+24
-4
@@ -1761,16 +1761,16 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
||||
//-------------------------------------------------------------------------//
|
||||
|
||||
private fun evaluateIntrinsicCall(callee: IrCall, args: List<LLVMValueRef>): 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())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user