Merge "Upgrade kotlinx metadata to 0.0.4"
diff --git a/.gitignore b/.gitignore
index cb3eaab..22b29da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,8 @@
tools/*/art-7.0.0.tar.gz
tools/*/art-8.1.0
tools/*/art-8.1.0.tar.gz
+tools/*/art-9.0.0
+tools/*/art-9.0.0.tar.gz
tools/*/dalvik
tools/*/dalvik.tar.gz
tools/*/dalvik-4.0.4
diff --git a/build.gradle b/build.gradle
index e50c0ce..b6e669f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -297,6 +297,7 @@
"linux/art-6.0.1",
"linux/art-7.0.0",
"linux/art-8.1.0",
+ "linux/art-9.0.0",
"linux/dalvik",
"linux/dalvik-4.0.4",
"${osString}/dx",
@@ -309,8 +310,8 @@
def outputDir = "${entry.key}/${entryFile}"
def gzFile = "${outputDir}.tar.gz"
def sha1File = "${gzFile}.sha1"
- inputs.file sha1File
- outputs.file gzFile
+ // Make the output file part of the input dependencies explictly.
+ inputs.files files(sha1File, gzFile)
outputs.dir outputDir
List<String> dlFromStorageArgs = ["-n", "-b", "r8-deps", "-u", "-s", "${sha1File}"]
if (OperatingSystem.current().isWindows()) {
@@ -581,6 +582,55 @@
}
}
+def r8CfCommandLine(input, output, pgconf) {
+ return ["java", "-ea", "-jar", R8.outputs.files[0],
+ "--classfile", "--release",
+ input,
+ "--lib", "third_party/openjdk/openjdk-rt-1.8/rt.jar",
+ "--output", output,
+ "--pg-conf", pgconf]
+}
+
+task R8R8(type: Exec) {
+ def pgconf = "pgconfs/r8.cfg"
+ def output = "build/libs/r8-r8.jar"
+ inputs.files files(pgconf, "build/libs/r8.jar")
+ outputs.file output
+ dependsOn R8
+ commandLine r8CfCommandLine(R8.outputs.files[0], output, pgconf)
+ workingDir = projectDir
+}
+
+task D8R8(type: Exec) {
+ def pgconf = "pgconfs/d8.cfg"
+ def output = "build/libs/d8-r8.jar"
+ inputs.files files(pgconf, "build/libs/d8.jar")
+ outputs.file output
+ dependsOn D8
+ commandLine r8CfCommandLine(R8.outputs.files[0], output, pgconf)
+ workingDir = projectDir
+}
+
+task CompatDxR8(type: Exec) {
+ def pgconf = "pgconfs/compatdx.cfg"
+ def output = "build/libs/compatdx-r8.jar"
+ inputs.files files(pgconf, "build/libs/compatdx.jar")
+ outputs.file output
+ dependsOn CompatDx
+ commandLine r8CfCommandLine(R8.outputs.files[0], output, pgconf)
+ workingDir = projectDir
+}
+
+task CompatProguardR8(type: Exec) {
+ def pgconf = "pgconfs/compatproguard.cfg"
+ def output = "build/libs/compatproguard-r8.jar"
+ inputs.files files(pgconf, "build/libs/compatproguard.jar")
+ outputs.file output
+ dependsOn CompatProguard
+ commandLine r8CfCommandLine(R8.outputs.files[0], output, pgconf)
+ workingDir = projectDir
+}
+
task sourceJar(type: Jar, dependsOn: classes) {
classifier = 'src'
from sourceSets.main.allSource
diff --git a/pgconfs/compatdx.cfg b/pgconfs/compatdx.cfg
new file mode 100644
index 0000000..51b401c
--- /dev/null
+++ b/pgconfs/compatdx.cfg
@@ -0,0 +1,5 @@
+# Copyright (c) 2018, 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.
+
+-keep public class com.android.tools.r8.compatdx.CompatDx { public static void main(java.lang.String[]); }
diff --git a/pgconfs/compatproguard.cfg b/pgconfs/compatproguard.cfg
new file mode 100644
index 0000000..f508bea
--- /dev/null
+++ b/pgconfs/compatproguard.cfg
@@ -0,0 +1,5 @@
+# Copyright (c) 2018, 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.
+
+-keep public class com.android.tools.r8.compatproguard.CompatProguard { public static void main(java.lang.String[]); }
diff --git a/pgconfs/d8.cfg b/pgconfs/d8.cfg
new file mode 100644
index 0000000..2d74e47
--- /dev/null
+++ b/pgconfs/d8.cfg
@@ -0,0 +1,6 @@
+# Copyright (c) 2018, 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.
+
+-keep @com.android.tools.r8.Keep class * { public *; }
+-keep @com.android.tools.r8.KeepForSubclassing class * { public *; protected *; }
diff --git a/pgconfs/r8.cfg b/pgconfs/r8.cfg
new file mode 100644
index 0000000..d1ae99b
--- /dev/null
+++ b/pgconfs/r8.cfg
@@ -0,0 +1,7 @@
+# Copyright (c) 2018, 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.
+
+-keep public class com.android.tools.r8.SwissArmyKnife { public static void main(java.lang.String[]); }
+-keep @com.android.tools.r8.Keep class * { public *; }
+-keep @com.android.tools.r8.KeepForSubclassing class * { public *; protected *; }
diff --git a/scripts/update-host-art.sh b/scripts/update-host-art.sh
index 8bfc753..fb45744 100755
--- a/scripts/update-host-art.sh
+++ b/scripts/update-host-art.sh
@@ -130,6 +130,23 @@
mkdir -p $DEST/usr/icu
cp -r $ANDROID_HOST_BUILD/usr/icu/* $DEST/usr/icu
+# Update links for vdex files for Android P and later.
+if [ -f $DEST/product/$ANDROID_PRODUCT/system/framework/boot.vdex ]; then
+ for VDEXFILE in $DEST/product/$ANDROID_PRODUCT/system/framework/*.vdex; do
+ VDEXNAME=$(basename ${VDEXFILE});
+ for ARCH in arm arm64; do
+ rm $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME};
+ # This relative link command will create a symbolic link of the form
+ # ../${VDEXNAME} for each architecture.
+ # ln -r -s $DEST/product/$ANDROID_PRODUCT/system/framework/${VDEXNAME} $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME};
+ # The Cloud Storage dependency tool (download_from_google_storage.py) does
+ # not allow synlinks at all, so instad of the ln in the comment above just
+ # copy the ${VDEXNAME} files.
+ cp $DEST/product/$ANDROID_PRODUCT/system/framework/${VDEXNAME} $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME};
+ done
+ done
+fi
+
# Allow failure for strip commands below.
set +e
diff --git a/src/main/java/com/android/tools/r8/ApiLevelException.java b/src/main/java/com/android/tools/r8/ApiLevelException.java
index 6d110a4..0ad75c7 100644
--- a/src/main/java/com/android/tools/r8/ApiLevelException.java
+++ b/src/main/java/com/android/tools/r8/ApiLevelException.java
@@ -6,9 +6,7 @@
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.utils.AndroidApiLevel;
-/**
- * Exception to signal features that are not supported until a given API level.
- */
+/** Exception to signal features that are not supported until a given API level. */
public class ApiLevelException extends CompilationError {
public ApiLevelException(
diff --git a/src/main/java/com/android/tools/r8/DexIndexedConsumer.java b/src/main/java/com/android/tools/r8/DexIndexedConsumer.java
index e235e67..118df2e 100644
--- a/src/main/java/com/android/tools/r8/DexIndexedConsumer.java
+++ b/src/main/java/com/android/tools/r8/DexIndexedConsumer.java
@@ -160,7 +160,7 @@
public void accept(
int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
super.accept(fileIndex, data, descriptors, handler);
- outputBuilder.addIndexedClassFile(fileIndex, getDexFileName(fileIndex), data, handler);
+ outputBuilder.addFile(getDexFileName(fileIndex), data, handler);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/errors/CompilationError.java b/src/main/java/com/android/tools/r8/errors/CompilationError.java
index 1104b29..466bf8a 100644
--- a/src/main/java/com/android/tools/r8/errors/CompilationError.java
+++ b/src/main/java/com/android/tools/r8/errors/CompilationError.java
@@ -9,9 +9,9 @@
/**
* Exception to signal an compilation error.
- * <p>
- * This is always an expected error and considered a user input issue. A user-understandable message
- * must be provided.
+ *
+ * <p>This is always an expected error and considered a user input issue. A user-understandable
+ * message must be provided.
*/
public class CompilationError extends RuntimeException implements Diagnostic {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 35cc716..ade48f3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -399,7 +399,11 @@
continue;
}
- throw new Unreachable("Unexpected usage left after method inlining: " + user);
+ throw new Unreachable(
+ "Unexpected usage left in method `"
+ + method.method.toSourceString()
+ + "` after inlining: "
+ + user);
}
if (needToRemoveUnreachableBlocks) {
@@ -423,7 +427,11 @@
continue;
}
- throw new Unreachable("Unexpected usage left after method inlining: " + user);
+ throw new Unreachable(
+ "Unexpected usage left in method `"
+ + method.method.toSourceString()
+ + "` after inlining: "
+ + user);
}
}
@@ -448,10 +456,18 @@
private void removeFieldWrites() {
for (Instruction user : eligibleInstance.uniqueUsers()) {
if (!user.isInstancePut()) {
- throw new Unreachable("Unexpected usage left after field reads removed: " + user);
+ throw new Unreachable(
+ "Unexpected usage left in method `"
+ + method.method.toSourceString()
+ + "` after field reads removed: "
+ + user);
}
if (user.asInstancePut().getField().clazz != eligibleClass) {
- throw new Unreachable("Unexpected field write left after field reads removed: " + user);
+ throw new Unreachable(
+ "Unexpected field write left in method `"
+ + method.method.toSourceString()
+ + "` after field reads removed: "
+ + user);
}
removeInstruction(user);
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java b/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
index 21b9409..20621f9 100644
--- a/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
+++ b/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
@@ -69,8 +69,10 @@
return new JvmFunctionExtensionVisitor() {
@Override
public void visit(JvmMethodSignature desc) {
- name = desc.getName();
- descriptor = desc.getDesc();
+ if (desc != null) {
+ name = desc.getName();
+ descriptor = desc.getDesc();
+ }
}
};
}
diff --git a/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java b/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java
index 69d65ea..4111bed 100644
--- a/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java
@@ -17,10 +17,6 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipOutputStream;
@@ -31,9 +27,6 @@
private ZipOutputStream stream = null;
private boolean closed = false;
private int openCount = 0;
- private int classesFileIndex = 0;
- private Map<Integer, DelayedData> delayedClassesDexFiles = new HashMap<>();
- private SortedSet<DelayedData> delayedWrites = new TreeSet<>();
public ArchiveBuilder(Path archive) {
this.archive = archive;
@@ -51,7 +44,6 @@
assert !closed;
openCount--;
if (openCount == 0) {
- writeDelayed(handler);
closed = true;
try {
getStreamRaw().close();
@@ -62,20 +54,6 @@
}
}
- private void writeDelayed(DiagnosticsHandler handler) {
- // We should never have any indexed files at this point
- assert delayedClassesDexFiles.isEmpty();
- for (DelayedData data : delayedWrites) {
- if (data.isDirectory) {
- assert data.content == null;
- writeDirectoryNow(data.name, handler);
- } else {
- assert data.content != null;
- writeFileNow(data.name, data.content, handler);
- }
- }
- }
-
private ZipOutputStream getStreamRaw() throws IOException {
if (stream != null) {
return stream;
@@ -107,11 +85,7 @@
}
@Override
- public synchronized void addDirectory(String name, DiagnosticsHandler handler) {
- delayedWrites.add(DelayedData.createDirectory(name));
- }
-
- private void writeDirectoryNow(String name, DiagnosticsHandler handler) {
+ public void addDirectory(String name, DiagnosticsHandler handler) {
if (name.charAt(name.length() - 1) != DataResource.SEPARATOR) {
name += DataResource.SEPARATOR;
}
@@ -131,10 +105,7 @@
@Override
public void addFile(String name, DataEntryResource content, DiagnosticsHandler handler) {
try (InputStream in = content.getByteStream()) {
- ByteDataView view = ByteDataView.of(ByteStreams.toByteArray(in));
- synchronized (this) {
- delayedWrites.add(DelayedData.createFile(name, view));
- }
+ addFile(name, ByteDataView.of(ByteStreams.toByteArray(in)), handler);
} catch (IOException e) {
handleIOException(e, handler);
} catch (ResourceException e) {
@@ -145,10 +116,6 @@
@Override
public synchronized void addFile(String name, ByteDataView content, DiagnosticsHandler handler) {
- delayedWrites.add(DelayedData.createFile(name, ByteDataView.of(content.copyByteData())));
- }
-
- private void writeFileNow(String name, ByteDataView content, DiagnosticsHandler handler) {
try {
ZipUtils.writeToZipStream(getStream(handler), name, content, ZipEntry.STORED);
} catch (IOException e) {
@@ -156,30 +123,6 @@
}
}
- private void writeNextIfAvailable(DiagnosticsHandler handler) {
- DelayedData data = delayedClassesDexFiles.remove(classesFileIndex);
- while (data != null) {
- writeFileNow(data.name, data.content, handler);
- classesFileIndex++;
- data = delayedClassesDexFiles.remove(classesFileIndex);
- }
- }
-
- @Override
- public synchronized void addIndexedClassFile(
- int index, String name, ByteDataView content, DiagnosticsHandler handler) {
- if (index == classesFileIndex) {
- // Fast case, we got the file in order (or we only had one).
- writeFileNow(name, content, handler);
- classesFileIndex++;
- writeNextIfAvailable(handler);
- } else {
- // Data is released in the application writer, take a copy.
- delayedClassesDexFiles.put(index,
- new DelayedData(name, ByteDataView.of(content.copyByteData()), false));
- }
- }
-
@Override
public Origin getOrigin() {
return origin;
@@ -189,32 +132,4 @@
public Path getPath() {
return archive;
}
-
- private static class DelayedData implements Comparable<DelayedData> {
- public final String name;
- public final ByteDataView content;
- public final boolean isDirectory;
-
- public static DelayedData createFile(String name, ByteDataView content) {
- return new DelayedData(name, content, false);
- }
-
- public static DelayedData createDirectory(String name) {
- return new DelayedData(name, null, true);
- }
-
- private DelayedData(String name, ByteDataView content, boolean isDirectory) {
- this.name = name;
- this.content = content;
- this.isDirectory = isDirectory;
- }
-
- @Override
- public int compareTo(DelayedData other) {
- if (other == null) {
- return name.compareTo(null);
- }
- return name.compareTo(other.name);
- }
- }
}
diff --git a/src/main/java/com/android/tools/r8/utils/DirectoryBuilder.java b/src/main/java/com/android/tools/r8/utils/DirectoryBuilder.java
index f78983f..8e0b054 100644
--- a/src/main/java/com/android/tools/r8/utils/DirectoryBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/DirectoryBuilder.java
@@ -68,12 +68,6 @@
}
@Override
- public void addIndexedClassFile(
- int index, String name, ByteDataView content, DiagnosticsHandler handler) {
- addFile(name, content, handler);
- }
-
- @Override
public Origin getOrigin() {
return origin;
}
diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java b/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
index 99149ff..3e4a44d 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.utils;
+import com.android.tools.r8.Keep;
import com.android.tools.r8.ResourceException;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
@@ -11,6 +12,7 @@
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.NoSuchFileException;
+@Keep
public class ExceptionDiagnostic extends DiagnosticWithThrowable {
private final Origin origin;
diff --git a/src/main/java/com/android/tools/r8/utils/OutputBuilder.java b/src/main/java/com/android/tools/r8/utils/OutputBuilder.java
index be739e3..9077f7b 100644
--- a/src/main/java/com/android/tools/r8/utils/OutputBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/OutputBuilder.java
@@ -23,9 +23,6 @@
void addFile(String name, ByteDataView content, DiagnosticsHandler handler);
- void addIndexedClassFile(
- int index, String name, ByteDataView content, DiagnosticsHandler handler);
-
Path getPath();
Origin getOrigin();
diff --git a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
index 2c2c5a6..cebfc53 100644
--- a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
+++ b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
@@ -40,7 +40,9 @@
.put("math.BigInteger.ConstructorLjava_lang_String.BigInteger_Constructor_A02", any())
.put(
"lang.StringBuffer.insertILjava_lang_Object.StringBuffer_insert_A01",
- match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.JAVA)))
+ match(
+ runtimes(
+ Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0, Runtime.JAVA)))
.put("lang.StringBuffer.serialization.StringBuffer_serialization_A01", anyDexVm())
.put(
"lang.CloneNotSupportedException.serialization.CloneNotSupportedException_serialization_A01",
@@ -52,12 +54,20 @@
"lang.StrictMath.roundF.StrictMath_round_A01",
match(
runtimes(
- Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.ART_V7_0_0, Runtime.JAVA)))
+ Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
+ Runtime.ART_V8_1_0,
+ Runtime.ART_V7_0_0,
+ Runtime.JAVA)))
.put(
"lang.StrictMath.roundD.StrictMath_round_A01",
match(
runtimes(
- Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.ART_V7_0_0, Runtime.JAVA)))
+ Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
+ Runtime.ART_V8_1_0,
+ Runtime.ART_V7_0_0,
+ Runtime.JAVA)))
.put("lang.StrictMath.atan2DD.StrictMath_atan2_A01", any())
.put("lang.Thread.stop.Thread_stop_A05", any())
.put("lang.Thread.resume.Thread_resume_A02", anyDexVm())
@@ -70,6 +80,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1)))
@@ -199,7 +210,12 @@
anyDexVm())
.put(
"lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A07",
- match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.ART_V7_0_0)))
+ match(
+ runtimes(
+ Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
+ Runtime.ART_V8_1_0,
+ Runtime.ART_V7_0_0)))
.put(
"lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A04",
anyDexVm())
@@ -421,6 +437,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -431,6 +448,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -441,6 +459,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -451,6 +470,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -465,6 +485,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -475,6 +496,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -509,6 +531,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -520,6 +543,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -530,6 +554,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -540,6 +565,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -550,6 +576,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -560,6 +587,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -570,6 +598,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -580,6 +609,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -590,6 +620,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -619,6 +650,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V6_0_1,
@@ -630,7 +662,7 @@
.put("lang.ref.WeakReference.get.WeakReference_get_A01", any())
.put(
"lang.StackTraceElement.toString.StackTraceElement_toString_A01",
- match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0)))
+ match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0)))
.put(
"lang.NullPointerException.serialization.NullPointerException_serialization_A01",
anyDexVm())
@@ -686,7 +718,9 @@
match(artRuntimesFromAndJava(Runtime.ART_V5_1_1)))
.put(
"lang.annotation.IncompleteAnnotationException.ConstructorLjava_lang_ClassLjava_lang_String.IncompleteAnnotationException_Constructor_A01",
- match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.JAVA)))
+ match(
+ runtimes(
+ Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0, Runtime.JAVA)))
.put(
"lang.InterruptedException.serialization.InterruptedException_serialization_A01",
anyDexVm())
@@ -774,6 +808,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V4_4_4,
@@ -814,6 +849,7 @@
match(
runtimes(
Runtime.ART_DEFAULT,
+ Runtime.ART_V9_0_0,
Runtime.ART_V8_1_0,
Runtime.ART_V7_0_0,
Runtime.ART_V4_4_4,
@@ -1167,7 +1203,9 @@
anyDexVm())
.put(
"lang.reflect.Proxy.h.Proxy_h_A01",
- match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.JAVA)))
+ match(
+ runtimes(
+ Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0, Runtime.JAVA)))
.put("lang.reflect.Proxy.serialization.Proxy_serialization_A02", any())
.put(
"lang.reflect.GenericSignatureFormatError.serialization.GenericSignatureFormatError_serialization_A01",
@@ -1177,7 +1215,9 @@
anyDexVm())
.put(
"lang.reflect.Proxy.ConstructorLjava_lang_reflect_InvocationHandler.Proxy_Constructor_A01",
- match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.JAVA)))
+ match(
+ runtimes(
+ Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0, Runtime.JAVA)))
.put(
"lang.reflect.Proxy.newProxyInstanceLjava_lang_ClassLoader_Ljava_lang_ClassLjava_lang_reflect_InvocationHandler.Proxy_newProxyInstance_A01",
anyDexVm())
@@ -1694,14 +1734,20 @@
match(artRuntimesUpTo(Runtime.ART_V4_4_4)))
.put(
"lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01",
- match(and(runtimes(Runtime.ART_V8_1_0), artRuntimesUpTo(Runtime.ART_V4_4_4))))
+ match(
+ and(
+ runtimes(Runtime.ART_V9_0_0, Runtime.ART_V8_1_0),
+ artRuntimesUpTo(Runtime.ART_V4_4_4))))
.put("lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01", anyDexVm())
.put(
"lang.ref.WeakReference.enqueue.WeakReference_enqueue_A01",
match(artRuntimesUpTo(Runtime.ART_V4_4_4)))
.put(
"lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01",
- match(and(runtimes(Runtime.ART_V8_1_0), artRuntimesUpTo(Runtime.ART_V4_4_4))))
+ match(
+ and(
+ runtimes(Runtime.ART_V9_0_0, Runtime.ART_V8_1_0),
+ artRuntimesUpTo(Runtime.ART_V4_4_4))))
.put(
"lang.ref.SoftReference.enqueue.SoftReference_enqueue_A01",
match(artRuntimesUpTo(Runtime.ART_V4_4_4)))
@@ -1712,7 +1758,6 @@
.put(
"util.concurrent.AbstractExecutorService.invokeAllLjava_util_CollectionJLjava_util_concurrent_TimeUnit.AbstractExecutorService_invokeAll_A06",
match(runtimes(Runtime.ART_V4_0_4)))
-
.build(); // end of flakyWhenRun
public static final Multimap<String, TestCondition> timeoutsWhenRun =
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index 5123c51..2a4977d 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -97,7 +97,8 @@
DexVm.Version.V5_1_1,
DexVm.Version.V6_0_1,
DexVm.Version.V7_0_0,
- DexVm.Version.V8_1_0);
+ DexVm.Version.V8_1_0,
+ DexVm.Version.V9_0_0);
// Input jar for jctf tests.
private static final String JCTF_COMMON_JAR = "build/libs/jctfCommon.jar";
@@ -463,6 +464,16 @@
static {
ImmutableMap.Builder<DexVm.Version, List<String>> builder = ImmutableMap.builder();
builder
+ .put(DexVm.Version.V9_0_0, ImmutableList.of(
+ // TODO(120400625): Triage.
+ "454-get-vreg",
+ // TODO(120402198): Triage.
+ "457-regs",
+ // TODO(120401674): Triage.
+ "543-env-long-ref",
+ // TODO(120261858) Triage.
+ "518-null-array-get"
+ ))
.put(DexVm.Version.V8_1_0, ImmutableList.of(
// TODO(119938529): Triage.
"709-checker-varhandles",
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index 101fbb8..1c949a4 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -69,6 +69,10 @@
.put(
Version.V7_0_0,
ImmutableList.of("invokecustom-with-shrinking", "invokecustom2-with-shrinking"))
+ .put(
+ Version.V9_0_0,
+ // TODO(120402963) Triage.
+ ImmutableList.of("invokecustom-with-shrinking", "invokecustom2-with-shrinking"))
.put(Version.DEFAULT, ImmutableList.of())
.build();
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index 221d427..793df27 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -208,6 +208,9 @@
// Early art versions incorrectly print doubles.
.put("regress_72361252.Test",
TestCondition.match(TestCondition.runtimesUpTo(Version.V6_0_1)))
+ // TODO(120402200): Triage.
+ .put("regress_62300145.Regress",
+ TestCondition.match(TestCondition.runtimesUpTo(Version.V9_0_0)))
.build();
}
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
index 68aec3f..a7b7230 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
@@ -269,6 +269,12 @@
"testMissingSuperDesugaredAndroidO"
))
.put(
+ DexVm.Version.V9_0_0, ImmutableList.of(
+ // TODO(120402963): Triage.
+ "invokecustom",
+ "invokecustom2"
+ ))
+ .put(
DexVm.Version.DEFAULT, ImmutableList.of()
);
failsOn = builder.build();
@@ -577,9 +583,6 @@
String qualifiedMainClass, Path[] jars, Path[] dexes, List<String> args) throws IOException {
boolean expectedToFail = expectedToFail(testName);
- if (expectedToFail && !ToolHelper.compareAgaintsGoldenFiles()) {
- thrown.expect(Throwable.class);
- }
String output = ToolHelper.runArtNoVerificationErrors(
Arrays.stream(dexes).map(path -> path.toString()).collect(Collectors.toList()),
qualifiedMainClass,
@@ -588,18 +591,22 @@
builder.appendProgramArgument(arg);
}
});
- if (!expectedToFail && !skipRunningOnJvm(testName) && !ToolHelper.compareAgaintsGoldenFiles()) {
- ArrayList<String> javaArgs = Lists.newArrayList(args);
- javaArgs.add(0, qualifiedMainClass);
- ToolHelper.ProcessResult javaResult =
- ToolHelper.runJava(ImmutableList.copyOf(jars), javaArgs.toArray(new String[0]));
- assertEquals("JVM run failed", javaResult.exitCode, 0);
- assertTrue(
- "JVM output does not match art output.\n\tjvm: "
- + javaResult.stdout
- + "\n\tart: "
- + output,
- output.replace("\r", "").equals(javaResult.stdout.replace("\r", "")));
+ try {
+ if (!skipRunningOnJvm(testName) && !ToolHelper.compareAgaintsGoldenFiles()) {
+ ArrayList<String> javaArgs = Lists.newArrayList(args);
+ javaArgs.add(0, qualifiedMainClass);
+ ToolHelper.ProcessResult javaResult =
+ ToolHelper.runJava(ImmutableList.copyOf(jars), javaArgs.toArray(new String[0]));
+ assertEquals("JVM run failed", javaResult.exitCode, 0);
+ assertTrue(
+ "JVM output does not match art output.\n\tjvm: "
+ + javaResult.stdout
+ + "\n\tart: "
+ + output,
+ output.replace("\r", "").equals(javaResult.stdout.replace("\r", "")));
+ }
+ } catch (Throwable t) {
+ assert expectedToFail;
}
}
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
index e0981c4..2ab5e3e 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
@@ -186,7 +186,9 @@
.put(DexVm.Version.V6_0_1, ImmutableList.of("invokecustom"))
// Dex version not supported
.put(DexVm.Version.V7_0_0, ImmutableList.of("invokecustom"))
+ // Dex version not supported
.put(DexVm.Version.V8_1_0, ImmutableList.of("invokecustom"))
+ // Dex version not supported
.put(DexVm.Version.DEFAULT, ImmutableList.of())
.build();
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index 8a284ac..9c91282 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -231,7 +231,9 @@
+ "1: d>i>s>i>a\n"
+ "2: l>i>s>i>a\n"
+ "3: x>s\n"
- + "4: c>d>i>s>i>a\n"
+ + "4: c>d>i>s>i>a\n",
+ "varhandle",
+ "true\nfalse\n"
);
@Rule
diff --git a/src/test/java/com/android/tools/r8/TestCondition.java b/src/test/java/com/android/tools/r8/TestCondition.java
index 439b9e9..52d7f93 100644
--- a/src/test/java/com/android/tools/r8/TestCondition.java
+++ b/src/test/java/com/android/tools/r8/TestCondition.java
@@ -23,6 +23,7 @@
ART_V6_0_1,
ART_V7_0_0,
ART_V8_1_0,
+ ART_V9_0_0,
ART_DEFAULT,
JAVA;
@@ -43,6 +44,8 @@
return ART_V7_0_0;
case V8_1_0:
return ART_V8_1_0;
+ case V9_0_0:
+ return ART_V9_0_0;
case DEFAULT:
return ART_DEFAULT;
default:
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index caeebd9..f73f198 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -126,6 +126,8 @@
ART_7_0_0_HOST(Version.V7_0_0, Kind.HOST),
ART_8_1_0_TARGET(Version.V8_1_0, Kind.TARGET),
ART_8_1_0_HOST(Version.V8_1_0, Kind.HOST),
+ ART_9_0_0_TARGET(Version.V9_0_0, Kind.TARGET),
+ ART_9_0_0_HOST(Version.V9_0_0, Kind.HOST),
ART_DEFAULT(Version.DEFAULT, Kind.HOST);
private static final ImmutableMap<String, DexVm> SHORT_NAME_MAP =
@@ -140,6 +142,7 @@
V6_0_1("6.0.1"),
V7_0_0("7.0.0"),
V8_1_0("8.1.0"),
+ V9_0_0("9.0.0"),
DEFAULT("default");
Version(String shortName) {
@@ -416,6 +419,7 @@
private static final Map<DexVm, String> ART_DIRS =
ImmutableMap.<DexVm, String>builder()
.put(DexVm.ART_DEFAULT, "art")
+ .put(DexVm.ART_9_0_0_HOST, "art-9.0.0")
.put(DexVm.ART_8_1_0_HOST, "art-8.1.0")
.put(DexVm.ART_7_0_0_HOST, "art-7.0.0")
.put(DexVm.ART_6_0_1_HOST, "art-6.0.1")
@@ -425,6 +429,7 @@
private static final Map<DexVm, String> ART_BINARY_VERSIONS =
ImmutableMap.<DexVm, String>builder()
.put(DexVm.ART_DEFAULT, "bin/art")
+ .put(DexVm.ART_9_0_0_HOST, "bin/art")
.put(DexVm.ART_8_1_0_HOST, "bin/art")
.put(DexVm.ART_7_0_0_HOST, "bin/art")
.put(DexVm.ART_6_0_1_HOST, "bin/art")
@@ -435,6 +440,7 @@
private static final Map<DexVm, String> ART_BINARY_VERSIONS_X64 =
ImmutableMap.of(
DexVm.ART_DEFAULT, "bin/art",
+ DexVm.ART_9_0_0_HOST, "bin/art",
DexVm.ART_8_1_0_HOST, "bin/art",
DexVm.ART_7_0_0_HOST, "bin/art",
DexVm.ART_6_0_1_HOST, "bin/art");
@@ -457,6 +463,7 @@
ImmutableMap.Builder<DexVm, List<String>> builder = ImmutableMap.builder();
builder
.put(DexVm.ART_DEFAULT, ART_BOOT_LIBS)
+ .put(DexVm.ART_9_0_0_HOST, ART_BOOT_LIBS)
.put(DexVm.ART_8_1_0_HOST, ART_BOOT_LIBS)
.put(DexVm.ART_7_0_0_HOST, ART_BOOT_LIBS)
.put(DexVm.ART_6_0_1_HOST, ART_BOOT_LIBS)
@@ -472,6 +479,7 @@
ImmutableMap.Builder<DexVm, String> builder = ImmutableMap.builder();
builder
.put(DexVm.ART_DEFAULT, "angler")
+ .put(DexVm.ART_9_0_0_HOST, "marlin")
.put(DexVm.ART_8_1_0_HOST, "marlin")
.put(DexVm.ART_7_0_0_HOST, "angler")
.put(DexVm.ART_6_0_1_HOST, "angler")
@@ -721,6 +729,8 @@
switch (dexVm.version) {
case DEFAULT:
return AndroidApiLevel.O;
+ case V9_0_0:
+ return AndroidApiLevel.P;
case V8_1_0:
return AndroidApiLevel.O;
case V7_0_0:
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
index a7b2b223..e6a1fcd 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
@@ -1019,6 +1019,10 @@
artCommandBuilder.appendArtOption("-Xcompiler-option");
artCommandBuilder.appendArtOption("--debuggable");
}
+ if (ToolHelper.getDexVm().getVersion().isAtLeast(DexVm.Version.V9_0_0) &&
+ ToolHelper.getDexVm().getVersion() != DexVm.Version.DEFAULT) {
+ artCommandBuilder.appendArtOption("-XjdwpProvider:internal");
+ }
if (DEBUG_TESTS && ToolHelper.getDexVm().getVersion().isNewerThan(Version.V4_4_4)) {
artCommandBuilder.appendArtOption("-verbose:jdwp");
}
diff --git a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
index af238f2..e26ec3d 100644
--- a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
@@ -19,7 +19,6 @@
import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
import com.android.tools.r8.ResourceException;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.dex.ApplicationWriter;
import com.android.tools.r8.naming.MemberNaming.FieldSignature;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -29,7 +28,9 @@
import com.android.tools.r8.utils.ArtErrorParser.ArtErrorInfo;
import com.android.tools.r8.utils.ArtErrorParser.ArtErrorParserException;
import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.KeepingDiagnosticHandler;
import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.Reporter;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
@@ -42,27 +43,32 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
-import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
-import java.util.function.Supplier;
import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-import org.junit.Assert;
+import org.junit.Before;
import org.junit.ComparisonFailure;
import org.junit.Rule;
import org.junit.rules.TemporaryFolder;
public abstract class CompilationTestBase {
+ protected KeepingDiagnosticHandler handler;
+ protected Reporter reporter;
+
@Rule
public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+ @Before
+ public void reset() {
+ handler = new KeepingDiagnosticHandler();
+ reporter = new Reporter(handler);
+ }
+
public AndroidApp runAndCheckVerification(
CompilerUnderTest compiler,
CompilationMode mode,
@@ -83,22 +89,6 @@
return result;
}
- public void assertIdenticalZipFiles(File file1, File file2) throws IOException {
- try (ZipFile zipFile1 = new ZipFile(file1); ZipFile zipFile2 = new ZipFile(file2)) {
- final Enumeration<? extends ZipEntry> entries1 = zipFile1.entries();
- final Enumeration<? extends ZipEntry> entries2 = zipFile2.entries();
-
- while (entries1.hasMoreElements()) {
- Assert.assertTrue(entries2.hasMoreElements());
- ZipEntry entry1 = entries1.nextElement();
- ZipEntry entry2 = entries2.nextElement();
- Assert.assertEquals(entry1.getName(), entry2.getName());
- Assert.assertEquals(entry1.getCrc(), entry2.getCrc());
- Assert.assertEquals(entry1.getSize(), entry2.getSize());
- }
- }
- }
-
public AndroidApp runAndCheckVerification(
CompilerUnderTest compiler,
CompilationMode mode,
@@ -107,30 +97,17 @@
Consumer<InternalOptions> optionsConsumer,
List<String> inputs)
throws ExecutionException, IOException, CompilationFailedException {
- return runAndCheckVerification(compiler, mode, referenceApk, pgConfs, optionsConsumer,
- DexIndexedConsumer::emptyConsumer, inputs);
- }
-
- public AndroidApp runAndCheckVerification(
- CompilerUnderTest compiler,
- CompilationMode mode,
- String referenceApk,
- List<String> pgConfs,
- Consumer<InternalOptions> optionsConsumer,
- Supplier<DexIndexedConsumer> dexIndexedConsumerSupplier,
- List<String> inputs)
- throws ExecutionException, IOException, CompilationFailedException {
assertTrue(referenceApk == null || new File(referenceApk).exists());
AndroidAppConsumers outputApp;
if (compiler == CompilerUnderTest.R8) {
- R8Command.Builder builder = R8Command.builder();
+ R8Command.Builder builder = R8Command.builder(reporter);
builder.addProgramFiles(ListUtils.map(inputs, Paths::get));
if (pgConfs != null) {
builder.addProguardConfigurationFiles(
pgConfs.stream().map(Paths::get).collect(Collectors.toList()));
}
builder.setMode(mode);
- builder.setProgramConsumer(dexIndexedConsumerSupplier.get());
+ builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
builder.setMinApiLevel(AndroidApiLevel.L.getLevel());
ToolHelper.allowPartiallyImplementedProguardOptions(builder);
ToolHelper.addProguardConfigurationConsumer(
@@ -154,7 +131,6 @@
return checkVerification(outputApp.build(), referenceApk);
}
-
public AndroidApp checkVerification(AndroidApp outputApp, String referenceApk)
throws IOException, ExecutionException {
Path out = temp.getRoot().toPath().resolve("all.zip");
diff --git a/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
index 634ff6f..09ce657 100644
--- a/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
@@ -5,7 +5,6 @@
import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.DexIndexedConsumer;
import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
import com.android.tools.r8.shaking.ProguardRuleParserException;
import com.android.tools.r8.utils.AndroidApp;
@@ -14,7 +13,6 @@
import java.util.Collections;
import java.util.concurrent.ExecutionException;
import java.util.function.Consumer;
-import java.util.function.Supplier;
public class GMSCoreDeployJarVerificationTest extends GMSCoreCompilationTestBase {
@@ -40,20 +38,4 @@
optionsConsumer,
Collections.singletonList(base + DEPLOY_JAR));
}
-
- public AndroidApp buildFromDeployJar(
- CompilerUnderTest compiler, CompilationMode mode, String base, boolean hasReference,
- Consumer<InternalOptions> optionsConsumer, Supplier<DexIndexedConsumer> consumerSupplier)
- throws ExecutionException, IOException, ProguardRuleParserException,
- CompilationFailedException {
- return runAndCheckVerification(
- compiler,
- mode,
- hasReference ? base + REFERENCE_APK : null,
- null,
- optionsConsumer,
- consumerSupplier,
- Collections.singletonList(base + DEPLOY_JAR));
- }
-
}
diff --git a/src/test/java/com/android/tools/r8/internal/NestTreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/NestTreeShakeJarVerificationTest.java
index e90c504..6514635 100644
--- a/src/test/java/com/android/tools/r8/internal/NestTreeShakeJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/NestTreeShakeJarVerificationTest.java
@@ -4,10 +4,15 @@
package com.android.tools.r8.internal;
+import static org.junit.Assert.assertEquals;
+
import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
import com.android.tools.r8.utils.AndroidApp;
import com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.stream.Stream;
import org.junit.Test;
public class NestTreeShakeJarVerificationTest extends NestCompilationBase {
@@ -22,5 +27,13 @@
ImmutableList.of(BASE + PG_CONF, BASE + PG_CONF_NO_OPT),
options -> options.testing.allowTypeErrors = true,
ImmutableList.of(BASE + DEPLOY_JAR));
+ assertEquals(0, filterKotlinMetadata(handler.warnings).count());
+ assertEquals(0, filterKotlinMetadata(handler.infos).count());
+ }
+
+ private Stream<Diagnostic> filterKotlinMetadata(List<Diagnostic> warnings) {
+ return warnings.stream().filter(diagnostic -> {
+ return diagnostic.getDiagnosticMessage().contains("kotlin.Metadata");
+ });
}
}
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java
index 5803355..d881185 100644
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java
@@ -7,12 +7,8 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.DexIndexedConsumer.ArchiveConsumer;
import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
import com.android.tools.r8.utils.AndroidApp;
-import java.io.File;
-import java.util.function.Supplier;
import org.junit.Test;
public class R8GMSCoreV10DeployJarVerificationTest extends GMSCoreDeployJarVerificationTest {
@@ -23,9 +19,6 @@
@Test
public void buildFromDeployJar() throws Exception {
// TODO(tamaskenez): set hasReference = true when we have the noshrink file for V10
- File tempFolder = temp.newFolder();
- File app1Zip = new File(tempFolder, "app1.zip");
- File app2Zip = new File(tempFolder, "app2.zip");
AndroidApp app1 =
buildFromDeployJar(
CompilerUnderTest.R8,
@@ -34,8 +27,7 @@
false,
options ->
options.proguardMapConsumer =
- (proguardMap, handler) -> this.proguardMap1 = proguardMap,
- ()-> new ArchiveConsumer(app1Zip.toPath(), true));
+ (proguardMap, handler) -> this.proguardMap1 = proguardMap);
AndroidApp app2 =
buildFromDeployJar(
CompilerUnderTest.R8,
@@ -44,14 +36,10 @@
false,
options ->
options.proguardMapConsumer =
- (proguardMap, handler) -> this.proguardMap2 = proguardMap,
- ()-> new ArchiveConsumer(app2Zip.toPath(), true));
-
-
+ (proguardMap, handler) -> this.proguardMap2 = proguardMap);
// Verify that the result of the two compilations was the same.
assertIdenticalApplications(app1, app2);
- assertIdenticalZipFiles(app1Zip, app2Zip);
assertEquals(proguardMap1, proguardMap2);
}
}
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
index e013b02..ddb0e7d 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
@@ -20,21 +20,15 @@
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringUtils;
import java.io.ByteArrayOutputStream;
-import java.io.IOException;
import java.io.PrintStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.LinkedList;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
import org.junit.Assert;
import org.junit.Test;
@@ -307,34 +301,6 @@
nonLambdaOffset++;
}
}
- testZipfileOrder(out);
- }
-
- private void testZipfileOrder(Path out) throws IOException {
- // Sanity check that the classes.dex files are in the correct order
- ZipFile outZip = new ZipFile(out.toFile());
- Enumeration<? extends ZipEntry> entries = outZip.entries();
- int index = 0;
- LinkedList<String> entryNames = new LinkedList<>();
- // We expect classes*.dex files first, in order, then the rest of the files, in order.
- while(entries.hasMoreElements()) {
- ZipEntry entry = entries.nextElement();
- if (!entry.getName().startsWith("classes") || !entry.getName().endsWith(".dex")) {
- entryNames.add(entry.getName());
- continue;
- }
- if (index == 0) {
- Assert.assertEquals("classes.dex", entry.getName());
- } else {
- Assert.assertEquals("classes" + (index + 1) + ".dex", entry.getName());
- }
- index++;
- }
- // Everything else should be sorted according to name.
- String[] entriesUnsorted = entryNames.toArray(new String[0]);
- String[] entriesSorted = entryNames.toArray(new String[0]);
- Arrays.sort(entriesSorted);
- Assert.assertArrayEquals(entriesUnsorted, entriesSorted);
}
private boolean isLambda(String mainDexEntry) {
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
new file mode 100644
index 0000000..6d7ce25
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
@@ -0,0 +1,101 @@
+// Copyright (c) 2018, 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.naming.retrace;
+
+import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileName;
+import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileNameAndLineNumber;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.ForceInline;
+import java.util.Collection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class InliningRetraceTest extends RetraceTestBase {
+
+ @Parameters(name = "Backend: {0}, mode: {1}")
+ public static Collection<Object[]> data() {
+ return buildParameters(Backend.values(), CompilationMode.values());
+ }
+
+ public InliningRetraceTest(Backend backend, CompilationMode mode) {
+ super(backend, mode);
+ }
+
+ @Override
+ public Class<?> getMainClass() {
+ return Main.class;
+ }
+
+ private int expectedActualStackTraceHeight() {
+ return mode == CompilationMode.RELEASE ? 1 : 4;
+ }
+
+ @Test
+ public void testSourceFileAndLineNumberTable() throws Exception {
+ runTest(
+ "-keepattributes SourceFile,LineNumberTable",
+ (StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
+ // Even when SourceFile is present retrace replaces the file name in the stack trace.
+ assertThat(retracedStackTrace, isSameExceptForFileName(expectedStackTrace));
+ assertEquals(expectedActualStackTraceHeight(), actualStackTrace.size());
+ });
+ }
+
+ @Test
+ public void testLineNumberTableOnly() throws Exception {
+ runTest(
+ "-keepattributes LineNumberTable",
+ (StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
+ assertThat(retracedStackTrace, isSameExceptForFileName(expectedStackTrace));
+ assertEquals(expectedActualStackTraceHeight(), actualStackTrace.size());
+ });
+ }
+
+ @Test
+ public void testNoLineNumberTable() throws Exception {
+ runTest(
+ "",
+ (StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
+ assertThat(retracedStackTrace, isSameExceptForFileNameAndLineNumber(expectedStackTrace));
+ assertEquals(expectedActualStackTraceHeight(), actualStackTrace.size());
+ });
+ }
+}
+
+class Main {
+
+ @ForceInline
+ public static void method3(long j) {
+ System.out.println("In method3");
+ throw null;
+ }
+
+ @ForceInline
+ public static void method2(int j) {
+ System.out.println("In method2");
+ for (int i = 0; i < 10; i++) {
+ method3((long) j);
+ }
+ }
+
+ @ForceInline
+ public static void method1(String s) {
+ System.out.println("In method1");
+ for (int i = 0; i < 10; i++) {
+ method2(Integer.parseInt(s));
+ }
+ }
+
+ public static void main(String[] args) {
+ System.out.println("In main");
+ method1("1");
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceTest.java
deleted file mode 100644
index b110ead..0000000
--- a/src/test/java/com/android/tools/r8/naming/retrace/RetraceTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (c) 2018, 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.naming.retrace;
-
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.not;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8Command;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ToolHelper.DexVm;
-import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.StringUtils;
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.BiConsumer;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class RetraceTest extends TestBase {
- private Backend backend;
- private CompilationMode mode;
-
- @Parameters(name = "Backend: {0}, mode: {1}")
- public static Collection<Object[]> data() {
- return buildParameters(Backend.values(), CompilationMode.values());
- }
-
- public RetraceTest(Backend backend, CompilationMode mode) {
- this.backend = backend;
- this.mode = mode;
- }
-
- private List<String> retrace(String map, List<String> stackTrace) throws IOException {
- Path t = temp.newFolder().toPath();
- Path mapFile = t.resolve("map");
- Path stackTraceFile = t.resolve("stackTrace");
- FileUtils.writeTextFile(mapFile, map);
- FileUtils.writeTextFile(stackTraceFile, stackTrace);
- return StringUtils.splitLines(ToolHelper.runRetrace(mapFile, stackTraceFile));
- }
-
- private boolean isDalvik() {
- return backend == Backend.DEX && ToolHelper.getDexVm().isOlderThanOrEqual(DexVm.ART_4_4_4_HOST);
- }
-
- private List<String> extractStackTrace(ProcessResult result) {
- ImmutableList.Builder<String> builder = ImmutableList.builder();
- List<String> stderr = StringUtils.splitLines(result.stderr);
- Iterator<String> iterator = stderr.iterator();
-
- // A Dalvik stacktrace looks like this:
- // W(209693) threadid=1: thread exiting with uncaught exception (group=0xf616cb20) (dalvikvm)
- // java.lang.NullPointerException
- // \tat com.android.tools.r8.naming.retrace.Main.a(:133)
- // \tat com.android.tools.r8.naming.retrace.Main.a(:139)
- // \tat com.android.tools.r8.naming.retrace.Main.main(:145)
- // \tat dalvik.system.NativeStart.main(Native Method)
- //
- // An Art 5.1.1 and 6.0.1 stacktrace looks like this:
- // java.lang.NullPointerException: throw with null exception
- // \tat com.android.tools.r8.naming.retrace.Main.a(:154)
- // \tat com.android.tools.r8.naming.retrace.Main.a(:160)
- // \tat com.android.tools.r8.naming.retrace.Main.main(:166)
- //
- // An Art 7.0.0 and latest stacktrace looks like this:
- // Exception in thread "main" java.lang.NullPointerException: throw with null exception
- // \tat com.android.tools.r8.naming.retrace.Main.a(:150)
- // \tat com.android.tools.r8.naming.retrace.Main.a(:156)
- // \tat com.android.tools.r8.naming.retrace.Main.main(:162)
- int last = stderr.size();
- if (isDalvik()) {
- // Skip the bottom frame "dalvik.system.NativeStart.main".
- last--;
- }
- // Take all lines from the bottom starting with "\tat ".
- int first = last;
- while (first - 1 >= 0 && stderr.get(first - 1).startsWith("\tat ")) {
- first--;
- }
- for (int i = first; i < last; i++) {
- builder.add(stderr.get(i));
- }
- return builder.build();
- }
-
- public void runTest(Class<?> mainClass, BiConsumer<List<String>, List<String>> checker)
- throws Exception {
- StringBuilder proguardMapBuilder = new StringBuilder();
- AndroidApp output =
- ToolHelper.runR8(
- R8Command.builder()
- .setMode(mode)
- .addClassProgramData(ToolHelper.getClassAsBytes(mainClass), Origin.unknown())
- .addProguardConfiguration(
- ImmutableList.of(keepMainProguardConfiguration(mainClass)), Origin.unknown())
- .setProgramConsumer(emptyConsumer(backend))
- .setProguardMapConsumer((string, ignore) -> proguardMapBuilder.append(string))
- .build());
-
- ProcessResult result = runOnVMRaw(output, mainClass, backend);
- List<String> stackTrace = extractStackTrace(result);
- List<String> retracesStackTrace = retrace(proguardMapBuilder.toString(), stackTrace);
- checker.accept(stackTrace, retracesStackTrace);
- }
-
- @Test
- public void test() throws Exception {
- runTest(
- Main.class,
- (List<String> stackTrace, List<String> retracesStackTrace) -> {
- assertEquals(
- mode == CompilationMode.RELEASE, stackTrace.size() != retracesStackTrace.size());
- if (mode == CompilationMode.DEBUG) {
- assertThat(stackTrace.get(0), not(containsString("method2")));
- assertThat(stackTrace.get(1), not(containsString("method1")));
- assertThat(stackTrace.get(2), containsString("main"));
- }
- assertEquals(3, retracesStackTrace.size());
- assertThat(retracesStackTrace.get(0), containsString("method2"));
- assertThat(retracesStackTrace.get(1), containsString("method1"));
- assertThat(retracesStackTrace.get(2), containsString("main"));
- });
- }
-}
-
-class Main {
- public static void method2(int i) {
- System.out.println("In method2");
- throw null;
- }
-
- public static void method1(String s) {
- System.out.println("In method1");
- for (int i = 0; i < 10; i++) {
- method2(Integer.parseInt(s));
- }
- }
-
- public static void main(String[] args) {
- System.out.println("In main");
- method1("1");
- }
-}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java
new file mode 100644
index 0000000..0d0c21b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java
@@ -0,0 +1,58 @@
+// Copyright (c) 2018, 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.naming.retrace;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.R8TestRunResult;
+import com.android.tools.r8.TestBase;
+import java.util.function.BiConsumer;
+import org.junit.Before;
+
+public abstract class RetraceTestBase extends TestBase {
+ protected Backend backend;
+ protected CompilationMode mode;
+
+ public RetraceTestBase(Backend backend, CompilationMode mode) {
+ this.backend = backend;
+ this.mode = mode;
+ }
+
+ public StackTrace expectedStackTrace;
+
+ public abstract Class<?> getMainClass();
+
+ @Before
+ public void setup() throws Exception {
+ // Get the expected stack trace by running on the JVM.
+ expectedStackTrace =
+ testForJvm()
+ .addTestClasspath()
+ .run(getMainClass())
+ .assertFailure()
+ .map(StackTrace::extractFromJvm);
+ }
+
+ public void runTest(String keepRule, BiConsumer<StackTrace, StackTrace> checker)
+ throws Exception {
+
+ R8TestRunResult result =
+ testForR8(backend)
+ .setMode(mode)
+ .enableProguardTestOptions()
+ .enableInliningAnnotations()
+ .addProgramClasses(getMainClass())
+ .addKeepMainRule(getMainClass())
+ .addKeepRules(keepRule)
+ .run(getMainClass())
+ .assertFailure();
+
+ // Extract actual stack trace and retraced stack trace from failed run result.
+ StackTrace actualStackTrace = StackTrace.extractFromArt(result.getStdErr());
+ StackTrace retracedStackTrace =
+ actualStackTrace.retrace(result.proguardMap(), temp.newFolder().toPath());
+
+ checker.accept(actualStackTrace, retracedStackTrace);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
new file mode 100644
index 0000000..68e09c1
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
@@ -0,0 +1,436 @@
+// Copyright (c) 2018, 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.naming.retrace;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.TestRunResult;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.base.Equivalence;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+class StackTrace {
+
+ public static String AT_PREFIX = "at ";
+ public static String TAB_AT_PREFIX = "\t" + AT_PREFIX;
+
+ static class StackTraceLine {
+ public final String originalLine;
+ public final String className;
+ public final String methodName;
+ public final String fileName;
+ public final int lineNumber;
+
+ public StackTraceLine(
+ String originalLine, String className, String methodName, String fileName, int lineNumber) {
+ this.originalLine = originalLine;
+ this.className = className;
+ this.methodName = methodName;
+ this.fileName = fileName;
+ this.lineNumber = lineNumber;
+ }
+
+ public static StackTraceLine parse(String line) {
+ String originalLine = line;
+
+ line = line.trim();
+ if (line.startsWith(AT_PREFIX)) {
+ line = line.substring(AT_PREFIX.length());
+ }
+
+ // Expect only one '(', and only one ')' with a ':' in between.
+ int parenBeginIndex = line.indexOf('(');
+ assertTrue(parenBeginIndex > 0);
+ assertEquals(parenBeginIndex, line.lastIndexOf('('));
+ int parenEndIndex = line.indexOf(')');
+ assertTrue(parenBeginIndex < parenEndIndex);
+ assertEquals(parenEndIndex, line.lastIndexOf(')'));
+ int colonIndex = line.indexOf(':');
+ assertTrue(parenBeginIndex < colonIndex && colonIndex < parenEndIndex);
+ assertEquals(parenEndIndex, line.lastIndexOf(')'));
+ String classAndMethod = line.substring(0, parenBeginIndex);
+ int lastDotIndex = classAndMethod.lastIndexOf('.');
+ assertTrue(lastDotIndex > 0);
+ String className = classAndMethod.substring(0, lastDotIndex);
+ String methodName = classAndMethod.substring(lastDotIndex + 1, classAndMethod.length());
+ String fileName = line.substring(parenBeginIndex + 1, colonIndex);
+ int lineNumber = Integer.parseInt(line.substring(colonIndex + 1, parenEndIndex));
+ StackTraceLine result =
+ new StackTraceLine(originalLine, className, methodName, fileName, lineNumber);
+ assertEquals(line, result.toString());
+ return result;
+ }
+
+ @Override
+ public int hashCode() {
+ return className.hashCode() * 31
+ + methodName.hashCode() * 13
+ + fileName.hashCode() * 7
+ + lineNumber;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other instanceof StackTraceLine) {
+ StackTraceLine o = (StackTraceLine) other;
+ return className.equals(o.className)
+ && methodName.equals(o.methodName)
+ && fileName.equals(o.fileName)
+ && lineNumber == o.lineNumber;
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return className + '.' + methodName + '(' + fileName + ':' + lineNumber + ')';
+ }
+ }
+
+ private final List<StackTraceLine> stackTraceLines;
+
+ private StackTrace(List<StackTraceLine> stackTraceLines) {
+ assert stackTraceLines.size() > 0;
+ this.stackTraceLines = stackTraceLines;
+ }
+
+ public int size() {
+ return stackTraceLines.size();
+ }
+
+ public StackTraceLine get(int index) {
+ return stackTraceLines.get(index);
+ }
+
+ public static StackTrace extractFromArt(String stderr) {
+ List<StackTraceLine> stackTraceLines = new ArrayList<>();
+ List<String> stderrLines = StringUtils.splitLines(stderr);
+
+ // A Dalvik stacktrace looks like this:
+ // W(209693) threadid=1: thread exiting with uncaught exception (group=0xf616cb20) (dalvikvm)
+ // java.lang.NullPointerException
+ // \tat com.android.tools.r8.naming.retrace.Main.a(:133)
+ // \tat com.android.tools.r8.naming.retrace.Main.a(:139)
+ // \tat com.android.tools.r8.naming.retrace.Main.main(:145)
+ // \tat dalvik.system.NativeStart.main(Native Method)
+ //
+ // An Art 5.1.1 and 6.0.1 stacktrace looks like this:
+ // java.lang.NullPointerException: throw with null exception
+ // \tat com.android.tools.r8.naming.retrace.Main.a(:154)
+ // \tat com.android.tools.r8.naming.retrace.Main.a(:160)
+ // \tat com.android.tools.r8.naming.retrace.Main.main(:166)
+ //
+ // An Art 7.0.0 and latest stacktrace looks like this:
+ // Exception in thread "main" java.lang.NullPointerException: throw with null exception
+ // \tat com.android.tools.r8.naming.retrace.Main.a(:150)
+ // \tat com.android.tools.r8.naming.retrace.Main.a(:156)
+ // \tat com.android.tools.r8.naming.retrace.Main.main(:162)
+ int last = stderrLines.size();
+ if (ToolHelper.getDexVm().isOlderThanOrEqual(DexVm.ART_4_4_4_HOST)) {
+ // Skip the bottom frame "dalvik.system.NativeStart.main".
+ last--;
+ }
+ // Take all lines from the bottom starting with "\tat ".
+ int first = last;
+ while (first - 1 >= 0 && stderrLines.get(first - 1).startsWith(TAB_AT_PREFIX)) {
+ first--;
+ }
+ for (int i = first; i < last; i++) {
+ stackTraceLines.add(StackTraceLine.parse(stderrLines.get(i)));
+ }
+ return new StackTrace(stackTraceLines);
+ }
+
+ public static StackTrace extractFromJvm(String stderr) {
+ return new StackTrace(
+ StringUtils.splitLines(stderr).stream()
+ .filter(s -> s.startsWith(TAB_AT_PREFIX))
+ .map(StackTraceLine::parse)
+ .collect(Collectors.toList()));
+ }
+
+ public static StackTrace extractFromJvm(TestRunResult result) {
+ assertNotEquals(0, result.getExitCode());
+ return extractFromJvm(result.getStdErr());
+ }
+
+ public StackTrace retrace(String map, Path tempFolder) throws IOException {
+ Path mapFile = tempFolder.resolve("map");
+ Path stackTraceFile = tempFolder.resolve("stackTrace");
+ FileUtils.writeTextFile(mapFile, map);
+ FileUtils.writeTextFile(
+ stackTraceFile,
+ stackTraceLines.stream().map(line -> line.originalLine).collect(Collectors.toList()));
+ return StackTrace.extractFromJvm(ToolHelper.runRetrace(mapFile, stackTraceFile));
+ }
+
+ @Override
+ public int hashCode() {
+ return stackTraceLines.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other instanceof StackTrace) {
+ return stackTraceLines.equals(((StackTrace) other).stackTraceLines);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return toStringWithPrefix("");
+ }
+
+ public String toStringWithPrefix(String prefix) {
+ StringBuilder builder = new StringBuilder();
+ for (StackTraceLine stackTraceLine : stackTraceLines) {
+ builder.append(prefix).append(stackTraceLine).append(System.lineSeparator());
+ }
+ return builder.toString();
+ }
+
+ public abstract static class StackTraceEquivalence extends Equivalence<StackTrace> {
+ public abstract Equivalence<StackTrace.StackTraceLine> getLineEquivalence();
+
+ @Override
+ protected boolean doEquivalent(StackTrace a, StackTrace b) {
+ if (a.stackTraceLines.size() != b.stackTraceLines.size()) {
+ return false;
+ }
+ for (int i = 0; i < a.stackTraceLines.size(); i++) {
+ if (!getLineEquivalence().equivalent(a.stackTraceLines.get(i), b.stackTraceLines.get(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ protected int doHash(StackTrace stackTrace) {
+ int hashCode = stackTrace.size() * 13;
+ for (StackTrace.StackTraceLine stackTraceLine : stackTrace.stackTraceLines) {
+ hashCode += (hashCode << 4) + getLineEquivalence().hash(stackTraceLine);
+ }
+ return hashCode;
+ }
+ }
+
+ // Equivalence forwarding to default stack trace comparison.
+ public static class EquivalenceFull extends StackTraceEquivalence {
+
+ private static class LineEquivalence extends Equivalence<StackTrace.StackTraceLine> {
+
+ private static final LineEquivalence INSTANCE = new LineEquivalence();
+
+ public static LineEquivalence get() {
+ return INSTANCE;
+ }
+
+ @Override
+ protected boolean doEquivalent(StackTrace.StackTraceLine a, StackTrace.StackTraceLine b) {
+ return a.equals(b);
+ }
+
+ @Override
+ protected int doHash(StackTrace.StackTraceLine stackTraceLine) {
+ return stackTraceLine.hashCode();
+ }
+ }
+
+ private static final EquivalenceFull INSTANCE = new EquivalenceFull();
+
+ public static EquivalenceFull get() {
+ return INSTANCE;
+ }
+
+ @Override
+ public Equivalence<StackTrace.StackTraceLine> getLineEquivalence() {
+ return LineEquivalence.get();
+ }
+
+ @Override
+ protected boolean doEquivalent(StackTrace a, StackTrace b) {
+ return a.equals(b);
+ }
+
+ @Override
+ protected int doHash(StackTrace stackTrace) {
+ return stackTrace.hashCode();
+ }
+ }
+
+ // Equivalence comparing stack traces without taking the file name into account.
+ public static class EquivalenceWithoutFileName extends StackTraceEquivalence {
+
+ private static class LineEquivalence extends Equivalence<StackTrace.StackTraceLine> {
+
+ private static final LineEquivalence INSTANCE = new LineEquivalence();
+
+ public static LineEquivalence get() {
+ return INSTANCE;
+ }
+
+ @Override
+ protected boolean doEquivalent(StackTrace.StackTraceLine a, StackTrace.StackTraceLine b) {
+ return a.className.equals(b.className)
+ && a.methodName.equals(b.methodName)
+ && a.lineNumber == b.lineNumber;
+ }
+
+ @Override
+ protected int doHash(StackTrace.StackTraceLine stackTraceLine) {
+ return stackTraceLine.className.hashCode() * 13
+ + stackTraceLine.methodName.hashCode() * 7
+ + stackTraceLine.lineNumber;
+ }
+ }
+
+ private static final EquivalenceWithoutFileName INSTANCE = new EquivalenceWithoutFileName();
+
+ public static EquivalenceWithoutFileName get() {
+ return INSTANCE;
+ }
+
+ @Override
+ public Equivalence<StackTrace.StackTraceLine> getLineEquivalence() {
+ return LineEquivalence.get();
+ }
+ }
+
+ // Equivalence comparing stack traces without taking the file name and line number into account.
+ public static class EquivalenceWithoutFileNameAndLineNumber extends StackTraceEquivalence {
+
+ private static final EquivalenceWithoutFileNameAndLineNumber INSTANCE =
+ new EquivalenceWithoutFileNameAndLineNumber();
+
+ public static EquivalenceWithoutFileNameAndLineNumber get() {
+ return INSTANCE;
+ }
+
+ public static class LineEquivalence extends Equivalence<StackTrace.StackTraceLine> {
+
+ private static final LineEquivalence INSTANCE = new LineEquivalence();
+
+ public static LineEquivalence get() {
+ return INSTANCE;
+ }
+
+ @Override
+ protected boolean doEquivalent(StackTrace.StackTraceLine a, StackTrace.StackTraceLine b) {
+ return a.className.equals(b.className) && a.methodName.equals(b.methodName);
+ }
+
+ @Override
+ protected int doHash(StackTrace.StackTraceLine stackTraceLine) {
+ return stackTraceLine.className.hashCode() * 13 + stackTraceLine.methodName.hashCode() * 7;
+ }
+ }
+
+ @Override
+ public Equivalence<StackTrace.StackTraceLine> getLineEquivalence() {
+ return LineEquivalence.get();
+ }
+ }
+
+ public static class StackTraceMatcherBase extends TypeSafeMatcher<StackTrace> {
+ private final StackTrace expected;
+ private final StackTraceEquivalence equivalence;
+ private final String comparisonDescription;
+
+ private StackTraceMatcherBase(
+ StackTrace expected, StackTraceEquivalence equivalence, String comparisonDescription) {
+ this.expected = expected;
+ this.equivalence = equivalence;
+ this.comparisonDescription = comparisonDescription;
+ }
+
+ @Override
+ public boolean matchesSafely(StackTrace stackTrace) {
+ return equivalence.equivalent(expected, stackTrace);
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description
+ .appendText("stacktrace " + comparisonDescription)
+ .appendText(System.lineSeparator())
+ .appendText(expected.toString());
+ }
+
+ @Override
+ public void describeMismatchSafely(final StackTrace stackTrace, Description description) {
+ description.appendText("stacktrace was " + stackTrace);
+ description.appendText(System.lineSeparator());
+ if (expected.size() != stackTrace.size()) {
+ description.appendText("They have different sizes.");
+ } else {
+ for (int i = 0; i < expected.size(); i++) {
+ if (!equivalence.getLineEquivalence().equivalent(expected.get(i), stackTrace.get(i))) {
+ description
+ .appendText("First different entry is index " + i + ":")
+ .appendText(System.lineSeparator())
+ .appendText("Expected: " + expected.get(i))
+ .appendText(System.lineSeparator())
+ .appendText(" Was: " + stackTrace.get(i));
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ public static class StackTraceMatcher extends StackTraceMatcherBase {
+ private StackTraceMatcher(StackTrace expected) {
+ super(expected, EquivalenceFull.get(), "");
+ }
+ }
+
+ public static Matcher<StackTrace> isSame(StackTrace stackTrace) {
+ return new StackTraceMatcher(stackTrace);
+ }
+
+ public static class StackTraceIgnoreFileNameMatcher extends StackTraceMatcherBase {
+ private StackTraceIgnoreFileNameMatcher(StackTrace expected) {
+ super(expected, EquivalenceWithoutFileName.get(), "(ignoring file name)");
+ }
+ }
+
+ public static Matcher<StackTrace> isSameExceptForFileName(StackTrace stackTrace) {
+ return new StackTraceIgnoreFileNameMatcher(stackTrace);
+ }
+
+ public static class StackTraceIgnoreFileNameAndLineNumberMatcher extends StackTraceMatcherBase {
+ private StackTraceIgnoreFileNameAndLineNumberMatcher(StackTrace expected) {
+ super(
+ expected,
+ EquivalenceWithoutFileNameAndLineNumber.get(),
+ "(ignoring file name and line number)");
+ }
+ }
+
+ public static Matcher<StackTrace> isSameExceptForFileNameAndLineNumber(StackTrace stackTrace) {
+ return new StackTraceIgnoreFileNameAndLineNumberMatcher(stackTrace);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTraceTest.java
new file mode 100644
index 0000000..e7ff8eb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTraceTest.java
@@ -0,0 +1,68 @@
+// Copyright (c) 2018, 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.naming.retrace;
+
+import static com.android.tools.r8.naming.retrace.StackTrace.TAB_AT_PREFIX;
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
+import com.android.tools.r8.utils.StringUtils;
+import org.junit.Test;
+
+public class StackTraceTest {
+
+ private static String oneLineStackTrace =
+ TAB_AT_PREFIX + "Test.main(Test.java:10)" + System.lineSeparator();
+ private static String twoLineStackTrace =
+ TAB_AT_PREFIX + "Test.a(Test.java:6)" + System.lineSeparator()
+ + TAB_AT_PREFIX + "Test.main(Test.java:10)" + System.lineSeparator();
+
+ private void testEquals(String stderr) {
+ StackTrace stackTrace = StackTrace.extractFromJvm(stderr);
+ assertEquals(stackTrace, stackTrace);
+ assertEquals(stackTrace, StackTrace.extractFromJvm(stderr));
+ }
+
+ @Test
+ public void testOneLine() {
+ StackTrace stackTrace = StackTrace.extractFromJvm(oneLineStackTrace);
+ assertEquals(1, stackTrace.size());
+ StackTraceLine stackTraceLine = stackTrace.get(0);
+ assertEquals("Test", stackTraceLine.className);
+ assertEquals("main", stackTraceLine.methodName);
+ assertEquals("Test.java", stackTraceLine.fileName);
+ assertEquals(10, stackTraceLine.lineNumber);
+ assertEquals(StringUtils.splitLines(oneLineStackTrace).get(0), stackTraceLine.originalLine);
+ assertEquals(oneLineStackTrace, stackTrace.toStringWithPrefix(TAB_AT_PREFIX));
+ }
+
+ @Test
+ public void testTwoLine() {
+ StackTrace stackTrace = StackTrace.extractFromJvm(twoLineStackTrace);
+ StackTraceLine stackTraceLine = stackTrace.get(0);
+ assertEquals("Test", stackTraceLine.className);
+ assertEquals("a", stackTraceLine.methodName);
+ assertEquals("Test.java", stackTraceLine.fileName);
+ assertEquals(6, stackTraceLine.lineNumber);
+ assertEquals(StringUtils.splitLines(twoLineStackTrace).get(0), stackTraceLine.originalLine);
+ stackTraceLine = stackTrace.get(1);
+ assertEquals("Test", stackTraceLine.className);
+ assertEquals("main", stackTraceLine.methodName);
+ assertEquals("Test.java", stackTraceLine.fileName);
+ assertEquals(10, stackTraceLine.lineNumber);
+ assertEquals(StringUtils.splitLines(twoLineStackTrace).get(1), stackTraceLine.originalLine);
+ assertEquals(twoLineStackTrace, stackTrace.toStringWithPrefix(TAB_AT_PREFIX));
+ }
+
+ @Test
+ public void testEqualsOneLine() {
+ testEquals(oneLineStackTrace);
+ }
+
+ @Test
+ public void testEqualsTwoLine() {
+ testEquals(twoLineStackTrace);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/regress/b78493232/Regress78493232_WithPhi.java b/src/test/java/com/android/tools/r8/regress/b78493232/Regress78493232_WithPhi.java
index 6ee7392..4bd0776 100644
--- a/src/test/java/com/android/tools/r8/regress/b78493232/Regress78493232_WithPhi.java
+++ b/src/test/java/com/android/tools/r8/regress/b78493232/Regress78493232_WithPhi.java
@@ -52,6 +52,7 @@
case V4_4_4:
case V7_0_0:
case V8_1_0:
+ case V9_0_0:
case DEFAULT:
assertNotEquals(-1, d8Result.stderr.indexOf("java.lang.VerifyError"));
assertNotEquals(-1, r8Result.stderr.indexOf("java.lang.VerifyError"));
diff --git a/tools/archive.py b/tools/archive.py
index 07f138a..0fa811b 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -88,7 +88,10 @@
shutil.copyfile(utils.R8_JAR, utils.R8_EXCLUDE_DEPS_JAR)
# Ensure all archived artifacts has been built before archiving.
- gradle.RunGradle([utils.D8, utils.R8, utils.COMPATDX, utils.COMPATPROGUARD])
+ # The target tasks postfixed by 'r8' depend on the actual target task so
+ # building it invokes the original task first.
+ gradle.RunGradle(map((lambda t: t + 'r8'),
+ [utils.D8, utils.R8, utils.COMPATDX, utils.COMPATPROGUARD]))
version = GetVersion()
is_master = IsMaster(version)
if is_master:
@@ -107,12 +110,12 @@
'releaser=go/r8bot (' + os.environ.get('BUILDBOT_SLAVENAME') + ')\n')
version_writer.write('version-file.version.code=1\n')
- for file in [utils.D8_JAR,
- utils.R8_JAR,
+ for file in [utils.D8_JAR, utils.D8R8_JAR,
+ utils.R8_JAR, utils.R8R8_JAR,
utils.R8_SRC_JAR,
utils.R8_EXCLUDE_DEPS_JAR,
- utils.COMPATDX_JAR,
- utils.COMPATPROGUARD_JAR,
+ utils.COMPATDX_JAR, utils.COMPATDXR8_JAR,
+ utils.COMPATPROGUARD_JAR, utils.COMPATPROGUARDR8_JAR,
utils.MAVEN_ZIP,
utils.GENERATED_LICENSE]:
file_name = os.path.basename(file)
diff --git a/tools/archive_logs.py b/tools/archive_logs.py
new file mode 100755
index 0000000..bdae32e
--- /dev/null
+++ b/tools/archive_logs.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+# Copyright (c) 2018, 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.
+
+# Script for achiving gradle test logs.
+
+import utils
+
+if __name__ == '__main__':
+ utils.archive_failures()
diff --git a/tools/linux/README.art-versions b/tools/linux/README.art-versions
index 1512a64..095872b 100644
--- a/tools/linux/README.art-versions
+++ b/tools/linux/README.art-versions
@@ -42,6 +42,29 @@
<continue with repo sync as above>
+art-9.0.0 (Android P)
+---------------------
+Build from branch android-9.0.0_r18.
+
+export BRANCH=android-9.0.0_r18
+mkdir ${BRANCH}
+cd ${BRANCH}
+repo init -u https://android.googlesource.com/platform/manifest -b ${BRANCH}
+repo sync -cq -j24
+source build/envsetup.sh
+lunch aosp_marlin-userdebug
+m -j24
+m -j24 build-art
+m -j24 test-art-host
+
+Collected into tools/linux/art-9.0.0.
+
+ cd <r8 checkout>
+ scripts/update-host-art.sh \
+ --android-checkout /usr/local/ssd/android/${BRANCH} \
+ --art-dir art-9.0.0 \
+ --android-product marlin
+
art-8.1.0 (Android O MR1)
-------------------------
Build from branch android-8.1.0_r51.
@@ -59,6 +82,7 @@
Collected into tools/linux/art-8.1.0.
+ cd <r8 checkout>
scripts/update-host-art.sh \
--android-checkout /usr/local/ssd/android/${BRANCH} \
--art-dir art-8.1.0 \
diff --git a/tools/linux/art-9.0.0.tar.gz.sha1 b/tools/linux/art-9.0.0.tar.gz.sha1
new file mode 100644
index 0000000..788e039
--- /dev/null
+++ b/tools/linux/art-9.0.0.tar.gz.sha1
@@ -0,0 +1 @@
+bfd3d6f4c7d7245d93eecdcc386b41299266e2d1
\ No newline at end of file
diff --git a/tools/run-jdwp-tests.py b/tools/run-jdwp-tests.py
index db69197..2ef479d 100755
--- a/tools/run-jdwp-tests.py
+++ b/tools/run-jdwp-tests.py
@@ -15,6 +15,7 @@
VERSIONS = [
'default',
+ '9.0.0',
'8.1.0',
'7.0.0',
'6.0.1',
@@ -101,6 +102,8 @@
flags.extend(['-Ximage:%s' % IMAGE])
if version != '5.1.1':
flags.extend(['-Xcompiler-option', '--debuggable'])
+ if version == '9.0.0':
+ flags.extend(['-XjdwpProvider:internal'])
return flags
def get_debuggee_flags(version):
diff --git a/tools/test.py b/tools/test.py
index 31b2134..e4433b3 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -13,13 +13,17 @@
import subprocess
import sys
import utils
-import uuid
import notify
-import upload_to_x20
-
-ALL_ART_VMS = ["default", "8.1.0", "7.0.0", "6.0.1", "5.1.1", "4.4.4", "4.0.4"]
-BUCKET = 'r8-test-results'
+ALL_ART_VMS = [
+ "default",
+ "9.0.0",
+ "8.1.0",
+ "7.0.0",
+ "6.0.1",
+ "5.1.1",
+ "4.4.4",
+ "4.0.4"]
def ParseOptions():
result = optparse.OptionParser()
@@ -89,15 +93,6 @@
return result.parse_args()
-def archive_failures():
- upload_dir = os.path.join(utils.REPO_ROOT, 'build', 'reports', 'tests')
- u_dir = uuid.uuid4()
- destination = 'gs://%s/%s' % (BUCKET, u_dir)
- utils.upload_dir_to_cloud_storage(upload_dir, destination, is_html=True)
- url = 'http://storage.googleapis.com/%s/%s/test/index.html' % (BUCKET, u_dir)
- print 'Test results available at: %s' % url
- print '@@@STEP_LINK@Test failures@%s@@@' % url
-
def Main():
(options, args) = ParseOptions()
if 'BUILDBOT_BUILDERNAME' in os.environ:
@@ -193,7 +188,7 @@
if return_code != 0:
if options.archive_failures and os.name != 'nt':
- archive_failures()
+ utils.archive_failures()
return return_code
return 0
diff --git a/tools/update_prebuilds_in_android.py b/tools/update_prebuilds_in_android.py
index 7635ba6..395a4b4 100755
--- a/tools/update_prebuilds_in_android.py
+++ b/tools/update_prebuilds_in_android.py
@@ -35,7 +35,8 @@
copyfile(src, dest)
def copy_jar_targets(root, target_root):
- srcs = map((lambda t: t + '.jar'), JAR_TARGETS)
+ # With the '-r8' postfix we're using the R8-processed jars.
+ srcs = map((lambda t: t + '-r8.jar'), JAR_TARGETS)
dests = map((lambda t: t + '-master.jar'), JAR_TARGETS)
copy_targets(root, target_root, srcs, dests)
@@ -61,12 +62,13 @@
args = parse_arguments()
target_root = args.android_root[0]
if args.commit_hash == None and args.version == None:
- gradle.RunGradle(JAR_TARGETS)
+ gradle.RunGradle(map((lambda t: t + 'r8'), JAR_TARGETS))
copy_jar_targets(utils.LIBS, target_root)
copy_other_targets(utils.GENERATED_LICENSE_DIR, target_root)
else:
assert args.commit_hash == None or args.version == None
- targets = map((lambda t: t + '.jar'), JAR_TARGETS) + OTHER_TARGETS
+ # With the '-r8' postfix we're using the R8-processed jars.
+ targets = map((lambda t: t + '-r8.jar'), JAR_TARGETS) + OTHER_TARGETS
with utils.TempDir() as root:
for target in targets:
if args.commit_hash:
diff --git a/tools/utils.py b/tools/utils.py
index d28643d..18f8870 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -12,6 +12,7 @@
import sys
import tarfile
import tempfile
+import uuid
ANDROID_JAR = 'third_party/android_jar/lib-v{api}/android.jar'
TOOLS_DIR = os.path.abspath(os.path.normpath(os.path.join(__file__, '..')))
@@ -34,16 +35,22 @@
COMPATPROGUARD = 'compatproguard'
D8_JAR = os.path.join(LIBS, 'd8.jar')
+D8R8_JAR = os.path.join(LIBS, 'd8-r8.jar')
R8_JAR = os.path.join(LIBS, 'r8.jar')
+R8R8_JAR = os.path.join(LIBS, 'r8-r8.jar')
R8_SRC_JAR = os.path.join(LIBS, 'r8-src.jar')
R8_EXCLUDE_DEPS_JAR = os.path.join(LIBS, 'r8-exclude-deps.jar')
COMPATDX_JAR = os.path.join(LIBS, 'compatdx.jar')
+COMPATDXR8_JAR = os.path.join(LIBS, 'compatdx-r8.jar')
COMPATPROGUARD_JAR = os.path.join(LIBS, 'compatproguard.jar')
+COMPATPROGUARDR8_JAR = os.path.join(LIBS, 'compatproguard-r8.jar')
MAVEN_ZIP = os.path.join(LIBS, 'r8.zip')
GENERATED_LICENSE = os.path.join(GENERATED_LICENSE_DIR, 'LICENSE')
RT_JAR = os.path.join(REPO_ROOT, 'third_party/openjdk/openjdk-rt-1.8/rt.jar')
R8LIB_KEEP_RULES = os.path.join(REPO_ROOT, 'src/main/keep.txt')
+TEST_RESULT_BUCKET = 'r8-test-results'
+
def PrintCmd(s):
if type(s) is list:
s = ' '.join(s)
@@ -180,6 +187,15 @@
def __exit__(self, *_):
shutil.rmtree(self._temp_dir, ignore_errors=True)
+def archive_failures():
+ upload_dir = os.path.join(REPO_ROOT, 'build', 'reports', 'tests')
+ u_dir = uuid.uuid4()
+ destination = 'gs://%s/%s' % (TEST_RESULT_BUCKET, u_dir)
+ upload_dir_to_cloud_storage(upload_dir, destination, is_html=True)
+ url = 'http://storage.googleapis.com/%s/%s/test/index.html' % (TEST_RESULT_BUCKET, u_dir)
+ print 'Test results available at: %s' % url
+ print '@@@STEP_LINK@Test failures@%s@@@' % url
+
class ChangedWorkingDirectory(object):
def __init__(self, working_directory):
self._working_directory = working_directory