From ca9cbf7eb74942e6a8787320e67e800b470380fc Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 20 Jul 2021 16:42:23 +0300 Subject: [PATCH] Fix warnings in K/Native code --- .../native/interop/indexer/NativeIndex.kt | 4 + .../kotlin/native/interop/indexer/Utils.kt | 2 + .../native/interop/gen/StubIrBridgeBuilder.kt | 7 ++ .../kotlin/backend/konan/CompilerOutput.kt | 1 + .../konan/lower/FileInitializersLowering.kt | 2 +- .../backend/konan/optimizations/DFGBuilder.kt | 99 +++++++++---------- .../konan/optimizations/EscapeAnalysis.kt | 7 ++ .../optimizations/LocalEscapeAnalysis.kt | 5 + 8 files changed, 75 insertions(+), 52 deletions(-) diff --git a/kotlin-native/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt b/kotlin-native/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt index 5455786acd5..4b629d2d67b 100644 --- a/kotlin-native/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt +++ b/kotlin-native/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt @@ -175,6 +175,8 @@ abstract class StructDef(val size: Long, val align: Int) { when (it) { is Field -> add(it) is AnonymousInnerRecord -> addAll(it.def.fields) + is BitField, + is IncompleteField -> {} } } } @@ -185,6 +187,8 @@ abstract class StructDef(val size: Long, val align: Int) { when (it) { is BitField -> add(it) is AnonymousInnerRecord -> addAll(it.def.bitFields) + is Field, + is IncompleteField -> {} } } } diff --git a/kotlin-native/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Utils.kt b/kotlin-native/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Utils.kt index 614363162d6..a0f3a97a1b1 100644 --- a/kotlin-native/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Utils.kt +++ b/kotlin-native/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Utils.kt @@ -241,6 +241,8 @@ fun StructDef.fieldsHaveDefaultAlignment(): Boolean { offset = it.offset / 8 + it.typeSize } is BitField -> return false + is AnonymousInnerRecord, + is IncompleteField -> {} } } diff --git a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBridgeBuilder.kt b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBridgeBuilder.kt index e30ad7ad7a1..1de9f3e2071 100644 --- a/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBridgeBuilder.kt +++ b/kotlin-native/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrBridgeBuilder.kt @@ -156,6 +156,7 @@ class StubIrBridgeBuilder( val getAddressExpression = getGlobalAddressExpression(extra.cGlobalName, propertyAccessor) propertyAccessorBridgeBodies[propertyAccessor] = typeInfo.argFromBridged(getAddressExpression, kotlinFile, nativeBacked = propertyAccessor) + "!!" } + else -> {} } } @@ -187,6 +188,7 @@ class StubIrBridgeBuilder( } propertyAccessorBridgeBodies[propertyAccessor] = setter } + else -> {} } is PropertyAccessor.Setter.WriteBits -> { @@ -223,6 +225,11 @@ class StubIrBridgeBuilder( simpleBridgeGenerator.insertNativeBridge(propertyAccessor, emptyList(), wrapper.lines) } } + is PropertyAccessor.Getter.ArrayMemberAt, + is PropertyAccessor.Getter.GetConstructorParameter, + is PropertyAccessor.Getter.GetEnumEntry, + is PropertyAccessor.Getter.MemberAt, + is PropertyAccessor.Setter.MemberAt -> {} } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt index fc1925c1f3d..21f4494d8ff 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt @@ -179,6 +179,7 @@ internal fun produceOutput(context: Context) { context.bitcodeFileName = output LLVMWriteBitcodeToFile(context.llvmModule!!, output) } + null -> {} } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FileInitializersLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FileInitializersLowering.kt index 78a70d4c255..d1e12c80ecd 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FileInitializersLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FileInitializersLowering.kt @@ -126,5 +126,5 @@ internal class FileInitializersLowering(val context: Context) : FileLoweringPass } private val IrField.hasNonConstInitializer: Boolean - get() = initializer.let { it != null && it !is IrConst<*> } + get() = initializer?.expression.let { it != null && it !is IrConst<*> } } \ No newline at end of file diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt index 2dd4469bf62..b377df1100d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt @@ -758,67 +758,64 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag else it } - if (callee is IrConstructor) { - error("Constructor call should be done with IrConstructorCall") - } else { - if (value.isVirtualCall) { - val owner = callee.parentAsClass - val actualReceiverType = value.dispatchReceiver!!.type - val actualReceiverClassifier = actualReceiverType.classifierOrFail - val receiverType = - if (actualReceiverClassifier is IrTypeParameterSymbol - || !callee.isReal /* Could be a bridge. */) - symbolTable.mapClassReferenceType(owner) - else { - val actualClassAtCallsite = - (actualReceiverClassifier as IrClassSymbol).descriptor + if (value.isVirtualCall) { + val owner = callee.parentAsClass + val actualReceiverType = value.dispatchReceiver!!.type + val actualReceiverClassifier = actualReceiverType.classifierOrFail + + val receiverType = + if (actualReceiverClassifier is IrTypeParameterSymbol + || !callee.isReal /* Could be a bridge. */) + symbolTable.mapClassReferenceType(owner) + else { + val actualClassAtCallsite = + (actualReceiverClassifier as IrClassSymbol).descriptor // assert (DescriptorUtils.isSubclass(actualClassAtCallsite, owner.descriptor)) { // "Expected an inheritor of ${owner.descriptor}, but was $actualClassAtCallsite" // } - if (DescriptorUtils.isSubclass(actualClassAtCallsite, owner.descriptor)) { - symbolTable.mapClassReferenceType(actualReceiverClassifier.owner) // Box if inline class. - } else { - symbolTable.mapClassReferenceType(owner) - } + if (DescriptorUtils.isSubclass(actualClassAtCallsite, owner.descriptor)) { + symbolTable.mapClassReferenceType(actualReceiverClassifier.owner) // Box if inline class. + } else { + symbolTable.mapClassReferenceType(owner) } + } - val isAnyMethod = callee.target.parentAsClass.isAny() - if (owner.isInterface && !isAnyMethod) { - val itablePlace = context.getLayoutBuilder(owner).itablePlace(callee) - DataFlowIR.Node.ItableCall( - symbolTable.mapFunction(callee.target), - receiverType, - itablePlace.interfaceId, - itablePlace.methodIndex, - arguments, - mapReturnType(value.type, callee.target.returnType), - value - ) - } else { - val vtableIndex = if (isAnyMethod) - context.getLayoutBuilder(context.irBuiltIns.anyClass.owner).vtableIndex(callee.target) - else - context.getLayoutBuilder(owner).vtableIndex(callee) - DataFlowIR.Node.VtableCall( - symbolTable.mapFunction(callee.target), - receiverType, - vtableIndex, - arguments, - mapReturnType(value.type, callee.target.returnType), - value - ) - } - } else { - val actualCallee = value.actualCallee - DataFlowIR.Node.StaticCall( - symbolTable.mapFunction(actualCallee), + val isAnyMethod = callee.target.parentAsClass.isAny() + if (owner.isInterface && !isAnyMethod) { + val itablePlace = context.getLayoutBuilder(owner).itablePlace(callee) + DataFlowIR.Node.ItableCall( + symbolTable.mapFunction(callee.target), + receiverType, + itablePlace.interfaceId, + itablePlace.methodIndex, arguments, - actualCallee.dispatchReceiverParameter?.let { symbolTable.mapType(it.type) }, - mapReturnType(value.type, actualCallee.returnType), + mapReturnType(value.type, callee.target.returnType), + value + ) + } else { + val vtableIndex = if (isAnyMethod) + context.getLayoutBuilder(context.irBuiltIns.anyClass.owner).vtableIndex(callee.target) + else + context.getLayoutBuilder(owner).vtableIndex(callee) + DataFlowIR.Node.VtableCall( + symbolTable.mapFunction(callee.target), + receiverType, + vtableIndex, + arguments, + mapReturnType(value.type, callee.target.returnType), value ) } + } else { + val actualCallee = value.actualCallee + DataFlowIR.Node.StaticCall( + symbolTable.mapFunction(actualCallee), + arguments, + actualCallee.dispatchReceiverParameter?.let { symbolTable.mapType(it.type) }, + mapReturnType(value.type, actualCallee.returnType), + value + ) } } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt index 8d2b4af1462..b0138bd3aa6 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/EscapeAnalysis.kt @@ -231,6 +231,13 @@ internal object EscapeAnalysis { for (value in node.values) assignRole(node, Role.ASSIGNED, RoleInfoEntry(value.node, null)) } + is DataFlowIR.Node.AllocInstance, + is DataFlowIR.Node.Call, + is DataFlowIR.Node.Const, + is DataFlowIR.Node.FunctionReference, + is DataFlowIR.Node.Null, + is DataFlowIR.Node.Parameter, + is DataFlowIR.Node.Scope -> {} } } FunctionAnalysisResult(function, nodesRoles) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/LocalEscapeAnalysis.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/LocalEscapeAnalysis.kt index cace5e8bdd6..85497f8a2c0 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/LocalEscapeAnalysis.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/LocalEscapeAnalysis.kt @@ -136,6 +136,11 @@ internal object LocalEscapeAnalysis { is DataFlowIR.Node.Parameter -> { node.escapeState = EscapeState.ARG_ESCAPE } + is DataFlowIR.Node.AllocInstance, + is DataFlowIR.Node.Const, + is DataFlowIR.Node.FunctionReference, + is DataFlowIR.Node.Null, + is DataFlowIR.Node.Scope -> {} } }