Commit 5ee9454d authored by Sebastien Hertz's avatar Sebastien Hertz
Browse files

Support compiling run-tests with jack

This CL adds support to compile run-test source files with jack. When
a test needs to rely on class files, we use jill to convert them to a
jack library.

We need to pass the full classpath to jack containing at least core
classes (like java.lang.Object). This means the Android tree must
have been compiled with jack first so we find all the necessary
classes.jack files.

Some tests still rely on dex files generated with the old toolchain.
We keep building them this way for the moment and will update them
later, when they get ready for Jack.

Also updates a few tests dealing with garbage collection to avoid a
situation where a reference can be retained by a local DEX register.

Bug: 19467889

(cherry picked from commit 19ac0276)

Change-Id: Ia5a989b83430ffe8298a869a1da970b756721bb0
parent c2bf1255
......@@ -88,4 +88,8 @@ TARGET_CORE_DEX_LOCATIONS := $(foreach jar,$(TARGET_CORE_JARS),/$(DEXPREOPT_BOOT
HOST_CORE_DEX_FILES := $(foreach jar,$(HOST_CORE_JARS), $(call intermediates-dir-for,JAVA_LIBRARIES,$(jar),t,COMMON)/javalib.jar)
TARGET_CORE_DEX_FILES := $(foreach jar,$(TARGET_CORE_JARS),$(call intermediates-dir-for,JAVA_LIBRARIES,$(jar), ,COMMON)/javalib.jar)
# Classpath for Jack compilation: we only need core-libart.
HOST_JACK_CLASSPATH := $(abspath $(call intermediates-dir-for,JAVA_LIBRARIES,core-libart-hostdex,t,COMMON)/classes.jack)
TARGET_JACK_CLASSPATH := $(abspath $(call intermediates-dir-for,JAVA_LIBRARIES,core-libart, ,COMMON)/classes.jack)
endif # ART_ANDROID_COMMON_PATH_MK
......@@ -22,5 +22,10 @@ ${JAVAC} -d classes `find src -name '*.java'`
rm classes/UnresClass.class
${JAVAC} -d classes `find src2 -name '*.java'`
${DX} -JXmx256m --debug --dex --output=classes.dex classes
if [ ${USE_JACK} = "true" ]; then
${JILL} classes --output classes.jack
${JACK} --import classes.jack --output-dex .
else
${DX} -JXmx256m --debug --dex --output=classes.dex classes
fi
zip $TEST_NAME.jar classes.dex
#!/bin/bash
#
# Copyright (C) 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Stop if something fails.
set -e
# The test relies on DEX file produced by javac+dx so keep building with them for now
# (see b/19467889)
mkdir classes
${JAVAC} -d classes `find src -name '*.java'`
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex \
--dump-width=1000 ${DX_FLAGS} classes
zip $TEST_NAME.jar classes.dex
#!/bin/bash
#
# Copyright (C) 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Stop if something fails.
set -e
# The test relies on DEX file produced by javac+dx so keep building with them for now
# (see b/19467889)
mkdir classes
${JAVAC} -d classes `find src -name '*.java'`
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex \
--dump-width=1000 ${DX_FLAGS} classes
zip $TEST_NAME.jar classes.dex
......@@ -25,4 +25,12 @@ ${JAVAC} -d classes `find src -name '*.java'`
# ...but not at run time.
rm 'classes/android/test/anno/MissingAnnotation.class'
rm 'classes/android/test/anno/ClassWithInnerAnnotationClass$MissingInnerAnnotationClass.class'
${DX} -JXmx256m --debug --dex --output=$TEST_NAME.jar classes
if [ ${USE_JACK} = "true" ]; then
${JILL} classes --output classes.jack
${JACK} --import classes.jack --output-dex .
else
${DX} -JXmx256m --debug --dex --output=classes.dex classes
fi
zip $TEST_NAME.jar classes.dex
......@@ -19,5 +19,11 @@ set -e
# Use classes that are compiled with ecj that exposes an invokeinterface
# issue when interfaces override methods in Object
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes
if [ ${USE_JACK} = "true" ]; then
${JILL} classes --output classes.jack
${JACK} --import classes.jack --output-dex .
else
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes
fi
zip $TEST_NAME.jar classes.dex
......@@ -21,8 +21,14 @@ set -e
gcc -Wall -Werror -o iface-gen iface-gen.c
./iface-gen
mkdir classes
${JAVAC} -d classes src/*.java
if [ ${USE_JACK} = "true" ]; then
${JACK} --output-dex . src
else
mkdir classes
${JAVAC} -d classes src/*.java
# dx needs more memory for that test so do not pass Xmx option here.
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes
fi
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes
zip $TEST_NAME.jar classes.dex
......@@ -89,10 +89,15 @@ public class Main {
return s[0];
}
private static void printWeakReference(WeakReference<FinalizerTest> wimp) {
// Reference ft so we are sure the WeakReference cannot be cleared.
FinalizerTest keepLive = wimp.get();
System.out.println("wimp: " + wimpString(wimp));
}
public static void main(String[] args) {
WeakReference<FinalizerTest> wimp = makeRef();
System.out.println("wimp: " + wimpString(wimp));
printWeakReference(wimp);
/* this will try to collect and finalize ft */
System.out.println("gc");
......
......@@ -39,8 +39,13 @@ function writeFile(name, start, end) {
printf("}\n") > fileName;
}'
mkdir classes
${JAVAC} -d classes src/*.java
if [ ${USE_JACK} = "true" ]; then
${JACK} --output-dex . src
else
mkdir classes
${JAVAC} -d classes src/*.java
${DX} -JXmx500m --debug --dex --no-optimize --positions=none --no-locals --output=classes.dex classes
fi
${DX} -JXmx500m --debug --dex --no-optimize --positions=none --no-locals --output=classes.dex classes
zip $TEST_NAME.jar classes.dex
......@@ -218,17 +218,7 @@ class Deep extends Thread {
return;
}
/*
* Check the results of the last trip through. Everything in
* "weak" should be matched in "strong", and the two should be
* equivalent (object-wise, not just string-equality-wise).
*/
for (int i = 0; i < MAX_DEPTH; i++) {
if (strong[i] != weak[i].get()) {
System.err.println("Deep: " + i + " strong=" + strong[i] +
", weak=" + weak[i].get());
}
}
checkStringReferences();
/*
* Wipe "strong", do a GC, see if "weak" got collected.
......@@ -248,6 +238,26 @@ class Deep extends Thread {
System.out.println("Deep: iters=" + iter / MAX_DEPTH);
}
/**
* Check the results of the last trip through. Everything in
* "weak" should be matched in "strong", and the two should be
* equivalent (object-wise, not just string-equality-wise).
*
* We do that check in a separate method to avoid retaining these
* String references in local DEX registers. In interpreter mode,
* they would retain these references until the end of the method
* or until they are updated to another value.
*/
private static void checkStringReferences() {
for (int i = 0; i < MAX_DEPTH; i++) {
if (strong[i] != weak[i].get()) {
System.err.println("Deep: " + i + " strong=" + strong[i] +
", weak=" + weak[i].get());
}
}
}
/**
* Recursively dive down, setting one or more local variables.
*
......
......@@ -22,7 +22,12 @@ set -e
mkdir classes
${JAVAC} -source 1.4 -target 1.4 -d classes `find src -name '*.java'`
# Suppress stderr to keep the inner class warnings out of the expected output.
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex --dump-width=1000 classes 2>/dev/null
if [ ${USE_JACK} = "true" ]; then
${JILL} classes --output classes.jack
${JACK} --import classes.jack --output-dex .
else
# Suppress stderr to keep the inner class warnings out of the expected output.
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex --dump-width=1000 classes 2>/dev/null
fi
zip $TEST_NAME.jar classes.dex
......@@ -43,7 +43,8 @@ function writeFileMethod(name) {
printf("}\n") > fileName;
}'
# The test relies on the error message produced by dx, not jack, so keep building with dx for now
# (b/19467889).
mkdir classes
${JAVAC} -d classes `find src -name '*.java'`
${DX} -JXmx1024m --dex --no-optimize classes
......@@ -18,8 +18,19 @@
set -e
mkdir classes
${JAVAC} -d classes src/*.java
${JASMIN} -d classes src/*.j
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes
if [ ${USE_JACK} = "true" ]; then
${JACK} --output-jack src.jack src
${JASMIN} -d classes src/*.j
${JILL} classes --output jasmin.jack
# We set jack.import.type.policy=keep-first to consider class definitions from jasmin first.
${JACK} --import jasmin.jack --import src.jack -D jack.import.type.policy=keep-first --output-dex .
else
${JAVAC} -d classes src/*.java
${JASMIN} -d classes src/*.j
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes
fi
zip $TEST_NAME.jar classes.dex
......@@ -21,5 +21,10 @@ mkdir classes
${JAVAC} -d classes `find src -name '*.java'`
rm classes/TestException.class
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex classes
if [ ${USE_JACK} = "true" ]; then
${JILL} classes --output classes.jack
${JACK} --import classes.jack --output-dex .
else
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex classes
fi
zip $TEST_NAME.jar classes.dex
......@@ -17,16 +17,32 @@
# Stop if something fails.
set -e
mkdir classes
# All except Main
mkdir classes
${JAVAC} -d classes `find src -name '*.java'`
rm classes/Main.class
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex classes
# Only Main
${JAVAC} -d classes `find src -name '*.java'`
rm classes/Second.class classes/FillerA.class classes/FillerB.class classes/Inf*.class
${DX} -JXmx256m --debug --dex --dump-to=classes2.lst --output=classes2.dex classes
mkdir classes2
${JAVAC} -d classes2 `find src -name '*.java'`
rm classes2/Second.class classes2/FillerA.class classes2/FillerB.class classes2/Inf*.class
if [ ${USE_JACK} = "true" ]; then
# Create .jack files from classes generated with javac.
${JILL} classes --output classes.jack
${JILL} classes2 --output classes2.jack
# Create DEX files from .jack files.
${JACK} --import classes.jack --output-dex .
mv classes.dex classes-1.dex
${JACK} --import classes2.jack --output-dex .
mv classes.dex classes2.dex
mv classes-1.dex classes.dex
else
# All except Main
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex classes
# Only Main
${DX} -JXmx256m --debug --dex --dump-to=classes2.lst --output=classes2.dex classes2
fi
zip $TEST_NAME.jar classes.dex classes2.dex
......@@ -53,20 +53,21 @@ public class Main implements Runnable {
}
// Allocate objects to definitely run GC before quitting.
ArrayList<Object> l = new ArrayList<Object>();
try {
for (int i = 0; i < 100000; i++) {
l.add(new ArrayList<Object>(i));
}
} catch (OutOfMemoryError oom) {
}
// Make the (outer) ArrayList unreachable. Note it may still
// be reachable under an interpreter or a compiler without a
// liveness analysis.
l = null;
allocateObjectsToRunGc();
new ArrayList<Object>(50);
}
private static void allocateObjectsToRunGc() {
ArrayList<Object> l = new ArrayList<Object>();
try {
for (int i = 0; i < 100000; i++) {
l.add(new ArrayList<Object>(i));
}
} catch (OutOfMemoryError oom) {
}
}
private Main(CyclicBarrier startBarrier) {
this.startBarrier = startBarrier;
}
......
......@@ -30,5 +30,11 @@ set -e
# mv NonInf.out classes/NonInf.class
# mv Main.class A.class A\$B.class A\$C.class classes/
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes
if [ ${USE_JACK} = "true" ]; then
${JILL} classes --output classes.jack
# Workaround b/19561685: disable sanity checks to produce a DEX file with invalid modifiers.
${JACK} --sanity-checks off --import classes.jack --output-dex .
else
${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes
fi
zip $TEST_NAME.jar classes.dex
......@@ -25,4 +25,11 @@ ${JAVAC} -d classes `find src -name '*.java'`
# ...but not at run time.
rm 'classes/MissingClass.class'
rm 'classes/Main$MissingInnerClass.class'
${DX} -JXmx256m --debug --dex --output=$TEST_NAME.jar classes
if [ ${USE_JACK} = "true" ]; then
${JILL} classes --output classes.jack
${JACK} --import classes.jack --output-dex .
else
${DX} -JXmx256m --debug --dex --output=classes.dex classes
fi
zip $TEST_NAME.jar classes.dex
......@@ -17,16 +17,32 @@
# Stop if something fails.
set -e
# All except MirandaInterface
mkdir classes
# All except Main
${JAVAC} -d classes `find src -name '*.java'`
rm classes/MirandaInterface.class
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex classes
# Only Main
${JAVAC} -d classes `find src -name '*.java'`
rm classes/Main.class classes/MirandaAbstract.class classes/MirandaClass*.class classes/MirandaInterface2*.class
${DX} -JXmx256m --debug --dex --dump-to=classes2.lst --output=classes2.dex classes
# Only MirandaInterface
mkdir classes2
${JAVAC} -d classes2 `find src -name '*.java'`
rm classes2/Main.class classes2/MirandaAbstract.class classes2/MirandaClass*.class classes2/MirandaInterface2*.class
if [ ${USE_JACK} = "true" ]; then
# Create .jack files from classes generated with javac.
${JILL} classes --output classes.jack
${JILL} classes2 --output classes2.jack
# Create DEX files from .jack files.
${JACK} --import classes.jack --output-dex .
mv classes.dex classes-1.dex
${JACK} --import classes2.jack --output-dex .
mv classes.dex classes2.dex
mv classes-1.dex classes.dex
else
# All except Main
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex classes
# Only Main
${DX} -JXmx256m --debug --dex --dump-to=classes2.lst --output=classes2.dex classes2
fi
zip $TEST_NAME.jar classes.dex classes2.dex
......@@ -23,9 +23,21 @@ ${JAVAC} -d classes `find src -name '*.java'`
mkdir classes-ex
mv classes/Super.class classes-ex
if [ ${NEED_DEX} = "true" ]; then
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex --dump-width=1000 classes
if [ ${USE_JACK} = "true" ]; then
# Create .jack files from classes generated with javac.
${JILL} classes --output classes.jack
${JILL} classes-ex --output classes-ex.jack
# Create DEX files from .jack files.
${JACK} --import classes.jack --output-dex .
zip $TEST_NAME.jar classes.dex
${DX} -JXmx256m --debug --dex --dump-to=classes-ex.lst --output=classes.dex --dump-width=1000 classes-ex
${JACK} --import classes-ex.jack --output-dex .
zip ${TEST_NAME}-ex.jar classes.dex
else
if [ ${NEED_DEX} = "true" ]; then
${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex --dump-width=1000 classes
zip $TEST_NAME.jar classes.dex
${DX} -JXmx256m --debug --dex --dump-to=classes-ex.lst --output=classes.dex --dump-width=1000 classes-ex
zip ${TEST_NAME}-ex.jar classes.dex
fi
fi
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment