From 5887bd54a985567159a143dd7f22e975da5e241b Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Fri, 14 Feb 2020 11:07:21 +0700 Subject: [PATCH] [Interop] Perform enum and struct generation before linkage This process may generate symbols that should be bound. Thus, we need to perform it before linkage. Also replace unsafe `irCall` with proper one. --- .../jetbrains/kotlin/backend/konan/ToplevelPhases.kt | 9 +++++---- .../ir/interop/cenum/CEnumByValueFunctionGenerator.kt | 11 +++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index a0cc89c6b40..38bae7c34c9 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -208,6 +208,11 @@ internal val psiToIrPhase = konanUnitPhase( config.configuration.languageVersionSettings ) val irProviderForCEnumsAndCStructs = IrProviderForCEnumAndCStructStubs(generatorContext, interopBuiltIns, symbols) + // We need to run `buildAllEnumsAndStructsFrom` before `generateModuleFragment` because it adds references to symbolTable + // that should be bound. + modulesWithoutDCE + .filter(ModuleDescriptor::isFromInteropLibrary) + .forEach(irProviderForCEnumsAndCStructs::buildAllEnumsAndStructsFrom) val irProviderForInteropStubs = IrProviderForInteropStubs(irProviderForCEnumsAndCStructs::canHandleSymbol) val irProviders = listOf( irProviderForCEnumsAndCStructs, @@ -235,10 +240,6 @@ internal val psiToIrPhase = konanUnitPhase( if (this.stdlibModule in modulesWithoutDCE) { functionIrClassFactory.buildAllClasses() } - modulesWithoutDCE - .filter(ModuleDescriptor::isFromInteropLibrary) - .forEach(irProviderForCEnumsAndCStructs::buildAllEnumsAndStructsFrom) - irModule = module irModules = deserializer.modules.filterValues { llvmModuleSpecification.containsModule(it) } ir.symbols = symbols diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumByValueFunctionGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumByValueFunctionGenerator.kt index aba76b300d3..2559807dde6 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumByValueFunctionGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/interop/cenum/CEnumByValueFunctionGenerator.kt @@ -54,23 +54,22 @@ internal class CEnumByValueFunctionGenerator( val values = irTemporaryVar(irCall(valuesIrFunctionSymbol)) val inductionVariable = irTemporaryVar(irInt(0)) val arrayClass = values.type.classOrNull!! - val valuesSize = irCall(symbols.arraySize.getValue(arrayClass)).also { irCall -> + val valuesSize = irCall(symbols.arraySize.getValue(arrayClass), irBuiltIns.intType).also { irCall -> irCall.dispatchReceiver = irGet(values) } val getElementFn = symbols.arrayGet.getValue(arrayClass) val plusFun = symbols.intPlusInt val lessFunctionSymbol = irBuiltIns.lessFunByOperandType.getValue(irBuiltIns.intClass) +irWhile().also { loop -> - loop.condition = irCall(lessFunctionSymbol).also { irCall -> + loop.condition = irCall(lessFunctionSymbol, irBuiltIns.booleanType).also { irCall -> irCall.putValueArgument(0, irGet(inductionVariable)) irCall.putValueArgument(1, valuesSize) } loop.body = irBlock { - val untypedEntry = irCall(getElementFn).also { irCall -> + val entry = irTemporaryVar(irCall(getElementFn, byValueIrFunction.returnType).also { irCall -> irCall.dispatchReceiver = irGet(values) irCall.putValueArgument(0, irGet(inductionVariable)) - } - val entry = irTemporaryVar(irImplicitCast(untypedEntry, byValueIrFunction.returnType)) + }) val valueGetter = entry.type.getClass()!!.getPropertyGetter("value")!! val entryValue = irGet(irValueParameter.type, irGet(entry), valueGetter) +irIfThenElse( @@ -87,7 +86,7 @@ internal class CEnumByValueFunctionGenerator( ) } } - +irCall(symbols.ThrowNullPointerException) + +irCall(symbols.ThrowNullPointerException, irBuiltIns.nothingType) }) } return byValueIrFunction