[KLIB tool] Respect '-signature-version' in 'dump-metadata' and 'dump-ir' commands

This commit is contained in:
Dmitriy Dolovov
2023-10-23 14:30:42 +02:00
committed by Space Team
parent c34e334550
commit 57e004e2b0
4 changed files with 47 additions and 25 deletions
@@ -273,11 +273,16 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) {
} }
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
fun dumpIr(output: Appendable, printSignatures: Boolean) { fun dumpIr(output: Appendable, printSignatures: Boolean, signatureVersion: KotlinIrSignatureVersion?) {
val module = loadModule() val module = loadModule()
val library = module.kotlinLibrary val library = module.kotlinLibrary
checkLibraryHasIr(library) 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 versionSpec = LanguageVersionSettingsImpl(currentLanguageVersion, currentApiVersion)
val idSignaturer = KonanIdSignaturer(KonanManglerDesc) val idSignaturer = KonanIdSignaturer(KonanManglerDesc)
val symbolTable = SymbolTable(idSignaturer, IrFactoryImpl) val symbolTable = SymbolTable(idSignaturer, IrFactoryImpl)
@@ -296,15 +301,15 @@ class Library(val libraryNameOrPath: String, val requestedRepository: String?) {
output.append(irFragment.dump(DumpIrTreeOptions(printSignatures = printSignatures))) 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.") 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 module = loadModule()
val signatureRenderer = if (printSignatures) val signatureRenderer = if (printSignatures)
DefaultKlibSignatureRenderer(KotlinIrSignatureVersion.V1, "// Signature: ") // TODO: use the version from `-signature-version` DefaultKlibSignatureRenderer(signatureVersion, "// Signature: ")
else else
KlibSignatureRenderer.NO_SIGNATURE KlibSignatureRenderer.NO_SIGNATURE
val printer = DeclarationPrinter(output, DefaultDeclarationHeaderRenderer, signatureRenderer) val printer = DeclarationPrinter(output, DefaultDeclarationHeaderRenderer, signatureRenderer)
@@ -394,11 +399,11 @@ fun main(args: Array<String>) {
val library = Library(command.library, repository) val library = Library(command.library, repository)
when (command.verb) { 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-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) "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) "signatures" -> library.signatures(System.out, signatureVersion)
"info" -> library.info() "info" -> library.info()
"install" -> library.install() "install" -> library.install()
@@ -19,7 +19,7 @@ class DumpMetadataTest {
private fun dumpMetadata(library: String, printOutput: Boolean = false, expected: () -> String) { private fun dumpMetadata(library: String, printOutput: Boolean = false, expected: () -> String) {
val output = StringBuilder() val output = StringBuilder()
val lib = Library(library, null) val lib = Library(library, null)
lib.dumpMetadata(output, false) lib.dumpMetadata(output, false, null)
if (printOutput) { if (printOutput) {
println(output.trim().toString()) println(output.trim().toString())
} }
@@ -34,7 +34,7 @@ class DumpMetadataTest {
fun `Stdlib content should be printed without exceptions`() { fun `Stdlib content should be printed without exceptions`() {
val output = StringBuilder() val output = StringBuilder()
val distributionPath = System.getProperty("konan.home") val distributionPath = System.getProperty("konan.home")
Library(Distribution(distributionPath).stdlib, null).dumpMetadata(output, false) Library(Distribution(distributionPath).stdlib, null).dumpMetadata(output, false, null)
} }
@Test @Test
@@ -53,7 +53,7 @@ abstract class AbstractNativeKlibDumpIrTest : AbstractNativeSimpleTest() {
) { ) {
val artifact = compilationResult.assertSuccess().resultingArtifact val artifact = compilationResult.assertSuccess().resultingArtifact
val kotlinNativeClassLoader = testRunSettings.get<KotlinNativeClassLoader>() val kotlinNativeClassLoader = testRunSettings.get<KotlinNativeClassLoader>()
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) assertEqualsToFile(expectedContents, klibIr)
} }
@@ -20,29 +20,46 @@ private fun invokeKlibTool(kotlinNativeClassLoader: ClassLoader, klibFile: File,
} }
internal fun TestCompilationArtifact.KLIB.dumpMetadata(kotlinNativeClassLoader: ClassLoader): String { internal fun TestCompilationArtifact.KLIB.dumpMetadata(kotlinNativeClassLoader: ClassLoader): String = invokeKlibTool(
return invokeKlibTool(kotlinNativeClassLoader, klibFile, "dumpMetadata", /* printSignatures= */ false) kotlinNativeClassLoader = kotlinNativeClassLoader,
} klibFile = klibFile,
functionName = "dumpMetadata",
/* printSignatures= */ false,
/* signatureVersion= */ null
)
internal fun TestCompilationArtifact.KLIB.dumpIr( internal fun TestCompilationArtifact.KLIB.dumpIr(
kotlinNativeClassLoader: ClassLoader, kotlinNativeClassLoader: ClassLoader,
printSignatures: Boolean = false, printSignatures: Boolean,
): String { signatureVersion: KotlinIrSignatureVersion?
return invokeKlibTool(kotlinNativeClassLoader, klibFile, "dumpIr", printSignatures) ): String = invokeKlibTool(
} kotlinNativeClassLoader = kotlinNativeClassLoader,
klibFile = klibFile,
functionName = "dumpIr",
/* printSignatures= */ printSignatures,
/* signatureVersion= */ signatureVersion?.let { getSignatureVersionForIsolatedClassLoader(kotlinNativeClassLoader, signatureVersion) }
)
internal fun TestCompilationArtifact.KLIB.dumpIrSignatures( internal fun TestCompilationArtifact.KLIB.dumpIrSignatures(
kotlinNativeClassLoader: ClassLoader, kotlinNativeClassLoader: ClassLoader,
signatureVersion: KotlinIrSignatureVersion, signatureVersion: KotlinIrSignatureVersion,
): String { ): String = invokeKlibTool(
// This ceremony is required to load `KotlinIrSignatureVersion` class from the isolated class loader and thus avoid kotlinNativeClassLoader = kotlinNativeClassLoader,
// "argument type mismatch" exception raised by the Java reflection API. klibFile = klibFile,
// TODO: migrate on CLI-based scheme of invocation of all KLIB tool commands functionName = "dumpIrSignatures",
val signatureVersionForIsolatedClassLoader = Class.forName( /* 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, signatureVersion::class.java.canonicalName,
true, true,
kotlinNativeClassLoader kotlinNativeClassLoader
).getDeclaredConstructor(Int::class.java).newInstance(signatureVersion.number)!! ).getDeclaredConstructor(Int::class.java).newInstance(signatureVersion.number)!!
return invokeKlibTool(kotlinNativeClassLoader, klibFile, "dumpIrSignatures", signatureVersionForIsolatedClassLoader)
} }