From baa502f0061775704be868fb7d61b5608114adf3 Mon Sep 17 00:00:00 2001 From: Sam Maier Date: Thu, 21 May 2020 14:27:57 +0000 Subject: [PATCH] Rolling R8 2.1.20 -> 2.1.26 * Fixes optimization bug (see linked bug) * Introduces enum simplification * Adds command-line support for L8 optimizations Bug: 1077307 Change-Id: I85e4bba61253c9056d4544cbd849ec0d9bcd97a4 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2210792 Reviewed-by: Andrew Grieve Commit-Queue: Sam Maier Cr-Commit-Position: refs/heads/master@{#771030} --- DEPS | 2 +- base/android/proguard/chromium_apk.flags | 2 +- base/android/proguard/chromium_code.flags | 6 +- ...rome_public_bundle.proguard_flags.expected | 8 +-- third_party/r8/README.chromium | 12 ++-- third_party/r8/desugar_jdk_libs.json | 6 +- ...ome-Change-meaning-of-file-per-class.patch | 8 +-- .../0002-Adds-feature-jar-to-R8-command.patch | 10 +-- ...ke-all-lambdas-stateless-fix-naming.patch} | 16 ++--- ...-merging-and-outlining-settable-via.patch} | 18 ++--- ...005-Fix-up-proguard-keeps-for-Chrome.patch | 25 +++---- ...brary-keep-rule-output-to-R8-command.patch | 69 +++++++++++++++++++ 12 files changed, 127 insertions(+), 55 deletions(-) rename third_party/r8/patches/{0003-Desugaring-Make-all-lambdas-stateless-fix-naming-sch.patch => 0003-Desugaring-Make-all-lambdas-stateless-fix-naming.patch} (75%) rename third_party/r8/patches/{0004-Make-class-merging-and-outlining-settable-via-comman.patch => 0004-Make-class-merging-and-outlining-settable-via.patch} (77%) create mode 100644 third_party/r8/patches/0006-Add-desugared-library-keep-rule-output-to-R8-command.patch diff --git a/DEPS b/DEPS index e1dbeac6c866ec..443db47d77f822 100644 --- a/DEPS +++ b/DEPS @@ -1323,7 +1323,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/r8', - 'version': 'UAycWqc5QfELtJhhnoU4jQHjsyxPjRNyZ0EfvlojaY4C', + 'version': 'bri3RbTe5EACoEqrT7RBNXf6QZ1fIHWpsWpg9lW-JEQC', }, ], 'condition': 'checkout_android', diff --git a/base/android/proguard/chromium_apk.flags b/base/android/proguard/chromium_apk.flags index d23027e4d3ca74..fcf488804dd7b1 100644 --- a/base/android/proguard/chromium_apk.flags +++ b/base/android/proguard/chromium_apk.flags @@ -77,6 +77,6 @@ } # Protobuf java lite runtime uses reflection --keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite { +-keepclassmembers,allowaccessmodification class * extends com.google.protobuf.GeneratedMessageLite { ; } diff --git a/base/android/proguard/chromium_code.flags b/base/android/proguard/chromium_code.flags index f1070dd64dc810..18a17c252c6b1d 100644 --- a/base/android/proguard/chromium_code.flags +++ b/base/android/proguard/chromium_code.flags @@ -34,13 +34,13 @@ -keep @org.chromium.base.annotations.UsedByReflection class ** {} # Keeps for method level annotations. --keepclasseswithmembers class ** { +-keepclasseswithmembers,allowaccessmodification class ** { @org.chromium.base.annotations.AccessedByNative ; } --keepclasseswithmembers,includedescriptorclasses class ** { +-keepclasseswithmembers,includedescriptorclasses,allowaccessmodification class ** { @org.chromium.base.annotations.CalledByNative ; } --keepclasseswithmembers,includedescriptorclasses class ** { +-keepclasseswithmembers,includedescriptorclasses,allowaccessmodification class ** { @org.chromium.base.annotations.CalledByNativeUnchecked ; } -keepclasseswithmembers class ** { diff --git a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected index 2cd283a58c3ecd..ab2d22634e3a8e 100644 --- a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected +++ b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected @@ -155,7 +155,7 @@ } # Protobuf java lite runtime uses reflection --keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite { +-keepclassmembers,allowaccessmodification class * extends com.google.protobuf.GeneratedMessageLite { ; } @@ -198,13 +198,13 @@ -keep @org.chromium.base.annotations.UsedByReflection class ** {} # Keeps for method level annotations. --keepclasseswithmembers class ** { +-keepclasseswithmembers,allowaccessmodification class ** { @org.chromium.base.annotations.AccessedByNative ; } --keepclasseswithmembers,includedescriptorclasses class ** { +-keepclasseswithmembers,includedescriptorclasses,allowaccessmodification class ** { @org.chromium.base.annotations.CalledByNative ; } --keepclasseswithmembers,includedescriptorclasses class ** { +-keepclasseswithmembers,includedescriptorclasses,allowaccessmodification class ** { @org.chromium.base.annotations.CalledByNativeUnchecked ; } -keepclasseswithmembers class ** { diff --git a/third_party/r8/README.chromium b/third_party/r8/README.chromium index 8a34ad1487abc8..bf65af246e4fd6 100644 --- a/third_party/r8/README.chromium +++ b/third_party/r8/README.chromium @@ -1,7 +1,7 @@ Name: R8 URL: https://r8.googlesource.com/r8 -Revision: 80f8cf3e5117f48b7bb8058ce08f554c5df67111 -Version: 2.1.20-dev +Revision: 924f28bdb1f32b7504d6813ee911ba1949be6130 +Version: 2.1.26-dev License: BSD 3-Clause License File: NOT_SHIPPED Security Critical: no @@ -34,8 +34,12 @@ tools/gradle.py r8 java -jar build/libs/r8.jar --debug --classfile --output r8.jar \ --lib $CHROMIUM_SRC/third_party/jdk/current --pg-conf src/main/keep.txt \ --no-minification --no-desugaring build/libs/r8.jar -rm $CHROMIUM_SRC/third_party/r8/libs/r8.jar -cp r8.jar $CHROMIUM_SRC/third_party/r8/libs/r8.jar +rm $CHROMIUM_SRC/third_party/r8/lib/r8.jar +cp r8.jar $CHROMIUM_SRC/third_party/r8/lib/r8.jar + +# Create patches if conflicts / new patches. Change number if expecting +# different amount of patches: +git format-patch -6 -o $CHROMIUM_SRC/third_party/r8/patches # Upload to CIPD: cipd create --pkg-def cipd.yaml # Make note of the instance ID diff --git a/third_party/r8/desugar_jdk_libs.json b/third_party/r8/desugar_jdk_libs.json index aadb6719d7976e..07765bbd54d2c2 100644 --- a/third_party/r8/desugar_jdk_libs.json +++ b/third_party/r8/desugar_jdk_libs.json @@ -1,6 +1,8 @@ { - "configuration_format_version": 3, - "version": "0.11.1", + "configuration_format_version": 4, + "group_id" : "com.tools.android", + "artifact_id" : "desugar_jdk_libs", + "version": "0.11.2", "required_compilation_api_level": 26, "synthesized_library_classes_package_prefix": "j$.", "library_flags": [ diff --git a/third_party/r8/patches/0001-Chrome-Change-meaning-of-file-per-class.patch b/third_party/r8/patches/0001-Chrome-Change-meaning-of-file-per-class.patch index 02d82875fe9844..07d809a48bf63c 100644 --- a/third_party/r8/patches/0001-Chrome-Change-meaning-of-file-per-class.patch +++ b/third_party/r8/patches/0001-Chrome-Change-meaning-of-file-per-class.patch @@ -1,7 +1,7 @@ -From 7b3c28d6438661f28ac7125db4ac3ff2d5776ff4 Mon Sep 17 00:00:00 2001 +From d9bab8bcf0e7ae33fb878327b850623cfa0504fe Mon Sep 17 00:00:00 2001 From: Andrew Grieve Date: Mon, 27 Apr 2020 14:53:10 -0400 -Subject: [PATCH 1/5] Chrome: Change meaning of --file-per-class +Subject: [PATCH 1/6] Chrome: Change meaning of --file-per-class Make it mean OutputMode.DexFilePerClassFile instead of OutputMode.DexFilePerClass. @@ -12,7 +12,7 @@ Fixes Chrome's incremental dexing logic. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/android/tools/r8/D8CommandParser.java b/src/main/java/com/android/tools/r8/D8CommandParser.java -index aad3468dd..470a7c44b 100644 +index 3c7fdd2c2..e3d6f1c8f 100644 --- a/src/main/java/com/android/tools/r8/D8CommandParser.java +++ b/src/main/java/com/android/tools/r8/D8CommandParser.java @@ -209,7 +209,7 @@ public class D8CommandParser extends BaseCompilerCommandParser Date: Mon, 27 Apr 2020 15:00:00 -0400 -Subject: [PATCH] Adds --feature-jar to R8 command +Subject: [PATCH 2/6] Adds --feature-jar to R8 command Chrome needs this to expose feature splits via command-line --- @@ -10,7 +10,7 @@ Chrome needs this to expose feature splits via command-line 2 files changed, 21 insertions(+) diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java -index 3e9ae7eb1..898b44255 100644 +index 656f3aa47..909b7bc93 100644 --- a/src/main/java/com/android/tools/r8/R8Command.java +++ b/src/main/java/com/android/tools/r8/R8Command.java @@ -70,6 +70,18 @@ public final class R8Command extends BaseCompilerCommand { @@ -33,7 +33,7 @@ index 3e9ae7eb1..898b44255 100644 private static class DefaultR8DiagnosticsHandler implements DiagnosticsHandler { diff --git a/src/main/java/com/android/tools/r8/R8CommandParser.java b/src/main/java/com/android/tools/r8/R8CommandParser.java -index f04f93722..d1b767725 100644 +index d31606dea..8d286601c 100644 --- a/src/main/java/com/android/tools/r8/R8CommandParser.java +++ b/src/main/java/com/android/tools/r8/R8CommandParser.java @@ -24,6 +24,7 @@ public class R8CommandParser extends BaseCompilerCommandParser -Date: Wed, 1 Apr 2020 10:03:46 -0400 -Subject: [PATCH 3/5] Desugaring: Make all lambdas stateless & fix naming +From 4fbdadba00834e5fd2f7863ed387bc06c761d37b Mon Sep 17 00:00:00 2001 +From: Sam Maier +Date: Tue, 19 May 2020 15:55:44 -0400 +Subject: [PATCH 3/6] Desugaring: Make all lambdas stateless & fix naming scheme of method references Statefull lambdas regress dex size. @@ -12,7 +12,7 @@ Bug: b/129997269 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java -index 0831e6d93..0abb97180 100644 +index f41bdce43..0dbdc24eb 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java @@ -128,7 +128,8 @@ public final class LambdaClass { @@ -22,7 +22,7 @@ index 0831e6d93..0abb97180 100644 - if (match.delegatesToLambdaImplMethod() || match.needsAccessor(accessedFrom)) { + if (true || match.delegatesToLambdaImplMethod() || match.needsAccessor(accessedFrom)) { + // Chrome: This class name is required for supersize to map the symbol to source .java file. - lambdaClassDescriptor.append(accessedFrom.getName()).append('$'); + lambdaClassDescriptor.append(accessedFrom.getHolderType().getName()).append('$'); } @@ -206,7 +207,7 @@ public final class LambdaClass { @@ -30,10 +30,10 @@ index 0831e6d93..0abb97180 100644 public final boolean isStateless() { - return descriptor.isStateless(); -+ return false; // descriptor.isStateless(); ++ return false; // descriptor.isStateless(); } void addSynthesizedFrom(DexProgramClass clazz) { -- -2.26.0.rc2.310.g2932bb562d-goog +2.26.2.761.g0e0b3e54be-goog diff --git a/third_party/r8/patches/0004-Make-class-merging-and-outlining-settable-via-comman.patch b/third_party/r8/patches/0004-Make-class-merging-and-outlining-settable-via.patch similarity index 77% rename from third_party/r8/patches/0004-Make-class-merging-and-outlining-settable-via-comman.patch rename to third_party/r8/patches/0004-Make-class-merging-and-outlining-settable-via.patch index d5037d6894b5b7..382cfae27bdfc7 100644 --- a/third_party/r8/patches/0004-Make-class-merging-and-outlining-settable-via-comman.patch +++ b/third_party/r8/patches/0004-Make-class-merging-and-outlining-settable-via.patch @@ -1,7 +1,7 @@ -From c090e841899461437cc91adbdfc7c74ef8091a53 Mon Sep 17 00:00:00 2001 -From: Andrew Grieve -Date: Wed, 1 Apr 2020 10:06:15 -0400 -Subject: [PATCH 4/5] Make class merging and outlining settable via +From b5cf822a88747e6026dd9743d71cef2d5ee53fa2 Mon Sep 17 00:00:00 2001 +From: Sam Maier +Date: Tue, 19 May 2020 16:24:11 -0400 +Subject: [PATCH 4/6] Make class merging and outlining settable via command-line --- @@ -9,10 +9,10 @@ Subject: [PATCH 4/5] Make class merging and outlining settable via 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java -index 232b54a54..fd45dfe36 100644 +index 997d4e905..06df3675d 100644 --- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java +++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java -@@ -198,8 +198,8 @@ public class InternalOptions { +@@ -220,8 +220,8 @@ public class InternalOptions { public boolean enableFieldAssignmentTracker = true; public boolean enableFieldBitAccessAnalysis = System.getProperty("com.android.tools.r8.fieldBitAccessAnalysis") != null; @@ -21,9 +21,9 @@ index 232b54a54..fd45dfe36 100644 + public boolean enableHorizontalClassMerging = System.getProperty("com.android.tools.r8.enableHorizontalClassMerging") != null; + public boolean enableVerticalClassMerging = System.getProperty("com.android.tools.r8.enableVerticalClassMerging") != null; public boolean enableArgumentRemoval = true; - public boolean enableUnusedArgumentRemoval = true; public boolean enableUnusedInterfaceRemoval = true; -@@ -956,7 +956,7 @@ public class InternalOptions { + public boolean enableDevirtualization = true; +@@ -1057,7 +1057,7 @@ public class InternalOptions { public static final String CLASS_NAME = "com.android.tools.r8.GeneratedOutlineSupport"; public static final String METHOD_PREFIX = "outline"; @@ -33,5 +33,5 @@ index 232b54a54..fd45dfe36 100644 public int maxSize = 99; public int threshold = 20; -- -2.26.0.rc2.310.g2932bb562d-goog +2.26.2.761.g0e0b3e54be-goog diff --git a/third_party/r8/patches/0005-Fix-up-proguard-keeps-for-Chrome.patch b/third_party/r8/patches/0005-Fix-up-proguard-keeps-for-Chrome.patch index f42ab8ae5e6b7d..baf30408af145c 100644 --- a/third_party/r8/patches/0005-Fix-up-proguard-keeps-for-Chrome.patch +++ b/third_party/r8/patches/0005-Fix-up-proguard-keeps-for-Chrome.patch @@ -1,23 +1,20 @@ -From fe0cf2feb23d4cdcf4dc287bddba9ea07538aa35 Mon Sep 17 00:00:00 2001 -From: Andrew Grieve -Date: Wed, 1 Apr 2020 10:06:57 -0400 -Subject: [PATCH 5/5] Fix up proguard keeps for Chrome +From bf551ce100964a415341e8c30a067720c4be85eb Mon Sep 17 00:00:00 2001 +From: Sam Maier +Date: Tue, 19 May 2020 16:27:53 -0400 +Subject: [PATCH 5/6] Fix up proguard keeps for Chrome --- - src/main/keep.txt | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) + src/main/keep.txt | 6 ++++++ + 1 file changed, 6 insertions(+) diff --git a/src/main/keep.txt b/src/main/keep.txt -index b0c58c916..5e4405175 100644 +index 7791d4e88..182ea9d37 100644 --- a/src/main/keep.txt +++ b/src/main/keep.txt -@@ -27,4 +27,10 @@ - -keep public class com.android.tools.r8.compatproguard.CompatProguard { public static void main(java.lang.String[]); } +@@ -23,3 +23,9 @@ - # Compatibility command line program used by in google3. ---keep public class com.android.tools.r8.compatdx.CompatDx { public static void main(java.lang.String[]); } -\ No newline at end of file -+-keep public class com.android.tools.r8.compatdx.CompatDx { public static void main(java.lang.String[]); } + # Compatibility command line program used by the Android Platform build. + -keep public class com.android.tools.r8.compatproguard.CompatProguard { public static void main(java.lang.String[]); } + +-keep public class com.android.tools.r8.SwissArmyKnife { *; } + @@ -25,5 +22,5 @@ index b0c58c916..5e4405175 100644 +# optimizations. +-dontoptimize -- -2.26.0.rc2.310.g2932bb562d-goog +2.26.2.761.g0e0b3e54be-goog diff --git a/third_party/r8/patches/0006-Add-desugared-library-keep-rule-output-to-R8-command.patch b/third_party/r8/patches/0006-Add-desugared-library-keep-rule-output-to-R8-command.patch new file mode 100644 index 00000000000000..23a49b8a9d64fe --- /dev/null +++ b/third_party/r8/patches/0006-Add-desugared-library-keep-rule-output-to-R8-command.patch @@ -0,0 +1,69 @@ +From 7b68ccb6caa68235fc325c26ec559d9a5f0e116e Mon Sep 17 00:00:00 2001 +From: Sam Maier +Date: Wed, 20 May 2020 15:29:37 -0400 +Subject: [PATCH 6/6] Add --desugared-library-keep-rule-output to R8 command + +Chrome needs this to export the keep rule file to optimize +imported library. +--- + src/main/java/com/android/tools/r8/L8CommandParser.java | 2 +- + src/main/java/com/android/tools/r8/R8CommandParser.java | 9 ++++++++- + 2 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/src/main/java/com/android/tools/r8/L8CommandParser.java b/src/main/java/com/android/tools/r8/L8CommandParser.java +index 08021272e..6366029c0 100644 +--- a/src/main/java/com/android/tools/r8/L8CommandParser.java ++++ b/src/main/java/com/android/tools/r8/L8CommandParser.java +@@ -19,7 +19,7 @@ import java.util.Set; + public class L8CommandParser extends BaseCompilerCommandParser { + + private static final Set OPTIONS_WITH_PARAMETER = +- ImmutableSet.of("--output", "--lib", MIN_API_FLAG, "--desugared-lib", THREAD_COUNT_FLAG); ++ ImmutableSet.of("--output", "--lib", MIN_API_FLAG, "--desugared-lib", THREAD_COUNT_FLAG, "--pg-conf"); + + public static void main(String[] args) throws CompilationFailedException { + L8Command command = parse(args, Origin.root()).build(); +diff --git a/src/main/java/com/android/tools/r8/R8CommandParser.java b/src/main/java/com/android/tools/r8/R8CommandParser.java +index 8d286601c..41aa2ab2d 100644 +--- a/src/main/java/com/android/tools/r8/R8CommandParser.java ++++ b/src/main/java/com/android/tools/r8/R8CommandParser.java +@@ -3,6 +3,7 @@ + // BSD-style license that can be found in the LICENSE file. + package com.android.tools.r8; + ++import com.android.tools.r8.StringConsumer; + import com.android.tools.r8.origin.Origin; + import com.android.tools.r8.utils.AndroidApiLevel; + import com.android.tools.r8.utils.FlagFile; +@@ -29,6 +30,7 @@ public class R8CommandParser extends BaseCompilerCommandParser # List of classes to place in the primary dex file.", + " --main-dex-list-output ", +- " # Output the full main-dex list in ."), ++ " # Output the full main-dex list in .", ++ " --desugared-library-keep-rule-output # Output the desugared library", ++ " # keep rule to ."), + ASSERTIONS_USAGE_MESSAGE, + Arrays.asList( + " --version # Print the version of r8.", +@@ -237,6 +241,9 @@ public class R8CommandParser extends BaseCompilerCommandParser