diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageRegionCollector.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageRegionCollector.kt index ff8b5b1e67a..85b263125f2 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageRegionCollector.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/coverage/CoverageRegionCollector.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.util.nameForIrSerialization import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -39,12 +40,10 @@ internal class CoverageRegionCollector(private val fileFilter: (IrFile) -> Boole override fun visitFunction(declaration: IrFunction) { if (!declaration.isInline && !declaration.isExternal && !declaration.isGeneratedByCompiler) { - declaration.body?.let { - val regionsCollector = IrFunctionRegionsCollector(fileFilter, file) - regionsCollector.visitBody(it) - if (regionsCollector.regions.isNotEmpty()) { - functionRegions += FunctionRegions(declaration, regionsCollector.regions) - } + val regionsCollector = IrFunctionRegionsCollector(fileFilter, file) + regionsCollector.visitFunction(declaration) + if (regionsCollector.regions.isNotEmpty()) { + functionRegions += FunctionRegions(declaration, regionsCollector.regions) } } // TODO: Decide how to work with local functions. Should they be process separately? @@ -57,7 +56,7 @@ internal class CoverageRegionCollector(private val fileFilter: (IrFile) -> Boole // So lets filter them. private val IrDeclaration.isGeneratedByCompiler: Boolean get() { - return origin != IrDeclarationOrigin.DEFINED + return origin != IrDeclarationOrigin.DEFINED || nameForIrSerialization.asString() == "Konan_start" } /** @@ -83,6 +82,10 @@ private class IrFunctionRegionsCollector( } override fun visitFunction(declaration: IrFunction) { + declaration.body?.let { + recordRegion(it) + visitBody(it) + } } override fun visitExpression(expression: IrExpression) { diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index ee17d609584..4c6dcdc8a2b 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -3855,7 +3855,7 @@ if (UtilsKt.testTargetSupportsCodeCoverage(project)) { binaryName = "CoverageBasic" numberOfCoveredFunctions = 1 - numberOfCoveredLines = 1 + numberOfCoveredLines = 3 konanArtifacts { program(binaryName, targets: [ target ]) { @@ -3892,7 +3892,7 @@ if (UtilsKt.testTargetSupportsCodeCoverage(project)) { task coverage_smoke0(type: CoverageTest) { binaryName = "CoverageSmoke0" numberOfCoveredFunctions = 2 - numberOfCoveredLines = 3 + numberOfCoveredLines = 5 konanArtifacts { program(binaryName, targets: [ target ]) {