From f50c3f0b228be5c3807f98e3ee83a6098079e365 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Fri, 2 Aug 2019 18:04:01 +0300 Subject: [PATCH] [codegen] switch scopes for local variable initializers according to their locations provided by inliner. --- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 0768f0e1019..7c80587eb04 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -9,6 +9,7 @@ import kotlinx.cinterop.* import llvm.* import org.jetbrains.kotlin.backend.common.descriptors.allParameters import org.jetbrains.kotlin.backend.common.ir.ir2string +import org.jetbrains.kotlin.backend.common.lower.inline.InlinerExpressionLocationHint import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.descriptors.* import org.jetbrains.kotlin.backend.konan.ir.* @@ -22,6 +23,7 @@ import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid @@ -277,6 +279,40 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map findCodeContext(entry: T, context:CodeContext?, predicate: CodeContext.(T) -> Boolean): CodeContext? { + if(context == null) + //TODO: replace `return null` with `throw NoContextFound()` ASAP. + return null + if (context.predicate(entry)) + return context + return findCodeContext(entry, (context as? InnerScope)?.outerContext, predicate) + } + + + private inline fun switchSymbolizationContextTo(symbol: IrFunctionSymbol, block: () -> R): R? { + val functionContext = findCodeContext(symbol.owner, currentCodeContext) { + val declaration = (this as? FunctionScope)?.declaration + val returnableBlock = (this as? ReturnableBlockScope)?.returnableBlock + val inlinedFunction = returnableBlock?.inlineFunctionSymbol?.owner + declaration == it || inlinedFunction == it + } ?: return null + + /** + * We can't switch context safely, only for symbolzation needs: location, scope detection. + */ + using(object: InnerScopeImpl() { + override fun location(line: Int, column: Int): LocationInfo? { + return functionContext.location(line, column) + } + + override fun scope(): DIScopeOpaqueRef? { + return functionContext.scope() + } + + }) { + return block() + } + } private fun appendCAdapters() { context.cAdapterGenerator.generateBindings(codegen) } @@ -1198,7 +1234,15 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map