[KLIB tool] Respect '-signature-version' in 'dump-metadata' and 'dump-ir' commands
This commit is contained in:
committed by
Space Team
parent
c34e334550
commit
57e004e2b0
@@ -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()
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+31
-14
@@ -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)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user