From 350ee4be1d140e4991a217ccec52c765418bded8 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 18 Sep 2023 11:28:56 +0200 Subject: [PATCH] [Native] Replace consequence `line` and `column` calls with a single one --- .../backend/common/phaser/performByIrFile.kt | 6 ++- .../js/transformers/irToJs/jsAstUtils.kt | 6 +-- .../backend/wasm/ir2wasm/locationUtils.kt | 4 +- .../org/jetbrains/kotlin/ir/IrFileEntry.kt | 15 ++++--- .../ir/linkage/partial/PartialLinkageUtils.kt | 15 ++++--- .../backend/konan/llvm/CodeGenerator.kt | 17 +++++--- .../kotlin/backend/konan/llvm/DebugUtils.kt | 9 +++-- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 40 +++++++++++-------- .../llvm/coverage/CoverageInformation.kt | 19 +++------ .../konan/llvm/coverage/LLVMCoverageWriter.kt | 13 +++--- 10 files changed, 79 insertions(+), 65 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/performByIrFile.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/performByIrFile.kt index 67e4aa03b4e..07ed56ba6d7 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/performByIrFile.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/performByIrFile.kt @@ -64,7 +64,8 @@ private class PerformByIrFilePhase( } catch (e: Throwable) { CodegenUtil.reportBackendException(e, "IR lowering", irFile.fileEntry.name) { offset -> irFile.fileEntry.takeIf { it.supportsDebugInfo }?.let { - it.getLineNumber(offset) to it.getColumnNumber(offset) + val (line, column) = it.getLineAndColumnNumbers(offset) + line to column } } } @@ -113,7 +114,8 @@ private class PerformByIrFilePhase( thrownFromThread.get()?.let { (e, irFile) -> CodegenUtil.reportBackendException(e, "Experimental parallel IR backend", irFile.fileEntry.name) { offset -> irFile.fileEntry.takeIf { it.supportsDebugInfo }?.let { - it.getLineNumber(offset) to it.getColumnNumber(offset) + val (line, column) = it.getLineAndColumnNumbers(offset) + line to column } } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt index 9d0c28db124..cc4bb769aef 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt @@ -12,7 +12,8 @@ import org.jetbrains.kotlin.ir.IrFileEntry import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.backend.js.JsLoweredDeclarationOrigin import org.jetbrains.kotlin.ir.backend.js.JsStatementOrigins -import org.jetbrains.kotlin.ir.backend.js.lower.* +import org.jetbrains.kotlin.ir.backend.js.lower.isBoxParameter +import org.jetbrains.kotlin.ir.backend.js.lower.isEs6ConstructorReplacement import org.jetbrains.kotlin.ir.backend.js.sourceMapsInfo import org.jetbrains.kotlin.ir.backend.js.utils.* import org.jetbrains.kotlin.ir.declarations.* @@ -618,8 +619,7 @@ inline fun IrElement.getSourceLocation(fileEntry: IrFileEntry, offsetSelector: I if (startOffset == UNDEFINED_OFFSET || endOffset == UNDEFINED_OFFSET) return null val path = fileEntry.name val offset = offsetSelector() - val startLine = fileEntry.getLineNumber(offset) - val startColumn = fileEntry.getColumnNumber(offset) + val (startLine, startColumn) = fileEntry.getLineAndColumnNumbers(offset) return JsLocation(path, startLine, startColumn) } diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/locationUtils.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/locationUtils.kt index dfc4bec4352..449140369dc 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/locationUtils.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/locationUtils.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.backend.wasm.ir2wasm import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrFileEntry -import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.wasm.ir.WasmExpressionBuilder import org.jetbrains.kotlin.wasm.ir.source.location.SourceLocation @@ -15,8 +14,7 @@ fun IrElement.getSourceLocation(fileEntry: IrFileEntry?): SourceLocation { if (fileEntry == null) return SourceLocation.NoLocation("fileEntry is null") val path = fileEntry.name - val startLine = fileEntry.getLineNumber(startOffset) - val startColumn = fileEntry.getColumnNumber(startOffset) + val (startLine, startColumn) = fileEntry.getLineAndColumnNumbers(startOffset) if (startLine < 0 || startColumn < 0) return SourceLocation.NoLocation("startLine or startColumn < 0") diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrFileEntry.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrFileEntry.kt index d7874b59dd5..2c8af9b7063 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrFileEntry.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrFileEntry.kt @@ -55,14 +55,17 @@ abstract class AbstractIrFileEntry : IrFileEntry { return LineAndColumn(lineNumber, columnNumber) } - override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo = - SourceRangeInfo( + override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo { + val (startLineNumber, startColumnNumber) = getLineAndColumnNumbers(beginOffset) + val (endLineNumber, endColumnNumber) = getLineAndColumnNumbers(endOffset) + return SourceRangeInfo( filePath = name, startOffset = beginOffset, - startLineNumber = getLineNumber(beginOffset), - startColumnNumber = getColumnNumber(beginOffset), + startLineNumber = startLineNumber, + startColumnNumber = startColumnNumber, endOffset = endOffset, - endLineNumber = getLineNumber(endOffset), - endColumnNumber = getColumnNumber(endOffset) + endLineNumber = endLineNumber, + endColumnNumber = endColumnNumber ) + } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/linkage/partial/PartialLinkageUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/linkage/partial/PartialLinkageUtils.kt index 9c24ad1d39a..c7523ff8c20 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/linkage/partial/PartialLinkageUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/linkage/partial/PartialLinkageUtils.kt @@ -65,12 +65,15 @@ object PartialLinkageUtils { data class IrBased(private val file: IrFile) : File { override val module = Module.Real(file.module.name) - override fun computeLocationForOffset(offset: Int) = PartialLinkageLogger.Location( - moduleName = module.name, - filePath = file.fileEntry.name, - lineNumber = if (offset == UNDEFINED_OFFSET) UNDEFINED_LINE_NUMBER else file.fileEntry.getLineNumber(offset) + 1, // since humans count from 1, not 0 - columnNumber = if (offset == UNDEFINED_OFFSET) UNDEFINED_COLUMN_NUMBER else file.fileEntry.getColumnNumber(offset) + 1 - ) + override fun computeLocationForOffset(offset: Int): PartialLinkageLogger.Location { + val (line, column) = file.fileEntry.getLineAndColumnNumbers(offset) + return PartialLinkageLogger.Location( + moduleName = module.name, + filePath = file.fileEntry.name, + lineNumber = if (offset == UNDEFINED_OFFSET) UNDEFINED_LINE_NUMBER else line + 1, // since humans count from 1, not 0 + columnNumber = if (offset == UNDEFINED_OFFSET) UNDEFINED_COLUMN_NUMBER else column + 1 + ) + } } class LazyIrBased(packageFragmentDescriptor: PackageFragmentDescriptor) : File { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt index 8b46c3f143e..12f9d7dd1be 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/CodeGenerator.kt @@ -6,16 +6,20 @@ package org.jetbrains.kotlin.backend.konan.llvm -import kotlinx.cinterop.* +import kotlinx.cinterop.cValuesOf +import kotlinx.cinterop.memScoped +import kotlinx.cinterop.toCValues +import kotlinx.cinterop.toKString import llvm.* -import org.jetbrains.kotlin.backend.konan.* +import org.jetbrains.kotlin.backend.konan.MemoryModel +import org.jetbrains.kotlin.backend.konan.NativeGenerationState +import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.backend.konan.cgen.CBridgeOrigin import org.jetbrains.kotlin.backend.konan.descriptors.ClassGlobalHierarchyInfo -import org.jetbrains.kotlin.backend.konan.ir.* +import org.jetbrains.kotlin.backend.konan.ir.isAny import org.jetbrains.kotlin.backend.konan.llvm.ThreadState.Native import org.jetbrains.kotlin.backend.konan.llvm.ThreadState.Runnable -import org.jetbrains.kotlin.backend.konan.llvm.objc.* -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.backend.konan.llvm.objc.ObjCDataGenerator import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.objcinterop.* @@ -343,7 +347,8 @@ private fun CodeGenerator.getVirtualFunctionTrampolineImpl(irFunction: IrSimpleF } } @Suppress("UNCHECKED_CAST") val location = diFunctionScope?.let { - LocationInfo(it as DIScopeOpaqueRef, file.fileEntry.line(offset!!), file.fileEntry.column(offset)) + val (line, column) = file.fileEntry.lineAndColumn(offset!!) + LocationInfo(it as DIScopeOpaqueRef, line, column) } generateFunction(this, proto, needSafePoint = false, startLocation = location, endLocation = location) { val args = proto.signature.parameterTypes.indices.map { param(it) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt index 79fa5facaf1..cead2ab50fe 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt @@ -259,7 +259,7 @@ internal class DebugInfo(override val generationState: NativeGenerationState) : /** * File entry starts offsets from zero while dwarf number lines/column starting from 1. */ -private val NO_SOURCE_FILE = "no source file" +private const val NO_SOURCE_FILE = "no source file" private fun IrFileEntry.location(offset: Int, offsetToNumber: (Int) -> Int): Int { // Part "name.isEmpty() || name == NO_SOURCE_FILE" is an awful hack, @minamoto, please fix properly. if (offset == UNDEFINED_OFFSET) return 0 @@ -270,9 +270,12 @@ private fun IrFileEntry.location(offset: Int, offsetToNumber: (Int) -> Int): Int return result } -internal fun IrFileEntry.line(offset: Int) = location(offset, this::getLineNumber) +internal fun IrFileEntry.lineAndColumn(offset: Int): Pair { + val (line, column) = this.getLineAndColumnNumbers(offset) + return location(offset) { line } to location(offset) { column } +} -internal fun IrFileEntry.column(offset: Int) = location(offset, this::getColumnNumber) +internal fun IrFileEntry.line(offset: Int) = location(offset, this::getLineNumber) internal data class FileAndFolder(val file: String, val folder: String) { companion object { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index 4ae4b539e6d..54d7a5adc83 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.backend.konan.llvm import kotlinx.cinterop.* import llvm.* -import org.jetbrains.kotlin.ir.util.inlineFunction import org.jetbrains.kotlin.backend.common.ir.isUnconditional import org.jetbrains.kotlin.backend.common.lower.coroutines.getOrCreateFunctionWithContinuationStub import org.jetbrains.kotlin.backend.common.lower.inline.INLINED_FUNCTION_ARGUMENTS @@ -28,10 +27,10 @@ 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.objcinterop.* import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.ir.objcinterop.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -781,7 +780,12 @@ internal class CodeGeneratorVisitor( } private val fileScope = (fileScope() as? FileScope) - override fun location(offset: Int) = scope?.let { scope -> fileScope?.let{LocationInfo(scope, it.file.fileEntry.line(offset), it.file.fileEntry.column(offset)) } } + override fun location(offset: Int) = scope?.let { scope -> + fileScope?.let { + val (line, column) = it.file.fileEntry.lineAndColumn(offset) + LocationInfo(scope, line, column) + } + } override fun scope() = scope @@ -909,12 +913,12 @@ internal class CodeGeneratorVisitor( verifyModule(llvm.module, "${ir2string(declaration.parent)}::${ir2string(declaration)}") } - private fun IrFunction.location(start: Boolean) = - if (context.shouldContainLocationDebugInfo() && startOffset != UNDEFINED_OFFSET) LocationInfo( - scope = scope()!!, - line = if (start) startLine() else endLine(), - column = if (start) startColumn() else endColumn()) - else null + private fun IrFunction.location(start: Boolean): LocationInfo? { + if (!context.shouldContainLocationDebugInfo() || startOffset == UNDEFINED_OFFSET) return null + + val (line, column) = if (start) startLineAndColumn() else endLineAndColumn() + return LocationInfo(scope = scope()!!, line = line, column = column) + } //-------------------------------------------------------------------------// @@ -2115,7 +2119,8 @@ internal class CodeGeneratorVisitor( return if (returnableBlock.inlineFunction != null) { val diScope = functionScope ?: return null val inlinedAt = outerContext.location(returnableBlock.startOffset) ?: return null - LocationInfo(diScope, file.fileEntry.line(offset), file.fileEntry.column(offset), inlinedAt) + val (line, column) = file.fileEntry.lineAndColumn(offset) + LocationInfo(diScope, line, column, inlinedAt) } else { outerContext.location(offset) } @@ -2128,7 +2133,8 @@ internal class CodeGeneratorVisitor( if (!context.shouldContainLocationDebugInfo() || returnableBlock.startOffset == UNDEFINED_OFFSET) return@lazy null val lexicalBlockFile = DICreateLexicalBlockFile(debugInfo.builder, functionScope()!!.scope(), super.file.diFileScope()) - DICreateLexicalBlock(debugInfo.builder, lexicalBlockFile, super.file.diFileScope(), returnableBlock.startLine(), returnableBlock.startColumn())!! + val (line, column) = returnableBlock.startLineAndColumn() + DICreateLexicalBlock(debugInfo.builder, lexicalBlockFile, super.file.diFileScope(), line, column)!! } override fun scope() = scope @@ -2140,7 +2146,10 @@ internal class CodeGeneratorVisitor( private open inner class FileScope(val file: IrFile) : InnerScopeImpl() { override fun fileScope(): CodeContext? = this - override fun location(offset: Int) = scope()?.let { LocationInfo(it, file.fileEntry.line(offset), file.fileEntry.column(offset)) } + override fun location(offset: Int) = scope()?.let { + val (line, column) = file.fileEntry.lineAndColumn(offset) + LocationInfo(it, line, column) + } @Suppress("UNCHECKED_CAST") private val scope by lazy { @@ -2271,13 +2280,10 @@ internal class CodeGeneratorVisitor( private fun IrElement.startLine() = file().fileEntry.line(this.startOffset) //-------------------------------------------------------------------------// - private fun IrElement.startColumn() = file().fileEntry.column(this.startOffset) + private fun IrElement.startLineAndColumn() = file().fileEntry.lineAndColumn(this.startOffset) //-------------------------------------------------------------------------// - private fun IrElement.endLine() = file().fileEntry.line(this.endOffset) - - //-------------------------------------------------------------------------// - private fun IrElement.endColumn() = file().fileEntry.column(this.endOffset) + private fun IrElement.endLineAndColumn() = file().fileEntry.lineAndColumn(this.endOffset) //-------------------------------------------------------------------------// private fun debugFieldDeclaration(expression: IrField) { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageInformation.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageInformation.kt index d7c68ac56db..fa33e0072aa 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageInformation.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageInformation.kt @@ -4,9 +4,8 @@ */ package org.jetbrains.kotlin.backend.konan.llvm.coverage -import org.jetbrains.kotlin.backend.konan.llvm.column -import org.jetbrains.kotlin.backend.konan.llvm.line import org.jetbrains.kotlin.backend.konan.llvm.computeSymbolName +import org.jetbrains.kotlin.backend.konan.llvm.lineAndColumn import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.IrFile @@ -25,17 +24,11 @@ class Region( val file: IrFile, val kind: RegionKind ) { - val startLine: Int - get() = file.fileEntry.line(startOffset) + val startLineAndColumn: Pair + get() = file.fileEntry.lineAndColumn(startOffset) - val startColumn: Int - get() = file.fileEntry.column(startOffset) - - val endLine: Int - get() = file.fileEntry.line(endOffset) - - val endColumn: Int - get() = file.fileEntry.column(endOffset) + val endLineAndColumn: Pair + get() = file.fileEntry.lineAndColumn(endOffset) companion object { fun fromIr(irElement: IrElement, irFile: IrFile, kind: RegionKind = RegionKind.Code) = @@ -48,7 +41,7 @@ class Region( override fun toString(): String { val expansion = (kind as? RegionKind.Expansion)?.let { " expand to " + it.expandedFile.name } ?: "" - return "${file.name}$expansion: ${kind::class.simpleName} $startLine, $startColumn -> $endLine, $endColumn" + return "${file.name}$expansion: ${kind::class.simpleName} $startLineAndColumn -> $endLineAndColumn" } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/LLVMCoverageWriter.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/LLVMCoverageWriter.kt index a4f3d764e53..2d87161ec33 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/LLVMCoverageWriter.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/LLVMCoverageWriter.kt @@ -6,9 +6,7 @@ package org.jetbrains.kotlin.backend.konan.llvm.coverage import kotlinx.cinterop.* import llvm.* -import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.NativeGenerationState -import org.jetbrains.kotlin.backend.konan.llvm.name import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.path import org.jetbrains.kotlin.konan.file.File @@ -20,11 +18,14 @@ private fun RegionKind.toLLVMCoverageRegionKind(): LLVMCoverageRegionKind = when } private fun LLVMCoverageRegion.populateFrom(region: Region, regionId: Int, filesIndex: Map) = apply { + val (lineStart, columnStart) = region.startLineAndColumn + val (lineEnd, columnEnd) = region.endLineAndColumn + fileId = filesIndex.getValue(region.file) - lineStart = region.startLine - columnStart = region.startColumn - lineEnd = region.endLine - columnEnd = region.endColumn + this.lineStart = lineStart + this.columnStart = columnStart + this.lineEnd = lineEnd + this.columnEnd = columnEnd counterId = regionId kind = region.kind.toLLVMCoverageRegionKind() expandedFileId = if (region.kind is RegionKind.Expansion) filesIndex.getValue(region.kind.expandedFile) else 0