From f74265126ed4b527c63b2c8069d1088afee3113f Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Tue, 29 Aug 2017 16:12:44 +0300 Subject: [PATCH] Fix performance bug, review feedback on indexer changes (#818) --- .../kotlin/native/interop/indexer/Indexer.kt | 45 ++++++++++--------- .../jetbrains/kotlin/backend/konan/Context.kt | 3 ++ .../kotlin/backend/konan/ir/KonanIr.kt | 4 +- .../kotlin/backend/konan/llvm/IrToBitcode.kt | 10 ++++- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt index 17b4fe26eb6..b80e3cda937 100644 --- a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt +++ b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt @@ -128,7 +128,7 @@ internal class NativeIndexImpl(val library: NativeLibrary) : NativeIndex() { if (structDecl.def == null) { val definitionCursor = clang_getCursorDefinition(cursor) if (clang_Cursor_isNull(definitionCursor) == 0) { - assert (clang_isCursorDefinition(definitionCursor) != 0) + assert(clang_isCursorDefinition(definitionCursor) != 0) createStructDef(structDecl, cursor) } } @@ -285,7 +285,8 @@ internal class NativeIndexImpl(val library: NativeLibrary) : NativeIndex() { result.methods.add(method) } } - else -> {} + else -> { + } } CXChildVisitResult.CXChildVisit_Continue } @@ -365,7 +366,7 @@ internal class NativeIndexImpl(val library: NativeLibrary) : NativeIndex() { } private fun convertCursorType(cursor: CValue) = - convertType(clang_getCursorType(cursor), clang_getDeclTypeAttributes(cursor)) + convertType(clang_getCursorType(cursor), clang_getDeclTypeAttributes(cursor)) private inline fun objCType(supplier: () -> ObjCPointer) = when (library.language) { Language.C -> UnsupportedType @@ -483,7 +484,7 @@ internal class NativeIndexImpl(val library: NativeLibrary) : NativeIndex() { private fun convertFunctionType(type: CValue): Type { val kind = type.kind - assert (kind == CXType_Unexposed || kind == CXType_FunctionProto) + assert(kind == CXType_Unexposed || kind == CXType_FunctionProto) return if (clang_isFunctionTypeVariadic(type) != 0) { VoidType // make this function pointer opaque. @@ -500,27 +501,27 @@ internal class NativeIndexImpl(val library: NativeLibrary) : NativeIndex() { private val TARGET_ATTRIBUTE = "__target__" internal fun tokenizeExtent(cursor: CValue): List { - val translationUnit = clang_Cursor_getTranslationUnit(cursor)!! - val cursorExtent = clang_getCursorExtent(cursor) - memScoped { - val tokensVar = alloc>() - val numTokensVar = alloc() - clang_tokenize(translationUnit, cursorExtent, tokensVar.ptr, numTokensVar.ptr) - val numTokens = numTokensVar.value - val tokens = tokensVar.value - if (tokens == null) return emptyList() - try { - return (0 until numTokens).map { - clang_getTokenSpelling(translationUnit, tokens[it].readValue()).convertAndDispose() + val translationUnit = clang_Cursor_getTranslationUnit(cursor)!! + val cursorExtent = clang_getCursorExtent(cursor) + memScoped { + val tokensVar = alloc>() + val numTokensVar = alloc() + clang_tokenize(translationUnit, cursorExtent, tokensVar.ptr, numTokensVar.ptr) + val numTokens = numTokensVar.value + val tokens = tokensVar.value + if (tokens == null) return emptyList() + try { + return (0 until numTokens).map { + clang_getTokenSpelling(translationUnit, tokens[it].readValue()).convertAndDispose() + } + } finally { + clang_disposeTokens(translationUnit, tokens, numTokens) } - } finally { - clang_disposeTokens(translationUnit, tokens, numTokens) } - } - TODO() + TODO() } - private fun isSuitable(cursor: CValue): Boolean { + private fun isSuitableFunction(cursor: CValue): Boolean { if (!isAvailable(cursor)) return false // If function is specific for certain target, ignore that, as we may be @@ -566,7 +567,7 @@ internal class NativeIndexImpl(val library: NativeLibrary) : NativeIndex() { } CXIdxEntity_Function -> { - if (isSuitable(cursor)) { + if (isSuitableFunction(cursor)) { functionById[getDeclarationId(cursor)] = getFunction(cursor) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt index dc6acb3d531..c3f89241939 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Context.kt @@ -216,6 +216,9 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) { var phase: KonanPhase? = null var depth: Int = 0 + // Cache used for source offset->(line,column) mapping. + val fileEntryCache = mutableMapOf() + protected fun separator(title: String) { println("\n\n--- ${title} ----------------------\n") } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/KonanIr.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/KonanIr.kt index d766f4edde6..084f898362c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/KonanIr.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/KonanIr.kt @@ -93,9 +93,9 @@ class NaiveSourceBasedFileEntryImpl(override val name: String) : SourceManager.F //-----------------------------------------------------------------------------// -class IrFileImpl(fileName: String) : IrFile { +class IrFileImpl(entry: SourceManager.FileEntry) : IrFile { - override val fileEntry = NaiveSourceBasedFileEntryImpl(fileName) + override val fileEntry = entry //-------------------------------------------------------------------------// 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 64be7284f70..e4c377439de 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 @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement +import org.jetbrains.kotlin.ir.SourceManager import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.descriptors.IrBuiltinOperatorDescriptorBase import org.jetbrains.kotlin.ir.expressions.* @@ -1433,8 +1434,15 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map