Add new compiler errors and flags when JVM compiles against JVM IR

From now on, the old JVM backend will report an error by default when
compiling against class files produced by the JVM IR backend. This is
needed because we're not yet sure that the ABI generated by JVM IR is
fully correct and do not want to land in a 2-dimensional compatibility
situation where we'll need to consider twice more scenarios when
introducing any breaking change in the language. This is generally OK
since the JVM IR backend is still going to be experimental in 1.4.

However, for purposes of users which _do_ need to compile something with
the old backend against JVM IR, we provide two new compiler flags:
* -Xallow-jvm-ir-dependencies -- allows to suppress the error when
  compiling with the old backend against JVM IR.
* -Xir-binary-with-stable-api -- allows to mark the generated binaries
  as stable, when compiling anything with JVM IR, so that dependent
  modules will compile even with the old backend automatically. In this
  case, the author usually does not care for the generated ABI, or s/he
  ensures that it's consistent with the one expected by the old compiler
  with some external tools.

Internally, this is implemented by storing two new flags in
kotlin.Metadata: one tells if the class file was compiled with the JVM
IR, and another tells if the class file is stable (in case it's compiled
with JVM IR). Implementation is similar to the diagnostic reported by
the pre-release dependency checker.
This commit is contained in:
Alexander Udalov
2020-01-15 19:27:39 +01:00
parent f262f61096
commit 953b461c53
37 changed files with 177 additions and 20 deletions
@@ -42,7 +42,7 @@ public annotation class Metadata(
@get:JvmName("d1")
val data1: Array<String> = [],
/**
* An addition to [d1]: array of strings which occur in metadata, written in plain text so that strings already present
* An addition to [data1]: array of strings which occur in metadata, written in plain text so that strings already present
* in the constant pool are reused. These strings may be then indexed in the metadata by an integer index in this array.
*/
@get:JvmName("d2")
@@ -67,7 +67,10 @@ public annotation class Metadata(
* * 1 - this class file is compiled by a pre-release version of Kotlin and is not visible to release versions.
* * 2 - this class file is a compiled Kotlin script source file (.kts).
* * 3 - the metadata of this class file is not supposed to be read by the compiler, whose major.minor version is less than
* the major.minor version of this metadata ([mv]).
* the major.minor version of this metadata ([metadataVersion]).
* * 4 - this class file is compiled with the new Kotlin compiler backend introduced in Kotlin 1.4.
* * 5 - if the class file is compiled with the new Kotlin compiler backend, the metadata has been verified by the author and
* no metadata incompatibility diagnostic should be reported at the call site.
*/
@SinceKotlin("1.1")
@get:JvmName("xi")