[Tests] Add ability to have separate asm instructions dump for fir + ir setup
This commit is contained in:
committed by
teamcity
parent
a2ffba275c
commit
21aec49709
+27
-12
@@ -10,11 +10,14 @@ import org.jetbrains.kotlin.codegen.getClassFiles
|
|||||||
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives
|
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives
|
||||||
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.CHECK_ASM_LIKE_INSTRUCTIONS
|
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.CHECK_ASM_LIKE_INSTRUCTIONS
|
||||||
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.CURIOUS_ABOUT
|
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.CURIOUS_ABOUT
|
||||||
|
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.FIR_DIFFERENCE
|
||||||
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.IR_DIFFERENCE
|
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.IR_DIFFERENCE
|
||||||
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.LOCAL_VARIABLE_TABLE
|
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.LOCAL_VARIABLE_TABLE
|
||||||
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.RENDER_ANNOTATIONS
|
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.RENDER_ANNOTATIONS
|
||||||
|
import org.jetbrains.kotlin.test.directives.model.Directive
|
||||||
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
|
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
|
||||||
import org.jetbrains.kotlin.test.model.BinaryArtifacts
|
import org.jetbrains.kotlin.test.model.BinaryArtifacts
|
||||||
|
import org.jetbrains.kotlin.test.model.FrontendKinds
|
||||||
import org.jetbrains.kotlin.test.model.TestModule
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
import org.jetbrains.kotlin.test.services.moduleStructure
|
import org.jetbrains.kotlin.test.services.moduleStructure
|
||||||
@@ -29,11 +32,13 @@ import org.jetbrains.org.objectweb.asm.util.Printer
|
|||||||
import org.jetbrains.org.objectweb.asm.util.Textifier
|
import org.jetbrains.org.objectweb.asm.util.Textifier
|
||||||
import org.jetbrains.org.objectweb.asm.util.TraceFieldVisitor
|
import org.jetbrains.org.objectweb.asm.util.TraceFieldVisitor
|
||||||
import org.jetbrains.org.objectweb.asm.util.TraceMethodVisitor
|
import org.jetbrains.org.objectweb.asm.util.TraceMethodVisitor
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
class AsmLikeInstructionListingHandler(testServices: TestServices) : JvmBinaryArtifactHandler(testServices) {
|
class AsmLikeInstructionListingHandler(testServices: TestServices) : JvmBinaryArtifactHandler(testServices) {
|
||||||
companion object {
|
companion object {
|
||||||
const val DUMP_EXTENSION = "asm.txt"
|
const val DUMP_EXTENSION = "asm.txt"
|
||||||
const val IR_DUMP_EXTENSION = "asm.ir.txt"
|
const val IR_DUMP_EXTENSION = "asm.ir.txt"
|
||||||
|
const val FIR_DUMP_EXTENSION = "asm.fir.txt"
|
||||||
const val LINE_SEPARATOR = "\n"
|
const val LINE_SEPARATOR = "\n"
|
||||||
|
|
||||||
val IGNORED_CLASS_VISIBLE_ANNOTATIONS = setOf(
|
val IGNORED_CLASS_VISIBLE_ANNOTATIONS = setOf(
|
||||||
@@ -382,26 +387,36 @@ class AsmLikeInstructionListingHandler(testServices: TestServices) : JvmBinaryAr
|
|||||||
if (baseDumper.isEmpty()) return
|
if (baseDumper.isEmpty()) return
|
||||||
|
|
||||||
val irDifference = IR_DIFFERENCE in testServices.moduleStructure.allDirectives
|
val irDifference = IR_DIFFERENCE in testServices.moduleStructure.allDirectives
|
||||||
|
val firDifference = FIR_DIFFERENCE in testServices.moduleStructure.allDirectives
|
||||||
|
|
||||||
val extension = when (irDifference) {
|
val firstModule = testServices.moduleStructure.modules.first()
|
||||||
false -> DUMP_EXTENSION
|
|
||||||
true -> when (testServices.moduleStructure.modules.first().targetBackend?.isIR) {
|
val extension = when {
|
||||||
true -> IR_DUMP_EXTENSION
|
firDifference && firstModule.frontendKind == FrontendKinds.FIR -> FIR_DUMP_EXTENSION
|
||||||
else -> DUMP_EXTENSION
|
irDifference && firstModule.targetBackend?.isIR == true -> IR_DUMP_EXTENSION
|
||||||
}
|
else -> DUMP_EXTENSION
|
||||||
}
|
}
|
||||||
|
|
||||||
val testDataFile = testServices.moduleStructure.originalTestDataFiles.first()
|
val testDataFile = testServices.moduleStructure.originalTestDataFiles.first()
|
||||||
val file = testDataFile.withExtension(extension)
|
val file = testDataFile.withExtension(extension)
|
||||||
assertions.assertEqualsToFile(file, baseDumper.generateResultingDump())
|
assertions.assertEqualsToFile(file, baseDumper.generateResultingDump())
|
||||||
|
|
||||||
|
|
||||||
|
val noIrDump = testDataFile.withExtension(DUMP_EXTENSION)
|
||||||
|
val irDump = testDataFile.withExtension(IR_DUMP_EXTENSION)
|
||||||
|
val firDump = testDataFile.withExtension(FIR_DUMP_EXTENSION)
|
||||||
|
if (firDifference) {
|
||||||
|
checkDifferenceDirectiveIsNotNeeded(irDump, firDump, FIR_DIFFERENCE)
|
||||||
|
}
|
||||||
if (irDifference) {
|
if (irDifference) {
|
||||||
val noIrDump = testDataFile.withExtension(DUMP_EXTENSION)
|
checkDifferenceDirectiveIsNotNeeded(noIrDump, irDump, IR_DIFFERENCE)
|
||||||
val irDump = testDataFile.withExtension(IR_DUMP_EXTENSION)
|
}
|
||||||
if (noIrDump.exists() && irDump.exists()) {
|
}
|
||||||
assertions.assertFalse(noIrDump.readText().trim() == irDump.readText().trim()) {
|
|
||||||
"Dumps for IR backend and classic backend are identical. Please remove IR_DIFFERENCE directive and ${irDump.name} file"
|
private fun checkDifferenceDirectiveIsNotNeeded(baseFile: File, additionalFile: File, directiveToRemove: Directive) {
|
||||||
}
|
if (baseFile.exists() && additionalFile.exists()) {
|
||||||
|
assertions.assertFalse(baseFile.readText().trim() == additionalFile.readText().trim()) {
|
||||||
|
"Dumps for IR backend and classic backend are identical. Please remove $directiveToRemove directive and ${additionalFile.name} file"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -17,6 +17,10 @@ object AsmLikeInstructionListingDirectives : SimpleDirectivesContainer() {
|
|||||||
"If present then saves dump for IR backend in asm.ir.txt file"
|
"If present then saves dump for IR backend in asm.ir.txt file"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val FIR_DIFFERENCE by directive(
|
||||||
|
"If present then saves dump for IR backend in asm.fir.txt file"
|
||||||
|
)
|
||||||
|
|
||||||
val CURIOUS_ABOUT by stringDirective(
|
val CURIOUS_ABOUT by stringDirective(
|
||||||
"Specifies list of methods for which asm instructions should be printed"
|
"Specifies list of methods for which asm instructions should be printed"
|
||||||
)
|
)
|
||||||
|
|||||||
+19
@@ -23,6 +23,9 @@ import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2IrConverter
|
|||||||
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade
|
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade
|
||||||
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact
|
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact
|
||||||
import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicDiagnosticsHandler
|
import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicDiagnosticsHandler
|
||||||
|
import org.jetbrains.kotlin.test.frontend.fir.Fir2IrResultsConverter
|
||||||
|
import org.jetbrains.kotlin.test.frontend.fir.FirFrontendFacade
|
||||||
|
import org.jetbrains.kotlin.test.frontend.fir.FirOutputArtifact
|
||||||
import org.jetbrains.kotlin.test.frontend.fir.handlers.FirDiagnosticsHandler
|
import org.jetbrains.kotlin.test.frontend.fir.handlers.FirDiagnosticsHandler
|
||||||
import org.jetbrains.kotlin.test.model.*
|
import org.jetbrains.kotlin.test.model.*
|
||||||
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest
|
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest
|
||||||
@@ -96,3 +99,19 @@ open class AbstractIrAsmLikeInstructionListingTest :
|
|||||||
get() = ::JvmIrBackendFacade
|
get() = ::JvmIrBackendFacade
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open class AbstractFirAsmLikeInstructionListingTest :
|
||||||
|
AbstractAsmLikeInstructionListingTestBase<FirOutputArtifact, IrBackendInput>(
|
||||||
|
FrontendKinds.FIR,
|
||||||
|
TargetBackend.JVM_IR
|
||||||
|
) {
|
||||||
|
|
||||||
|
override val frontendFacade: Constructor<FrontendFacade<FirOutputArtifact>>
|
||||||
|
get() = ::FirFrontendFacade
|
||||||
|
|
||||||
|
override val frontendToBackendConverter: Constructor<Frontend2BackendConverter<FirOutputArtifact, IrBackendInput>>
|
||||||
|
get() = ::Fir2IrResultsConverter
|
||||||
|
|
||||||
|
override val backendFacade: Constructor<BackendFacade<IrBackendInput, BinaryArtifacts.Jvm>>
|
||||||
|
get() = ::JvmIrBackendFacade
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user