diff options
author | Ivan Gavrilovic <gavra@google.com> | 2017-08-29 10:07:39 +0100 |
---|---|---|
committer | Ivan Gavrilovic <gavra@google.com> | 2017-08-29 10:07:39 +0100 |
commit | f1fbe8f322b8ec19ba87a0396f1505c92bc3c441 (patch) | |
tree | 5f4886f6fa7f6305c010eeddf4fc565ee4e1dfe6 | |
parent | ecc0e07b4309a4efb8d289b8b4a55ae070064b37 (diff) | |
parent | 6cc67d81522d327eb33b765c138bd04e1003bf93 (diff) | |
download | r8-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.gradle | 14 | ||||
-rw-r--r-- | src/main/java/com/android/tools/r8/D8.java | 2 | ||||
-rw-r--r-- | src/main/java/com/android/tools/r8/R8.java | 2 | ||||
-rw-r--r-- | src/main/java/com/android/tools/r8/ir/code/ConstNumber.java | 5 | ||||
-rw-r--r-- | src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java | 2 | ||||
-rw-r--r-- | src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java | 3 | ||||
-rw-r--r-- | src/test/java/com/android/tools/r8/JctfTestSpecifications.java | 6 | ||||
-rwxr-xr-x | tools/compatdx.py | 4 | ||||
-rwxr-xr-x | tools/run_proguard_dx_on_app.py | 3 | ||||
-rwxr-xr-x | tools/test.py | 5 | ||||
-rwxr-xr-x | tools/test_android_cts.py | 3 | ||||
-rwxr-xr-x | tools/test_aosp_jar.py | 54 | ||||
-rw-r--r-- | tools/utils.py | 32 |
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')} + ) |