summaryrefslogtreecommitdiffstats
path: root/jack
diff options
context:
space:
mode:
authormikaelpeltier <mikaelpeltier@google.com>2014-07-03 15:23:55 +0200
committermikaelpeltier <mikaelpeltier@google.com>2014-07-28 13:28:24 +0200
commitf03975dc15719d32dd4476df3d6ea7cf64d5e145 (patch)
treec0c75b66a95f35d415aab34bf22e88daef601af8 /jack
parent1b72fd1b00bb5fcecf1b6b0c2a779d8a5d2b4747 (diff)
downloadtoolchain_jack-f03975dc15719d32dd4476df3d6ea7cf64d5e145.tar.gz
toolchain_jack-f03975dc15719d32dd4476df3d6ea7cf64d5e145.tar.bz2
toolchain_jack-f03975dc15719d32dd4476df3d6ea7cf64d5e145.zip
Add options to enable incremental support
- It is required to remove an hack on configuration which does not work since output dex file was deleted after each compilation. Problem appears because there was two calls to checkValidity method of options. (cherry picked from commit c07d64dcaf10d2684ed9fbb42677cd9e02aae998) Conflicts: jack/src/com/android/jack/experimental/incremental/JackIncremental.java Change-Id: I0e1eff015bf739bcded429a2619bce1aad69d0b3
Diffstat (limited to 'jack')
-rw-r--r--jack/src/com/android/jack/Options.java20
-rw-r--r--jack/src/com/android/jack/experimental/incremental/CompilerState.java21
-rw-r--r--jack/src/com/android/jack/experimental/incremental/JackIncremental.java37
-rw-r--r--jack/tests/com/android/jack/experimental/incremental/DependenciesTest009.java2
-rw-r--r--jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java22
5 files changed, 54 insertions, 48 deletions
diff --git a/jack/src/com/android/jack/Options.java b/jack/src/com/android/jack/Options.java
index 5dd65259..b4ae1360 100644
--- a/jack/src/com/android/jack/Options.java
+++ b/jack/src/com/android/jack/Options.java
@@ -19,6 +19,7 @@ package com.android.jack;
import com.android.jack.backend.dex.FieldInitializerRemover;
import com.android.jack.backend.dex.rop.CodeItemBuilder;
import com.android.jack.config.id.JavaVersionPropertyId;
+import com.android.jack.experimental.incremental.JackIncremental;
import com.android.jack.ir.ast.JMethod;
import com.android.jack.shrob.obfuscation.MappingPrinter;
import com.android.jack.shrob.obfuscation.NameProviderFactory;
@@ -190,6 +191,10 @@ public class Options {
metaVar = "[error | warning | info | debug | trace]")
protected VerbosityLevel verbose = VerbosityLevel.WARNING;
+ @Option(name = "--incremental-folder",
+ usage = "Folder used for incremental data", metaVar = "FILE")
+ protected File incrementalFolder = null;
+
@Option(name = "-o", aliases = "--output",
usage = "output to this dex file (default: ./classes.dex)", metaVar = "FILE")
protected File out = new File("./classes.dex");
@@ -581,6 +586,12 @@ public class Options {
configBuilder.set(
FieldInitializerRemover.STRING_AS_INITIALVALUE_OF_OBJECT, !runtimeLegacy);
+ if (incrementalFolder != null) {
+ configBuilder.set(JackIncremental.GENERATE_COMPILER_STATE, true);
+ configBuilder.setString(JackIncremental.COMPILER_STATE_OUTPUT_DIR,
+ incrementalFolder.getAbsolutePath());
+ }
+
if (tracerDir != null) {
configBuilder.setString(TracerFactory.TRACER, "html");
configBuilder.setString(StatsTracerFtl.TRACER_DIR, tracerDir.getAbsolutePath());
@@ -760,4 +771,13 @@ public class Options {
public List<File> getJayceImport() {
return jayceImport;
}
+
+ @CheckForNull
+ public File getIncrementalFolder() {
+ return incrementalFolder;
+ }
+
+ public void setIncrementalFolder(@Nonnull File incrementalFolder) {
+ this.incrementalFolder = incrementalFolder;
+ }
}
diff --git a/jack/src/com/android/jack/experimental/incremental/CompilerState.java b/jack/src/com/android/jack/experimental/incremental/CompilerState.java
index 225560ff..f2229f81 100644
--- a/jack/src/com/android/jack/experimental/incremental/CompilerState.java
+++ b/jack/src/com/android/jack/experimental/incremental/CompilerState.java
@@ -21,7 +21,9 @@ import com.android.jack.util.TextUtils;
import com.android.sched.item.Description;
import com.android.sched.item.Name;
import com.android.sched.item.Tag;
-import com.android.sched.util.file.Directory;
+import com.android.sched.vfs.OutputVDir;
+import com.android.sched.vfs.OutputVFile;
+import com.android.sched.vfs.VPath;
import java.io.BufferedReader;
import java.io.File;
@@ -72,8 +74,8 @@ public final class CompilerState {
@Nonnull
private final File compilerStateFile;
- public CompilerState(@Nonnull Directory directory) {
- compilerStateFile = new File(directory.getFile(), COMPILER_STATE_FILENAME);
+ public CompilerState(@Nonnull File incrementalFolder) {
+ compilerStateFile = new File(incrementalFolder, COMPILER_STATE_FILENAME);
}
@Nonnull
@@ -125,11 +127,12 @@ public final class CompilerState {
return compilerStateFile.exists();
}
- public void write(@Nonnull Directory directory) throws JackIOException {
- File compilerStateFile = new File(directory.getFile(), COMPILER_STATE_FILENAME);
+ public void write(@Nonnull OutputVDir outputVDir) throws JackIOException {
PrintStream ps = null;
try {
+ OutputVFile compilerStateFile =
+ outputVDir.createOutputVFile(new VPath(COMPILER_STATE_FILENAME, '/'));
StringBuffer sb = new StringBuffer();
writeMap(sb, javaFileToTypeNamePath);
@@ -137,12 +140,14 @@ public final class CompilerState {
writeMap(sb, cstFileToUsedFiles);
writeMap(sb, structFileToUsedFiles);
- ps = new PrintStream(compilerStateFile);
+ ps = new PrintStream(compilerStateFile.openWrite());
ps.print(sb.toString());
-
} catch (FileNotFoundException e) {
throw new JackIOException("Could not write compiler state file to output '"
- + compilerStateFile.getAbsolutePath() + "'", e);
+ + compilerStateFile + "'", e);
+ } catch (IOException e) {
+ throw new JackIOException("Could not write compiler state file to output '"
+ + compilerStateFile + "'", e);
} finally {
if (ps != null) {
ps.close();
diff --git a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java
index 157863db..e13e35e6 100644
--- a/jack/src/com/android/jack/experimental/incremental/JackIncremental.java
+++ b/jack/src/com/android/jack/experimental/incremental/JackIncremental.java
@@ -31,19 +31,17 @@ import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter;
import com.android.jack.ir.formatter.TypeFormatter;
import com.android.jack.load.JackLoadingException;
import com.android.jack.util.TextUtils;
-import com.android.sched.util.RunnableHooks;
import com.android.sched.util.UnrecoverableException;
-import com.android.sched.util.codec.DirectoryCodec;
+import com.android.sched.util.codec.OutputVDirCodec;
import com.android.sched.util.config.ChainedException;
import com.android.sched.util.config.ConfigurationException;
import com.android.sched.util.config.HasKeyId;
-import com.android.sched.util.config.ThreadConfig;
import com.android.sched.util.config.id.BooleanPropertyId;
import com.android.sched.util.config.id.PropertyId;
-import com.android.sched.util.file.Directory;
import com.android.sched.util.file.FileOrDirectory.Existence;
-import com.android.sched.util.file.FileOrDirectory.Permission;
import com.android.sched.util.log.LoggerFactory;
+import com.android.sched.vfs.Container;
+import com.android.sched.vfs.OutputVDir;
import com.android.sched.vfs.VPath;
import java.io.File;
@@ -73,10 +71,10 @@ public class JackIncremental extends CommandLine {
Boolean.FALSE);
@Nonnull
- public static final PropertyId<Directory> COMPILER_STATE_OUTPUT_DIR = PropertyId.create(
+ public static final PropertyId<OutputVDir> COMPILER_STATE_OUTPUT_DIR = PropertyId.create(
"jack.experimental.compilerstate.output.dir", "Compiler state output folder",
- new DirectoryCodec(Existence.MUST_EXIST, Permission.READ | Permission.WRITE))
- .requiredIf(GENERATE_COMPILER_STATE.getValue().isTrue());
+ new OutputVDirCodec(Existence.MAY_EXIST, Container.DIR)).requiredIf(
+ GENERATE_COMPILER_STATE.getValue().isTrue());
@CheckForNull
private static CompilerState compilerState = null;
@@ -161,19 +159,12 @@ public class JackIncremental extends CommandLine {
public static void run(@Nonnull Options options) throws ConfigurationException,
IllegalOptionsException, NothingToDoException, JackUserException {
- RunnableHooks hooks = new RunnableHooks();
- List<String> ecjArgsSave = new ArrayList<String>(options.getEcjArguments());
- options.checkValidity(hooks);
- if (!ecjArgsSave.isEmpty()) {
- options.setEcjArguments(ecjArgsSave);
- }
- ThreadConfig.setConfig(options.getConfig());
+ File incrementalFolder = options.getIncrementalFolder();
+ assert incrementalFolder != null;
- dexFilesFolder = new File(ThreadConfig.get(
- JackIncremental.COMPILER_STATE_OUTPUT_DIR).getFile(), "dexFiles");
+ dexFilesFolder = new File(incrementalFolder, "dexFiles");
- jackFilesFolder = new File(ThreadConfig.get(
- JackIncremental.COMPILER_STATE_OUTPUT_DIR).getFile(), "jackFiles");
+ jackFilesFolder = new File(incrementalFolder, "jackFiles");
// Add options to control incremental support
options.addProperty(Options.GENERATE_ONE_DEX_PER_TYPE.getName(), "true");
@@ -184,7 +175,7 @@ public class JackIncremental extends CommandLine {
assert jackFilesFolder != null;
options.addProperty(Options.JACK_FILE_OUTPUT_DIR.getName(), jackFilesFolder.getAbsolutePath());
- compilerState = new CompilerState(ThreadConfig.get(JackIncremental.COMPILER_STATE_OUTPUT_DIR));
+ compilerState = new CompilerState(incrementalFolder);
if (isIncrementalCompilation(options)) {
logger.log(Level.INFO, "Incremental compilation");
@@ -203,14 +194,12 @@ public class JackIncremental extends CommandLine {
if (!filesToRecompile.isEmpty()) {
logger.log(Level.INFO, "{0} Files to recompile {1}",
new Object[] {Integer.valueOf(filesToRecompile.size()), filesToRecompile});
-
updateOptions(options, filesToRecompile);
- logger.log(Level.INFO, "Update compiler state");
getCompilerState().updateCompilerState(filesToRecompile);
- logger.log(Level.INFO, "Generate {0}", options.getOutputFile());
logger.log(Level.INFO, "Ecj options {0}", options.getEcjArguments());
+
Jack.run(options);
} else {
logger.log(Level.INFO, "No files to recompile");
@@ -441,8 +430,6 @@ public class JackIncremental extends CommandLine {
private static boolean isIncrementalCompilation(@Nonnull Options options) {
if (!options.getEcjArguments().isEmpty()
- && ThreadConfig.get(Options.GENERATE_DEX_FILE).booleanValue()
- && ThreadConfig.get(JackIncremental.GENERATE_COMPILER_STATE).booleanValue()
&& getCompilerState().exists()) {
return true;
}
diff --git a/jack/tests/com/android/jack/experimental/incremental/DependenciesTest009.java b/jack/tests/com/android/jack/experimental/incremental/DependenciesTest009.java
index aec446f5..a736e419 100644
--- a/jack/tests/com/android/jack/experimental/incremental/DependenciesTest009.java
+++ b/jack/tests/com/android/jack/experimental/incremental/DependenciesTest009.java
@@ -57,7 +57,7 @@ public class DependenciesTest009 {
ite.incrementalBuildFromFolder();
- CompilerState csm = new CompilerState(ite.getCompilerStateDirectory());
+ CompilerState csm = new CompilerState(ite.getCompilerStateFolder());
csm.read();
Map<String, Set<String>> dependencies1 = csm.computeDependencies();
diff --git a/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java b/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java
index b344bc16..808307b4 100644
--- a/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java
+++ b/jack/tests/com/android/jack/experimental/incremental/IncrementalTestingEnvironment.java
@@ -21,10 +21,6 @@ import com.android.jack.TestTools;
import com.android.jack.backend.jayce.JayceFileImporter;
import com.android.jack.util.ExecuteFile;
import com.android.jack.util.NamingTools;
-import com.android.sched.util.file.Directory;
-import com.android.sched.util.file.FileOrDirectory.ChangePermission;
-import com.android.sched.util.file.FileOrDirectory.Existence;
-import com.android.sched.util.file.FileOrDirectory.Permission;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -57,7 +53,7 @@ public class IncrementalTestingEnvironment extends TestTools {
PrintStream outRedirectStream = null;
@Nonnull
- private final Directory compilerStateDir;
+ private final File compilerStateDir;
@Nonnull
private final File testingFolder;
@@ -83,11 +79,11 @@ public class IncrementalTestingEnvironment extends TestTools {
throw new IOException("Failed to create folder " + this.sourceFolder.getAbsolutePath());
}
dexFile = new File(testingFolder, "result.dex");
- compilerStateDir =
- new Directory(testingFolder.getAbsolutePath() + File.separatorChar + "compilerState",
- null, Existence.MAY_EXIST, Permission.READ | Permission.WRITE,
- ChangePermission.NOCHANGE);
- jackFolder = new File(compilerStateDir.getFile(), "jackFiles");
+ compilerStateDir = new File(testingFolder, "compileState");
+ if (!compilerStateDir.exists() && !compilerStateDir.mkdir()) {
+ throw new IOException("Failed to create folder " + compilerStateDir.getAbsolutePath());
+ }
+ jackFolder = new File(compilerStateDir, "jackFiles");
}
public void addJavaFile(@Nonnull String packageName, @Nonnull String fileName,
@@ -126,7 +122,7 @@ public class IncrementalTestingEnvironment extends TestTools {
}
@Nonnull
- public Directory getCompilerStateDirectory() {
+ public File getCompilerStateFolder() {
return compilerStateDir;
}
@@ -135,9 +131,7 @@ public class IncrementalTestingEnvironment extends TestTools {
startErrRedirection();
Options options = TestTools.buildCommandLineArgs(testingFolder);
- options.addProperty(JackIncremental.GENERATE_COMPILER_STATE.getName(), "true");
- options.addProperty(JackIncremental.COMPILER_STATE_OUTPUT_DIR.getName(), getCompilerStateDirectory()
- .getFile().getAbsolutePath());
+ options.setIncrementalFolder(getCompilerStateFolder());
compileSourceToDex(options, sourceFolder,
TestTools.getClasspathAsString(TestTools.getDefaultBootclasspath()), dexFile);