From 57e004e2b02505eefc0bb7a7a696d21a6d2b8203 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Mon, 23 Oct 2023 14:30:42 +0200 Subject: [PATCH] [KLIB tool] Respect '-signature-version' in 'dump-metadata' and 'dump-ir' commands --- .../org/jetbrains/kotlin/cli/klib/main.kt | 21 +++++---- .../kotlin/cli/klib/test/DumpMetadataTest.kt | 4 +- .../blackbox/AbstractNativeKlibDumpIrTest.kt | 2 +- .../support/util/TestCompilationArtifacts.kt | 45 +++++++++++++------ 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt index ce96a589d72..8fb005aac7f 100644 --- a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt +++ b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/main.kt @@ -273,11 +273,16 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) { } @OptIn(ObsoleteDescriptorBasedAPI::class) - fun dumpIr(output: Appendable, printSignatures: Boolean) { + fun dumpIr(output: Appendable, printSignatures: Boolean, signatureVersion: KotlinIrSignatureVersion?) { val module = loadModule() val library = module.kotlinLibrary checkLibraryHasIr(library) + if (signatureVersion != null && signatureVersion != KotlinIrSignatureVersion.V2) { + // TODO: support passing any signature version through `DumpIrTreeOptions`, KT-62828 + logWarning("using a non-default signature version in \"dump-ir\" is not supported yet") + } + val versionSpec = LanguageVersionSettingsImpl(currentLanguageVersion, currentApiVersion) val idSignaturer = KonanIdSignaturer(KonanManglerDesc) val symbolTable = SymbolTable(idSignaturer, IrFactoryImpl) @@ -296,15 +301,15 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) { output.append(irFragment.dump(DumpIrTreeOptions(printSignatures = printSignatures))) } - fun contents(output: Appendable, printSignatures: Boolean) { + fun contents(output: Appendable, printSignatures: Boolean, signatureVersion: KotlinIrSignatureVersion?) { logWarning("\"contents\" has been renamed to \"dump-metadata\". Please, use new command name.") - dumpMetadata(output, printSignatures) + dumpMetadata(output, printSignatures, signatureVersion) } - fun dumpMetadata(output: Appendable, printSignatures: Boolean) { + fun dumpMetadata(output: Appendable, printSignatures: Boolean, signatureVersion: KotlinIrSignatureVersion?) { val module = loadModule() val signatureRenderer = if (printSignatures) - DefaultKlibSignatureRenderer(KotlinIrSignatureVersion.V1, "// Signature: ") // TODO: use the version from `-signature-version` + DefaultKlibSignatureRenderer(signatureVersion, "// Signature: ") else KlibSignatureRenderer.NO_SIGNATURE val printer = DeclarationPrinter(output, DefaultDeclarationHeaderRenderer, signatureRenderer) @@ -394,11 +399,11 @@ fun main(args: Array) { val library = Library(command.library, repository) when (command.verb) { - "dump-ir" -> library.dumpIr(System.out, printSignatures) + "dump-ir" -> library.dumpIr(System.out, printSignatures, signatureVersion) "dump-ir-signatures" -> library.dumpIrSignatures(System.out, signatureVersion) - "dump-metadata" -> library.dumpMetadata(System.out, printSignatures) + "dump-metadata" -> library.dumpMetadata(System.out, printSignatures, signatureVersion) "dump-metadata-signatures" -> library.dumpMetadataSignatures(System.out, signatureVersion) - "contents" -> library.contents(System.out, printSignatures) + "contents" -> library.contents(System.out, printSignatures, signatureVersion) "signatures" -> library.signatures(System.out, signatureVersion) "info" -> library.info() "install" -> library.install() diff --git a/kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/DumpMetadataTest.kt b/kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/DumpMetadataTest.kt index 42e59cb6e21..49bfca074ad 100644 --- a/kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/DumpMetadataTest.kt +++ b/kotlin-native/klib/src/test/kotlin/org/jetbrains/kotlin/cli/klib/test/DumpMetadataTest.kt @@ -19,7 +19,7 @@ class DumpMetadataTest { private fun dumpMetadata(library: String, printOutput: Boolean = false, expected: () -> String) { val output = StringBuilder() val lib = Library(library, null) - lib.dumpMetadata(output, false) + lib.dumpMetadata(output, false, null) if (printOutput) { println(output.trim().toString()) } @@ -34,7 +34,7 @@ class DumpMetadataTest { fun `Stdlib content should be printed without exceptions`() { val output = StringBuilder() val distributionPath = System.getProperty("konan.home") - Library(Distribution(distributionPath).stdlib, null).dumpMetadata(output, false) + Library(Distribution(distributionPath).stdlib, null).dumpMetadata(output, false, null) } @Test diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeKlibDumpIrTest.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeKlibDumpIrTest.kt index 3a116fa92ea..c12d327273c 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeKlibDumpIrTest.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/AbstractNativeKlibDumpIrTest.kt @@ -53,7 +53,7 @@ abstract class AbstractNativeKlibDumpIrTest : AbstractNativeSimpleTest() { ) { val artifact = compilationResult.assertSuccess().resultingArtifact val kotlinNativeClassLoader = testRunSettings.get() - val klibIr = artifact.dumpIr(kotlinNativeClassLoader.classLoader, printSignatures) + val klibIr = artifact.dumpIr(kotlinNativeClassLoader.classLoader, printSignatures, null) // TODO: test for all signature versions, KT-62828 assertEqualsToFile(expectedContents, klibIr) } diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/support/util/TestCompilationArtifacts.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/support/util/TestCompilationArtifacts.kt index ae07f27ff49..f0fd86b123f 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/support/util/TestCompilationArtifacts.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/test/blackbox/support/util/TestCompilationArtifacts.kt @@ -20,29 +20,46 @@ private fun invokeKlibTool(kotlinNativeClassLoader: ClassLoader, klibFile: File, } -internal fun TestCompilationArtifact.KLIB.dumpMetadata(kotlinNativeClassLoader: ClassLoader): String { - return invokeKlibTool(kotlinNativeClassLoader, klibFile, "dumpMetadata", /* printSignatures= */ false) -} +internal fun TestCompilationArtifact.KLIB.dumpMetadata(kotlinNativeClassLoader: ClassLoader): String = invokeKlibTool( + kotlinNativeClassLoader = kotlinNativeClassLoader, + klibFile = klibFile, + functionName = "dumpMetadata", + /* printSignatures= */ false, + /* signatureVersion= */ null +) internal fun TestCompilationArtifact.KLIB.dumpIr( kotlinNativeClassLoader: ClassLoader, - printSignatures: Boolean = false, -): String { - return invokeKlibTool(kotlinNativeClassLoader, klibFile, "dumpIr", printSignatures) -} + printSignatures: Boolean, + signatureVersion: KotlinIrSignatureVersion? +): String = invokeKlibTool( + kotlinNativeClassLoader = kotlinNativeClassLoader, + klibFile = klibFile, + functionName = "dumpIr", + /* printSignatures= */ printSignatures, + /* signatureVersion= */ signatureVersion?.let { getSignatureVersionForIsolatedClassLoader(kotlinNativeClassLoader, signatureVersion) } +) internal fun TestCompilationArtifact.KLIB.dumpIrSignatures( kotlinNativeClassLoader: ClassLoader, signatureVersion: KotlinIrSignatureVersion, -): String { - // This ceremony is required to load `KotlinIrSignatureVersion` class from the isolated class loader and thus avoid - // "argument type mismatch" exception raised by the Java reflection API. - // TODO: migrate on CLI-based scheme of invocation of all KLIB tool commands - val signatureVersionForIsolatedClassLoader = Class.forName( +): String = invokeKlibTool( + kotlinNativeClassLoader = kotlinNativeClassLoader, + klibFile = klibFile, + functionName = "dumpIrSignatures", + /* signatureVersion= */ getSignatureVersionForIsolatedClassLoader(kotlinNativeClassLoader, signatureVersion) +) + +// This ceremony is required to load `KotlinIrSignatureVersion` class from the isolated class loader and thus avoid +// "argument type mismatch" exception raised by the Java reflection API. +// TODO: migrate on CLI-based scheme of invocation of all KLIB tool commands +private fun getSignatureVersionForIsolatedClassLoader( + kotlinNativeClassLoader: ClassLoader, + signatureVersion: KotlinIrSignatureVersion, +): Any { + return Class.forName( signatureVersion::class.java.canonicalName, true, kotlinNativeClassLoader ).getDeclaredConstructor(Int::class.java).newInstance(signatureVersion.number)!! - - return invokeKlibTool(kotlinNativeClassLoader, klibFile, "dumpIrSignatures", signatureVersionForIsolatedClassLoader) }