aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Gavrilovic <gavra@google.com>2017-08-29 10:07:39 +0100
committerIvan Gavrilovic <gavra@google.com>2017-08-29 10:07:39 +0100
commitf1fbe8f322b8ec19ba87a0396f1505c92bc3c441 (patch)
tree5f4886f6fa7f6305c010eeddf4fc565ee4e1dfe6
parentecc0e07b4309a4efb8d289b8b4a55ae070064b37 (diff)
parent6cc67d81522d327eb33b765c138bd04e1003bf93 (diff)
downloadr8-f1fbe8f322b8ec19ba87a0396f1505c92bc3c441.tar.gz
Merge remote-tracking branch 'goog/upstream-d8-0.1' into studio-master-canary
* goog/upstream-d8-0.1: Version 0.1.5 Version 0.1.4
-rw-r--r--build.gradle14
-rw-r--r--src/main/java/com/android/tools/r8/D8.java2
-rw-r--r--src/main/java/com/android/tools/r8/R8.java2
-rw-r--r--src/main/java/com/android/tools/r8/ir/code/ConstNumber.java5
-rw-r--r--src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java2
-rw-r--r--src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java3
-rw-r--r--src/test/java/com/android/tools/r8/JctfTestSpecifications.java6
-rwxr-xr-xtools/compatdx.py4
-rwxr-xr-xtools/run_proguard_dx_on_app.py3
-rwxr-xr-xtools/test.py5
-rwxr-xr-xtools/test_android_cts.py3
-rwxr-xr-xtools/test_aosp_jar.py54
-rw-r--r--tools/utils.py32
13 files changed, 118 insertions, 17 deletions
diff --git a/build.gradle b/build.gradle
index fa1e717f9..63513ce32 100644
--- a/build.gradle
+++ b/build.gradle
@@ -918,13 +918,21 @@ task supportLibList() {
}
}
+task AospJarTest(type: Exec) {
+ dependsOn CompatDx, downloadDeps
+ def script = "tools/test_aosp_jar.py"
+ inputs.file script
+ commandLine "python", script, "--no-build"
+ workingDir = projectDir
+}
+
test {
dependsOn supportLibList
testLogging.exceptionFormat = 'full'
if (project.hasProperty('print_test_stdout')) {
testLogging.showStandardStreams = true
}
- if (project.hasProperty('dex_vm')) {
+ if (project.hasProperty('dex_vm') && project.property('dex_vm') != 'default') {
println "Running with non default vm: " + project.property('dex_vm')
systemProperty 'dex_vm', project.property('dex_vm')
if (project.property('dex_vm') == '5.1.1' || project.property('dex_vm') == '6.0.1') {
@@ -934,6 +942,7 @@ test {
exclude "com/android/tools/r8/art/jack/**"
}
}
+
if (project.hasProperty('one_line_per_test')) {
beforeTest { desc ->
println "Start executing test ${desc.name} [${desc.className}]"
@@ -976,6 +985,9 @@ test {
if (project.hasProperty('test_dir')) {
systemProperty 'test_dir', project.property('test_dir')
}
+ if (project.hasProperty('aosp_jar')) {
+ dependsOn AospJarTest
+ }
if (OperatingSystem.current().isLinux()
|| OperatingSystem.current().isMacOsX()
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index d452bc9e7..33e383cca 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -55,7 +55,7 @@ import java.util.concurrent.ExecutorService;
*/
public final class D8 {
- private static final String VERSION = "v0.1.3";
+ private static final String VERSION = "v0.1.5";
private static final int STATUS_ERROR = 1;
private D8() {}
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index c54936a39..45b43db3c 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -71,7 +71,7 @@ import java.util.concurrent.Executors;
public class R8 {
- private static final String VERSION = "v0.1.3";
+ private static final String VERSION = "v0.1.5";
private final Timing timing = new Timing("R8");
private final InternalOptions options;
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
index 188066852..708e5a460 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
@@ -26,7 +26,6 @@ public class ConstNumber extends ConstInstruction {
// are all for fixed register values. All other values that are used as the destination for
// const number instructions should be marked as constants.
assert dest.isFixedRegisterValue() || dest.definition.isConstNumber();
- assert type != ConstType.OBJECT;
this.type = type;
this.value = value;
}
@@ -53,7 +52,7 @@ public class ConstNumber extends ConstInstruction {
}
public int getIntValue() {
- assert type == ConstType.INT || type == ConstType.INT_OR_FLOAT;
+ assert type == ConstType.INT || type == ConstType.INT_OR_FLOAT || type == ConstType.OBJECT;
return (int) value;
}
@@ -96,7 +95,7 @@ public class ConstNumber extends ConstInstruction {
}
int register = builder.allocatedRegister(dest(), getNumber());
- if (MoveType.fromConstType(type) == MoveType.SINGLE) {
+ if (MoveType.fromConstType(type) == MoveType.SINGLE || type == ConstType.OBJECT) {
assert NumberUtils.is32Bit(value);
if ((register & 0xf) == register && NumberUtils.is4Bit(value)) {
builder.add(this, new Const4(register, (int) value));
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
index 976020c27..aa860572f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -716,7 +716,7 @@ public class IRBuilder {
}
public void addNullConst(int dest, long value) {
- canonicalizeAndAddConst(ConstType.INT, dest, value, nullConstants);
+ canonicalizeAndAddConst(ConstType.OBJECT, dest, value, nullConstants);
}
public void addConstClass(int dest, DexType type) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 815efe4e7..0c75ef3d6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -78,6 +78,7 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -845,7 +846,7 @@ public class CodeRewriter {
if (current.isInvoke() && current.asInvoke().requiredArgumentRegisters() > 5) {
Invoke invoke = current.asInvoke();
it.previous();
- Map<ConstNumber, ConstNumber> oldToNew = new HashMap<>();
+ Map<ConstNumber, ConstNumber> oldToNew = new IdentityHashMap<>();
for (int i = 0; i < invoke.inValues().size(); i++) {
Value value = invoke.inValues().get(i);
if (value.isConstNumber() && value.numberOfUsers() > 1) {
diff --git a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
index beba10e6e..8b6926e93 100644
--- a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
+++ b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
@@ -2675,7 +2675,8 @@ public class JctfTestSpecifications {
// 1) t02
// java.lang.AssertionError: Failed to load serialization resource file: serialization/com/google/jctf/test/lib/java/lang/String/CASE_INSENSITIVE_ORDER/serialization/String_serialization_A01.golden.0.ser
- .put("lang.String.getBytesLjava_lang_String.String_getBytes_A14", any())
+ .put("lang.String.getBytesLjava_lang_String.String_getBytes_A14",
+ match(runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
// 1) t07
// arrays first differed at element [0]; expected:<-2> but was:<-1>
// Caused by: java.lang.AssertionError: expected:<-2> but was:<-1>
@@ -2735,7 +2736,8 @@ public class JctfTestSpecifications {
// 1) t09
// org.junit.ComparisonFailure: Incorrect double string returned expected:<0.001[0]> but was:<0.001[]>
- .put("lang.String.getBytesLjava_nio_charset_Charset.String_getBytes_A14", any())
+ .put("lang.String.getBytesLjava_nio_charset_Charset.String_getBytes_A14",
+ match(runtimes(DexVm.ART_7_0_0, DexVm.ART_6_0_1, DexVm.ART_5_1_1)))
// 1) t07
// arrays first differed at element [0]; expected:<-2> but was:<-1>
// Caused by: java.lang.AssertionError: expected:<-2> but was:<-1>
diff --git a/tools/compatdx.py b/tools/compatdx.py
index 51e310454..75910b1cb 100755
--- a/tools/compatdx.py
+++ b/tools/compatdx.py
@@ -9,8 +9,6 @@ import subprocess
import sys
import utils
-COMPATDX_JAR = os.path.join(utils.REPO_ROOT, 'build', 'libs', 'compatdx.jar')
-
def run(args, build = True, debug = True, profile = False, track_memory_file=None):
if build:
gradle.RunGradle(['CompatDX'])
@@ -22,7 +20,7 @@ def run(args, build = True, debug = True, profile = False, track_memory_file=Non
cmd.append('-ea')
if profile:
cmd.append('-agentlib:hprof=cpu=samples,interval=1,depth=8')
- cmd.extend(['-jar', COMPATDX_JAR])
+ cmd.extend(['-jar', utils.COMPATDX_JAR])
cmd.extend(args)
subprocess.check_call(cmd)
diff --git a/tools/run_proguard_dx_on_app.py b/tools/run_proguard_dx_on_app.py
index 92a75ba92..a95322907 100755
--- a/tools/run_proguard_dx_on_app.py
+++ b/tools/run_proguard_dx_on_app.py
@@ -26,7 +26,6 @@ import youtube_data
APPS = ['gmscore', 'youtube']
DX_JAR = join(utils.REPO_ROOT, 'tools', 'linux', 'dx', 'framework', 'dx.jar')
-COMPATDX_JAR = join(utils.REPO_ROOT, 'build', 'libs', 'compatdx.jar')
def parse_arguments(argv):
parser = argparse.ArgumentParser(
@@ -122,7 +121,7 @@ def Main(argv):
# run dex on the result
if options.compatdx:
- jar = COMPATDX_JAR
+ jar = utils.COMPATDX_JAR
else:
jar = DX_JAR
diff --git a/tools/test.py b/tools/test.py
index 1da077b48..b0255cb3f 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -56,6 +56,9 @@ def ParseOptions():
result.add_option('--jctf_compile_only',
help="Don't run, only compile JCTF tests.",
default=False, action='store_true')
+ result.add_option('--aosp_jar',
+ help='Run aosp_jar test.',
+ default=False, action='store_true')
result.add_option('--disable_assertions',
help='Disable assertions when running tests.',
default=False, action='store_true')
@@ -104,6 +107,8 @@ def Main():
gradle_args.append('-Ponly_jctf')
if options.jctf_compile_only:
gradle_args.append('-Pjctf_compile_only')
+ if options.aosp_jar:
+ gradle_args.append('-Paosp_jar')
if options.disable_assertions:
gradle_args.append('-Pdisable_assertions')
if options.with_code_coverage:
diff --git a/tools/test_android_cts.py b/tools/test_android_cts.py
index 4ef8039b1..3f663020c 100755
--- a/tools/test_android_cts.py
+++ b/tools/test_android_cts.py
@@ -40,7 +40,6 @@ AOSP_MANIFEST_XML = join(utils.REPO_ROOT, 'third_party',
AOSP_HELPER_SH = join(utils.REPO_ROOT, 'scripts', 'aosp_helper.sh')
D8_JAR = join(utils.REPO_ROOT, 'build/libs/d8.jar')
-COMPATDX_JAR = join(utils.REPO_ROOT, 'build/libs/compatdx.jar')
D8LOGGER_JAR = join(utils.REPO_ROOT, 'build/libs/d8logger.jar')
AOSP_ROOT = join(utils.REPO_ROOT, 'build/aosp')
@@ -175,7 +174,7 @@ def Main():
alt_jar_option += D8LOGGER_JAR
os.environ['D8LOGGER_OUTPUT'] = args.d8log
else:
- alt_jar_option += COMPATDX_JAR
+ alt_jar_option += utils.COMPATDX_JAR
gradle.RunGradle(['d8','d8logger', 'compatdx'])
diff --git a/tools/test_aosp_jar.py b/tools/test_aosp_jar.py
new file mode 100755
index 000000000..79a584a9e
--- /dev/null
+++ b/tools/test_aosp_jar.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+# Copyright (c) 2017, 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.
+
+# Test prebuilt AOSP jar files: compile with D8 and run dex2out to validate
+
+from __future__ import print_function
+from glob import glob
+from itertools import chain
+from os.path import join
+import argparse
+import os
+import subprocess
+import sys
+
+import gradle
+
+import utils
+
+REPLAY_SCRIPT_DIR = join(utils.REPO_ROOT, 'third_party',
+ 'android_cts_baseline', 'dx_replay')
+REPLAY_SCRIPT = join(REPLAY_SCRIPT_DIR, 'replay_script.py')
+OUT_DIR = join(REPLAY_SCRIPT_DIR, 'out')
+
+def parse_arguments():
+ parser = argparse.ArgumentParser(
+ description = 'Run D8 (CompatDX) and dex2oat on prebuilt AOSP jars.')
+ parser.add_argument('--no-build', default = False, action = 'store_true')
+ return parser.parse_args()
+
+def Main():
+
+ utils.check_java_version()
+ args = parse_arguments()
+
+ if not args.no_build:
+ gradle.RunGradle(['CompatDx'])
+
+ cmd = [REPLAY_SCRIPT, 'java', '-jar', utils.COMPATDX_JAR]
+ utils.PrintCmd(cmd)
+ subprocess.check_call(cmd)
+
+ # collect dex files below OUT_DIR
+ dex_files = (chain.from_iterable(glob(join(x[0], '*.dex'))
+ for x in os.walk(OUT_DIR)))
+
+ for dex_file in dex_files:
+ utils.verify_with_dex2oat(dex_file)
+
+
+if __name__ == '__main__':
+ sys.exit(Main())
+
diff --git a/tools/utils.py b/tools/utils.py
index dab1dd1d8..e281ccd91 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -18,6 +18,7 @@ MEMORY_USE_TMP_FILE = 'memory_use.tmp'
DEX_SEGMENTS_JAR = os.path.join(REPO_ROOT, 'build', 'libs',
'dexsegments.jar')
DEX_SEGMENTS_RESULT_PATTERN = re.compile('- ([^:]+): ([0-9]+)')
+COMPATDX_JAR = os.path.join(REPO_ROOT, 'build', 'libs', 'compatdx.jar')
def PrintCmd(s):
if type(s) is list:
@@ -185,3 +186,34 @@ def check_java_version():
if m is None:
raise Exception("Incorrect java version, expected: '1.8.*-internal',"
" actual: {}".format(version))
+
+def verify_with_dex2oat(dex_file):
+
+ # dex2oat accepts non-existent dex files, check here instead
+ if not os.path.exists(dex_file):
+ raise Exception('Dex file not found: "{}"'.format(dex_file))
+
+ android_root_dir = os.path.join(TOOLS_DIR, 'linux', 'art', 'product',
+ 'angler')
+ boot_art = os.path.join(android_root_dir, 'system', 'framework', 'boot.art')
+ dex2oat = os.path.join(TOOLS_DIR, 'linux', 'art', 'bin', 'dex2oat')
+
+ with TempDir() as temp:
+ oat_file = os.path.join(temp, 'all.oat')
+
+ cmd = [
+ dex2oat,
+ '--android-root=' + android_root_dir,
+ '--runtime-arg', '-Xnorelocate',
+ '--boot-image=' + boot_art,
+ '--dex-file=' + dex_file,
+ '--oat-file=' + oat_file,
+ '--instruction-set=arm64',
+ '--compiler-filter=interpret-only'
+ ]
+
+ PrintCmd(cmd)
+ subprocess.check_call(cmd,
+ env = {"LD_LIBRARY_PATH":
+ os.path.join(TOOLS_DIR, 'linux', 'art', 'lib')}
+ )