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:
+14
-12
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user