Merge commit 'a8c6db61ad6808fb56c8cf61dfb1433814f40dc8' into dev-release
diff --git a/infra/config/global/cr-buildbucket.cfg b/infra/config/global/cr-buildbucket.cfg
index c1038e4..9fe678c 100644
--- a/infra/config/global/cr-buildbucket.cfg
+++ b/infra/config/global/cr-buildbucket.cfg
@@ -149,6 +149,15 @@
}
}
builders {
+ name: "desugared_library_jdk11_head"
+ mixins: "linux"
+ mixins: "normal"
+ priority: 26
+ recipe {
+ properties_j: "test_options:[\"--no_internal\", \"--desugared-library\", \"HEAD\", \"--desugared-library-configuration\", \"jdk11\"]"
+ }
+ }
+ builders {
name: "linux-dex-default"
mixins: "linux"
mixins: "normal"
diff --git a/infra/config/global/generated/cr-buildbucket.cfg b/infra/config/global/generated/cr-buildbucket.cfg
new file mode 100644
index 0000000..b8a3edb
--- /dev/null
+++ b/infra/config/global/generated/cr-buildbucket.cfg
@@ -0,0 +1,592 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see BuildbucketCfg message:
+# https://luci-config.appspot.com/schemas/projects:buildbucket.cfg
+
+buckets {
+ name: "ci"
+ acls {
+ group: "all"
+ }
+ acls {
+ role: SCHEDULER
+ group: "luci-scheduler@appspot.gserviceaccount.com"
+ }
+ acls {
+ role: SCHEDULER
+ group: "project-r8-committers"
+ }
+ swarming {
+ builders {
+ name: "archive"
+ swarming_host: "chrome-swarming.appspot.com"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "archive:true"
+ }
+ execution_timeout_secs: 1800
+ }
+ builders {
+ name: "archive_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "archive:true"
+ }
+ execution_timeout_secs: 1800
+ }
+ builders {
+ name: "linux-android-4.0.4"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=4.0.4\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android-4.0.4_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=4.0.4\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android-4.4.4"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=4.4.4\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android-4.4.4_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=4.4.4\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android-5.1.1"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=5.1.1\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android-5.1.1_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=5.1.1\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android-6.0.1"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=6.0.1\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android-6.0.1_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=6.0.1\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android-7.0.0"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=7.0.0\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android-7.0.0_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=7.0.0\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android=10.0.0"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=10.0.0\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android=10.0.0_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=10.0.0\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android=8.1.0"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=8.1.0\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android=8.1.0_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=8.1.0\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android=9.0.0"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=9.0.0\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-android=9.0.0_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--dex_vm=9.0.0\",\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-dex_default"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=dex-default\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-dex_default_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=dex-default\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-internal"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=jdk11\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-internal_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=jdk11\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-jdk11"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=jdk11\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-jdk11_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=jdk11\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-jdk8"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=jdk8\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-jdk8_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=jdk8\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-jdk9"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=jdk9\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-jdk9_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=jdk9\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-none"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=none\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "linux-none_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu-16.04"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--runtimes=none\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "windows"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:windows-10"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ builders {
+ name: "windows_release"
+ swarming_host: "chrome-swarming.appspot.com"
+ swarming_tags: "vpython:native-python-wrapper"
+ dimensions: "cores:8"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:windows-10"
+ dimensions: "pool:luci.r8.ci"
+ recipe {
+ name: "rex"
+ cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+ cipd_version: "refs/heads/master"
+ properties_j: "test_options:[\"--all_tests\",\"--tool=r8\",\"--no_internal\",\"--one_line_per_test\",\"--archive_failures\"]"
+ }
+ execution_timeout_secs: 21600
+ expiration_secs: 126000
+ service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+ }
+ }
+}
diff --git a/infra/config/global/generated/luci-milo.cfg b/infra/config/global/generated/luci-milo.cfg
new file mode 100644
index 0000000..3202e40
--- /dev/null
+++ b/infra/config/global/generated/luci-milo.cfg
@@ -0,0 +1,173 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see Project message:
+# https://luci-config.appspot.com/schemas/projects:luci-milo.cfg
+
+consoles {
+ id: "main"
+ name: "R8 Main Console"
+ repo_url: "https://r8.googlesource.com/r8"
+ refs: "regexp:regexp:refs/heads/.*"
+ manifest_name: "REVISION"
+ builders {
+ name: "buildbucket/luci.r8.ci/archive"
+ category: "R8"
+ short_name: "archive"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/archive_release"
+ category: "R8"
+ short_name: "archive_release"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-dex_default"
+ category: "R8"
+ short_name: "dex_default"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-dex_default_release"
+ category: "R8 release"
+ short_name: "dex_default"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-none"
+ category: "R8"
+ short_name: "none"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-none_release"
+ category: "R8 release"
+ short_name: "none"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-jdk8"
+ category: "R8"
+ short_name: "jdk8"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-jdk8_release"
+ category: "R8 release"
+ short_name: "jdk8"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-jdk9"
+ category: "R8"
+ short_name: "jdk9"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-jdk9_release"
+ category: "R8 release"
+ short_name: "jdk9"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-jdk11"
+ category: "R8"
+ short_name: "jdk11"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-jdk11_release"
+ category: "R8 release"
+ short_name: "jdk11"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-internal"
+ category: "R8"
+ short_name: "internal"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-internal_release"
+ category: "R8 release"
+ short_name: "internal"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-4.0.4"
+ category: "R8"
+ short_name: "4.0.4"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-4.0.4_release"
+ category: "R8 release"
+ short_name: "4.0.4"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-4.4.4"
+ category: "R8"
+ short_name: "4.4.4"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-4.4.4_release"
+ category: "R8 release"
+ short_name: "4.4.4"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-5.1.1"
+ category: "R8"
+ short_name: "5.1.1"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-5.1.1_release"
+ category: "R8 release"
+ short_name: "5.1.1"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-6.0.1"
+ category: "R8"
+ short_name: "6.0.1"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-6.0.1_release"
+ category: "R8 release"
+ short_name: "6.0.1"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-7.0.0"
+ category: "R8"
+ short_name: "7.0.0"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android-7.0.0_release"
+ category: "R8 release"
+ short_name: "7.0.0"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android=8.1.0"
+ category: "R8"
+ short_name: "android=8.1.0"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android=8.1.0_release"
+ category: "R8 release"
+ short_name: "android=8.1.0"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android=9.0.0"
+ category: "R8"
+ short_name: "android=9.0.0"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android=9.0.0_release"
+ category: "R8 release"
+ short_name: "android=9.0.0"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android=10.0.0"
+ category: "R8"
+ short_name: "android=10.0.0"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/linux-android=10.0.0_release"
+ category: "R8 release"
+ short_name: "android=10.0.0"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/windows"
+ category: "R8"
+ short_name: "windows"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/windows_release"
+ category: "R8 release"
+ short_name: "windows"
+ }
+}
diff --git a/infra/config/global/generated/luci-notify.cfg b/infra/config/global/generated/luci-notify.cfg
new file mode 100644
index 0000000..24a7816
--- /dev/null
+++ b/infra/config/global/generated/luci-notify.cfg
@@ -0,0 +1,366 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see ProjectConfig message:
+# https://luci-config.appspot.com/schemas/projects:luci-notify.cfg
+
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-4.0.4"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-4.0.4_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-4.4.4"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-4.4.4_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-5.1.1"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-5.1.1_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-6.0.1"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-6.0.1_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-7.0.0"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android-7.0.0_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android=10.0.0"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android=10.0.0_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android=8.1.0"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android=8.1.0_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android=9.0.0"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-android=9.0.0_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-dex_default"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-dex_default_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-internal"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-internal_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-jdk11"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-jdk11_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-jdk8"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-jdk8_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-jdk9"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-jdk9_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-none"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "linux-none_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "windows"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
+notifiers {
+ notifications {
+ on_failure: true
+ on_new_failure: true
+ notify_blamelist {}
+ }
+ builders {
+ bucket: "ci"
+ name: "windows_release"
+ repository: "https://r8.googlesource.com/r8"
+ }
+}
diff --git a/infra/config/global/generated/luci-scheduler.cfg b/infra/config/global/generated/luci-scheduler.cfg
new file mode 100644
index 0000000..72809c3
--- /dev/null
+++ b/infra/config/global/generated/luci-scheduler.cfg
@@ -0,0 +1,359 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see ProjectConfig message:
+# https://luci-config.appspot.com/schemas/projects:luci-scheduler.cfg
+
+job {
+ id: "archive"
+ acl_sets: "ci"
+ triggering_policy {
+ kind: GREEDY_BATCHING
+ max_concurrent_invocations: 3
+ max_batch_size: 1
+ }
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "archive"
+ }
+}
+job {
+ id: "archive_release"
+ acl_sets: "ci"
+ triggering_policy {
+ kind: GREEDY_BATCHING
+ max_concurrent_invocations: 3
+ max_batch_size: 1
+ }
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "archive_release"
+ }
+}
+job {
+ id: "linux-android-4.0.4"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-4.0.4"
+ }
+}
+job {
+ id: "linux-android-4.0.4_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-4.0.4_release"
+ }
+}
+job {
+ id: "linux-android-4.4.4"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-4.4.4"
+ }
+}
+job {
+ id: "linux-android-4.4.4_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-4.4.4_release"
+ }
+}
+job {
+ id: "linux-android-5.1.1"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-5.1.1"
+ }
+}
+job {
+ id: "linux-android-5.1.1_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-5.1.1_release"
+ }
+}
+job {
+ id: "linux-android-6.0.1"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-6.0.1"
+ }
+}
+job {
+ id: "linux-android-6.0.1_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-6.0.1_release"
+ }
+}
+job {
+ id: "linux-android-7.0.0"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-7.0.0"
+ }
+}
+job {
+ id: "linux-android-7.0.0_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android-7.0.0_release"
+ }
+}
+job {
+ id: "linux-android=10.0.0"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android=10.0.0"
+ }
+}
+job {
+ id: "linux-android=10.0.0_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android=10.0.0_release"
+ }
+}
+job {
+ id: "linux-android=8.1.0"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android=8.1.0"
+ }
+}
+job {
+ id: "linux-android=8.1.0_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android=8.1.0_release"
+ }
+}
+job {
+ id: "linux-android=9.0.0"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android=9.0.0"
+ }
+}
+job {
+ id: "linux-android=9.0.0_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-android=9.0.0_release"
+ }
+}
+job {
+ id: "linux-dex_default"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-dex_default"
+ }
+}
+job {
+ id: "linux-dex_default_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-dex_default_release"
+ }
+}
+job {
+ id: "linux-internal"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-internal"
+ }
+}
+job {
+ id: "linux-internal_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-internal_release"
+ }
+}
+job {
+ id: "linux-jdk11"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-jdk11"
+ }
+}
+job {
+ id: "linux-jdk11_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-jdk11_release"
+ }
+}
+job {
+ id: "linux-jdk8"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-jdk8"
+ }
+}
+job {
+ id: "linux-jdk8_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-jdk8_release"
+ }
+}
+job {
+ id: "linux-jdk9"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-jdk9"
+ }
+}
+job {
+ id: "linux-jdk9_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-jdk9_release"
+ }
+}
+job {
+ id: "linux-none"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-none"
+ }
+}
+job {
+ id: "linux-none_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "linux-none_release"
+ }
+}
+job {
+ id: "windows"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "windows"
+ }
+}
+job {
+ id: "windows_release"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "windows_release"
+ }
+}
+trigger {
+ id: "branch-gitiles-trigger"
+ acl_sets: "ci"
+ triggers: "archive_release"
+ triggers: "linux-android-4.0.4_release"
+ triggers: "linux-android-4.4.4_release"
+ triggers: "linux-android-5.1.1_release"
+ triggers: "linux-android-6.0.1_release"
+ triggers: "linux-android-7.0.0_release"
+ triggers: "linux-android=10.0.0_release"
+ triggers: "linux-android=8.1.0_release"
+ triggers: "linux-android=9.0.0_release"
+ triggers: "linux-dex_default_release"
+ triggers: "linux-internal_release"
+ triggers: "linux-jdk11_release"
+ triggers: "linux-jdk8_release"
+ triggers: "linux-jdk9_release"
+ triggers: "linux-none_release"
+ triggers: "windows_release"
+ gitiles {
+ repo: "https://r8.googlesource.com/r8"
+ refs: "regexp:regexp:refs/heads/(?:d8-)?[0-9]+\\.[0-9]+(\\.[0-9]+)?"
+ path_regexps: "src/main/java/com/android/tools/r8/Version.java"
+ }
+}
+trigger {
+ id: "main-gitiles-trigger"
+ acl_sets: "ci"
+ triggers: "archive"
+ triggers: "linux-android-4.0.4"
+ triggers: "linux-android-4.4.4"
+ triggers: "linux-android-5.1.1"
+ triggers: "linux-android-6.0.1"
+ triggers: "linux-android-7.0.0"
+ triggers: "linux-android=10.0.0"
+ triggers: "linux-android=8.1.0"
+ triggers: "linux-android=9.0.0"
+ triggers: "linux-dex_default"
+ triggers: "linux-internal"
+ triggers: "linux-jdk11"
+ triggers: "linux-jdk8"
+ triggers: "linux-jdk9"
+ triggers: "linux-none"
+ triggers: "windows"
+ gitiles {
+ repo: "https://r8.googlesource.com/r8"
+ refs: "regexp:refs/heads/master"
+ }
+}
+acl_sets {
+ name: "ci"
+ acls {
+ granted_to: "group:all"
+ }
+}
diff --git a/infra/config/global/generated/project.cfg b/infra/config/global/generated/project.cfg
new file mode 100644
index 0000000..97e5a27
--- /dev/null
+++ b/infra/config/global/generated/project.cfg
@@ -0,0 +1,8 @@
+# Auto-generated by lucicfg.
+# Do not modify manually.
+#
+# For the schema of this file, see ProjectCfg message:
+# https://luci-config.appspot.com/schemas/projects:project.cfg
+
+name: "r8"
+access: "group:all"
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg
index 5b0bb98..8218353 100644
--- a/infra/config/global/luci-milo.cfg
+++ b/infra/config/global/luci-milo.cfg
@@ -102,13 +102,18 @@
}
builders {
name: "buildbucket/luci.r8.ci/archive_lib_desugar"
- category: "archive_desugar"
- short_name: "sdk_desugar"
+ category: "library_desugar"
+ short_name: "release"
}
builders {
name: "buildbucket/luci.r8.ci/desugared_library_head"
- category: "archive_desugar"
- short_name: "head_desugar"
+ category: "library_desugar"
+ short_name: "head"
+ }
+ builders {
+ name: "buildbucket/luci.r8.ci/desugared_library_jdk11_head"
+ category: "library_desugar"
+ short_name: "head_jdk11"
}
builders {
name: "buildbucket/luci.r8.ci/archive_release"
diff --git a/infra/config/global/luci-scheduler.cfg b/infra/config/global/luci-scheduler.cfg
index d6c888e..4bd0b89 100644
--- a/infra/config/global/luci-scheduler.cfg
+++ b/infra/config/global/luci-scheduler.cfg
@@ -45,6 +45,7 @@
triggers: "r8cf-linux-jctf"
triggers: "windows"
triggers: "desugared_library_head"
+ triggers: "desugared_library_jdk11_head"
}
trigger {
@@ -165,6 +166,19 @@
}
job {
+ id: "desugared_library_jdk11_head"
+ acl_sets: "default"
+ triggering_policy: {
+ max_concurrent_invocations: 1
+ }
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "luci.r8.ci"
+ builder: "desugared_library_jdk11_head"
+ }
+}
+
+job {
id: "kotlin-builder"
acl_sets: "default"
triggering_policy: {
diff --git a/infra/config/global/main.star b/infra/config/global/main.star
new file mode 100755
index 0000000..cdadb61
--- /dev/null
+++ b/infra/config/global/main.star
@@ -0,0 +1,209 @@
+#!/usr/bin/env lucicfg
+
+luci.project(
+ name = "r8",
+ buildbucket = "cr-buildbucket.appspot.com",
+ logdog = "luci-logdog.appspot.com",
+ milo = "luci-milo.appspot.com",
+ notify = "luci-notify.appspot.com",
+ scheduler = "luci-scheduler.appspot.com",
+ swarming = "chrome-swarming.appspot.com",
+ acls = [
+ acl.entry(
+ [
+ acl.BUILDBUCKET_READER,
+ acl.LOGDOG_READER,
+ acl.PROJECT_CONFIGS_READER,
+ acl.SCHEDULER_READER,
+ ],
+ groups = ["all"],
+ ),
+ acl.entry(
+ [
+ acl.BUILDBUCKET_TRIGGERER,
+ ],
+ groups = [
+ "luci-scheduler@appspot.gserviceaccount.com",
+ "project-r8-committers"
+ ],
+ ),
+
+ ]
+)
+
+luci.bucket(name = "ci")
+
+luci.milo()
+
+luci.notifier(
+ name = "r8-failures",
+ on_failure = True,
+ on_new_failure = True,
+ notify_blamelist = True
+)
+
+luci.gitiles_poller(
+ name = "main-gitiles-trigger",
+ bucket = "ci",
+ repo = "https://r8.googlesource.com/r8"
+)
+
+luci.gitiles_poller(
+ name = "branch-gitiles-trigger",
+ bucket = "ci",
+ repo = "https://r8.googlesource.com/r8",
+ # Version branches are named d8-x.y (up until d8-1.5) or just x.y (from 1.6)
+ refs = ["regexp:refs/heads/(?:d8-)?[0-9]+\\.[0-9]+(\\.[0-9]+)?"],
+ path_regexps = ["src/main/java/com/android/tools/r8/Version.java"]
+)
+
+luci.console_view(
+ name = "main",
+ title = "R8 Main Console",
+ repo = "https://r8.googlesource.com/r8",
+ refs = ["regexp:refs/heads/.*"]
+)
+
+def builder_view(name, category, short_name):
+ return luci.console_view_entry(
+ console_view = "main",
+ builder = name,
+ category = category,
+ short_name = short_name,
+ )
+
+luci.recipe(
+ name="rex",
+ cipd_package = "infra_internal/recipe_bundles/" +
+ "chrome-internal.googlesource.com/chrome/" +
+ "tools/build_limited/scripts/slave",
+ cipd_version = "refs/heads/master"
+)
+
+common_test_options = [
+ "--tool=r8",
+ "--no_internal",
+ "--one_line_per_test",
+ "--archive_failures"
+]
+
+def get_dimensions(windows=False, jctf=False, internal=False):
+ dimensions = {
+ "cores" : "2" if internal else "8",
+ "cpu" : "x86-64",
+ "pool" : "luci.r8.ci"
+ }
+ if windows:
+ dimensions["os"] = "windows-10"
+ else:
+ dimensions["os"] = "Ubuntu-16.04"
+ if jctf:
+ dimensions["jctf"] = "true"
+ if internal:
+ dimensions["internal"] = "true"
+ return dimensions
+
+def r8_tester(name,
+ test_options,
+ dimensions=None,
+ execution_timeout=time.hour * 6,
+ expiration_timeout=time.hour * 35):
+ dimensions = dimensions if dimensions else get_dimensions()
+ luci.builder(
+ name = name,
+ bucket = "ci",
+ service_account = "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
+ swarming_tags = ["vpython:native-python-wrapper"],
+ execution_timeout=execution_timeout,
+ expiration_timeout=expiration_timeout,
+ executable = "rex",
+ dimensions = dimensions,
+ triggered_by = ["main-gitiles-trigger"],
+ properties = {
+ "test_options" : test_options
+ },
+ notifies = ["r8-failures"]
+ )
+ builder_view(name, "R8", name.split("-")[-1])
+
+ # Branch version
+ release_name = name + "_release"
+ luci.builder(
+ name = release_name,
+ bucket = "ci",
+ service_account = "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
+ swarming_tags = ["vpython:native-python-wrapper"],
+ execution_timeout=execution_timeout,
+ expiration_timeout=expiration_timeout,
+ executable = "rex",
+ dimensions = dimensions,
+ triggered_by = ["branch-gitiles-trigger"],
+ properties = {
+ "test_options" : test_options
+ },
+ notifies = ["r8-failures"]
+ )
+ builder_view(release_name, "R8 release", name.split("-")[-1])
+
+def r8_tester_with_default(name, test_options, dimensions=None):
+ r8_tester(name, test_options + common_test_options, dimensions)
+
+luci.builder(
+ name = "archive",
+ bucket = "ci",
+ dimensions = get_dimensions(),
+ triggered_by = ["main-gitiles-trigger"],
+ executable = "rex",
+ execution_timeout = time.minute * 30,
+ triggering_policy = scheduler.policy(
+ kind = scheduler.GREEDY_BATCHING_KIND,
+ max_batch_size = 1,
+ max_concurrent_invocations = 3
+ ),
+ properties = {"archive": True}
+)
+builder_view("archive", "R8", "archive")
+
+luci.builder(
+ name = "archive_release",
+ bucket = "ci",
+ dimensions = get_dimensions(),
+ triggered_by = ["branch-gitiles-trigger"],
+ execution_timeout = time.minute * 30,
+ executable = "rex",
+ triggering_policy = scheduler.policy(
+ kind = scheduler.GREEDY_BATCHING_KIND,
+ max_batch_size = 1,
+ max_concurrent_invocations = 3
+ ),
+ properties = {"archive": True}
+)
+builder_view("archive_release", "R8", "archive_release")
+
+r8_tester_with_default("linux-dex_default", ["--runtimes=dex-default"])
+r8_tester_with_default("linux-none", ["--runtimes=none"])
+r8_tester_with_default("linux-jdk8", ["--runtimes=jdk8"])
+r8_tester_with_default("linux-jdk9", ["--runtimes=jdk9"])
+r8_tester_with_default("linux-jdk11", ["--runtimes=jdk11"])
+
+r8_tester_with_default("linux-internal", ["--runtimes=jdk11"])
+
+r8_tester_with_default("linux-android-4.0.4",
+ ["--dex_vm=4.0.4", "--all_tests"])
+r8_tester_with_default("linux-android-4.4.4",
+ ["--dex_vm=4.4.4", "--all_tests"])
+r8_tester_with_default("linux-android-5.1.1",
+ ["--dex_vm=5.1.1", "--all_tests"])
+r8_tester_with_default("linux-android-6.0.1",
+ ["--dex_vm=6.0.1", "--all_tests"])
+r8_tester_with_default("linux-android-7.0.0",
+ ["--dex_vm=7.0.0", "--all_tests"])
+r8_tester_with_default("linux-android=8.1.0",
+ ["--dex_vm=8.1.0", "--all_tests"])
+r8_tester_with_default("linux-android=9.0.0",
+ ["--dex_vm=9.0.0", "--all_tests"])
+r8_tester_with_default("linux-android=10.0.0",
+ ["--dex_vm=10.0.0", "--all_tests"])
+
+r8_tester_with_default("windows", ["--all_tests"],
+ dimensions=get_dimensions(windows=True))
diff --git a/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
new file mode 100644
index 0000000..ad27516
--- /dev/null
+++ b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
@@ -0,0 +1,39 @@
+{
+ "configuration_format_version": 3,
+ "group_id" : "com.tools.android",
+ "artifact_id" : "chm_only_desugar_jdk_libs",
+ "version": "1.0.12",
+ "required_compilation_api_level": 26,
+ "synthesized_library_classes_package_prefix": "j$.",
+ "support_all_callbacks_from_library": false,
+ "common_flags": [
+ ],
+ "library_flags": [
+ {
+ "api_level_below_or_equal": 23,
+ "rewrite_prefix": {
+ "java.util.concurrent.Helpers": "j$.util.concurrent.Helpers",
+ "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
+ "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap",
+ "sun.misc.Desugar": "j$.sun.misc.Desugar"
+ }
+ }
+ ],
+ "program_flags": [
+ {
+ "api_level_below_or_equal": 23,
+ "rewrite_prefix": {
+ "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
+ "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap"
+ }
+ }
+ ],
+ "shrinker_config": [
+ "-keepclassmembers class j$.util.concurrent.ConcurrentHashMap$TreeBin { int lockState; }",
+ "-keepclassmembers class j$.util.concurrent.ConcurrentHashMap { int sizeCtl; int transferIndex; long baseCount; int cellsBusy; }",
+ "-keepclassmembers class j$.util.concurrent.ConcurrentHashMap$CounterCell { long value; }",
+ "-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }",
+ "-keeppackagenames j$",
+ "-dontwarn sun.misc.Unsafe"
+ ]
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
index 9e1b306..5049ee4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedField.java
@@ -22,6 +22,7 @@
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
import com.android.tools.r8.kotlin.KotlinFieldLevelInfo;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
+import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.ConsumerUtils;
import com.android.tools.r8.utils.structural.StructuralItem;
import com.android.tools.r8.utils.structural.StructuralMapping;
@@ -127,6 +128,11 @@
return optimizationInfo;
}
+ @Override
+ public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApiLevel) {
+ return optimizationInfo.getApiReferenceLevelForDefinition(minApiLevel);
+ }
+
public synchronized MutableFieldOptimizationInfo getMutableOptimizationInfo() {
MutableFieldOptimizationInfo mutableInfo = optimizationInfo.toMutableOptimizationInfo();
optimizationInfo = mutableInfo;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java
index e054ffa..c1ce2f5 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java
@@ -5,6 +5,7 @@
import com.android.tools.r8.ir.optimize.info.MemberOptimizationInfo;
import com.android.tools.r8.kotlin.KotlinMemberLevelInfo;
+import com.android.tools.r8.utils.AndroidApiLevel;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -84,6 +85,8 @@
public abstract MemberOptimizationInfo<?> getOptimizationInfo();
+ public abstract AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApiLevel);
+
@Override
public final boolean equals(Object other) {
if (other == this) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 2fdb279..d3af4ee 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -70,6 +70,7 @@
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.position.MethodPosition;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
+import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.ConsumerUtils;
import com.android.tools.r8.utils.InternalOptions;
@@ -1407,6 +1408,20 @@
return optimizationInfo;
}
+ public AndroidApiLevel getApiReferenceLevelForDefinition(AndroidApiLevel minApiLevel) {
+ return optimizationInfo.getApiReferenceLevelForDefinition(minApiLevel);
+ }
+
+ public AndroidApiLevel getApiReferenceLevelForCode(AndroidApiLevel minApiLevel) {
+ return optimizationInfo.getApiReferenceLevelForCode(minApiLevel);
+ }
+
+ @Override
+ public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApiLevel) {
+ return getApiReferenceLevelForDefinition(minApiLevel)
+ .max(getApiReferenceLevelForCode(minApiLevel));
+ }
+
public synchronized MutableMethodOptimizationInfo getMutableOptimizationInfo() {
checkIfObsolete();
MutableMethodOptimizationInfo mutableInfo = optimizationInfo.toMutableOptimizationInfo();
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index 64608dc..90841e1 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -15,7 +15,6 @@
import com.android.tools.r8.graph.GenericSignature.ClassSignature;
import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
-import com.android.tools.r8.ir.optimize.info.MemberOptimizationInfo;
import com.android.tools.r8.kotlin.KotlinClassLevelInfo;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.origin.Origin;
@@ -835,9 +834,7 @@
}
}
for (DexEncodedMember<?, ?> member : members()) {
- MemberOptimizationInfo<?> optimizationInfo = member.getOptimizationInfo();
- assert optimizationInfo.hasApiReferenceLevel();
- computedApiLevel = optimizationInfo.getApiReferenceLevel(computedApiLevel);
+ computedApiLevel = member.getApiReferenceLevel(computedApiLevel);
if (computedApiLevel == AndroidApiLevel.UNKNOWN) {
return AndroidApiLevel.UNKNOWN;
}
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/ApiModelAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/ApiModelAnalysis.java
index 65840c5..32c9420 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/ApiModelAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/ApiModelAnalysis.java
@@ -7,13 +7,16 @@
import com.android.tools.r8.androidapi.AndroidApiReferenceLevelCache;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedMember;
+import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexMember;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.optimize.info.DefaultFieldOptimizationWithMinApiInfo;
+import com.android.tools.r8.ir.optimize.info.DefaultMethodOptimizationInfo;
import com.android.tools.r8.ir.optimize.info.DefaultMethodOptimizationWithMinApiInfo;
import com.android.tools.r8.ir.optimize.info.MemberOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
import com.android.tools.r8.shaking.DefaultEnqueuerUseRegistry;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -31,13 +34,13 @@
@Override
public void processNewlyLiveField(ProgramField field, ProgramDefinition context) {
- setApiLevelForMember(
+ setApiLevelForMemberDefinition(
field.getDefinition(), computeApiLevelForReferencedTypes(field.getReference()));
}
@Override
public void processNewlyLiveMethod(ProgramMethod method, ProgramDefinition context) {
- setApiLevelForMember(
+ setApiLevelForMemberDefinition(
method.getDefinition(), computeApiLevelForReferencedTypes(method.getReference()));
}
@@ -51,10 +54,13 @@
.tracedMethodApiLevelCallback
.accept(method.getMethodReference(), registry.getMaxApiReferenceLevel());
}
- setApiLevelForMember(method.getDefinition(), registry.getMaxApiReferenceLevel());
+ setApiLevelForMemberDefinition(
+ method.getDefinition(), computeApiLevelForReferencedTypes(method.getReference()));
+ setApiLevelForCode(method.getDefinition(), registry.getMaxApiReferenceLevel());
}
- private void setApiLevelForMember(DexEncodedMember<?, ?> member, AndroidApiLevel apiLevel) {
+ private void setApiLevelForMemberDefinition(
+ DexEncodedMember<?, ?> member, AndroidApiLevel apiLevel) {
// To not have mutable update information for all members that all has min api level we
// swap the default optimization info for one with that marks the api level to be min api.
MemberOptimizationInfo<?> optimizationInfo = member.getOptimizationInfo();
@@ -68,19 +74,29 @@
});
} else {
AndroidApiLevel maxApiLevel =
- optimizationInfo.hasApiReferenceLevel()
- ? apiLevel.max(optimizationInfo.getApiReferenceLevel(minApiLevel))
+ optimizationInfo.hasApiReferenceLevelForDefinition()
+ ? apiLevel.max(optimizationInfo.getApiReferenceLevelForDefinition(minApiLevel))
: apiLevel;
member.accept(
field -> {
- field.getMutableOptimizationInfo().setApiReferenceLevel(maxApiLevel);
+ field.getMutableOptimizationInfo().setApiReferenceLevelForDefinition(maxApiLevel);
},
method -> {
- method.getMutableOptimizationInfo().setApiReferenceLevel(maxApiLevel);
+ method.getMutableOptimizationInfo().setApiReferenceLevelForDefinition(maxApiLevel);
});
}
}
+ private void setApiLevelForCode(DexEncodedMethod method, AndroidApiLevel apiLevel) {
+ MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
+ assert optimizationInfo != DefaultMethodOptimizationInfo.getInstance();
+ if (!optimizationInfo.isMutableOptimizationInfo() && apiLevel == minApiLevel) {
+ assert optimizationInfo == DefaultMethodOptimizationWithMinApiInfo.getInstance();
+ return;
+ }
+ method.getMutableOptimizationInfo().setApiReferenceLevelForCode(apiLevel);
+ }
+
private AndroidApiLevel computeApiLevelForReferencedTypes(DexMember<?, ?> member) {
return member.computeApiLevelForReferencedTypes(appView, referenceLevelCache::lookupMax);
}
diff --git a/src/main/java/com/android/tools/r8/graph/analysis/DesugaredLibraryConversionWrapperAnalysis.java b/src/main/java/com/android/tools/r8/graph/analysis/DesugaredLibraryConversionWrapperAnalysis.java
index c9788bd..28d6be7 100644
--- a/src/main/java/com/android/tools/r8/graph/analysis/DesugaredLibraryConversionWrapperAnalysis.java
+++ b/src/main/java/com/android/tools/r8/graph/analysis/DesugaredLibraryConversionWrapperAnalysis.java
@@ -8,8 +8,6 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.ir.code.Invoke;
-import com.android.tools.r8.ir.code.Invoke.Type;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter.Mode;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
@@ -32,33 +30,33 @@
converter.registerCallbackIfRequired(method);
}
- private void traceInvoke(DexMethod invokedMethod, Type invokeType, ProgramMethod context) {
- converter.registerWrappersForLibraryInvokeIfRequired(invokedMethod, invokeType, context);
+ private void traceInvoke(DexMethod invokedMethod) {
+ converter.registerWrappersForLibraryInvokeIfRequired(invokedMethod);
}
@Override
public void traceInvokeStatic(DexMethod invokedMethod, ProgramMethod context) {
- this.traceInvoke(invokedMethod, Type.STATIC, context);
+ this.traceInvoke(invokedMethod);
}
@Override
public void traceInvokeDirect(DexMethod invokedMethod, ProgramMethod context) {
- this.traceInvoke(invokedMethod, Type.DIRECT, context);
+ this.traceInvoke(invokedMethod);
}
@Override
public void traceInvokeInterface(DexMethod invokedMethod, ProgramMethod context) {
- this.traceInvoke(invokedMethod, Type.INTERFACE, context);
+ this.traceInvoke(invokedMethod);
}
@Override
public void traceInvokeSuper(DexMethod invokedMethod, ProgramMethod context) {
- this.traceInvoke(invokedMethod, Type.SUPER, context);
+ this.traceInvoke(invokedMethod);
}
@Override
public void traceInvokeVirtual(DexMethod invokedMethod, ProgramMethod context) {
- this.traceInvoke(invokedMethod, Invoke.Type.VIRTUAL, context);
+ this.traceInvoke(invokedMethod);
}
public ProgramMethodSet generateCallbackMethods() {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java
index 514002e..9508da1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java
@@ -13,6 +13,8 @@
import com.android.tools.r8.ir.desugar.CfClassDesugaringEventConsumer.D8CfClassDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer.D8CfInstructionDesugaringEventConsumer;
+import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
+import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer.D8CfPostProcessingDesugaringEventConsumer;
import com.android.tools.r8.utils.ThreadUtils;
import com.google.common.collect.Sets;
import java.util.ArrayList;
@@ -56,6 +58,7 @@
D8CfClassDesugaringEventConsumer classDesugaringEventConsumer =
CfClassDesugaringEventConsumer.createForD8(methodProcessor);
converter.desugarClassesForD8(classes, classDesugaringEventConsumer, executorService);
+ converter.prepareDesugaringForD8(executorService);
while (!classes.isEmpty()) {
Set<DexType> seenNestHosts = Sets.newIdentityHashSet();
@@ -75,11 +78,6 @@
D8CfInstructionDesugaringEventConsumer instructionDesugaringEventConsumer =
CfInstructionDesugaringEventConsumer.createForD8(methodProcessor);
- // TODO(b/191656218): Move upfront the loop and use maybe the class event consumer.
- if (appView.options().isDesugaredLibraryCompilation()) {
- converter.ensureWrappersForL8(instructionDesugaringEventConsumer);
- }
-
// Process the wave and wait for all IR processing to complete.
methodProcessor.newWave();
ThreadUtils.processItems(
@@ -114,6 +112,13 @@
classes = deferred;
}
+
+ D8CfPostProcessingDesugaringEventConsumer eventConsumer =
+ CfPostProcessingDesugaringEventConsumer.createForD8(methodProcessor, appView);
+ methodProcessor.newWave();
+ converter.postProcessDesugaring(eventConsumer);
+ methodProcessor.awaitMethodProcessing();
+ eventConsumer.finalizeDesugaring();
}
abstract void convertClass(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index b6b40f8..0b3c524 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -51,12 +51,11 @@
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer.D8CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringCollection;
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
-import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer.D8CfPostProcessingDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.CovariantReturnTypeAnnotationTransformer;
+import com.android.tools.r8.ir.desugar.ProgramAdditions;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter.Mode;
import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceApplicationRewriter;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
import com.android.tools.r8.ir.desugar.lambda.LambdaDeserializationMethodRemover;
@@ -95,6 +94,7 @@
import com.android.tools.r8.ir.optimize.string.StringOptimizer;
import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
+import com.android.tools.r8.ir.synthetic.SynthesizedCode;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.naming.IdentifierNameStringMarker;
import com.android.tools.r8.position.MethodPosition;
@@ -226,8 +226,12 @@
assert options.desugarState.isOn();
this.instructionDesugaring = CfInstructionDesugaringCollection.create(appView);
this.classDesugaring = instructionDesugaring.createClassDesugaringCollection();
- this.interfaceMethodRewriter = null;
- this.desugaredLibraryAPIConverter = null;
+ this.interfaceMethodRewriter =
+ options.desugaredLibraryConfiguration.getEmulateLibraryInterface().isEmpty()
+ ? null
+ : new InterfaceMethodRewriter(appView, this);
+ this.desugaredLibraryAPIConverter =
+ new DesugaredLibraryAPIConverter(appView, Mode.GENERATE_CALLBACKS_AND_WRAPPERS);
this.covariantReturnTypeAnnotationTransformer = null;
this.dynamicTypeOptimization = null;
this.classInliner = null;
@@ -255,7 +259,7 @@
: CfInstructionDesugaringCollection.create(appView);
this.classDesugaring = instructionDesugaring.createClassDesugaringCollection();
this.interfaceMethodRewriter =
- options.isInterfaceMethodDesugaringEnabled() && appView.enableWholeProgramOptimizations()
+ options.isInterfaceMethodDesugaringEnabled()
? new InterfaceMethodRewriter(appView, this)
: null;
this.covariantReturnTypeAnnotationTransformer =
@@ -319,7 +323,10 @@
this.identifierNameStringMarker = null;
this.devirtualizer = null;
this.typeChecker = null;
- this.desugaredLibraryAPIConverter = null;
+ this.desugaredLibraryAPIConverter =
+ appView.rewritePrefix.isRewriting()
+ ? new DesugaredLibraryAPIConverter(appView, Mode.GENERATE_CALLBACKS_AND_WRAPPERS)
+ : null;
this.serviceLoaderRewriter = null;
this.methodOptimizationInfoCollector = null;
this.enumValueOptimizer = null;
@@ -360,11 +367,9 @@
D8NestBasedAccessDesugaring::clearNestAttributes);
}
- public void ensureWrappersForL8(
- D8CfInstructionDesugaringEventConsumer instructionDesugaringEventConsumer) {
- assert appView.options().isDesugaredLibraryCompilation();
- instructionDesugaring.withDesugaredLibraryAPIConverter(
- converter -> converter.ensureWrappersForL8(instructionDesugaringEventConsumer));
+ void postProcessDesugaring(CfPostProcessingDesugaringEventConsumer eventConsumer) {
+ CfPostProcessingDesugaringCollection.create(appView, instructionDesugaring.getRetargetingInfo())
+ .postProcessingDesugaring(eventConsumer);
}
private void staticizeClasses(
@@ -389,11 +394,11 @@
}
}
- private void runInterfaceDesugaringProcessorsForR8(
+ private void runInterfaceDesugaringProcessors(
Flavor includeAllResources, ExecutorService executorService) throws ExecutionException {
assert !appView.getSyntheticItems().hasPendingSyntheticClasses();
if (interfaceMethodRewriter != null) {
- interfaceMethodRewriter.runInterfaceDesugaringProcessorsForR8(
+ interfaceMethodRewriter.runInterfaceDesugaringProcessors(
this, includeAllResources, executorService);
}
}
@@ -410,28 +415,30 @@
workaroundAbstractMethodOnNonAbstractClassVerificationBug(
executor, OptimizationFeedbackIgnore.getInstance());
DexApplication application = appView.appInfo().app();
- D8MethodProcessor methodProcessor = new D8MethodProcessor(this, executor);
-
timing.begin("IR conversion");
- convertClasses(methodProcessor, executor);
+ convertClasses(executor);
reportNestDesugarDependencies();
clearNestAttributes();
- application = commitPendingSyntheticItems(appView, application);
-
- postProcessingDesugaringForD8(methodProcessor, executor);
-
- application = commitPendingSyntheticItems(appView, application);
+ if (appView.getSyntheticItems().hasPendingSyntheticClasses()) {
+ appView.setAppInfo(
+ new AppInfo(
+ appView.appInfo().getSyntheticItems().commit(application),
+ appView.appInfo().getMainDexInfo()));
+ application = appView.appInfo().app();
+ }
// Build a new application with jumbo string info,
Builder<?> builder = application.builder().setHighestSortingString(highestSortingString);
+ runInterfaceDesugaringProcessors(ExcludeDexResources, executor);
if (appView.options().isDesugaredLibraryCompilation()) {
new EmulatedInterfaceApplicationRewriter(appView).rewriteApplication(builder);
}
processCovariantReturnTypeAnnotations(builder);
+ generateDesugaredLibraryAPIWrappers(builder, executor);
timing.end();
@@ -442,33 +449,8 @@
appView.appInfo().getMainDexInfo()));
}
- private DexApplication commitPendingSyntheticItems(
- AppView<AppInfo> appView, DexApplication application) {
- if (appView.getSyntheticItems().hasPendingSyntheticClasses()) {
- appView.setAppInfo(
- new AppInfo(
- appView.appInfo().getSyntheticItems().commit(application),
- appView.appInfo().getMainDexInfo()));
- application = appView.appInfo().app();
- }
- return application;
- }
-
- private void postProcessingDesugaringForD8(
- D8MethodProcessor methodProcessor, ExecutorService executorService)
- throws ExecutionException {
- D8CfPostProcessingDesugaringEventConsumer eventConsumer =
- CfPostProcessingDesugaringEventConsumer.createForD8(methodProcessor);
- InterfaceMethodProcessorFacade interfaceDesugaring =
- instructionDesugaring.getInterfaceMethodPostProcessingDesugaring(ExcludeDexResources);
- CfPostProcessingDesugaringCollection.create(
- appView, interfaceDesugaring, instructionDesugaring.getRetargetingInfo())
- .postProcessingDesugaring(eventConsumer, executorService);
- eventConsumer.finalizeDesugaring();
- }
-
- private void convertClasses(D8MethodProcessor methodProcessor, ExecutorService executorService)
- throws ExecutionException {
+ private void convertClasses(ExecutorService executorService) throws ExecutionException {
+ D8MethodProcessor methodProcessor = new D8MethodProcessor(this, executorService);
ClassConverterResult classConverterResult =
ClassConverter.create(appView, this, methodProcessor).convertClasses(executorService);
@@ -481,9 +463,6 @@
rewriteEnclosingLambdaMethodAttributes(
appView, classConverterResult.getForcefullyMovedLambdaMethods());
-
- instructionDesugaring.withDesugaredLibraryAPIConverter(
- DesugaredLibraryAPIConverter::generateTrackingWarnings);
}
public void desugarClassesForD8(
@@ -499,13 +478,27 @@
classes, clazz -> desugarClassForD8(clazz, desugaringEventConsumer), executorService);
}
- public void desugarClassForD8(
+ private void desugarClassForD8(
DexProgramClass clazz, D8CfClassDesugaringEventConsumer desugaringEventConsumer) {
if (classDesugaring.needsDesugaring(clazz)) {
classDesugaring.desugar(clazz, desugaringEventConsumer);
}
}
+ public void prepareDesugaringForD8(ExecutorService executorService) throws ExecutionException {
+ // Prepare desugaring by collecting all the synthetic methods required on program classes.
+ ProgramAdditions programAdditions = new ProgramAdditions();
+ ThreadUtils.processItems(
+ appView.appInfo().classes(),
+ clazz -> {
+ clazz.forEachProgramMethodMatching(
+ method -> method.hasCode() && method.getCode().isCfCode(),
+ method -> instructionDesugaring.prepare(method, programAdditions));
+ },
+ executorService);
+ programAdditions.apply(executorService);
+ }
+
void convertMethods(
DexProgramClass clazz,
D8CfInstructionDesugaringEventConsumer desugaringEventConsumer,
@@ -578,14 +571,32 @@
}
}
- private boolean needsIRConversion() {
+ private boolean needsIRConversion(ProgramMethod method) {
if (appView.enableWholeProgramOptimizations()) {
return true;
}
if (options.testing.forceIRForCfToCfDesugar) {
return true;
}
- return !options.cfToCfDesugar;
+ if (options.isDesugaredLibraryCompilation()) {
+ return true;
+ }
+ if (!options.cfToCfDesugar) {
+ return true;
+ }
+ if (desugaredLibraryAPIConverter != null
+ && desugaredLibraryAPIConverter.shouldRegisterCallback(method)) {
+ return true;
+ }
+ if (method.getDefinition().getCode() instanceof SynthesizedCode) {
+ // SynthesizedCode needs IR to generate the code.
+ return true;
+ } else {
+ NeedsIRDesugarUseRegistry useRegistry =
+ new NeedsIRDesugarUseRegistry(method, appView, desugaredLibraryAPIConverter);
+ method.registerCodeReferences(useRegistry);
+ return useRegistry.needsDesugaring();
+ }
}
private void checkPrefixMerging(ProgramMethod method) {
@@ -786,9 +797,12 @@
printPhase("Interface method desugaring");
finalizeInterfaceMethodRewritingThroughIR(executorService);
- runInterfaceDesugaringProcessorsForR8(IncludeAllResources, executorService);
+ runInterfaceDesugaringProcessors(IncludeAllResources, executorService);
feedback.updateVisibleOptimizationInfo();
+ printPhase("Desugared library API Conversion finalization");
+ generateDesugaredLibraryAPIWrappers(builder, executorService);
+
if (serviceLoaderRewriter != null) {
processSynthesizedServiceLoaderMethods(
serviceLoaderRewriter.getServiceLoadMethods(), executorService);
@@ -952,6 +966,14 @@
removeDeadCodeAndFinalizeIR(code, OptimizationFeedbackIgnore.getInstance(), Timing.empty());
}
+ private void generateDesugaredLibraryAPIWrappers(
+ DexApplication.Builder<?> builder, ExecutorService executorService)
+ throws ExecutionException {
+ if (desugaredLibraryAPIConverter != null) {
+ desugaredLibraryAPIConverter.finalizeWrappers(builder, this, executorService);
+ }
+ }
+
private void clearDexMethodCompilationState() {
appView.appInfo().classes().forEach(this::clearDexMethodCompilationState);
}
@@ -1119,7 +1141,7 @@
options.testing.hookInIrConversion.run();
}
- if (!needsIRConversion() || options.skipIR) {
+ if (!needsIRConversion(method) || options.skipIR) {
feedback.markProcessed(method.getDefinition(), ConstraintWithTarget.NEVER);
return Timing.empty();
}
@@ -1477,9 +1499,10 @@
previous = printMethod(code, "IR after interface method rewriting (SSA)", previous);
+ // This pass has to be after interfaceMethodRewriter and BackportedMethodRewriter.
if (desugaredLibraryAPIConverter != null
- && appView.enableWholeProgramOptimizations()
- && methodProcessor.isPrimaryMethodProcessor()) {
+ && (!appView.enableWholeProgramOptimizations()
+ || methodProcessor.isPrimaryMethodProcessor())) {
timing.begin("Desugar library API");
desugaredLibraryAPIConverter.desugar(code);
timing.end();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/NeedsIRDesugarUseRegistry.java b/src/main/java/com/android/tools/r8/ir/conversion/NeedsIRDesugarUseRegistry.java
new file mode 100644
index 0000000..0d1c587
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/conversion/NeedsIRDesugarUseRegistry.java
@@ -0,0 +1,108 @@
+// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.conversion;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexCallSite;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.graph.UseRegistry;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
+
+class NeedsIRDesugarUseRegistry extends UseRegistry {
+
+ private boolean needsDesugaring = false;
+ private final ProgramMethod context;
+ private final DesugaredLibraryAPIConverter desugaredLibraryAPIConverter;
+
+ public NeedsIRDesugarUseRegistry(
+ ProgramMethod method,
+ AppView<?> appView,
+ DesugaredLibraryAPIConverter desugaredLibraryAPIConverter) {
+ super(appView.dexItemFactory());
+ this.context = method;
+ this.desugaredLibraryAPIConverter = desugaredLibraryAPIConverter;
+ }
+
+ public boolean needsDesugaring() {
+ return needsDesugaring;
+ }
+
+ @Override
+ public void registerInitClass(DexType type) {
+ if (!needsDesugaring
+ && desugaredLibraryAPIConverter != null
+ && desugaredLibraryAPIConverter.canConvert(type)) {
+ needsDesugaring = true;
+ }
+ }
+
+ @Override
+ public void registerInvokeVirtual(DexMethod method) {
+ registerDesugaredLibraryAPIConverter(method);
+ }
+
+ @Override
+ public void registerInvokeDirect(DexMethod method) {
+ registerDesugaredLibraryAPIConverter(method);
+ }
+
+ private void registerDesugaredLibraryAPIConverter(DexMethod method) {
+ if (!needsDesugaring) {
+ needsDesugaring =
+ desugaredLibraryAPIConverter != null
+ && desugaredLibraryAPIConverter.shouldRewriteInvoke(method);
+ }
+ }
+
+ @Override
+ public void registerInvokeStatic(DexMethod method) {
+ registerDesugaredLibraryAPIConverter(method);
+ }
+
+ @Override
+ public void registerInvokeInterface(DexMethod method) {
+ registerDesugaredLibraryAPIConverter(method);
+ }
+
+ @Override
+ public void registerInvokeStatic(DexMethod method, boolean itf) {
+ registerInvokeStatic(method);
+ }
+
+ @Override
+ public void registerCallSite(DexCallSite callSite) {
+ super.registerCallSite(callSite);
+ needsDesugaring = true;
+ }
+
+ @Override
+ public void registerInvokeSuper(DexMethod method) {
+ registerDesugaredLibraryAPIConverter(method);
+ }
+
+ @Override
+ public void registerInstanceFieldRead(DexField field) {}
+
+ @Override
+ public void registerInstanceFieldWrite(DexField field) {}
+
+ @Override
+ public void registerNewInstance(DexType type) {}
+
+ @Override
+ public void registerStaticFieldRead(DexField field) {}
+
+ @Override
+ public void registerStaticFieldWrite(DexField field) {}
+
+ @Override
+ public void registerTypeReference(DexType type) {}
+
+ @Override
+ public void registerInstanceOf(DexType type) {}
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java
index 9d7b629..513a9d5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java
@@ -13,11 +13,23 @@
/** Interface for desugaring a single class-file instruction. */
public interface CfInstructionDesugaring {
+ // TODO(193004879): Merge the scan and prepare methods.
default void scan(ProgramMethod method, CfInstructionDesugaringEventConsumer eventConsumer) {
// Default scan is to do nothing.
}
/**
+ * Prepare step which is called on all classes scheduled for desugaring before the actual
+ * instruction level desugaring is preformed. This allows the desugaring to prepare and provide
+ * additional methods for program classes which will be needed for desugaring. During desugaring
+ * synthetic items can be added and the instruction stream can be altered, but program methods
+ * cannot be added.
+ */
+ default void prepare(ProgramMethod method, ProgramAdditions programAdditions) {
+ // Default prepare is to do nothing.
+ }
+
+ /**
* Given an instruction, returns the list of instructions that the instruction should be desugared
* to. If no desugaring is needed, {@code null} should be returned (for efficiency).
*/
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
index cd9a9ec..6efa25b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
@@ -7,13 +7,9 @@
import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.RetargetingInfo;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
import com.android.tools.r8.utils.ThrowingConsumer;
-import java.util.function.Consumer;
/**
* Abstracts a collection of low-level desugarings (i.e., mappings from class-file instructions to
@@ -39,6 +35,8 @@
return EmptyCfInstructionDesugaringCollection.getInstance();
}
+ public abstract void prepare(ProgramMethod method, ProgramAdditions programAdditions);
+
public abstract void scan(
ProgramMethod method, CfInstructionDesugaringEventConsumer eventConsumer);
@@ -60,11 +58,5 @@
public abstract <T extends Throwable> void withD8NestBasedAccessDesugaring(
ThrowingConsumer<D8NestBasedAccessDesugaring, T> consumer) throws T;
- public abstract InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaring(
- Flavor flavor);
-
public abstract RetargetingInfo getRetargetingInfo();
-
- public abstract void withDesugaredLibraryAPIConverter(
- Consumer<DesugaredLibraryAPIConverter> consumer);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
index cb9aeb9..d497332 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -15,7 +15,6 @@
import com.android.tools.r8.ir.conversion.ClassConverterResult;
import com.android.tools.r8.ir.conversion.D8MethodProcessor;
import com.android.tools.r8.ir.desugar.backports.BackportedMethodDesugaringEventConsumer;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverterEventConsumer;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeterInstructionEventConsumer;
import com.android.tools.r8.ir.desugar.invokespecial.InvokeSpecialBridgeInfo;
import com.android.tools.r8.ir.desugar.invokespecial.InvokeSpecialToSelfDesugaringEventConsumer;
@@ -26,7 +25,6 @@
import com.android.tools.r8.ir.desugar.records.RecordDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.twr.TwrCloseResourceDesugaringEventConsumer;
import com.android.tools.r8.shaking.Enqueuer.SyntheticAdditions;
-import com.android.tools.r8.utils.collections.SortedProgramMethodSet;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.Collections;
@@ -35,7 +33,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@@ -51,8 +48,7 @@
RecordDesugaringEventConsumer,
TwrCloseResourceDesugaringEventConsumer,
InterfaceMethodDesugaringEventConsumer,
- DesugaredLibraryRetargeterInstructionEventConsumer,
- DesugaredLibraryAPIConverterEventConsumer {
+ DesugaredLibraryRetargeterInstructionEventConsumer {
public static D8CfInstructionDesugaringEventConsumer createForD8(
D8MethodProcessor methodProcessor) {
@@ -72,26 +68,6 @@
return new CfInstructionDesugaringEventConsumer() {
@Override
- public void acceptWrapperProgramClass(DexProgramClass clazz) {
- assert false;
- }
-
- @Override
- public void acceptWrapperClasspathClass(DexClasspathClass clazz) {
- assert false;
- }
-
- @Override
- public void acceptAPIConversion(ProgramMethod method) {
- assert false;
- }
-
- @Override
- public void acceptSuperAPIConversion(ProgramMethod method) {
- assert false;
- }
-
- @Override
public void acceptDesugaredLibraryRetargeterDispatchProgramClass(DexProgramClass clazz) {
assert false;
}
@@ -171,8 +147,6 @@
private final Map<DexReference, InvokeSpecialBridgeInfo> pendingInvokeSpecialBridges =
new LinkedHashMap<>();
- private final Map<DexProgramClass, SortedProgramMethodSet> pendingSuperAPIConversions =
- new ConcurrentHashMap<>();
private final List<LambdaClass> synthesizedLambdaClasses = new ArrayList<>();
private D8CfInstructionDesugaringEventConsumer(D8MethodProcessor methodProcessor) {
@@ -226,17 +200,17 @@
@Override
public void acceptNestFieldGetBridge(ProgramField target, ProgramMethod bridge) {
- methodProcessor.scheduleDesugaredMethodForProcessing(bridge);
+ assert false;
}
@Override
public void acceptNestFieldPutBridge(ProgramField target, ProgramMethod bridge) {
- methodProcessor.scheduleDesugaredMethodForProcessing(bridge);
+ assert false;
}
@Override
public void acceptNestMethodBridge(ProgramMethod target, ProgramMethod bridge) {
- methodProcessor.scheduleDesugaredMethodForProcessing(bridge);
+ assert false;
}
@Override
@@ -255,48 +229,14 @@
methodProcessor.scheduleDesugaredMethodForProcessing(method);
}
- @Override
- public void acceptWrapperProgramClass(DexProgramClass clazz) {
- methodProcessor.scheduleDesugaredMethodsForProcessing(clazz.programMethods());
- }
-
- @Override
- public void acceptWrapperClasspathClass(DexClasspathClass clazz) {
- // Intentionally empty.
- }
-
- @Override
- public void acceptAPIConversion(ProgramMethod method) {
- methodProcessor.scheduleDesugaredMethodForProcessing(method);
- }
-
- @Override
- public void acceptSuperAPIConversion(ProgramMethod method) {
- SortedProgramMethodSet superAPIConversions =
- pendingSuperAPIConversions.computeIfAbsent(
- method.getHolder(), ignored -> SortedProgramMethodSet.createConcurrent());
- superAPIConversions.add(method);
- }
-
public List<ProgramMethod> finalizeDesugaring(
AppView<?> appView, ClassConverterResult.Builder classConverterResultBuilder) {
List<ProgramMethod> needsProcessing = new ArrayList<>();
finalizeInvokeSpecialDesugaring(appView, needsProcessing::add);
finalizeLambdaDesugaring(classConverterResultBuilder, needsProcessing::add);
- finalizeSuperAPIConversionDesugaring(needsProcessing::add);
return needsProcessing;
}
- private void finalizeSuperAPIConversionDesugaring(Consumer<ProgramMethod> needsProcessing) {
- for (SortedProgramMethodSet superAPIConversions : pendingSuperAPIConversions.values()) {
- for (ProgramMethod superAPIConversion : superAPIConversions) {
- superAPIConversion.getHolder().addDirectMethod(superAPIConversion.getDefinition());
- needsProcessing.accept(superAPIConversion);
- }
- }
- pendingSuperAPIConversions.clear();
- }
-
private void finalizeInvokeSpecialDesugaring(
AppView<?> appView, Consumer<ProgramMethod> needsProcessing) {
// Fixup the code of the new private methods have that been synthesized.
@@ -408,30 +348,6 @@
}
@Override
- public void acceptWrapperProgramClass(DexProgramClass clazz) {
- // TODO(b/189912077): There should be nothing to do.
- assert false;
- }
-
- @Override
- public void acceptWrapperClasspathClass(DexClasspathClass clazz) {
- // TODO(b/189912077): Should be added to live non program types.
- assert false;
- }
-
- @Override
- public void acceptAPIConversion(ProgramMethod method) {
- // TODO(b/189912077): There should be nothing to do.
- assert false;
- }
-
- @Override
- public void acceptSuperAPIConversion(ProgramMethod method) {
- // TODO(b/189912077): Manage pending conversions.
- assert false;
- }
-
- @Override
public void acceptBackportedMethod(ProgramMethod backportedMethod, ProgramMethod context) {
// Intentionally empty. The backported method will be hit by the tracing in R8 as if it was
// present in the input code, and thus nothing needs to be done.
@@ -456,20 +372,17 @@
@Override
public void acceptNestFieldGetBridge(ProgramField target, ProgramMethod bridge) {
- // Intentionally empty. These bridges will be hit by the tracing in R8 as if they were present
- // in the input code, and thus nothing needs to be done.
+ assert false;
}
@Override
public void acceptNestFieldPutBridge(ProgramField target, ProgramMethod bridge) {
- // Intentionally empty. These bridges will be hit by the tracing in R8 as if they were present
- // in the input code, and thus nothing needs to be done.
+ assert false;
}
@Override
public void acceptNestMethodBridge(ProgramMethod target, ProgramMethod bridge) {
- // Intentionally empty. These bridges will be hit by the tracing in R8 as if they were present
- // in the input code, and thus nothing needs to be done.
+ assert false;
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaring.java
index 38a0413..2a2de5f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaring.java
@@ -3,12 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.desugar;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-
public interface CfPostProcessingDesugaring {
- void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
- throws ExecutionException;
+ void postProcessingDesugaring(CfPostProcessingDesugaringEventConsumer eventConsumer);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
index 367e0ca..f659ad8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
@@ -4,24 +4,17 @@
package com.android.tools.r8.ir.desugar;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeterPostProcessor;
import com.android.tools.r8.ir.desugar.desugaredlibrary.RetargetingInfo;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
-import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
public abstract class CfPostProcessingDesugaringCollection {
public static CfPostProcessingDesugaringCollection create(
- AppView<?> appView,
- InterfaceMethodProcessorFacade interfaceMethodProcessorFacade,
- RetargetingInfo retargetingInfo) {
+ AppView<?> appView, RetargetingInfo retargetingInfo) {
if (appView.options().desugarState.isOn()) {
- return NonEmptyCfPostProcessingDesugaringCollection.create(
- appView, interfaceMethodProcessorFacade, retargetingInfo);
+ return NonEmptyCfPostProcessingDesugaringCollection.create(appView, retargetingInfo);
}
return empty();
}
@@ -31,8 +24,7 @@
}
public abstract void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
- throws ExecutionException;
+ CfPostProcessingDesugaringEventConsumer eventConsumer);
public static class NonEmptyCfPostProcessingDesugaringCollection
extends CfPostProcessingDesugaringCollection {
@@ -45,37 +37,19 @@
}
public static CfPostProcessingDesugaringCollection create(
- AppView<?> appView,
- InterfaceMethodProcessorFacade interfaceMethodProcessorFacade,
- RetargetingInfo retargetingInfo) {
- ArrayList<CfPostProcessingDesugaring> desugarings = new ArrayList<>();
- if (!appView.options().desugaredLibraryConfiguration.getRetargetCoreLibMember().isEmpty()) {
- desugarings.add(new DesugaredLibraryRetargeterPostProcessor(appView, retargetingInfo));
- }
- if (interfaceMethodProcessorFacade != null) {
- desugarings.add(interfaceMethodProcessorFacade);
- }
- DesugaredLibraryAPIConverter desugaredLibraryAPIConverter =
- appView.rewritePrefix.isRewriting() && !appView.enableWholeProgramOptimizations()
- ? new DesugaredLibraryAPIConverter(appView, null)
- : null;
- // At this point the desugaredLibraryAPIConverter is required to be last to generate
- // call-backs on the forwarding methods.
- if (desugaredLibraryAPIConverter != null) {
- desugarings.add(desugaredLibraryAPIConverter);
- }
- if (desugarings.isEmpty()) {
+ AppView<?> appView, RetargetingInfo retargetingInfo) {
+ if (appView.options().desugaredLibraryConfiguration.getRetargetCoreLibMember().isEmpty()) {
return empty();
}
- return new NonEmptyCfPostProcessingDesugaringCollection(desugarings);
+ return new NonEmptyCfPostProcessingDesugaringCollection(
+ Collections.singletonList(
+ new DesugaredLibraryRetargeterPostProcessor(appView, retargetingInfo)));
}
@Override
- public void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
- throws ExecutionException {
+ public void postProcessingDesugaring(CfPostProcessingDesugaringEventConsumer eventConsumer) {
for (CfPostProcessingDesugaring desugaring : desugarings) {
- desugaring.postProcessingDesugaring(eventConsumer, executorService);
+ desugaring.postProcessingDesugaring(eventConsumer);
}
}
}
@@ -93,9 +67,7 @@
}
@Override
- public void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
- throws ExecutionException {
+ public void postProcessingDesugaring(CfPostProcessingDesugaringEventConsumer eventConsumer) {
// Intentionally empty.
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
index f5af1f1..dc67ee9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
@@ -10,12 +10,8 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.conversion.D8MethodProcessor;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverterEventConsumer.DesugaredLibraryAPIConverterPostProcessingEventConsumer;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeterInstructionEventConsumer.DesugaredLibraryRetargeterPostProcessingEventConsumer;
-import com.android.tools.r8.ir.desugar.itf.InterfaceProcessingDesugaringEventConsumer;
import com.android.tools.r8.shaking.Enqueuer.SyntheticAdditions;
-import com.android.tools.r8.utils.collections.ProgramMethodSet;
-import java.util.concurrent.ExecutionException;
/**
* Specialized Event consumer for desugaring finalization. During finalization, it is not possible
@@ -23,13 +19,16 @@
* explicit calls must be done here.
*/
public abstract class CfPostProcessingDesugaringEventConsumer
- implements DesugaredLibraryRetargeterPostProcessingEventConsumer,
- InterfaceProcessingDesugaringEventConsumer,
- DesugaredLibraryAPIConverterPostProcessingEventConsumer {
+ implements DesugaredLibraryRetargeterPostProcessingEventConsumer {
+ protected DesugaredLibraryAPIConverter desugaredLibraryAPIConverter;
+
+ protected CfPostProcessingDesugaringEventConsumer(AppView<?> appView) {
+ this.desugaredLibraryAPIConverter = new DesugaredLibraryAPIConverter(appView, null);
+ }
public static D8CfPostProcessingDesugaringEventConsumer createForD8(
- D8MethodProcessor methodProcessor) {
- return new D8CfPostProcessingDesugaringEventConsumer(methodProcessor);
+ D8MethodProcessor methodProcessor, AppView<?> appView) {
+ return new D8CfPostProcessingDesugaringEventConsumer(methodProcessor, appView);
}
public static R8PostProcessingDesugaringEventConsumer createForR8(
@@ -37,22 +36,23 @@
return new R8PostProcessingDesugaringEventConsumer(appView, additions);
}
- public abstract void finalizeDesugaring() throws ExecutionException;
+ public void finalizeDesugaring() {
+ desugaredLibraryAPIConverter.generateTrackingWarnings();
+ }
public static class D8CfPostProcessingDesugaringEventConsumer
extends CfPostProcessingDesugaringEventConsumer {
private final D8MethodProcessor methodProcessor;
- // Methods cannot be processed directly because we cannot add method to classes while
- // concurrently processing other methods.
- private final ProgramMethodSet methodsToReprocess = ProgramMethodSet.createConcurrent();
- private D8CfPostProcessingDesugaringEventConsumer(D8MethodProcessor methodProcessor) {
+ private D8CfPostProcessingDesugaringEventConsumer(
+ D8MethodProcessor methodProcessor, AppView<?> appView) {
+ super(appView);
this.methodProcessor = methodProcessor;
}
@Override
public void acceptDesugaredLibraryRetargeterDispatchProgramClass(DexProgramClass clazz) {
- methodsToReprocess.addAll(clazz.programMethods());
+ methodProcessor.scheduleDesugaredMethodsForProcessing(clazz.programMethods());
}
@Override
@@ -67,30 +67,9 @@
@Override
public void acceptForwardingMethod(ProgramMethod method) {
- methodsToReprocess.add(method);
- }
-
- @Override
- public void acceptCompanionClassClinit(ProgramMethod method) {
- methodsToReprocess.add(method);
- }
-
- @Override
- public void acceptEmulatedInterfaceMethod(ProgramMethod method) {
- methodsToReprocess.add(method);
- }
-
- @Override
- public void acceptAPIConversionCallback(ProgramMethod method) {
- methodsToReprocess.add(method);
- }
-
- @Override
- public void finalizeDesugaring() throws ExecutionException {
- assert methodProcessor.verifyNoPendingMethodProcessing();
- methodProcessor.newWave();
- methodProcessor.scheduleDesugaredMethodsForProcessing(methodsToReprocess);
- methodProcessor.awaitMethodProcessing();
+ methodProcessor.scheduleDesugaredMethodForProcessing(method);
+ // TODO(b/189912077): Uncomment when API conversion is performed cf to cf in D8.
+ // desugaredLibraryAPIConverter.generateCallbackIfRequired(method);
}
}
@@ -98,22 +77,13 @@
extends CfPostProcessingDesugaringEventConsumer {
private final SyntheticAdditions additions;
- // The desugaredLibraryAPIConverter is required here because call-backs need to be generated
- // once forwarding methods are generated. We should be able to remove it once the interface
- // method desugaring and the API converter are moved cf to cf in R8.
- private final DesugaredLibraryAPIConverter desugaredLibraryAPIConverter;
-
- R8PostProcessingDesugaringEventConsumer(AppView<?> appView, SyntheticAdditions additions) {
- this.desugaredLibraryAPIConverter = new DesugaredLibraryAPIConverter(appView, null);
+ protected R8PostProcessingDesugaringEventConsumer(
+ AppView<?> appView, SyntheticAdditions additions) {
+ super(appView);
this.additions = additions;
}
@Override
- public void finalizeDesugaring() throws ExecutionException {
- desugaredLibraryAPIConverter.generateTrackingWarnings();
- }
-
- @Override
public void acceptDesugaredLibraryRetargeterDispatchProgramClass(DexProgramClass clazz) {
additions.addLiveMethods(clazz.programMethods());
}
@@ -131,22 +101,10 @@
@Override
public void acceptForwardingMethod(ProgramMethod method) {
additions.addLiveMethod(method);
- desugaredLibraryAPIConverter.generateCallbackIfRequired(method, this);
- }
-
- @Override
- public void acceptCompanionClassClinit(ProgramMethod method) {
- assert false : "TODO(b/183998768): Support Interface processing in R8";
- }
-
- @Override
- public void acceptEmulatedInterfaceMethod(ProgramMethod method) {
- assert false : "TODO(b/183998768): Support Interface processing in R8";
- }
-
- @Override
- public void acceptAPIConversionCallback(ProgramMethod method) {
- additions.addLiveMethod(method);
+ ProgramMethod callback = desugaredLibraryAPIConverter.generateCallbackIfRequired(method);
+ if (callback != null) {
+ additions.addLiveMethod(callback);
+ }
}
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
index c78f6db..61c9617 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
@@ -7,13 +7,9 @@
import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.CfClassDesugaringCollection.EmptyCfClassDesugaringCollection;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.RetargetingInfo;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
import com.android.tools.r8.utils.ThrowingConsumer;
-import java.util.function.Consumer;
public class EmptyCfInstructionDesugaringCollection extends CfInstructionDesugaringCollection {
@@ -28,6 +24,11 @@
}
@Override
+ public void prepare(ProgramMethod method, ProgramAdditions additionalProgramMethods) {
+ // Intentionally empty.
+ }
+
+ @Override
public void scan(ProgramMethod method, CfInstructionDesugaringEventConsumer eventConsumer) {
// Intentionally empty.
}
@@ -62,17 +63,7 @@
}
@Override
- public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaring(Flavor flavor) {
- return null;
- }
-
- @Override
public RetargetingInfo getRetargetingInfo() {
return null;
}
-
- @Override
- public void withDesugaredLibraryAPIConverter(Consumer<DesugaredLibraryAPIConverter> consumer) {
- // Intentionally empty.
- }
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
index b1ea3a0..8ddd45c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
@@ -14,13 +14,10 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.CfClassDesugaringCollection.EmptyCfClassDesugaringCollection;
import com.android.tools.r8.ir.desugar.CfClassDesugaringCollection.NonEmptyCfClassDesugaringCollection;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.RetargetingInfo;
import com.android.tools.r8.ir.desugar.invokespecial.InvokeSpecialToSelfDesugaring;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
import com.android.tools.r8.ir.desugar.lambda.LambdaInstructionDesugaring;
import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
import com.android.tools.r8.ir.desugar.nest.NestBasedAccessDesugaring;
@@ -36,7 +33,6 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
-import java.util.function.Consumer;
public class NonEmptyCfInstructionDesugaringCollection extends CfInstructionDesugaringCollection {
@@ -46,8 +42,6 @@
private final NestBasedAccessDesugaring nestBasedAccessDesugaring;
private final RecordRewriter recordRewriter;
private final DesugaredLibraryRetargeter desugaredLibraryRetargeter;
- private final InterfaceMethodRewriter interfaceMethodRewriter;
- private final DesugaredLibraryAPIConverter desugaredLibraryAPIConverter;
NonEmptyCfInstructionDesugaringCollection(AppView<?> appView) {
this.appView = appView;
@@ -55,8 +49,6 @@
this.nestBasedAccessDesugaring = null;
this.recordRewriter = null;
this.desugaredLibraryRetargeter = null;
- this.interfaceMethodRewriter = null;
- this.desugaredLibraryAPIConverter = null;
return;
}
this.nestBasedAccessDesugaring = NestBasedAccessDesugaring.create(appView);
@@ -78,23 +70,9 @@
// TODO(b/183998768): Enable interface method rewriter cf to cf also in R8.
if (appView.options().isInterfaceMethodDesugaringEnabled()
&& !appView.enableWholeProgramOptimizations()) {
- interfaceMethodRewriter =
+ desugarings.add(
new InterfaceMethodRewriter(
- appView, backportedMethodRewriter, desugaredLibraryRetargeter);
- desugarings.add(interfaceMethodRewriter);
- } else {
- interfaceMethodRewriter = null;
- }
- desugaredLibraryAPIConverter =
- appView.rewritePrefix.isRewriting() && !appView.enableWholeProgramOptimizations()
- ? new DesugaredLibraryAPIConverter(
- appView,
- interfaceMethodRewriter,
- desugaredLibraryRetargeter,
- backportedMethodRewriter)
- : null;
- if (desugaredLibraryAPIConverter != null) {
- desugarings.add(desugaredLibraryAPIConverter);
+ appView, backportedMethodRewriter, desugaredLibraryRetargeter));
}
desugarings.add(new LambdaInstructionDesugaring(appView));
desugarings.add(new InvokeSpecialToSelfDesugaring(appView));
@@ -149,6 +127,12 @@
}
@Override
+ public void prepare(ProgramMethod method, ProgramAdditions programAdditions) {
+ ensureCfCode(method);
+ desugarings.forEach(d -> d.prepare(method, programAdditions));
+ }
+
+ @Override
public void scan(ProgramMethod method, CfInstructionDesugaringEventConsumer eventConsumer) {
ensureCfCode(method);
desugarings.forEach(d -> d.scan(method, eventConsumer));
@@ -328,24 +312,10 @@
}
@Override
- public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaring(Flavor flavor) {
- return interfaceMethodRewriter != null
- ? interfaceMethodRewriter.getPostProcessingDesugaring(flavor)
- : null;
- }
-
- @Override
public RetargetingInfo getRetargetingInfo() {
if (desugaredLibraryRetargeter != null) {
return desugaredLibraryRetargeter.getRetargetingInfo();
}
return null;
}
-
- @Override
- public void withDesugaredLibraryAPIConverter(Consumer<DesugaredLibraryAPIConverter> consumer) {
- if (desugaredLibraryAPIConverter != null) {
- consumer.accept(desugaredLibraryAPIConverter);
- }
- }
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/ProgramAdditions.java b/src/main/java/com/android/tools/r8/ir/desugar/ProgramAdditions.java
new file mode 100644
index 0000000..cf57453
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/ProgramAdditions.java
@@ -0,0 +1,53 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.desugar;
+
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexMember;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DexReference;
+import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.utils.ThreadUtils;
+import com.google.common.collect.Sets;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.function.BiConsumer;
+import java.util.function.Supplier;
+
+public class ProgramAdditions implements BiConsumer<DexMember<?, ?>, Supplier<ProgramMethod>> {
+ private final Set<DexReference> added = Sets.newConcurrentHashSet();
+ private final Map<DexProgramClass, List<DexEncodedMethod>> additions = new ConcurrentHashMap<>();
+
+ @Override
+ public synchronized void accept(
+ DexMember<?, ?> reference, Supplier<ProgramMethod> programMethodSupplier) {
+ if (added.add(reference)) {
+ ProgramMethod method = programMethodSupplier.get();
+ List<DexEncodedMethod> methods =
+ additions.computeIfAbsent(method.getHolder(), k -> new ArrayList<>());
+ synchronized (methods) {
+ assert !methods.contains(method.getDefinition());
+ assert method.getHolder().lookupProgramMethod(method.getReference()) == null;
+ methods.add(method.getDefinition());
+ }
+ }
+ }
+
+ public void apply(ExecutorService executorService) throws ExecutionException {
+ ThreadUtils.processMap(
+ additions,
+ (clazz, methods) -> {
+ methods.sort(Comparator.comparing(DexEncodedMethod::getReference));
+ clazz.getMethodCollection().addDirectMethods(methods);
+ },
+ executorService);
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
index 3fb9030..b50ac86 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverter.java
@@ -4,13 +4,10 @@
package com.android.tools.r8.ir.desugar.desugaredlibrary;
-import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCode;
import com.android.tools.r8.graph.DebugLocalInfo;
-import com.android.tools.r8.graph.DexAnnotationSet;
+import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexClasspathClass;
@@ -20,9 +17,6 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
-import com.android.tools.r8.graph.MethodAccessFlags;
-import com.android.tools.r8.graph.ParameterAnnotationsList;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.analysis.type.Nullability;
import com.android.tools.r8.ir.analysis.type.TypeElement;
@@ -31,22 +25,11 @@
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.ir.code.Invoke;
-import com.android.tools.r8.ir.code.Invoke.Type;
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.code.InvokeStatic;
import com.android.tools.r8.ir.code.Value;
-import com.android.tools.r8.ir.desugar.BackportedMethodRewriter;
-import com.android.tools.r8.ir.desugar.CfInstructionDesugaring;
-import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
-import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaring;
-import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
-import com.android.tools.r8.ir.desugar.FreshLocalProvider;
-import com.android.tools.r8.ir.desugar.LocalStackAllocator;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverterEventConsumer.DesugaredLibraryAPIConverterPostProcessingEventConsumer;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
-import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConversionCfCodeProvider;
+import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterWrapperCfCodeProvider;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.OptionalBool;
@@ -55,17 +38,15 @@
import com.android.tools.r8.utils.collections.SortedProgramMethodSet;
import com.google.common.collect.Sets;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;
-import org.jetbrains.annotations.Nullable;
-import org.objectweb.asm.Opcodes;
// I convert library calls with desugared parameters/return values so they can work normally.
// In the JSON of the desugared library, one can specify conversions between desugared and
@@ -81,31 +62,22 @@
// DesugarType is only a rewritten type (generated through rewriting of type).
// The type, from the library, may either be rewritten to the desugarType,
// or be a rewritten type (generated through rewriting of vivifiedType).
-public class DesugaredLibraryAPIConverter
- implements CfInstructionDesugaring, CfPostProcessingDesugaring {
+public class DesugaredLibraryAPIConverter {
static final String VIVIFIED_PREFIX = "$-vivified-$.";
public static final String DESCRIPTOR_VIVIFIED_PREFIX = "L$-vivified-$/";
- private static final String SUPER_CONVERSION_METHOD_PREFIX = "api$super$conversion$";
private final AppView<?> appView;
private final DexItemFactory factory;
// For debugging only, allows to assert that synthesized code in R8 have been synthesized in the
// Enqueuer and not during IR processing.
private final Mode mode;
- // This is used to filter out double desugaring on backported methods.
- private final BackportedMethodRewriter backportedMethodRewriter;
- private final InterfaceMethodRewriter interfaceMethodRewriter;
- private final DesugaredLibraryRetargeter retargeter;
-
private final DesugaredLibraryWrapperSynthesizer wrapperSynthesizor;
private final Map<DexClass, Set<DexEncodedMethod>> callBackMethods = new IdentityHashMap<>();
private final Map<DexProgramClass, List<DexEncodedMethod>> pendingCallBackMethods =
new IdentityHashMap<>();
private final Set<DexMethod> trackedCallBackAPIs;
private final Set<DexMethod> trackedAPIs;
- private final MethodAccessFlags superAPIConversionMethodAccessFlags =
- MethodAccessFlags.createPublicStaticSynthetic();
public enum Mode {
GENERATE_CALLBACKS_AND_WRAPPERS,
@@ -113,29 +85,9 @@
}
public DesugaredLibraryAPIConverter(AppView<?> appView, Mode mode) {
- this(appView, mode, null, null, null);
- }
-
- public DesugaredLibraryAPIConverter(
- AppView<?> appView,
- InterfaceMethodRewriter interfaceMethodRewriter,
- DesugaredLibraryRetargeter retargeter,
- BackportedMethodRewriter backportedMethodRewriter) {
- this(appView, null, interfaceMethodRewriter, retargeter, backportedMethodRewriter);
- }
-
- private DesugaredLibraryAPIConverter(
- AppView<?> appView,
- Mode mode,
- InterfaceMethodRewriter interfaceMethodRewriter,
- DesugaredLibraryRetargeter retargeter,
- BackportedMethodRewriter backportedMethodRewriter) {
this.appView = appView;
this.factory = appView.dexItemFactory();
this.mode = mode;
- this.interfaceMethodRewriter = interfaceMethodRewriter;
- this.retargeter = retargeter;
- this.backportedMethodRewriter = backportedMethodRewriter;
this.wrapperSynthesizor = new DesugaredLibraryWrapperSynthesizer(appView, this);
if (appView.options().testing.trackDesugaredAPIConversions) {
trackedCallBackAPIs = Sets.newConcurrentHashSet();
@@ -146,95 +98,6 @@
}
}
- // TODO(b/191656218): Consider parallelizing post processing across classes instead of per
- // implementor
- // method.
- @Override
- public void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService) {
- assert noPendingWrappersOrConversions();
- for (DexProgramClass clazz : appView.appInfo().classes()) {
- if (!appView.isAlreadyLibraryDesugared(clazz)) {
- ArrayList<DexEncodedMethod> callbacks = new ArrayList<>();
- for (ProgramMethod virtualProgramMethod : clazz.virtualProgramMethods()) {
- if (shouldRegisterCallback(virtualProgramMethod)) {
- if (trackedCallBackAPIs != null) {
- trackedCallBackAPIs.add(virtualProgramMethod.getReference());
- }
- ProgramMethod callback =
- generateCallbackMethod(
- virtualProgramMethod.getDefinition(),
- virtualProgramMethod.getHolder(),
- eventConsumer);
- callbacks.add(callback.getDefinition());
- }
- }
- if (!callbacks.isEmpty()) {
- clazz.addVirtualMethods(callbacks);
- }
- }
- }
- assert noPendingWrappersOrConversions();
- generateTrackingWarnings();
- }
-
- private boolean noPendingWrappersOrConversions() {
- for (DexProgramClass pendingSyntheticClass :
- appView.getSyntheticItems().getPendingSyntheticClasses()) {
- assert !isAPIConversionSyntheticType(pendingSyntheticClass.type);
- }
- return true;
- }
-
- @Override
- public Collection<CfInstruction> desugarInstruction(
- CfInstruction instruction,
- FreshLocalProvider freshLocalProvider,
- LocalStackAllocator localStackAllocator,
- CfInstructionDesugaringEventConsumer eventConsumer,
- ProgramMethod context,
- MethodProcessingContext methodProcessingContext,
- DexItemFactory dexItemFactory) {
- assert !appView.enableWholeProgramOptimizations();
- if (needsDesugaring(instruction, context)) {
- assert instruction.isInvoke();
- return Collections.singletonList(
- rewriteLibraryInvoke(
- instruction.asInvoke(), methodProcessingContext, eventConsumer, context));
- }
- return null;
- }
-
- @Override
- public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
- if (!instruction.isInvoke()) {
- return false;
- }
- if (skipDesugaring(context)) {
- return false;
- }
- CfInvoke invoke = instruction.asInvoke();
- return shouldRewriteInvoke(
- invoke.getMethod(), invoke.getInvokeType(context), invoke.isInterface(), context);
- }
-
- // We should not generate conversion for Wrappers and for conversion methods.
- private boolean skipDesugaring(ProgramMethod method) {
- return isAPIConversionSyntheticType(method.getHolderType())
- || isSuperAPIConversionMethod(method);
- }
-
- private boolean isSuperAPIConversionMethod(ProgramMethod method) {
- return method.getDefinition().isD8R8Synthesized()
- && method.getAccessFlags().equals(superAPIConversionMethodAccessFlags)
- && method.getName().toString().startsWith(SUPER_CONVERSION_METHOD_PREFIX);
- }
-
- private boolean isAPIConversionSyntheticType(DexType type) {
- return wrapperSynthesizor.isSyntheticWrapper(type)
- || appView.getSyntheticItems().isSyntheticOfKind(type, SyntheticKind.API_CONVERSION);
- }
-
public static boolean isVivifiedType(DexType type) {
return type.descriptor.toString().startsWith(DESCRIPTOR_VIVIFIED_PREFIX);
}
@@ -245,8 +108,6 @@
public void desugar(IRCode code) {
- assert appView.enableWholeProgramOptimizations();
-
if (wrapperSynthesizor.isSyntheticWrapper(code.method().getHolderType())) {
return;
}
@@ -267,34 +128,26 @@
continue;
}
InvokeMethod invokeMethod = instruction.asInvokeMethod();
- DexMethod invokedMethod = invokeMethod.getInvokedMethod();
+ DexMethod invokedMethod;
+ if (invokeMethod.isInvokeSuper()) {
+ DexClassAndMethod result =
+ appView
+ .appInfoForDesugaring()
+ .lookupSuperTarget(invokeMethod.getInvokedMethod(), code.context());
+ invokedMethod = result != null ? result.getReference() : null;
+ } else {
+ // TODO(b/192439456): Make a test to prove resolution is needed here and fix it.
+ invokedMethod = invokeMethod.getInvokedMethod();
+ }
// Library methods do not understand desugared types, hence desugared types have to be
// converted around non desugared library calls for the invoke to resolve.
- if (invokedMethod != null
- && shouldRewriteInvoke(
- invokedMethod,
- invokeMethod.getType(),
- invokeMethod.getInterfaceBit(),
- code.context())) {
+ if (invokedMethod != null && shouldRewriteInvoke(invokedMethod)) {
rewriteLibraryInvoke(code, invokeMethod, iterator, blockIterator);
}
}
}
}
- @Nullable
- private DexMethod getMethodForDesugaring(
- DexMethod invokedMethod, boolean isInvokeSuper, ProgramMethod context) {
- if (isInvokeSuper) {
- // TODO(b/191656218): Use lookupInvokeSpecial instead when this is all to Cf.
- DexClassAndMethod result =
- appView.appInfoForDesugaring().lookupSuperTarget(invokedMethod, context);
- return result != null ? result.getReference() : null;
- }
- // TODO(b/192439456): Make a test to prove resolution is needed here and fix it.
- return invokedMethod;
- }
-
private boolean validateCallbackWasGeneratedInEnqueuer(ProgramMethod method) {
if (!shouldRegisterCallback(method)) {
return true;
@@ -304,17 +157,7 @@
return true;
}
- private boolean shouldRewriteInvoke(
- DexMethod unresolvedInvokedMethod,
- Type invokeType,
- Boolean isInterface,
- ProgramMethod context) {
- DexMethod invokedMethod =
- getMethodForDesugaring(unresolvedInvokedMethod, invokeType == Type.SUPER, context);
- if (invokedMethod == null) {
- // Implies a resolution/look-up failure, we do not convert to keep the runtime error.
- return false;
- }
+ public boolean shouldRewriteInvoke(DexMethod invokedMethod) {
if (appView.rewritePrefix.hasRewrittenType(invokedMethod.holder, appView)
|| invokedMethod.holder.isArrayType()) {
return false;
@@ -323,19 +166,6 @@
if (dexClass == null || !dexClass.isLibraryClass()) {
return false;
}
- if (interfaceMethodRewriter != null
- && interfaceMethodRewriter.needsRewriting(invokedMethod, invokeType, context)) {
- return false;
- }
- assert retargeter == null || isInterface != null;
- if (retargeter != null
- && retargeter.hasNewInvokeTarget(invokedMethod, false, invokeType == Type.SUPER, context)) {
- return false;
- }
- if (backportedMethodRewriter != null
- && backportedMethodRewriter.methodIsBackport(invokedMethod)) {
- return false;
- }
return appView.rewritePrefix.hasRewrittenTypeInSignature(invokedMethod.proto, appView);
}
@@ -345,18 +175,16 @@
}
}
- public void generateCallbackIfRequired(
- ProgramMethod method, DesugaredLibraryAPIConverterPostProcessingEventConsumer eventConsumer) {
+ public ProgramMethod generateCallbackIfRequired(ProgramMethod method) {
if (!shouldRegisterCallback(method)) {
- return;
+ return null;
}
if (trackedCallBackAPIs != null) {
trackedCallBackAPIs.add(method.getReference());
}
- ProgramMethod callback =
- generateCallbackMethod(method.getDefinition(), method.getHolder(), eventConsumer);
- callback.getHolder().addVirtualMethod(callback.getDefinition());
- assert noPendingWrappersOrConversions();
+ ProgramMethod callback = generateCallbackMethod(method.getDefinition(), method.getHolder());
+ method.getHolder().addVirtualMethod(callback.getDefinition());
+ return callback;
}
public boolean shouldRegisterCallback(ProgramMethod method) {
@@ -370,7 +198,6 @@
DexEncodedMethod definition = method.getDefinition();
if (definition.isPrivateMethod()
|| definition.isStatic()
- || definition.isAbstract()
|| definition.isLibraryMethodOverride().isFalse()) {
return false;
}
@@ -495,9 +322,19 @@
return appView.dexItemFactory().createMethod(holder, newProto, originalMethod.name);
}
- public void ensureWrappersForL8(CfInstructionDesugaringEventConsumer eventConsumer) {
- assert appView.options().isDesugaredLibraryCompilation();
- wrapperSynthesizor.ensureWrappersForL8(eventConsumer);
+ public void finalizeWrappers(
+ DexApplication.Builder<?> builder, IRConverter irConverter, ExecutorService executorService)
+ throws ExecutionException {
+ // In D8, we generate the wrappers here. In R8, wrappers have already been generated in the
+ // enqueuer, so nothing needs to be done.
+ if (appView.enableWholeProgramOptimizations()) {
+ return;
+ }
+ SortedProgramMethodSet callbacks = generateCallbackMethods();
+ irConverter.processMethodsConcurrently(callbacks, executorService);
+ if (appView.options().isDesugaredLibraryCompilation()) {
+ wrapperSynthesizor.finalizeWrappersForL8();
+ }
}
public SortedProgramMethodSet generateCallbackMethods() {
@@ -508,7 +345,7 @@
List<DexEncodedMethod> newVirtualMethods = new ArrayList<>();
callbacks.forEach(
callback -> {
- ProgramMethod callbackMethod = generateCallbackMethod(callback, clazz, null);
+ ProgramMethod callbackMethod = generateCallbackMethod(callback, clazz);
newVirtualMethods.add(callbackMethod.getDefinition());
allCallbackMethods.add(callbackMethod);
});
@@ -532,14 +369,12 @@
}
private ProgramMethod generateCallbackMethod(
- DexEncodedMethod originalMethod,
- DexProgramClass clazz,
- DesugaredLibraryAPIConverterPostProcessingEventConsumer eventConsumer) {
+ DexEncodedMethod originalMethod, DexProgramClass clazz) {
DexMethod methodToInstall =
methodWithVivifiedTypeInSignature(originalMethod.getReference(), clazz.type, appView);
CfCode cfCode =
new APIConverterWrapperCfCodeProvider(
- appView, originalMethod.getReference(), null, this, clazz.isInterface(), null)
+ appView, originalMethod.getReference(), null, this, clazz.isInterface())
.generateCfCode();
DexEncodedMethod newMethod =
wrapperSynthesizor.newSynthesizedMethod(methodToInstall, originalMethod, cfCode);
@@ -547,13 +382,7 @@
if (originalMethod.isLibraryMethodOverride().isTrue()) {
newMethod.setLibraryMethodOverride(OptionalBool.TRUE);
}
- ProgramMethod callback = new ProgramMethod(clazz, newMethod);
- if (eventConsumer != null) {
- eventConsumer.acceptAPIConversionCallback(callback);
- } else {
- assert appView.enableWholeProgramOptimizations();
- }
- return callback;
+ return new ProgramMethod(clazz, newMethod);
}
private void generateTrackDesugaredAPIWarnings(Set<DexMethod> tracked, String inner) {
@@ -596,10 +425,8 @@
return vivifiedType;
}
- public void registerWrappersForLibraryInvokeIfRequired(
- DexMethod invokedMethod, Type invokeType, ProgramMethod context) {
- // TODO(b/191656218): Once R8 support is done, use an unboxed boolean here.
- if (!shouldRewriteInvoke(invokedMethod, invokeType, null, context)) {
+ public void registerWrappersForLibraryInvokeIfRequired(DexMethod invokedMethod) {
+ if (!shouldRewriteInvoke(invokedMethod)) {
return;
}
if (trackedAPIs != null) {
@@ -616,120 +443,6 @@
}
}
- private DexMethod computeReturnConversion(
- DexMethod invokedMethod, CfInstructionDesugaringEventConsumer eventConsumer) {
- DexType returnType = invokedMethod.proto.returnType;
- if (!appView.rewritePrefix.hasRewrittenType(returnType, appView)) {
- return null;
- }
- if (canConvert(returnType)) {
- DexType newReturnType = DesugaredLibraryAPIConverter.vivifiedTypeFor(returnType, appView);
- return ensureConversionMethod(returnType, newReturnType, returnType, eventConsumer);
- }
- reportInvalidInvoke(returnType, invokedMethod, "return ");
- return null;
- }
-
- private DexMethod[] computeParameterConversions(
- DexMethod invokedMethod, CfInstructionDesugaringEventConsumer eventConsumer) {
- DexMethod[] parameterConversions = new DexMethod[invokedMethod.getArity()];
- DexType[] parameters = invokedMethod.proto.parameters.values;
- for (int i = 0; i < parameters.length; i++) {
- DexType argType = parameters[i];
- if (appView.rewritePrefix.hasRewrittenType(argType, appView)) {
- if (canConvert(argType)) {
- DexType argVivifiedType = vivifiedTypeFor(argType, appView);
- parameterConversions[i] =
- ensureConversionMethod(argType, argType, argVivifiedType, eventConsumer);
- } else {
- reportInvalidInvoke(argType, invokedMethod, "parameter ");
- }
- }
- }
- return parameterConversions;
- }
-
- private CfInvoke rewriteLibraryInvoke(
- CfInvoke invoke,
- MethodProcessingContext methodProcessingContext,
- CfInstructionDesugaringEventConsumer eventConsumer,
- ProgramMethod context) {
- DexMethod invokedMethod = invoke.getMethod();
- if (trackedAPIs != null) {
- trackedAPIs.add(invokedMethod);
- }
- DexProto newProto =
- invoke.isInvokeStatic()
- ? invokedMethod.proto
- : factory.prependTypeToProto(invokedMethod.getHolderType(), invokedMethod.getProto());
- DexMethod apiConversionMethod =
- invoke.isInvokeSuper(context.getHolderType())
- ? createSuperAPIConversion(
- invoke, methodProcessingContext, eventConsumer, newProto, context)
- : createOutlinedAPIConversion(invoke, methodProcessingContext, eventConsumer, newProto);
- return new CfInvoke(Opcodes.INVOKESTATIC, apiConversionMethod, false);
- }
-
- private DexMethod createSuperAPIConversion(
- CfInvoke invoke,
- MethodProcessingContext methodProcessingContext,
- CfInstructionDesugaringEventConsumer eventConsumer,
- DexProto newProto,
- ProgramMethod context) {
- DexMethod invokedMethod = invoke.getMethod();
- String uniqueSuffix = methodProcessingContext.createUniqueContext().getSyntheticSuffix();
- DexMethod method =
- factory.createMethod(
- context.getHolderType(), newProto, SUPER_CONVERSION_METHOD_PREFIX + uniqueSuffix);
- DexEncodedMethod apiConversion =
- new DexEncodedMethod(
- method,
- superAPIConversionMethodAccessFlags,
- MethodTypeSignature.noSignature(),
- DexAnnotationSet.empty(),
- ParameterAnnotationsList.empty(),
- new APIConversionCfCodeProvider(
- appView,
- method.holder,
- invoke,
- computeReturnConversion(invokedMethod, eventConsumer),
- computeParameterConversions(invokedMethod, eventConsumer))
- .generateCfCode(),
- true);
- eventConsumer.acceptSuperAPIConversion(new ProgramMethod(context.getHolder(), apiConversion));
- return method;
- }
-
- private DexMethod createOutlinedAPIConversion(
- CfInvoke invoke,
- MethodProcessingContext methodProcessingContext,
- CfInstructionDesugaringEventConsumer eventConsumer,
- DexProto newProto) {
- DexMethod invokedMethod = invoke.getMethod();
- ProgramMethod outline =
- appView
- .getSyntheticItems()
- .createMethod(
- SyntheticKind.API_CONVERSION,
- methodProcessingContext.createUniqueContext(),
- appView,
- builder ->
- builder
- .setProto(newProto)
- .setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
- .setCode(
- methodSig ->
- new APIConversionCfCodeProvider(
- appView,
- methodSig.holder,
- invoke,
- computeReturnConversion(invokedMethod, eventConsumer),
- computeParameterConversions(invokedMethod, eventConsumer))
- .generateCfCode()));
- eventConsumer.acceptAPIConversion(outline);
- return outline.getReference();
- }
-
private void rewriteLibraryInvoke(
IRCode code,
InvokeMethod invokeMethod,
@@ -861,7 +574,7 @@
private Instruction createParameterConversion(
IRCode code, DexType argType, DexType argVivifiedType, Value inValue) {
- DexMethod conversionMethod = ensureConversionMethod(argType, argType, argVivifiedType, null);
+ DexMethod conversionMethod = ensureConversionMethod(argType, argType, argVivifiedType);
// The value is null only if the input is null.
Value convertedValue =
createConversionValue(code, inValue.getType().nullability(), argVivifiedType, null);
@@ -870,8 +583,7 @@
private Instruction createReturnConversionAndReplaceUses(
IRCode code, InvokeMethod invokeMethod, DexType returnType, DexType returnVivifiedType) {
- DexMethod conversionMethod =
- ensureConversionMethod(returnType, returnVivifiedType, returnType, null);
+ DexMethod conversionMethod = ensureConversionMethod(returnType, returnVivifiedType, returnType);
Value outValue = invokeMethod.outValue();
Value convertedValue =
createConversionValue(code, Nullability.maybeNull(), returnType, outValue.getLocalInfo());
@@ -888,11 +600,7 @@
}
}
- public DexMethod ensureConversionMethod(
- DexType type,
- DexType srcType,
- DexType destType,
- DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
+ public DexMethod ensureConversionMethod(DexType type, DexType srcType, DexType destType) {
// ConversionType holds the methods "rewrittenType convert(type)" and the other way around.
// But everything is going to be rewritten, so we need to use vivifiedType and type".
DexType conversionHolder =
@@ -900,8 +608,8 @@
if (conversionHolder == null) {
conversionHolder =
type == srcType
- ? wrapperSynthesizor.ensureTypeWrapper(type, eventConsumer)
- : wrapperSynthesizor.ensureVivifiedTypeWrapper(type, eventConsumer);
+ ? wrapperSynthesizor.ensureTypeWrapper(type)
+ : wrapperSynthesizor.ensureVivifiedTypeWrapper(type);
}
assert conversionHolder != null;
return factory.createMethod(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverterEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverterEventConsumer.java
deleted file mode 100644
index 65f5ece..0000000
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryAPIConverterEventConsumer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.ir.desugar.desugaredlibrary;
-
-import com.android.tools.r8.graph.DexClasspathClass;
-import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.ProgramMethod;
-
-public interface DesugaredLibraryAPIConverterEventConsumer {
-
- void acceptWrapperProgramClass(DexProgramClass clazz);
-
- void acceptWrapperClasspathClass(DexClasspathClass clazz);
-
- void acceptAPIConversion(ProgramMethod method);
-
- void acceptSuperAPIConversion(ProgramMethod method);
-
- interface DesugaredLibraryAPIConverterPostProcessingEventConsumer {
-
- void acceptAPIConversionCallback(ProgramMethod method);
- }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
index dac3079..0b0039e 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
@@ -23,8 +23,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
// The rewrite of virtual calls requires to go through emulate dispatch. This class is responsible
// for inserting interfaces on library boundaries and forwarding methods in the program, and to
@@ -43,9 +41,7 @@
}
@Override
- public void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
- throws ExecutionException {
+ public void postProcessingDesugaring(CfPostProcessingDesugaringEventConsumer eventConsumer) {
if (appView.options().isDesugaredLibraryCompilation()) {
ensureEmulatedDispatchMethodsSynthesized(eventConsumer);
} else {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java
index 02eb59b..1f8322f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java
@@ -150,7 +150,6 @@
.setCode(
methodSig ->
new EmulateInterfaceSyntheticCfCodeProvider(
- methodSig.getHolderType(),
emulatedDispatchMethod.getHolderType(),
desugarMethod,
itfMethod,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
index 7e2164f..6c1e889 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryWrapperSynthesizer.java
@@ -117,16 +117,14 @@
return appView.options().desugaredLibraryConfiguration.getWrapperConversions().contains(type);
}
- DexType ensureTypeWrapper(DexType type, DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
- return ensureWrappers(type, eventConsumer).getWrapper().type;
+ DexType ensureTypeWrapper(DexType type) {
+ return ensureWrappers(type).getWrapper().type;
}
- DexType ensureVivifiedTypeWrapper(
- DexType type, DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
- return ensureWrappers(type, eventConsumer).getVivifiedWrapper().type;
+ DexType ensureVivifiedTypeWrapper(DexType type) {
+ return ensureWrappers(type).getVivifiedWrapper().type;
}
-
public void registerWrapper(DexType type) {
wrappersToGenerate.add(type);
assert getValidClassToWrap(type) != null;
@@ -163,17 +161,13 @@
}
}
- private Wrappers ensureWrappers(
- DexType type, DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
+ private Wrappers ensureWrappers(DexType type) {
assert canGenerateWrapper(type) : type;
DexClass dexClass = getValidClassToWrap(type);
- return ensureWrappers(dexClass, ignored -> {}, eventConsumer);
+ return ensureWrappers(dexClass, ignored -> {});
}
- private Wrappers ensureWrappers(
- DexClass context,
- Consumer<DexClasspathClass> creationCallback,
- DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
+ private Wrappers ensureWrappers(DexClass context, Consumer<DexClasspathClass> creationCallback) {
DexType type = context.type;
DexClass wrapper;
DexClass vivifiedWrapper;
@@ -186,20 +180,15 @@
vivifiedTypeFor(type),
type,
programContext,
- eventConsumer,
- wrapperField ->
- synthesizeVirtualMethodsForTypeWrapper(
- programContext, wrapperField, eventConsumer));
+ wrapperField -> synthesizeVirtualMethodsForTypeWrapper(programContext, wrapperField));
vivifiedWrapper =
ensureProgramWrapper(
SyntheticKind.VIVIFIED_WRAPPER,
type,
vivifiedTypeFor(type),
programContext,
- eventConsumer,
wrapperField ->
- synthesizeVirtualMethodsForVivifiedTypeWrapper(
- programContext, wrapperField, eventConsumer));
+ synthesizeVirtualMethodsForVivifiedTypeWrapper(programContext, wrapperField));
DexField wrapperField = getWrapperUniqueField(wrapper);
DexField vivifiedWrapperField = getWrapperUniqueField(vivifiedWrapper);
ensureProgramConversionMethod(
@@ -216,9 +205,7 @@
type,
classpathOrLibraryContext,
creationCallback,
- eventConsumer,
- wrapperField ->
- synthesizeVirtualMethodsForTypeWrapper(context, wrapperField, eventConsumer));
+ wrapperField -> synthesizeVirtualMethodsForTypeWrapper(context, wrapperField));
vivifiedWrapper =
ensureClasspathWrapper(
SyntheticKind.VIVIFIED_WRAPPER,
@@ -226,10 +213,8 @@
vivifiedTypeFor(type),
classpathOrLibraryContext,
creationCallback,
- eventConsumer,
wrapperField ->
- synthesizeVirtualMethodsForVivifiedTypeWrapper(
- context, wrapperField, eventConsumer));
+ synthesizeVirtualMethodsForVivifiedTypeWrapper(context, wrapperField));
DexField wrapperField = getWrapperUniqueField(wrapper);
DexField vivifiedWrapperField = getWrapperUniqueField(vivifiedWrapper);
ensureClasspathConversionMethod(
@@ -257,7 +242,6 @@
DexType wrappingType,
DexType wrappedType,
DexProgramClass programContext,
- DesugaredLibraryAPIConverterEventConsumer eventConsumer,
Function<DexEncodedField, DexEncodedMethod[]> virtualMethodProvider) {
return appView
.getSyntheticItems()
@@ -268,13 +252,9 @@
builder -> buildWrapper(wrappingType, wrappedType, programContext, builder),
// The creation of virtual methods may require new wrappers, this needs to happen
// once the wrapper is created to avoid infinite recursion.
- wrapper -> {
- if (eventConsumer != null) {
- eventConsumer.acceptWrapperProgramClass(wrapper);
- }
- wrapper.setVirtualMethods(
- virtualMethodProvider.apply(getWrapperUniqueEncodedField(wrapper)));
- });
+ wrapper ->
+ wrapper.setVirtualMethods(
+ virtualMethodProvider.apply(getWrapperUniqueEncodedField(wrapper))));
}
private DexClasspathClass ensureClasspathWrapper(
@@ -283,7 +263,6 @@
DexType wrappedType,
ClasspathOrLibraryClass classpathOrLibraryContext,
Consumer<DexClasspathClass> creationCallback,
- DesugaredLibraryAPIConverterEventConsumer eventConsumer,
Function<DexEncodedField, DexEncodedMethod[]> virtualMethodProvider) {
return appView
.getSyntheticItems()
@@ -297,9 +276,6 @@
// The creation of virtual methods may require new wrappers, this needs to happen
// once the wrapper is created to avoid infinite recursion.
wrapper -> {
- if (eventConsumer != null) {
- eventConsumer.acceptWrapperClasspathClass(wrapper);
- }
wrapper.setVirtualMethods(
virtualMethodProvider.apply(getWrapperUniqueEncodedField(wrapper)));
creationCallback.accept(wrapper);
@@ -406,9 +382,7 @@
}
private DexEncodedMethod[] synthesizeVirtualMethodsForVivifiedTypeWrapper(
- DexClass dexClass,
- DexEncodedField wrapperField,
- DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
+ DexClass dexClass, DexEncodedField wrapperField) {
List<DexEncodedMethod> dexMethods = allImplementedMethods(dexClass);
List<DexEncodedMethod> generatedMethods = new ArrayList<>();
// Each method should use only types in their signature, but each method the wrapper forwards
@@ -447,12 +421,7 @@
} else {
cfCode =
new APIConverterVivifiedWrapperCfCodeProvider(
- appView,
- methodToInstall,
- wrapperField.getReference(),
- converter,
- isInterface,
- eventConsumer)
+ appView, methodToInstall, wrapperField.getReference(), converter, isInterface)
.generateCfCode();
}
DexEncodedMethod newDexEncodedMethod =
@@ -463,9 +432,7 @@
}
private DexEncodedMethod[] synthesizeVirtualMethodsForTypeWrapper(
- DexClass dexClass,
- DexEncodedField wrapperField,
- DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
+ DexClass dexClass, DexEncodedField wrapperField) {
List<DexEncodedMethod> dexMethods = allImplementedMethods(dexClass);
List<DexEncodedMethod> generatedMethods = new ArrayList<>();
// Each method should use only vivified types in their signature, but each method the wrapper
@@ -498,8 +465,7 @@
dexEncodedMethod.getReference(),
wrapperField.getReference(),
converter,
- isInterface,
- eventConsumer)
+ isInterface)
.generateCfCode();
}
DexEncodedMethod newDexEncodedMethod =
@@ -608,7 +574,7 @@
field, fieldAccessFlags, FieldTypeSignature.noSignature(), DexAnnotationSet.empty(), null);
}
- void ensureWrappersForL8(DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
+ void finalizeWrappersForL8() {
DesugaredLibraryConfiguration conf = appView.options().desugaredLibraryConfiguration;
for (DexType type : conf.getWrapperConversions()) {
assert !conf.getCustomConversions().containsKey(type);
@@ -616,7 +582,7 @@
// In broken set-ups we can end up having a json files containing wrappers of non desugared
// classes. Such wrappers are not required since the class won't be rewritten.
if (validClassToWrap.isProgramClass()) {
- ensureWrappers(validClassToWrap, ignored -> {}, eventConsumer);
+ ensureWrappers(validClassToWrap, ignored -> {});
}
}
}
@@ -633,8 +599,7 @@
classpathWrapper -> {
changed.set(true);
synthesizedCallback.accept(classpathWrapper);
- },
- null);
+ });
}
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
index 14e5fea..d86d22c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
@@ -380,8 +380,7 @@
}
@Override
- public void process(
- DexProgramClass clazz, InterfaceProcessingDesugaringEventConsumer eventConsumer) {
+ public void process(DexProgramClass clazz, ProgramMethodSet synthesizedMethods) {
if (!clazz.isInterface()) {
visitClassInfo(clazz, new ReportingContext(clazz, clazz));
}
@@ -390,11 +389,11 @@
// We introduce forwarding methods only once all desugaring has been performed to avoid
// confusing the look-up with inserted forwarding methods.
@Override
- public final void finalizeProcessing(InterfaceProcessingDesugaringEventConsumer eventConsumer) {
+ public final void finalizeProcessing(ProgramMethodSet synthesizedMethods) {
newSyntheticMethods.forEach(
(clazz, newForwardingMethods) -> {
clazz.addVirtualMethods(newForwardingMethods.toDefinitionSet());
- newForwardingMethods.forEach(eventConsumer::acceptForwardingMethod);
+ newForwardingMethods.forEach(synthesizedMethods::add);
});
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceProcessor.java
index f0d298f..46bd871 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceProcessor.java
@@ -19,6 +19,7 @@
import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.Pair;
import com.android.tools.r8.utils.StringDiagnostic;
+import com.android.tools.r8.utils.collections.ProgramMethodSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import java.util.ArrayList;
@@ -88,7 +89,7 @@
}
DexProgramClass ensureEmulateInterfaceLibrary(
- DexProgramClass emulatedInterface, InterfaceProcessingDesugaringEventConsumer eventConsumer) {
+ DexProgramClass emulatedInterface, ProgramMethodSet synthesizedMethods) {
assert rewriter.isEmulatedInterface(emulatedInterface.type);
DexProgramClass emulateInterfaceClass =
appView
@@ -106,7 +107,7 @@
synthesizeEmulatedInterfaceMethod(
method, emulatedInterface, methodBuilder))),
ignored -> {});
- emulateInterfaceClass.forEachProgramMethod(eventConsumer::acceptEmulatedInterfaceMethod);
+ emulateInterfaceClass.forEachProgramMethod(synthesizedMethods::add);
assert emulateInterfaceClass.getType()
== InterfaceMethodRewriter.getEmulateLibraryInterfaceClassType(
emulatedInterface.type, appView.dexItemFactory());
@@ -130,10 +131,9 @@
.setProto(emulatedMethod.getProto())
.setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
.setCode(
- emulatedInterfaceMethod ->
+ theMethod ->
new EmulateInterfaceSyntheticCfCodeProvider(
- emulatedInterfaceMethod.getHolderType(),
- method.getHolderType(),
+ theMethod.getHolderType(),
companionMethod,
libraryMethod,
extraDispatchCases,
@@ -177,22 +177,17 @@
for (int i = subInterfaces.size() - 1; i >= 0; i--) {
DexClass subInterfaceClass = appView.definitionFor(subInterfaces.get(i));
assert subInterfaceClass != null;
+ assert subInterfaceClass.isProgramClass();
// Else computation of subInterface would have failed.
// if the method is implemented, extra dispatch is required.
DexEncodedMethod result = subInterfaceClass.lookupVirtualMethod(method.getReference());
if (result != null && !result.isAbstract()) {
+ assert result.isDefaultMethod();
extraDispatchCases.add(
new Pair<>(
subInterfaceClass.type,
- appView
- .dexItemFactory()
- .createMethod(
- rewriter.getCompanionClassType(subInterfaceClass.type),
- appView
- .dexItemFactory()
- .protoWithDifferentFirstParameter(
- companionMethod.proto, subInterfaceClass.type),
- companionMethod.name)));
+ InterfaceMethodRewriter.defaultAsMethodOfCompanionClass(
+ result.getReference(), appView.dexItemFactory())));
}
}
} else {
@@ -217,15 +212,14 @@
}
@Override
- public void process(
- DexProgramClass emulatedInterface, InterfaceProcessingDesugaringEventConsumer eventConsumer) {
+ public void process(DexProgramClass emulatedInterface, ProgramMethodSet synthesizedMethods) {
if (!appView.options().isDesugaredLibraryCompilation()
|| !rewriter.isEmulatedInterface(emulatedInterface.type)
|| appView.isAlreadyLibraryDesugared(emulatedInterface)) {
return;
}
if (needsEmulateInterfaceLibrary(emulatedInterface)) {
- ensureEmulateInterfaceLibrary(emulatedInterface, eventConsumer);
+ ensureEmulateInterfaceLibrary(emulatedInterface, synthesizedMethods);
}
}
@@ -234,7 +228,7 @@
}
@Override
- public void finalizeProcessing(InterfaceProcessingDesugaringEventConsumer eventConsumer) {
+ public void finalizeProcessing(ProgramMethodSet synthesizedMethods) {
warnMissingEmulatedInterfaces();
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
new file mode 100644
index 0000000..81ec904
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
@@ -0,0 +1,28 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.desugar.itf;
+
+public class InterfaceDesugaringForTesting {
+
+ public static String getEmulateLibraryClassNameSuffix() {
+ return InterfaceMethodRewriter.EMULATE_LIBRARY_CLASS_NAME_SUFFIX;
+ }
+
+ public static String getCompanionClassNameSuffix() {
+ return InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX;
+ }
+
+ public static String getDefaultMethodPrefix() {
+ return InterfaceMethodRewriter.DEFAULT_METHOD_PREFIX;
+ }
+
+ public static String getPrivateMethodPrefix() {
+ return InterfaceMethodRewriter.PRIVATE_METHOD_PREFIX;
+ }
+
+ public static String getCompanionClassDescriptor(String descriptor) {
+ return InterfaceMethodRewriter.getCompanionClassDescriptor(descriptor);
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringProcessor.java
index 4f4ba32..7f3d047 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringProcessor.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.ir.desugar.itf;
import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.utils.collections.ProgramMethodSet;
public interface InterfaceDesugaringProcessor {
@@ -13,11 +14,11 @@
// so this phase cannot modify the classes themselves (for example insertion/removal of methods).
// The phase can insert new classes with new methods, such as emulated interface dispatch classes
// or companion classes with their methods.
- void process(DexProgramClass clazz, InterfaceProcessingDesugaringEventConsumer eventConsumer);
+ void process(DexProgramClass clazz, ProgramMethodSet synthesizedMethods);
// The finalization phase is done at a join point, after all code desugaring have been performed.
// All finalization phases of all desugaring processors are performed sequentially.
// Complex computations should be avoided if possible here and be moved to the concurrent phase.
// Classes may be mutated here (new methods can be inserted, etc.).
- void finalizeProcessing(InterfaceProcessingDesugaringEventConsumer eventConsumer);
+ void finalizeProcessing(ProgramMethodSet synthesizedMethods);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java
index 71844b0..731316f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java
@@ -6,10 +6,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaring;
-import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
import com.android.tools.r8.utils.ThreadUtils;
import com.android.tools.r8.utils.collections.SortedProgramMethodSet;
@@ -19,22 +16,21 @@
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
-public class InterfaceMethodProcessorFacade implements CfPostProcessingDesugaring {
+class InterfaceMethodProcessorFacade {
private final AppView<?> appView;
- private final Flavor flavour;
- private final List<InterfaceDesugaringProcessor> interfaceDesugaringProcessors;
- InterfaceMethodProcessorFacade(
- AppView<?> appView, Flavor flavour, InterfaceMethodRewriter rewriter) {
+ InterfaceMethodProcessorFacade(AppView<?> appView) {
this.appView = appView;
- this.flavour = flavour;
- interfaceDesugaringProcessors = instantiateInterfaceDesugaringProcessors(appView, rewriter);
}
- private List<InterfaceDesugaringProcessor> instantiateInterfaceDesugaringProcessors(
- AppView<?> appView, InterfaceMethodRewriter rewriter) {
-
+ /** Runs the interfaceProcessor, the class processor and the emulated interface processor. */
+ void runInterfaceDesugaringProcessors(
+ InterfaceMethodRewriter rewriter,
+ IRConverter converter,
+ Flavor flavour,
+ ExecutorService executorService)
+ throws ExecutionException {
// During L8 compilation, emulated interfaces are processed to be renamed, to have
// their interfaces fixed-up and to generate the emulated dispatch code.
EmulatedInterfaceProcessor emulatedInterfaceProcessor =
@@ -50,47 +46,17 @@
// classes if needed.
InterfaceProcessor interfaceProcessor = new InterfaceProcessor(appView, rewriter);
- // The processors can be listed in any order.
- return ImmutableList.of(classProcessor, interfaceProcessor, emulatedInterfaceProcessor);
- }
-
- /** Runs the interfaceProcessor, the class processor and the emulated interface processor. */
- void runInterfaceDesugaringProcessorsForR8(IRConverter converter, ExecutorService executorService)
- throws ExecutionException {
-
- CollectingInterfaceDesugaringEventConsumer eventConsumer =
- new CollectingInterfaceDesugaringEventConsumer();
- processClassesConcurrently(eventConsumer, executorService);
- converter.processMethodsConcurrently(
- eventConsumer.getSortedSynthesizedMethods(), executorService);
- }
-
- // This temporary class avoids the duality between collecting with IR processing and
- // having events with the Cf desugaring.
- private static class CollectingInterfaceDesugaringEventConsumer
- implements InterfaceProcessingDesugaringEventConsumer {
+ // The interface processors must be ordered so that finalization of the processing is performed
+ // in that order. The emulatedInterfaceProcessor has to be last at this point to avoid renaming
+ // emulated interfaces before the other processing.
+ ImmutableList<InterfaceDesugaringProcessor> orderedInterfaceDesugaringProcessors =
+ ImmutableList.of(classProcessor, interfaceProcessor, emulatedInterfaceProcessor);
SortedProgramMethodSet sortedSynthesizedMethods = SortedProgramMethodSet.createConcurrent();
-
- @Override
- public void acceptForwardingMethod(ProgramMethod method) {
- sortedSynthesizedMethods.add(method);
- }
-
- @Override
- public void acceptCompanionClassClinit(ProgramMethod method) {
- sortedSynthesizedMethods.add(method);
- }
-
- @Override
- public void acceptEmulatedInterfaceMethod(ProgramMethod method) {
-
- sortedSynthesizedMethods.add(method);
- }
-
- public SortedProgramMethodSet getSortedSynthesizedMethods() {
- return sortedSynthesizedMethods;
- }
+ processClassesConcurrently(
+ orderedInterfaceDesugaringProcessors, sortedSynthesizedMethods, flavour, executorService);
+ assert converter != null;
+ converter.processMethodsConcurrently(sortedSynthesizedMethods, executorService);
}
private boolean shouldProcess(DexProgramClass clazz, Flavor flavour) {
@@ -101,28 +67,22 @@
}
private void processClassesConcurrently(
- InterfaceProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
+ List<InterfaceDesugaringProcessor> processors,
+ SortedProgramMethodSet sortedSynthesizedMethods,
+ Flavor flavour,
+ ExecutorService executorService)
throws ExecutionException {
ThreadUtils.processItems(
Iterables.filter(
appView.appInfo().classes(), (DexProgramClass clazz) -> shouldProcess(clazz, flavour)),
clazz -> {
- for (InterfaceDesugaringProcessor processor : interfaceDesugaringProcessors) {
- processor.process(clazz, eventConsumer);
+ for (InterfaceDesugaringProcessor processor : processors) {
+ processor.process(clazz, sortedSynthesizedMethods);
}
},
executorService);
- for (InterfaceDesugaringProcessor processor : interfaceDesugaringProcessors) {
- processor.finalizeProcessing(eventConsumer);
+ for (InterfaceDesugaringProcessor processor : processors) {
+ processor.finalizeProcessing(sortedSynthesizedMethods);
}
}
-
- @Override
- public void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
- throws ExecutionException {
- // TODO(b/183998768): Would be nice to use the ClassProcessing for the processing of classes,
- // and do here only the finalization.
- processClassesConcurrently(eventConsumer, executorService);
- }
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index e6471fe..6ab6f1f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -120,11 +120,11 @@
//
public final class InterfaceMethodRewriter implements CfInstructionDesugaring {
- // Public for testing.
- public static final String EMULATE_LIBRARY_CLASS_NAME_SUFFIX = "$-EL";
- public static final String COMPANION_CLASS_NAME_SUFFIX = "$-CC";
- public static final String DEFAULT_METHOD_PREFIX = "$default$";
- public static final String PRIVATE_METHOD_PREFIX = "$private$";
+ // Use InterfaceDesugaringForTesting for public accesses in tests.
+ static final String EMULATE_LIBRARY_CLASS_NAME_SUFFIX = "$-EL";
+ static final String COMPANION_CLASS_NAME_SUFFIX = "$-CC";
+ static final String DEFAULT_METHOD_PREFIX = "$default$";
+ static final String PRIVATE_METHOD_PREFIX = "$private$";
private final AppView<?> appView;
private final InternalOptions options;
@@ -1155,7 +1155,8 @@
}
}
- public static String getCompanionClassDescriptor(String descriptor) {
+ // Use InterfaceDesugaringForTesting for public accesses in tests.
+ static String getCompanionClassDescriptor(String descriptor) {
return descriptor.substring(0, descriptor.length() - 1) + COMPANION_CLASS_NAME_SUFFIX + ";";
}
@@ -1167,10 +1168,6 @@
return factory.createSynthesizedType(ccTypeDescriptor);
}
- public DexType getCompanionClassType(DexType type) {
- return getCompanionClassType(type, factory);
- }
-
// Checks if `type` is a companion class.
public static boolean isCompanionClassType(DexType type) {
return type.descriptor.toString().endsWith(COMPANION_CLASS_NAME_SUFFIX + ";");
@@ -1379,15 +1376,11 @@
this.synthesizedMethods.clear();
}
- public void runInterfaceDesugaringProcessorsForR8(
+ public void runInterfaceDesugaringProcessors(
IRConverter converter, Flavor flavour, ExecutorService executorService)
throws ExecutionException {
- getPostProcessingDesugaring(flavour)
- .runInterfaceDesugaringProcessorsForR8(converter, executorService);
- }
-
- public InterfaceMethodProcessorFacade getPostProcessingDesugaring(Flavor flavour) {
- return new InterfaceMethodProcessorFacade(appView, flavour, this);
+ new InterfaceMethodProcessorFacade(appView)
+ .runInterfaceDesugaringProcessors(this, converter, flavour, executorService);
}
final boolean isDefaultMethod(DexEncodedMethod method) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessingDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessingDesugaringEventConsumer.java
deleted file mode 100644
index 2581364..0000000
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessingDesugaringEventConsumer.java
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.ir.desugar.itf;
-
-import com.android.tools.r8.graph.ProgramMethod;
-
-public interface InterfaceProcessingDesugaringEventConsumer {
-
- void acceptForwardingMethod(ProgramMethod method);
-
- void acceptCompanionClassClinit(ProgramMethod method);
-
- void acceptEmulatedInterfaceMethod(ProgramMethod method);
-}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
index 2dd65a9..cb752ad 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -47,6 +47,7 @@
import com.android.tools.r8.utils.collections.BidirectionalOneToOneHashMap;
import com.android.tools.r8.utils.collections.BidirectionalOneToOneMap;
import com.android.tools.r8.utils.collections.MutableBidirectionalOneToOneMap;
+import com.android.tools.r8.utils.collections.ProgramMethodSet;
import com.google.common.collect.ImmutableList;
import java.util.ArrayDeque;
import java.util.ArrayList;
@@ -79,13 +80,12 @@
}
@Override
- public void process(
- DexProgramClass iface, InterfaceProcessingDesugaringEventConsumer eventConsumer) {
+ public void process(DexProgramClass iface, ProgramMethodSet synthesizedMethods) {
if (!iface.isInterface()) {
return;
}
analyzeBridges(iface);
- ensureCompanionClassMethods(iface, eventConsumer);
+ ensureCompanionClassMethods(iface, synthesizedMethods);
}
private void analyzeBridges(DexProgramClass iface) {
@@ -99,8 +99,8 @@
}
private void ensureCompanionClassMethods(
- DexProgramClass iface, InterfaceProcessingDesugaringEventConsumer eventConsumer) {
- ensureCompanionClassInitializesInterface(iface, eventConsumer);
+ DexProgramClass iface, ProgramMethodSet synthesizedMethods) {
+ ensureCompanionClassInitializesInterface(iface, synthesizedMethods);
// TODO(b/183998768): Once fixed, the methods should be added for processing.
// D8 and R8 don't need to optimize the methods since they are just moved from interfaces and
// don't need to be re-processed.
@@ -134,7 +134,7 @@
}
private void ensureCompanionClassInitializesInterface(
- DexProgramClass iface, InterfaceProcessingDesugaringEventConsumer eventConsumer) {
+ DexProgramClass iface, ProgramMethodSet synthesizedMethods) {
if (!hasStaticMethodThatTriggersNonTrivialClassInitializer(iface)) {
return;
}
@@ -146,7 +146,7 @@
appView.dexItemFactory().createProto(appView.dexItemFactory().voidType),
appView,
methodBuilder -> createCompanionClassInitializer(iface, clinitField, methodBuilder));
- eventConsumer.acceptCompanionClassClinit(clinit);
+ synthesizedMethods.add(clinit);
}
private DexEncodedField ensureStaticClinitFieldToTriggerInterfaceInitialization(
@@ -441,7 +441,7 @@
}
@Override
- public void finalizeProcessing(InterfaceProcessingDesugaringEventConsumer eventConsumer) {
+ public void finalizeProcessing(ProgramMethodSet synthesizedMethods) {
InterfaceProcessorNestedGraphLens graphLens = postProcessInterfaces();
if (appView.enableWholeProgramOptimizations() && graphLens != null) {
appView.setGraphLens(graphLens);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index b052672..87adb53 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -19,6 +19,7 @@
import com.android.tools.r8.graph.DexClassAndMember;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMember;
import com.android.tools.r8.graph.DexMethod;
@@ -33,6 +34,7 @@
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.FreshLocalProvider;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
+import com.android.tools.r8.ir.desugar.ProgramAdditions;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
@@ -98,6 +100,121 @@
}
}
+ private static class BridgeAndTarget<T extends DexClassAndMember<?, ?>> {
+ private final DexMethod bridge;
+ private final T target;
+
+ public BridgeAndTarget(DexMethod bridge, T target) {
+ this.bridge = bridge;
+ this.target = target;
+ assert bridge.holder == target.getHolderType();
+ }
+
+ public DexMethod getBridge() {
+ return bridge;
+ }
+
+ public T getTarget() {
+ return target;
+ }
+
+ public boolean shouldAddBridge() {
+ return target.isProgramMember() && target.getHolder().lookupDirectMethod(bridge) == null;
+ }
+ }
+
+ @Override
+ public void prepare(ProgramMethod method, ProgramAdditions programAdditions) {
+ method
+ .getDefinition()
+ .getCode()
+ .asCfCode()
+ .getInstructions()
+ .forEach(
+ instruction -> {
+ if (instruction.isFieldInstruction()) {
+ DexField field = instruction.asFieldInstruction().getField();
+ if (needsDesugaring(field, method)) {
+ prepareDesugarFieldInstruction(
+ field,
+ instruction.asFieldInstruction().isFieldGet(),
+ method,
+ programAdditions);
+ }
+ } else if (instruction.isInvoke()) {
+ DexMethod invokedMethod = instruction.asInvoke().getMethod();
+ if (needsDesugaring(invokedMethod, method)) {
+ prepareDesugarMethodInstruction(invokedMethod, method, programAdditions);
+ }
+ }
+ });
+ }
+
+ private void prepareDesugarFieldInstruction(
+ DexField field, boolean isGet, ProgramMethod context, ProgramAdditions programAdditions) {
+ BridgeAndTarget<DexClassAndField> bridgeAndTarget =
+ bridgeAndTargetForDesugaring(field, isGet, context);
+ if (bridgeAndTarget == null || !bridgeAndTarget.shouldAddBridge()) {
+ return;
+ }
+
+ programAdditions.accept(
+ bridgeAndTarget.getBridge(),
+ () ->
+ AccessBridgeFactory.createFieldAccessorBridge(
+ bridgeAndTarget.getBridge(), bridgeAndTarget.getTarget().asProgramField(), isGet));
+ }
+
+ private void prepareDesugarMethodInstruction(
+ DexMethod method, ProgramMethod context, ProgramAdditions programAdditions) {
+ BridgeAndTarget<DexClassAndMethod> bridgeAndTarget =
+ bridgeAndTargetForDesugaring(method, context);
+ if (bridgeAndTarget == null || !bridgeAndTarget.shouldAddBridge()) {
+ return;
+ }
+ programAdditions.accept(
+ bridgeAndTarget.getBridge(),
+ () ->
+ bridgeAndTarget.getTarget().getDefinition().isInstanceInitializer()
+ ? AccessBridgeFactory.createInitializerAccessorBridge(
+ bridgeAndTarget.getBridge(),
+ bridgeAndTarget.getTarget().asProgramMethod(),
+ dexItemFactory)
+ : AccessBridgeFactory.createMethodAccessorBridge(
+ bridgeAndTarget.getBridge(),
+ bridgeAndTarget.getTarget().asProgramMethod(),
+ dexItemFactory));
+ }
+
+ private BridgeAndTarget<DexClassAndMethod> bridgeAndTargetForDesugaring(
+ DexMethod method, ProgramMethod context) {
+ if (!method.getHolderType().isClassType()) {
+ return null;
+ }
+ // Since we only need to desugar accesses to private methods, and all accesses to private
+ // methods must be accessing the private method directly on its holder, we can lookup the
+ // method on the holder instead of resolving the method.
+ DexClass holder = appView.definitionForHolder(method, context);
+ DexClassAndMethod target = method.lookupMemberOnClass(holder);
+ if (target == null || !needsDesugaring(target, context)) {
+ return null;
+ }
+ return new BridgeAndTarget<>(getMethodBridgeReference(target), target);
+ }
+
+ private BridgeAndTarget<DexClassAndField> bridgeAndTargetForDesugaring(
+ DexField field, boolean isGet, ProgramMethod context) {
+ // Since we only need to desugar accesses to private fields, and all accesses to private
+ // fields must be accessing the private field directly on its holder, we can lookup the
+ // field on the holder instead of resolving the field.
+ DexClass holder = appView.definitionForHolder(field, context);
+ DexClassAndField target = field.lookupMemberOnClass(holder);
+ if (target == null || !needsDesugaring(target, context)) {
+ return null;
+ }
+ return new BridgeAndTarget<>(getFieldAccessBridgeReference(target, isGet), target);
+ }
+
public boolean needsDesugaring(ProgramMethod method) {
if (!method.getHolder().isInANest() || !method.getDefinition().hasCode()) {
return false;
@@ -166,18 +283,21 @@
CfFieldInstruction instruction,
ProgramMethod context,
NestBasedAccessDesugaringEventConsumer eventConsumer) {
- // Since we only need to desugar accesses to private fields, and all accesses to private
- // fields must be accessing the private field directly on its holder, we can lookup the
- // field on the holder instead of resolving the field.
- DexClass holder = appView.definitionForHolder(instruction.getField(), context);
- DexClassAndField field = instruction.getField().lookupMemberOnClass(holder);
- if (field == null || !needsDesugaring(field, context)) {
+
+ BridgeAndTarget<DexClassAndField> bridgeAndTarget =
+ bridgeAndTargetForDesugaring(instruction.getField(), instruction.isFieldGet(), context);
+ if (bridgeAndTarget == null) {
return null;
}
-
- DexMethod bridge = ensureFieldAccessBridge(field, instruction.isFieldGet(), eventConsumer);
+ // All bridges for program fields must have been added through the prepare step.
+ assert !bridgeAndTarget.getTarget().isProgramField()
+ || bridgeAndTarget.getTarget().getHolder().lookupDirectMethod(bridgeAndTarget.getBridge())
+ != null;
return ImmutableList.of(
- new CfInvoke(Opcodes.INVOKESTATIC, bridge, field.getHolder().isInterface()));
+ new CfInvoke(
+ Opcodes.INVOKESTATIC,
+ bridgeAndTarget.getBridge(),
+ bridgeAndTarget.getTarget().getHolder().isInterface()));
}
private List<CfInstruction> desugarInvokeInstruction(
@@ -186,29 +306,27 @@
ProgramMethod context,
NestBasedAccessDesugaringEventConsumer eventConsumer) {
DexMethod invokedMethod = invoke.getMethod();
- if (!invokedMethod.getHolderType().isClassType()) {
+
+ BridgeAndTarget<DexClassAndMethod> bridgeAndTarget =
+ bridgeAndTargetForDesugaring(invokedMethod, context);
+ if (bridgeAndTarget == null) {
return null;
}
-
- // Since we only need to desugar accesses to private methods, and all accesses to private
- // methods must be accessing the private method directly on its holder, we can lookup the
- // method on the holder instead of resolving the method.
- DexClass holder = appView.definitionForHolder(invokedMethod, context);
- DexClassAndMethod target = invokedMethod.lookupMemberOnClass(holder);
- if (target == null || !needsDesugaring(target, context)) {
- return null;
- }
-
- DexMethod bridge = ensureMethodBridge(target, eventConsumer);
- if (target.getDefinition().isInstanceInitializer()) {
+ // All bridges for program methods must have been added through the prepare step.
+ assert !bridgeAndTarget.getTarget().isProgramMethod()
+ || bridgeAndTarget.getTarget().getHolder().lookupDirectMethod(bridgeAndTarget.getBridge())
+ != null;
+ if (bridgeAndTarget.getTarget().getDefinition().isInstanceInitializer()) {
assert !invoke.isInterface();
// Ensure room on the stack for the extra null argument.
localStackAllocator.allocateLocalStack(1);
return ImmutableList.of(
- new CfConstNull(), new CfInvoke(Opcodes.INVOKESPECIAL, bridge, false));
+ new CfConstNull(),
+ new CfInvoke(Opcodes.INVOKESPECIAL, bridgeAndTarget.getBridge(), false));
}
- return ImmutableList.of(new CfInvoke(Opcodes.INVOKESTATIC, bridge, invoke.isInterface()));
+ return ImmutableList.of(
+ new CfInvoke(Opcodes.INVOKESTATIC, bridgeAndTarget.getBridge(), invoke.isInterface()));
}
private RuntimeException reportIncompleteNest(LibraryMember<?, ?> member) {
@@ -279,6 +397,7 @@
return dexItemFactory.createString(prefix + field.getName().toString());
}
+ // This is only used for generating bridge methods for class path references.
DexMethod ensureMethodBridge(
DexClassAndMethod method, NestBasedAccessDesugaringEventConsumer eventConsumer) {
if (method.isProgramMethod()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java
index 533174b..4fd2fcd 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationInfo.java
@@ -56,7 +56,7 @@
}
@Override
- public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi) {
+ public AndroidApiLevel getApiReferenceLevelForDefinition(AndroidApiLevel minApi) {
throw new RuntimeException("Should never be called");
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationWithMinApiInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationWithMinApiInfo.java
index 27c6f43..a9c7462 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationWithMinApiInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultFieldOptimizationWithMinApiInfo.java
@@ -16,12 +16,12 @@
}
@Override
- public boolean hasApiReferenceLevel() {
+ public boolean hasApiReferenceLevelForDefinition() {
return true;
}
@Override
- public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi) {
+ public AndroidApiLevel getApiReferenceLevelForDefinition(AndroidApiLevel minApi) {
return minApi;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
index 2d8ff77..aebd195 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
@@ -197,12 +197,22 @@
}
@Override
- public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi) {
+ public boolean hasApiReferenceLevelForCode() {
+ return false;
+ }
+
+ @Override
+ public AndroidApiLevel getApiReferenceLevelForCode(AndroidApiLevel minApi) {
throw new RuntimeException("Should never be called");
}
@Override
- public boolean hasApiReferenceLevel() {
+ public AndroidApiLevel getApiReferenceLevelForDefinition(AndroidApiLevel minApi) {
+ throw new RuntimeException("Should never be called");
+ }
+
+ @Override
+ public boolean hasApiReferenceLevelForDefinition() {
return false;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationWithMinApiInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationWithMinApiInfo.java
index 0638369..cd06dee 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationWithMinApiInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationWithMinApiInfo.java
@@ -16,12 +16,22 @@
}
@Override
- public boolean hasApiReferenceLevel() {
+ public boolean hasApiReferenceLevelForDefinition() {
return true;
}
@Override
- public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi) {
+ public AndroidApiLevel getApiReferenceLevelForDefinition(AndroidApiLevel minApi) {
+ return minApi;
+ }
+
+ @Override
+ public boolean hasApiReferenceLevelForCode() {
+ return true;
+ }
+
+ @Override
+ public AndroidApiLevel getApiReferenceLevelForCode(AndroidApiLevel minApi) {
return minApi;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java
index 8a098ac..8f42838 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/FieldOptimizationInfo.java
@@ -55,4 +55,14 @@
public abstract boolean isDead();
public abstract boolean valueHasBeenPropagated();
+
+ @Override
+ public boolean isFieldOptimizationInfo() {
+ return true;
+ }
+
+ @Override
+ public FieldOptimizationInfo asFieldOptimizationInfo() {
+ return this;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MemberOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MemberOptimizationInfo.java
index 910669d..9cb8a2a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MemberOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MemberOptimizationInfo.java
@@ -21,11 +21,27 @@
return null;
}
- default boolean hasApiReferenceLevel() {
+ default boolean hasApiReferenceLevelForDefinition() {
return false;
}
- AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi);
+ AndroidApiLevel getApiReferenceLevelForDefinition(AndroidApiLevel minApi);
T toMutableOptimizationInfo();
+
+ default boolean isFieldOptimizationInfo() {
+ return false;
+ }
+
+ default boolean isMethodOptimizationInfo() {
+ return false;
+ }
+
+ default FieldOptimizationInfo asFieldOptimizationInfo() {
+ return null;
+ }
+
+ default MethodOptimizationInfo asMethodOptimizationInfo() {
+ return null;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
index 4de895c..30c8d7a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
@@ -17,6 +17,7 @@
import com.android.tools.r8.ir.optimize.enums.classification.EnumUnboxerMethodClassification;
import com.android.tools.r8.ir.optimize.info.bridge.BridgeInfo;
import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
+import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.OptionalBool;
import java.util.BitSet;
@@ -103,17 +104,31 @@
public abstract boolean returnValueHasBeenPropagated();
+ public abstract boolean hasApiReferenceLevelForCode();
+
+ public abstract AndroidApiLevel getApiReferenceLevelForCode(AndroidApiLevel minApi);
+
public static OptionalBool isApiSafeForInlining(
MethodOptimizationInfo caller, MethodOptimizationInfo inlinee, InternalOptions options) {
if (!options.apiModelingOptions().enableApiCallerIdentification) {
return OptionalBool.TRUE;
}
- if (!caller.hasApiReferenceLevel() || !inlinee.hasApiReferenceLevel()) {
+ if (!caller.hasApiReferenceLevelForCode() || !inlinee.hasApiReferenceLevelForCode()) {
return UNKNOWN;
}
return OptionalBool.of(
caller
- .getApiReferenceLevel(options.minApiLevel)
- .isGreaterThanOrEqualTo(inlinee.getApiReferenceLevel(options.minApiLevel)));
+ .getApiReferenceLevelForCode(options.minApiLevel)
+ .isGreaterThanOrEqualTo(inlinee.getApiReferenceLevelForCode(options.minApiLevel)));
+ }
+
+ @Override
+ public boolean isMethodOptimizationInfo() {
+ return true;
+ }
+
+ @Override
+ public MethodOptimizationInfo asMethodOptimizationInfo() {
+ return this;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
index d00377e..bdab6e8 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
@@ -69,6 +69,7 @@
public MutableFieldOptimizationInfo mutableCopy() {
MutableFieldOptimizationInfo copy = new MutableFieldOptimizationInfo();
copy.flags = flags;
+ copy.apiReferenceLevel = apiReferenceLevel;
return copy;
}
@@ -156,13 +157,13 @@
@SuppressWarnings("OptionalAssignedToNull")
@Override
- public boolean hasApiReferenceLevel() {
+ public boolean hasApiReferenceLevelForDefinition() {
return apiReferenceLevel != null;
}
@Override
- public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi) {
- assert hasApiReferenceLevel();
+ public AndroidApiLevel getApiReferenceLevelForDefinition(AndroidApiLevel minApi) {
+ assert hasApiReferenceLevelForDefinition();
return apiReferenceLevel.orElse(minApi);
}
@@ -174,7 +175,7 @@
}
@Override
- public void setApiReferenceLevel(AndroidApiLevel apiReferenceLevel) {
+ public void setApiReferenceLevelForDefinition(AndroidApiLevel apiReferenceLevel) {
assert apiReferenceLevel != null;
this.apiReferenceLevel = Optional.of(apiReferenceLevel);
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
index 348312f..0f81ec0 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
@@ -75,7 +75,8 @@
private SimpleInliningConstraint simpleInliningConstraint =
NeverSimpleInliningConstraint.getInstance();
- private Optional<AndroidApiLevel> apiReferenceLevel = null;
+ private Optional<AndroidApiLevel> codeApiReferenceLevel = null;
+ private Optional<AndroidApiLevel> definitionApiReferenceLevel = null;
// To reduce the memory footprint of UpdatableMethodOptimizationInfo, all the boolean fields are
// merged into a flag int field. The various static final FLAG fields indicate which bit is
@@ -158,7 +159,8 @@
nonNullParamOnNormalExits = template.nonNullParamOnNormalExits;
classInlinerConstraint = template.classInlinerConstraint;
enumUnboxerMethodClassification = template.enumUnboxerMethodClassification;
- apiReferenceLevel = template.apiReferenceLevel;
+ definitionApiReferenceLevel = template.definitionApiReferenceLevel;
+ codeApiReferenceLevel = template.codeApiReferenceLevel;
}
public MutableMethodOptimizationInfo fixupClassTypeReferences(
@@ -526,28 +528,47 @@
}
@Override
- public AndroidApiLevel getApiReferenceLevel(AndroidApiLevel minApi) {
- assert hasApiReferenceLevel();
- return apiReferenceLevel.orElse(minApi);
+ public AndroidApiLevel getApiReferenceLevelForDefinition(AndroidApiLevel minApi) {
+ assert hasApiReferenceLevelForDefinition();
+ return definitionApiReferenceLevel.orElse(minApi);
}
@SuppressWarnings("OptionalAssignedToNull")
@Override
- public boolean hasApiReferenceLevel() {
- return apiReferenceLevel != null;
+ public boolean hasApiReferenceLevelForDefinition() {
+ return definitionApiReferenceLevel != null;
+ }
+
+ @Override
+ @SuppressWarnings("OptionalAssignedToNull")
+ public boolean hasApiReferenceLevelForCode() {
+ return codeApiReferenceLevel != null;
+ }
+
+ @Override
+ public AndroidApiLevel getApiReferenceLevelForCode(AndroidApiLevel minApi) {
+ assert hasApiReferenceLevelForCode();
+ return codeApiReferenceLevel.orElse(minApi);
}
@Override
@SuppressWarnings("OptionalAssignedToNull")
public void setMinApiReferenceLevel() {
- assert apiReferenceLevel == null;
- this.apiReferenceLevel = Optional.empty();
+ assert codeApiReferenceLevel == null;
+ assert definitionApiReferenceLevel == null;
+ this.codeApiReferenceLevel = Optional.empty();
+ this.definitionApiReferenceLevel = Optional.empty();
+ }
+
+ public void setApiReferenceLevelForCode(AndroidApiLevel apiLevel) {
+ assert apiLevel != null;
+ this.codeApiReferenceLevel = Optional.of(apiLevel);
}
@Override
- public void setApiReferenceLevel(AndroidApiLevel apiReferenceLevel) {
- assert apiReferenceLevel != null;
- this.apiReferenceLevel = Optional.of(apiReferenceLevel);
+ public void setApiReferenceLevelForDefinition(AndroidApiLevel apiLevel) {
+ assert apiLevel != null;
+ this.definitionApiReferenceLevel = Optional.of(apiLevel);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableOptimizationInfo.java
index db7bd1d..421f689 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableOptimizationInfo.java
@@ -10,5 +10,5 @@
void setMinApiReferenceLevel();
- void setApiReferenceLevel(AndroidApiLevel apiReferenceLevel);
+ void setApiReferenceLevelForDefinition(AndroidApiLevel apiLevel);
}
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java
index 5680337..db93ced 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java
@@ -32,8 +32,6 @@
import com.android.tools.r8.ir.code.If;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverterEventConsumer;
-import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.collections.ImmutableDeque;
import com.android.tools.r8.utils.collections.ImmutableInt2ReferenceSortedMap;
import java.util.ArrayList;
@@ -64,25 +62,22 @@
public static class APIConverterVivifiedWrapperCfCodeProvider
extends DesugaredLibraryAPIConversionCfCodeProvider {
- private final DexField wrapperField;
- private final DexMethod forwardMethod;
- private final DesugaredLibraryAPIConverter converter;
- private final boolean itfCall;
- private final DesugaredLibraryAPIConverterEventConsumer eventConsumer;
+ DexField wrapperField;
+ DexMethod forwardMethod;
+ DesugaredLibraryAPIConverter converter;
+ boolean itfCall;
public APIConverterVivifiedWrapperCfCodeProvider(
AppView<?> appView,
DexMethod forwardMethod,
DexField wrapperField,
DesugaredLibraryAPIConverter converter,
- boolean itfCall,
- DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
+ boolean itfCall) {
super(appView, wrapperField.holder);
this.forwardMethod = forwardMethod;
this.wrapperField = wrapperField;
this.converter = converter;
this.itfCall = itfCall;
- this.eventConsumer = eventConsumer;
}
@Override
@@ -103,8 +98,7 @@
instructions.add(
new CfInvoke(
Opcodes.INVOKESTATIC,
- converter.ensureConversionMethod(
- param, param, vivifiedTypeFor(param), eventConsumer),
+ converter.ensureConversionMethod(param, param, vivifiedTypeFor(param)),
false));
newParameters[index - 1] = vivifiedTypeFor(param);
}
@@ -136,7 +130,7 @@
new CfInvoke(
Opcodes.INVOKESTATIC,
converter.ensureConversionMethod(
- returnType, vivifiedTypeFor(returnType), returnType, eventConsumer),
+ returnType, vivifiedTypeFor(returnType), returnType),
false));
}
if (returnType == factory.voidType) {
@@ -155,22 +149,19 @@
DexMethod forwardMethod;
DesugaredLibraryAPIConverter converter;
boolean itfCall;
- private final DesugaredLibraryAPIConverterEventConsumer eventConsumer;
public APIConverterWrapperCfCodeProvider(
AppView<?> appView,
DexMethod forwardMethod,
DexField wrapperField,
DesugaredLibraryAPIConverter converter,
- boolean itfCall,
- DesugaredLibraryAPIConverterEventConsumer eventConsumer) {
+ boolean itfCall) {
// Var wrapperField is null if should forward to receiver.
super(appView, wrapperField == null ? forwardMethod.holder : wrapperField.holder);
this.forwardMethod = forwardMethod;
this.wrapperField = wrapperField;
this.converter = converter;
this.itfCall = itfCall;
- this.eventConsumer = eventConsumer;
}
@Override
@@ -194,8 +185,7 @@
instructions.add(
new CfInvoke(
Opcodes.INVOKESTATIC,
- converter.ensureConversionMethod(
- param, vivifiedTypeFor(param), param, eventConsumer),
+ converter.ensureConversionMethod(param, vivifiedTypeFor(param), param),
false));
}
if (param == factory.longType || param == factory.doubleType) {
@@ -216,7 +206,7 @@
new CfInvoke(
Opcodes.INVOKESTATIC,
converter.ensureConversionMethod(
- returnType, returnType, vivifiedTypeFor(returnType), eventConsumer),
+ returnType, returnType, vivifiedTypeFor(returnType)),
false));
returnType = vivifiedTypeFor(returnType);
}
@@ -292,105 +282,6 @@
}
}
- public static class APIConversionCfCodeProvider extends SyntheticCfCodeProvider {
-
- private final CfInvoke initialInvoke;
- private final DexMethod returnConversion;
- private final DexMethod[] parameterConversions;
-
- public APIConversionCfCodeProvider(
- AppView<?> appView,
- DexType holder,
- CfInvoke initialInvoke,
- DexMethod returnConversion,
- DexMethod[] parameterConversions) {
- super(appView, holder);
- this.initialInvoke = initialInvoke;
- this.returnConversion = returnConversion;
- this.parameterConversions = parameterConversions;
- }
-
- private DexType invalidType(DexMethod invokedMethod, DexMethod convertedMethod) {
- if (invokedMethod.getReturnType() != convertedMethod.getReturnType()
- && returnConversion == null) {
- return invokedMethod.getReturnType();
- }
- for (int i = 0; i < invokedMethod.getArity(); i++) {
- if (invokedMethod.getParameter(i) != convertedMethod.getParameter(i)
- && parameterConversions[i] == null) {
- return invokedMethod.getParameter(i);
- }
- }
- return null;
- }
-
- @Override
- public CfCode generateCfCode() {
- DexMethod invokedMethod = initialInvoke.getMethod();
- DexMethod convertedMethod =
- DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
- invokedMethod, invokedMethod.holder, appView);
-
- DexType invalidType = invalidType(invokedMethod, convertedMethod);
- if (invalidType != null) {
- // This is true if the API conversion requires to convert a type which is impossible to
- // convert: no custom conversion and no wrapping possible. This is extremely rare and
- // should happen only with broken desugared library set-ups. A warning has already been
- // reported at this point.
- DexString message =
- appView
- .dexItemFactory()
- .createString(
- "The method "
- + invokedMethod
- + " requires API conversion, but conversion was impossible because of the"
- + " non convertible type "
- + invalidType
- + ".");
- return new APIConverterThrowRuntimeExceptionCfCodeProvider(
- appView, message, invokedMethod.getHolderType())
- .generateCfCode();
- }
-
- List<CfInstruction> instructions = new ArrayList<>();
-
- boolean isStatic = initialInvoke.getOpcode() == Opcodes.INVOKESTATIC;
- if (!isStatic) {
- instructions.add(new CfLoad(ValueType.fromDexType(invokedMethod.holder), 0));
- }
- int receiverShift = BooleanUtils.intValue(!isStatic);
- int stackIndex = 0;
- for (int i = 0; i < invokedMethod.getArity(); i++) {
- DexType param = invokedMethod.getParameter(i);
- instructions.add(new CfLoad(ValueType.fromDexType(param), stackIndex + receiverShift));
- if (parameterConversions[i] != null) {
- instructions.add(new CfInvoke(Opcodes.INVOKESTATIC, parameterConversions[i], false));
- }
- if (param == appView.dexItemFactory().longType
- || param == appView.dexItemFactory().doubleType) {
- stackIndex++;
- }
- stackIndex++;
- }
-
- // Actual call to converted value.
- instructions.add(
- new CfInvoke(initialInvoke.getOpcode(), convertedMethod, initialInvoke.isInterface()));
-
- // Return conversion.
- if (returnConversion != null) {
- instructions.add(new CfInvoke(Opcodes.INVOKESTATIC, returnConversion, false));
- }
-
- if (invokedMethod.getReturnType().isVoidType()) {
- instructions.add(new CfReturnVoid());
- } else {
- instructions.add(new CfReturn(ValueType.fromDexType(invokedMethod.getReturnType())));
- }
- return standardCfCodeFromInstructions(instructions);
- }
- }
-
public static class APIConverterConstructorCfCodeProvider extends SyntheticCfCodeProvider {
DexField wrapperField;
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/EmulateInterfaceSyntheticCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/EmulateInterfaceSyntheticCfCodeProvider.java
index e1ba3b2..7f26a19 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/EmulateInterfaceSyntheticCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/EmulateInterfaceSyntheticCfCodeProvider.java
@@ -36,13 +36,12 @@
private final List<Pair<DexType, DexMethod>> extraDispatchCases;
public EmulateInterfaceSyntheticCfCodeProvider(
- DexType holder,
DexType interfaceType,
DexMethod companionMethod,
DexMethod libraryMethod,
List<Pair<DexType, DexMethod>> extraDispatchCases,
AppView<?> appView) {
- super(appView, holder);
+ super(appView, interfaceType);
this.interfaceType = interfaceType;
this.companionMethod = companionMethod;
this.libraryMethod = libraryMethod;
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 02aea63..822a7dc 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -105,6 +105,7 @@
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer.R8PostProcessingDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.LambdaClass;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
+import com.android.tools.r8.ir.desugar.ProgramAdditions;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
import com.android.tools.r8.kotlin.KotlinMetadataEnqueuerExtension;
import com.android.tools.r8.logging.Log;
@@ -3466,6 +3467,13 @@
if (pendingDesugaring.isEmpty()) {
return;
}
+
+ // Prepare desugaring by collecting all the synthetic methods required on program classes.
+ ProgramAdditions programAdditions = new ProgramAdditions();
+ ThreadUtils.processItems(
+ pendingDesugaring, method -> desugaring.prepare(method, programAdditions), executorService);
+ programAdditions.apply(executorService);
+
R8CfInstructionDesugaringEventConsumer desugaringEventConsumer =
CfInstructionDesugaringEventConsumer.createForR8(
appView,
@@ -3878,14 +3886,14 @@
}
}
- private void postProcessingDesugaring() throws ExecutionException {
+ private void postProcessingDesugaring() {
SyntheticAdditions syntheticAdditions =
new SyntheticAdditions(appView.createProcessorContext());
R8PostProcessingDesugaringEventConsumer eventConsumer =
CfPostProcessingDesugaringEventConsumer.createForR8(appView, syntheticAdditions);
- CfPostProcessingDesugaringCollection.create(appView, null, desugaring.getRetargetingInfo())
- .postProcessingDesugaring(eventConsumer, executorService);
+ CfPostProcessingDesugaringCollection.create(appView, desugaring.getRetargetingInfo())
+ .postProcessingDesugaring(eventConsumer);
if (syntheticAdditions.isEmpty()) {
return;
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
index 4768437..2fcac55 100644
--- a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
@@ -18,8 +18,8 @@
import com.android.tools.r8.utils.Action;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
-import java.util.ArrayDeque;
import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
public abstract class EnqueuerWorklist {
@@ -369,7 +369,7 @@
static class PushableEnqueuerWorkList extends EnqueuerWorklist {
PushableEnqueuerWorkList(Enqueuer enqueuer) {
- super(enqueuer, new ArrayDeque<>());
+ super(enqueuer, new ConcurrentLinkedQueue<>());
}
@Override
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index 9f87beb..4c1ac7c 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -51,8 +51,7 @@
THROW_NSME("ThrowNSME", 16, true),
TWR_CLOSE_RESOURCE("TwrCloseResource", 17, true),
SERVICE_LOADER("ServiceLoad", 18, true),
- OUTLINE("Outline", 19, true),
- API_CONVERSION("APIConversion", 26, true);
+ OUTLINE("Outline", 19, true);
static {
assert verifyNoOverlappingIds();
diff --git a/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java
index 4838419..5fe5cf1 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java
@@ -44,6 +44,10 @@
return backing.get(method);
}
+ public boolean contains(DexMethod method) {
+ return backing.containsKey(method);
+ }
+
public boolean contains(DexEncodedMethod method) {
return backing.containsKey(method.getReference());
}
diff --git a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
index f13a704..dfebfd7 100644
--- a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
import static org.junit.Assert.assertEquals;
@@ -13,7 +14,6 @@
import com.android.tools.r8.errors.InternalCompilerError;
import com.android.tools.r8.errors.Unimplemented;
import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
@@ -97,7 +97,7 @@
// interface, the main class/interface, or for JDK9, desugaring of try-with-resources.
ClassReference reference = Reference.classFromDescriptor(descriptor);
Assert.assertTrue(
- descriptor.endsWith(InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX + ";")
+ descriptor.endsWith(getCompanionClassNameSuffix() + ";")
|| SyntheticItemsTestUtils.isExternalTwrCloseMethod(reference)
|| SyntheticItemsTestUtils.isExternalLambda(reference)
|| SyntheticItemsTestUtils.isExternalStaticInterfaceCall(reference)
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index fd7a3bd..a20964a 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -4,6 +4,8 @@
package com.android.tools.r8;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getPrivateMethodPrefix;
import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
import static com.android.tools.r8.utils.FileUtils.ZIP_EXTENSION;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
@@ -13,7 +15,6 @@
import static org.junit.Assume.assumeFalse;
import com.android.tools.r8.ToolHelper.DexVm;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.TestDescriptionWatcher;
@@ -218,21 +219,24 @@
public void desugaredPrivateInterfaceMethods() throws Throwable {
assumeFalse("CF backend does not desugar", this instanceof R8CFRunExamplesJava9Test);
final String iName = "privateinterfacemethods.I";
- test("desugared-private-interface-methods",
- "privateinterfacemethods", "PrivateInterfaceMethods")
+ test(
+ "desugared-private-interface-methods",
+ "privateinterfacemethods",
+ "PrivateInterfaceMethods")
.withMinApiLevel(AndroidApiLevel.M.getLevel())
.withKeepAll()
- .withDexCheck(dexInspector -> {
- ClassSubject companion = dexInspector.clazz(
- iName + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX);
- assertThat(companion, isPresent());
- MethodSubject iFoo = companion.method(
- "java.lang.String",
- InterfaceMethodRewriter.PRIVATE_METHOD_PREFIX + "iFoo",
- ImmutableList.of(iName, "boolean"));
- assertThat(iFoo, isPresent());
- assertTrue(iFoo.getMethod().isPublicMethod());
- })
+ .withDexCheck(
+ dexInspector -> {
+ ClassSubject companion = dexInspector.clazz(iName + getCompanionClassNameSuffix());
+ assertThat(companion, isPresent());
+ MethodSubject iFoo =
+ companion.method(
+ "java.lang.String",
+ getPrivateMethodPrefix() + "iFoo",
+ ImmutableList.of(iName, "boolean"));
+ assertThat(iFoo, isPresent());
+ assertTrue(iFoo.getMethod().isPublicMethod());
+ })
.run();
}
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 0a7edb3..f0d2830 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -197,6 +197,10 @@
return Paths.get(getDesugarLibraryJsonDir(), "desugar_jdk_libs.json");
}
+ public static Path getCHMOnlyDesugarLibJsonForTesting() {
+ return Paths.get(getDesugarLibraryJsonDir(), "chm_only_desugar_jdk_libs.json");
+ }
+
public static Path getDesugarLibJsonForTestingAlternative3() {
return Paths.get(getDesugarLibraryJsonDir(), "desugar_jdk_libs_alternative_3.json");
}
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerDebugTestRunner.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerDebugTestRunner.java
index 210967c..8709781 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerDebugTestRunner.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerDebugTestRunner.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.classmerging.vertical;
-import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -52,7 +52,7 @@
// applied) contain "$classmerging$.
String qualifiedMethodSignature =
state.getClassSignature() + "->" + state.getMethodName() + state.getMethodSignature();
- boolean holderIsCompanionClass = state.getClassName().endsWith(COMPANION_CLASS_NAME_SUFFIX);
+ boolean holderIsCompanionClass = state.getClassName().endsWith(getCompanionClassNameSuffix());
if (!holderIsCompanionClass) {
assertThat(qualifiedMethodSignature, not(containsString("$classmerging$")));
}
diff --git a/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java b/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
index 5f4be39..927b5ba 100644
--- a/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
@@ -4,10 +4,12 @@
package com.android.tools.r8.debug;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getDefaultMethodPrefix;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.Command;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
+import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
@@ -52,12 +54,12 @@
defaultMethodName = "doSomething";
defaultMethodThisName = "this";
} else {
- defaultMethodContainerClass = "InterfaceWithDefaultAndStaticMethods"
- + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX;
+ defaultMethodContainerClass =
+ "InterfaceWithDefaultAndStaticMethods" + getCompanionClassNameSuffix();
// IntelliJ's debugger does not know about the companion class. The only way to match it with
// the source file or the desguared interface is to make it an inner class.
- assertEquals('$', InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX.charAt(0));
- defaultMethodName = InterfaceMethodRewriter.DEFAULT_METHOD_PREFIX + "doSomething";
+ assertEquals('$', getCompanionClassNameSuffix().charAt(0));
+ defaultMethodName = getDefaultMethodPrefix() + "doSomething";
defaultMethodThisName = "_this";
}
@@ -121,8 +123,9 @@
if (supportsDefaultMethod(config)) {
staticMethodContainerClass = "InterfaceWithDefaultAndStaticMethods";
} else {
- staticMethodContainerClass = "InterfaceWithDefaultAndStaticMethods"
- + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX;
+ staticMethodContainerClass =
+ "InterfaceWithDefaultAndStaticMethods"
+ + InterfaceDesugaringForTesting.getCompanionClassNameSuffix();
}
List<Command> commands = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/desugar/ConcurrencyTest.java b/src/test/java/com/android/tools/r8/desugar/ConcurrencyTest.java
index 380127b..848fc6d 100644
--- a/src/test/java/com/android/tools/r8/desugar/ConcurrencyTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/ConcurrencyTest.java
@@ -6,7 +6,6 @@
import static com.android.tools.r8.TestRuntime.CfVm.JDK11;
import static org.junit.Assume.assumeTrue;
-import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.cf.CfVersion;
@@ -57,7 +56,8 @@
}));
for (String s : new String[] {"a", "b", "c", "d", "e"}) {
for (int i = 0; i < 10; i++) {
- transformer.setPrivate(Host.class.getDeclaredMethod(s + "0" + i));
+ transformer.setPrivate(Host.class.getDeclaredMethod(s + "0" + i, int.class));
+ transformer.setPrivate(Host.class.getDeclaredField("f" + s + "0" + i));
}
}
@@ -76,100 +76,234 @@
@Test
public void testD8() throws Exception {
- try {
- testForD8(parameters.getBackend())
- .addProgramClasses(getClasses())
- .addProgramClassFileData(getTransformedClasses())
- .compile();
- } catch (CompilationFailedException e) {
- if (e.getCause() instanceof ArrayIndexOutOfBoundsException) {
- // TODO(b/192310793): This should not happen.
- return;
- }
- throw e;
- }
+ testForD8(parameters.getBackend())
+ .addProgramClasses(getClasses())
+ .addProgramClassFileData(getTransformedClasses())
+ .compile();
}
@Test
public void testR8() throws Exception {
assumeTrue(parameters.getBackend().isDex());
- try {
- testForR8(parameters.getBackend())
- .addProgramClasses(getClasses())
- .addProgramClassFileData(getTransformedClasses())
- .setMinApi(parameters.getApiLevel())
- .addKeepAllClassesRule()
- .compile();
- } catch (CompilationFailedException e) {
- if (e.getCause() instanceof AssertionError
- && e.getCause()
- .getStackTrace()[0]
- .getClassName()
- .equals(
- "com.android.tools.r8.ir.desugar.NonEmptyCfInstructionDesugaringCollection")) {
- // TODO(b/192446461): This should not happen.
- return;
- }
- throw e;
- }
+ testForR8(parameters.getBackend())
+ .addProgramClasses(getClasses())
+ .addProgramClassFileData(getTransformedClasses())
+ .setMinApi(parameters.getApiLevel())
+ .addKeepAllClassesRule()
+ .compile();
}
static class Host {
- /* will be private */ void a00() {}
- /* will be private */ void a01() {}
- /* will be private */ void a02() {}
- /* will be private */ void a03() {}
- /* will be private */ void a04() {}
- /* will be private */ void a05() {}
- /* will be private */ void a06() {}
- /* will be private */ void a07() {}
- /* will be private */ void a08() {}
- /* will be private */ void a09() {}
+ /* will be private */ int fa00;
+ /* will be private */ int fa01;
+ /* will be private */ int fa02;
+ /* will be private */ int fa03;
+ /* will be private */ int fa04;
+ /* will be private */ int fa05;
+ /* will be private */ int fa06;
+ /* will be private */ int fa07;
+ /* will be private */ int fa08;
+ /* will be private */ int fa09;
- /* will be private */ void b00() {}
- /* will be private */ void b01() {}
- /* will be private */ void b02() {}
- /* will be private */ void b03() {}
- /* will be private */ void b04() {}
- /* will be private */ void b05() {}
- /* will be private */ void b06() {}
- /* will be private */ void b07() {}
- /* will be private */ void b08() {}
- /* will be private */ void b09() {}
+ /* will be private */ int fb00;
+ /* will be private */ int fb01;
+ /* will be private */ int fb02;
+ /* will be private */ int fb03;
+ /* will be private */ int fb04;
+ /* will be private */ int fb05;
+ /* will be private */ int fb06;
+ /* will be private */ int fb07;
+ /* will be private */ int fb08;
+ /* will be private */ int fb09;
- /* will be private */ void c00() {}
- /* will be private */ void c01() {}
- /* will be private */ void c02() {}
- /* will be private */ void c03() {}
- /* will be private */ void c04() {}
- /* will be private */ void c05() {}
- /* will be private */ void c06() {}
- /* will be private */ void c07() {}
- /* will be private */ void c08() {}
- /* will be private */ void c09() {}
+ /* will be private */ int fc00;
+ /* will be private */ int fc01;
+ /* will be private */ int fc02;
+ /* will be private */ int fc03;
+ /* will be private */ int fc04;
+ /* will be private */ int fc05;
+ /* will be private */ int fc06;
+ /* will be private */ int fc07;
+ /* will be private */ int fc08;
+ /* will be private */ int fc09;
- /* will be private */ void d00() {}
- /* will be private */ void d01() {}
- /* will be private */ void d02() {}
- /* will be private */ void d03() {}
- /* will be private */ void d04() {}
- /* will be private */ void d05() {}
- /* will be private */ void d06() {}
- /* will be private */ void d07() {}
- /* will be private */ void d08() {}
- /* will be private */ void d09() {}
+ /* will be private */ int fd00;
+ /* will be private */ int fd01;
+ /* will be private */ int fd02;
+ /* will be private */ int fd03;
+ /* will be private */ int fd04;
+ /* will be private */ int fd05;
+ /* will be private */ int fd06;
+ /* will be private */ int fd07;
+ /* will be private */ int fd08;
+ /* will be private */ int fd09;
- /* will be private */ void e00() {}
- /* will be private */ void e01() {}
- /* will be private */ void e02() {}
- /* will be private */ void e03() {}
- /* will be private */ void e04() {}
- /* will be private */ void e05() {}
- /* will be private */ void e06() {}
- /* will be private */ void e07() {}
- /* will be private */ void e08() {}
- /* will be private */ void e09() {}
+ /* will be private */ int fe00;
+ /* will be private */ int fe01;
+ /* will be private */ int fe02;
+ /* will be private */ int fe03;
+ /* will be private */ int fe04;
+ /* will be private */ int fe05;
+ /* will be private */ int fe06;
+ /* will be private */ int fe07;
+ /* will be private */ int fe08;
+ /* will be private */ int fe09;
+
+ /* will be private */ int a00(int x) {
+ return x;
+ }
+ /* will be private */ int a01(int x) {
+ return x;
+ }
+ /* will be private */ int a02(int x) {
+ return x;
+ }
+ /* will be private */ int a03(int x) {
+ return x;
+ }
+ /* will be private */ int a04(int x) {
+ return x;
+ }
+ /* will be private */ int a05(int x) {
+ return x;
+ }
+ /* will be private */ int a06(int x) {
+ return x;
+ }
+ /* will be private */ int a07(int x) {
+ return x;
+ }
+ /* will be private */ int a08(int x) {
+ return x;
+ }
+ /* will be private */ int a09(int x) {
+ return x;
+ }
+
+ /* will be private */ int b00(int x) {
+ return x;
+ }
+ /* will be private */ int b01(int x) {
+ return x;
+ }
+ /* will be private */ int b02(int x) {
+ return x;
+ }
+ /* will be private */ int b03(int x) {
+ return x;
+ }
+ /* will be private */ int b04(int x) {
+ return x;
+ }
+ /* will be private */ int b05(int x) {
+ return x;
+ }
+ /* will be private */ int b06(int x) {
+ return x;
+ }
+ /* will be private */ int b07(int x) {
+ return x;
+ }
+ /* will be private */ int b08(int x) {
+ return x;
+ }
+ /* will be private */ int b09(int x) {
+ return x;
+ }
+
+ /* will be private */ int c00(int x) {
+ return x;
+ }
+ /* will be private */ int c01(int x) {
+ return x;
+ }
+ /* will be private */ int c02(int x) {
+ return x;
+ }
+ /* will be private */ int c03(int x) {
+ return x;
+ }
+ /* will be private */ int c04(int x) {
+ return x;
+ }
+ /* will be private */ int c05(int x) {
+ return x;
+ }
+ /* will be private */ int c06(int x) {
+ return x;
+ }
+ /* will be private */ int c07(int x) {
+ return x;
+ }
+ /* will be private */ int c08(int x) {
+ return x;
+ }
+ /* will be private */ int c09(int x) {
+ return x;
+ }
+
+ /* will be private */ int d00(int x) {
+ return x;
+ }
+ /* will be private */ int d01(int x) {
+ return x;
+ }
+ /* will be private */ int d02(int x) {
+ return x;
+ }
+ /* will be private */ int d03(int x) {
+ return x;
+ }
+ /* will be private */ int d04(int x) {
+ return x;
+ }
+ /* will be private */ int d05(int x) {
+ return x;
+ }
+ /* will be private */ int d06(int x) {
+ return x;
+ }
+ /* will be private */ int d07(int x) {
+ return x;
+ }
+ /* will be private */ int d08(int x) {
+ return x;
+ }
+ /* will be private */ int d09(int x) {
+ return x;
+ }
+
+ /* will be private */ int e00(int x) {
+ return x;
+ }
+ /* will be private */ int e01(int x) {
+ return x;
+ }
+ /* will be private */ int e02(int x) {
+ return x;
+ }
+ /* will be private */ int e03(int x) {
+ return x;
+ }
+ /* will be private */ int e04(int x) {
+ return x;
+ }
+ /* will be private */ int e05(int x) {
+ return x;
+ }
+ /* will be private */ int e06(int x) {
+ return x;
+ }
+ /* will be private */ int e07(int x) {
+ return x;
+ }
+ /* will be private */ int e08(int x) {
+ return x;
+ }
+ /* will be private */ int e09(int x) {
+ return x;
+ }
private void hello() {}
@@ -275,86 +409,191 @@
new Host().hello();
new Host().hello();
new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
+ new Host().hello();
}
}
static class A {
public void foo() {
// Will be virtual invoke to private methods.
- new Host().a00();
- new Host().a01();
- new Host().a02();
- new Host().a03();
- new Host().a04();
- new Host().a05();
- new Host().a06();
- new Host().a07();
- new Host().a08();
- new Host().a09();
+ Host host = new Host();
+ host.fa00 = host.a00(host.fa00);
+ host.fa01 = host.a01(host.fa01);
+ host.fa02 = host.a02(host.fa02);
+ host.fa03 = host.a03(host.fa03);
+ host.fa04 = host.a04(host.fa04);
+ host.fa05 = host.a05(host.fa05);
+ host.fa06 = host.a06(host.fa06);
+ host.fa07 = host.a07(host.fa07);
+ host.fa08 = host.a08(host.fa08);
+ host.fa09 = host.a09(host.fa09);
}
}
static class B {
public void foo() {
// Will be virtual invoke to private methods.
- new Host().b00();
- new Host().b01();
- new Host().b02();
- new Host().b03();
- new Host().b04();
- new Host().b05();
- new Host().b06();
- new Host().b07();
- new Host().b08();
- new Host().b09();
+ Host host = new Host();
+ host.fb00 = host.b00(host.fb00);
+ host.fb01 = host.b01(host.fb01);
+ host.fb02 = host.b02(host.fb02);
+ host.fb03 = host.b03(host.fb03);
+ host.fb04 = host.b04(host.fb04);
+ host.fb05 = host.b05(host.fb05);
+ host.fb06 = host.b06(host.fb06);
+ host.fb07 = host.b07(host.fb07);
+ host.fb08 = host.b08(host.fb08);
+ host.fb09 = host.b09(host.fb09);
}
}
static class C {
public void foo() {
// Will be virtual invoke to private methods.
- new Host().c00();
- new Host().c01();
- new Host().c02();
- new Host().c03();
- new Host().c04();
- new Host().c05();
- new Host().c06();
- new Host().c07();
- new Host().c08();
- new Host().c09();
+ Host host = new Host();
+ host.fc00 = host.c00(host.fc00);
+ host.fc01 = host.c01(host.fc01);
+ host.fc02 = host.c02(host.fc02);
+ host.fc03 = host.c03(host.fc03);
+ host.fc04 = host.c04(host.fc04);
+ host.fc05 = host.c05(host.fc05);
+ host.fc06 = host.c06(host.fc06);
+ host.fc07 = host.c07(host.fc07);
+ host.fc08 = host.c08(host.fc08);
+ host.fc09 = host.c09(host.fc09);
}
}
static class D {
public void foo() {
// Will be virtual invoke to private methods.
- new Host().d00();
- new Host().d01();
- new Host().d02();
- new Host().d03();
- new Host().d04();
- new Host().d05();
- new Host().d06();
- new Host().d07();
- new Host().d08();
- new Host().d09();
+ Host host = new Host();
+ host.fd00 = host.d00(host.fd00);
+ host.fd01 = host.d01(host.fd01);
+ host.fd02 = host.d02(host.fd02);
+ host.fd03 = host.d03(host.fd03);
+ host.fd04 = host.d04(host.fd04);
+ host.fd05 = host.d05(host.fd05);
+ host.fd06 = host.d06(host.fd06);
+ host.fd07 = host.d07(host.fd07);
+ host.fd08 = host.d08(host.fd08);
+ host.fd09 = host.d09(host.fd09);
}
}
static class E {
public void foo() {
// Will be virtual invoke to private methods.
- new Host().e00();
- new Host().e01();
- new Host().e02();
- new Host().e03();
- new Host().e04();
- new Host().e05();
- new Host().e06();
- new Host().e07();
- new Host().e08();
- new Host().e09();
+ Host host = new Host();
+ host.fe00 = host.e00(host.fe00);
+ host.fe01 = host.e01(host.fe01);
+ host.fe02 = host.e02(host.fe02);
+ host.fe03 = host.e03(host.fe03);
+ host.fe04 = host.e04(host.fe04);
+ host.fe05 = host.e05(host.fe05);
+ host.fe06 = host.e06(host.fe06);
+ host.fe07 = host.e07(host.fe07);
+ host.fe08 = host.e08(host.fe08);
+ host.fe09 = host.e09(host.fe09);
}
}
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarInnerClassesInInterfaces.java b/src/test/java/com/android/tools/r8/desugar/DesugarInnerClassesInInterfaces.java
index 2d396f7d..1c8d5b9 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarInnerClassesInInterfaces.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarInnerClassesInInterfaces.java
@@ -3,11 +3,12 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.desugar;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
+
import com.android.tools.r8.DesugarTestConfiguration;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.concurrent.Callable;
@@ -24,16 +25,16 @@
private final List<String> EXPECTED_RESULT_WITH_DESUGARING =
ImmutableList.of(
- WithAnonymousInner.class.getName() + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX,
+ WithAnonymousInner.class.getName() + getCompanionClassNameSuffix(),
"true",
- WithLocalInner.class.getName() + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX,
+ WithLocalInner.class.getName() + getCompanionClassNameSuffix(),
"true");
private final List<String> EXPECTED_RESULT_WITH_DESUGARING_B168697955 =
ImmutableList.of(
- WithAnonymousInner.class.getName() + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX,
+ WithAnonymousInner.class.getName() + getCompanionClassNameSuffix(),
"false",
- WithLocalInner.class.getName() + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX,
+ WithLocalInner.class.getName() + getCompanionClassNameSuffix(),
"false");
@Parameterized.Parameters(name = "{0}")
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
index fdca331..ddebca5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
@@ -126,7 +126,7 @@
Path desugaredLib =
getDesugaredLibraryInCF(parameters, this::configurationForLibraryCompilation);
- // Run on the JVM with desugared library on classpath.
+ // Run on the JVM with desuagred library on classpath.
testForJvm()
.addProgramFiles(jar)
.addRunClasspathFiles(desugaredLib)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java
new file mode 100644
index 0000000..dc995e3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java
@@ -0,0 +1,81 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.desugaredlibrary;
+
+import com.android.tools.r8.StringResource;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfiguration;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryConfigurationParser;
+import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.nio.file.Path;
+import java.util.Collections;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class DesugaredLibraryCHMOnlyContentTest extends DesugaredLibraryTestBase {
+
+ private final TestParameters parameters;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withDexRuntimes().withAllApiLevels().build();
+ }
+
+ public DesugaredLibraryCHMOnlyContentTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testDesugaredLibraryContentCHMOnlyD8() throws Exception {
+ Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
+ Assume.assumeTrue(isJDK11DesugaredLibrary());
+ Path desugaredLib =
+ buildDesugaredLibrary(
+ parameters.getApiLevel(),
+ "",
+ false,
+ Collections.emptyList(),
+ options -> {
+ options.desugaredLibraryConfiguration =
+ chmOnlyConfiguration(options, true, parameters);
+ });
+ CodeInspector inspector = new CodeInspector(desugaredLib);
+ assert inspector.clazz("j$.util.concurrent.ConcurrentHashMap").isPresent();
+ }
+
+ @Test
+ public void testDesugaredLibraryContentCHMOnlyR8() throws Exception {
+ Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters));
+ Assume.assumeTrue(isJDK11DesugaredLibrary());
+ Path desugaredLib =
+ buildDesugaredLibrary(
+ parameters.getApiLevel(),
+ "-keep class * { *; }",
+ true,
+ Collections.emptyList(),
+ options -> {
+ options.desugaredLibraryConfiguration =
+ chmOnlyConfiguration(options, true, parameters);
+ });
+ CodeInspector inspector = new CodeInspector(desugaredLib);
+ assert inspector.clazz("j$.util.concurrent.ConcurrentHashMap").isPresent();
+ }
+
+ DesugaredLibraryConfiguration chmOnlyConfiguration(
+ InternalOptions options, boolean libraryCompilation, TestParameters parameters) {
+ return new DesugaredLibraryConfigurationParser(
+ options.dexItemFactory(),
+ options.reporter,
+ libraryCompilation,
+ parameters.getApiLevel().getLevel())
+ .parse(StringResource.fromFile(ToolHelper.getCHMOnlyDesugarLibJsonForTesting()));
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
index 02d036c..c7544d5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
@@ -41,13 +41,22 @@
}
@Test
- public void testDesugaredLibraryContent() throws Exception {
+ public void testDesugaredLibraryContentD8() throws Exception {
Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
CodeInspector inspector = new CodeInspector(buildDesugaredLibrary(parameters.getApiLevel()));
assertCorrect(inspector);
}
@Test
+ public void testDesugaredLibraryContentR8() throws Exception {
+ Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
+ CodeInspector inspector =
+ new CodeInspector(
+ buildDesugaredLibrary(parameters.getApiLevel(), "-keep class * { *; }", true));
+ assertCorrect(inspector);
+ }
+
+ @Test
public void testDesugaredLibraryContentWithCoreLambdaStubsAsProgram() throws Exception {
Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
ArrayList<Path> coreLambdaStubs = new ArrayList<>();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
index 4e96f57..b3d3ddd 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.desugar.desugaredlibrary;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getEmulateLibraryClassNameSuffix;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertTrue;
@@ -14,7 +15,6 @@
import com.android.tools.r8.code.Instruction;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
@@ -75,11 +75,7 @@
private List<FoundClassSubject> getEmulatedInterfaces(CodeInspector inspector) {
return inspector.allClasses().stream()
- .filter(
- clazz ->
- clazz
- .getOriginalName()
- .contains(InterfaceMethodRewriter.EMULATE_LIBRARY_CLASS_NAME_SUFFIX))
+ .filter(clazz -> clazz.getOriginalName().contains(getEmulateLibraryClassNameSuffix()))
.collect(Collectors.toList());
}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionFinalClassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionFinalClassTest.java
index 131295c..f9d1828 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionFinalClassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionFinalClassTest.java
@@ -68,9 +68,7 @@
.inspectDiagnosticMessages(this::assertDiagnosis)
.addRunClasspathFiles(customLib)
.run(parameters.getRuntime(), Executor.class)
- .assertFailureWithErrorThatMatches(
- containsString(
- "conversion was impossible because of the non convertible type java.time.Year"));
+ .assertFailureWithErrorThatMatches(containsString("NoSuchMethodError"));
}
private void assertDiagnosis(TestDiagnosticMessages d) {
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
index 30dc93f..236cf7e 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
@@ -91,9 +91,9 @@
parameters.isCfRuntime(),
result ->
result.assertSuccessWithOutputLines(
- "int, int, Outer$Inner-IA, 3",
- "int, Outer$Inner-IA, 2",
"Outer$Inner-IA, 1",
+ "int, Outer$Inner-IA, 2",
+ "int, int, Outer$Inner-IA, 3",
"int, int, 2",
"int, 1",
"0"),
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromStaticInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromStaticInterfaceMethodTest.java
index 5660355..e1763f1 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromStaticInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromStaticInterfaceMethodTest.java
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.optimize.outliner;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
@@ -12,7 +13,6 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.HorizontallyMergedClassesInspector;
@@ -65,8 +65,7 @@
.getApiLevel()
.isGreaterThanOrEqualTo(apiLevelWithStaticInterfaceMethodsSupport())
? inspector.clazz(I.class)
- : inspector.clazz(
- I.class.getTypeName() + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX);
+ : inspector.clazz(I.class.getTypeName() + getCompanionClassNameSuffix());
assertThat(interfaceSubject, isPresent());
MethodSubject greetMethodSubject = interfaceSubject.uniqueMethodWithName("greet");
diff --git a/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
index 2875a43..36a35e5 100644
--- a/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
+++ b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
@@ -3,11 +3,11 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.jasmin;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertFalse;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -37,8 +37,7 @@
AndroidApp androidApp = compileWithD8(builder);
CodeInspector codeInspector = new CodeInspector(androidApp);
- ClassSubject clazz =
- codeInspector.clazz("MyAnnotation" + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX);
+ ClassSubject clazz = codeInspector.clazz("MyAnnotation" + getCompanionClassNameSuffix());
assertThat(clazz, isPresent());
assertFalse(clazz.isAnnotation());
}
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/desugar/DefaultInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/desugar/DefaultInterfaceMethodTest.java
index cae1185..1868602 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/desugar/DefaultInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/desugar/DefaultInterfaceMethodTest.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
+import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
@@ -84,9 +84,11 @@
assertTrue(inspector.clazz(LibraryInterface.class).isPresent());
assertTrue(inspector.method(LibraryInterface.class.getMethod("foo")).isPresent());
if (willDesugarDefaultInterfaceMethods(parameters.getApiLevel())) {
- ClassSubject companion = inspector.clazz(Reference.classFromDescriptor(
- InterfaceMethodRewriter.getCompanionClassDescriptor(
- classFromClass(LibraryInterface.class).getDescriptor())));
+ ClassSubject companion =
+ inspector.clazz(
+ Reference.classFromDescriptor(
+ InterfaceDesugaringForTesting.getCompanionClassDescriptor(
+ classFromClass(LibraryInterface.class).getDescriptor())));
// Check that we included the companion class.
assertTrue(companion.isPresent());
// TODO(b/129223905): Check the method is also present on the companion class.
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/interfacemethoddesugaring/IfRuleWithInterfaceMethodDesugaringTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/interfacemethoddesugaring/IfRuleWithInterfaceMethodDesugaringTest.java
index 961d400..19b87e4 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/interfacemethoddesugaring/IfRuleWithInterfaceMethodDesugaringTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/interfacemethoddesugaring/IfRuleWithInterfaceMethodDesugaringTest.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.shaking.ifrule.interfacemethoddesugaring;
-import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPublic;
import static com.android.tools.r8.utils.codeinspector.Matchers.isStatic;
@@ -74,7 +74,7 @@
.inspector();
ClassSubject classSubject =
- inspector.clazz(Interface.class.getTypeName() + COMPANION_CLASS_NAME_SUFFIX);
+ inspector.clazz(Interface.class.getTypeName() + getCompanionClassNameSuffix());
assertThat(classSubject, isPresent());
assertEquals(2, classSubject.allMethods().size());
diff --git a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
index 1b4ec31..6ffbce9 100644
--- a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
+++ b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
@@ -5,7 +5,7 @@
import static org.hamcrest.CoreMatchers.containsString;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
+import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.references.Reference;
@@ -22,7 +22,7 @@
public static ClassReference syntheticCompanionClass(Class<?> clazz) {
return Reference.classFromDescriptor(
- InterfaceMethodRewriter.getCompanionClassDescriptor(
+ InterfaceDesugaringForTesting.getCompanionClassDescriptor(
Reference.classFromClass(clazz).getDescriptor()));
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index 4f8ecd3..8beec8a 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.utils.codeinspector;
-import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
import com.android.tools.r8.graph.ClassAccessFlags;
import com.android.tools.r8.graph.DexMethod;
@@ -232,7 +232,9 @@
String descriptor = reference.getDescriptor();
return codeInspector.clazz(
Reference.classFromDescriptor(
- descriptor.substring(0, descriptor.length() - 1) + COMPANION_CLASS_NAME_SUFFIX + ";"));
+ descriptor.substring(0, descriptor.length() - 1)
+ + getCompanionClassNameSuffix()
+ + ";"));
}
public abstract RetraceClassResult retrace();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index 0533c6b..77c68b3 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.utils.codeinspector;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getCompanionClassNameSuffix;
+
import com.android.tools.r8.DexIndexedConsumer;
import com.android.tools.r8.StringResource;
import com.android.tools.r8.TestDiagnosticMessagesImpl;
@@ -24,7 +26,6 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.SwitchPayloadResolver;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.naming.ClassNamingForNameMapper;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
@@ -327,9 +328,7 @@
}
public ClassSubject companionClassFor(Class<?> clazz) {
- return clazz(
- Reference.classFromTypeName(
- clazz.getTypeName() + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX));
+ return clazz(Reference.classFromTypeName(clazz.getTypeName() + getCompanionClassNameSuffix()));
}
public void forAllClasses(Consumer<FoundClassSubject> inspection) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index 268c51a..d781ef5 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.utils.codeinspector;
-import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.DEFAULT_METHOD_PREFIX;
+import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getDefaultMethodPrefix;
import com.android.tools.r8.cf.code.CfInstruction;
import com.android.tools.r8.cf.code.CfPosition;
@@ -372,7 +372,7 @@
.build();
return companionClass.method(
reference.getReturnType().getTypeName(),
- DEFAULT_METHOD_PREFIX + reference.getMethodName(),
+ getDefaultMethodPrefix() + reference.getMethodName(),
p);
}
}
diff --git a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
index cb35cd0..64f4609 100644
--- a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
+++ b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
@@ -1 +1 @@
-5696c90f0675746b4e996c80de461dd2cfd80076
\ No newline at end of file
+112c4e2bbfdd1e825ee02a98416ba385ad5433d0
\ No newline at end of file
diff --git a/tools/archive_desugar_jdk_libs.py b/tools/archive_desugar_jdk_libs.py
index 2bc8386..d2c1ef1 100755
--- a/tools/archive_desugar_jdk_libs.py
+++ b/tools/archive_desugar_jdk_libs.py
@@ -104,7 +104,7 @@
checkout_dir, 'bazel-bin', 'src', 'share', 'classes', 'java', 'libjava.jar')
else:
library_jar = os.path.join(
- checkout_dir, 'bazel-bin', 'jdk11', 'src', 'java_base_selected.jar')
+ checkout_dir, 'bazel-bin', 'jdk11', 'src', 'd8_java_base_selected.jar')
maven_zip = os.path.join(
checkout_dir,
'bazel-bin',