Use not an alias, but a wrapper for nonvirtual function C adapters.

^KT-45468 Fixed

Merge-request: KT-MR-6467
Merged-by: Vladimir Sukharev <Vladimir.Sukharev@jetbrains.com>
This commit is contained in:
Vladimir Sukharev
2022-06-19 12:45:27 +00:00
committed by Space
parent ea0dfb50df
commit c9f0eeea3b
@@ -214,20 +214,22 @@ private class ExportedElement(val kind: ElementKind,
cname = "_konan_function_${owner.nextFunctionIndex()}" cname = "_konan_function_${owner.nextFunctionIndex()}"
val llvmCallable = owner.codegen.llvmFunction(irFunction) val llvmCallable = owner.codegen.llvmFunction(irFunction)
// If function is virtual, we need to resolve receiver properly. // If function is virtual, we need to resolve receiver properly.
val bridge = if (!DescriptorUtils.isTopLevelDeclaration(function) && val bridge = generateFunction(owner.codegen, llvmCallable.functionType, cname) {
irFunction.isOverridable) { val callee = if (!DescriptorUtils.isTopLevelDeclaration(function) &&
generateFunction(owner.codegen, llvmCallable.functionType, cname) { irFunction.isOverridable) {
val receiver = param(0) val receiver = param(0)
val numParams = LLVMCountParams(llvmCallable.llvmValue) lookupVirtualImpl(receiver, irFunction)
val args = (0..numParams - 1).map { index -> param(index) } } else {
val callee = lookupVirtualImpl(receiver, irFunction) // KT-45468: Alias insertion may not be handled by LLVM properly, in case callee is in the cache.
callee.attributeProvider.addFunctionAttributes(this.function) // Hence, insert not an alias but a wrapper, hoping it will be optimized out later.
val result = call(callee, args, exceptionHandler = ExceptionHandler.Caller, verbatim = true) llvmCallable
ret(result)
} }
} else {
val aliasType = pointerType(llvmCallable.functionType) val numParams = LLVMCountParams(llvmCallable.llvmValue)
LLVMAddAlias(context.llvmModule, aliasType, llvmCallable.llvmValue, cname)!! val args = (0..numParams - 1).map { index -> param(index) }
callee.attributeProvider.addFunctionAttributes(this.function)
val result = call(callee, args, exceptionHandler = ExceptionHandler.Caller, verbatim = true)
ret(result)
} }
LLVMSetLinkage(bridge, LLVMLinkage.LLVMExternalLinkage) LLVMSetLinkage(bridge, LLVMLinkage.LLVMExternalLinkage)
} }