aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Gavrilovic <gavra@google.com>2017-07-14 09:25:44 +0100
committerIvan Gavrilovic <gavra@google.com>2017-07-14 09:51:24 +0100
commit02cc4ebce7deb01a5509624f70e7d667d5f4e2c8 (patch)
tree12138df73467b1f4d8f1a7ab98e9994e21f525bc
parent6c2225731a2b111cb48de651edda6bd3ece0f053 (diff)
downloadr8-02cc4ebce7deb01a5509624f70e7d667d5f4e2c8.tar.gz
Fix max number of entries in single dex
Maximum allowed number of entries is 64k, so any index from 0 to 0xFFFF is allowed. Test: CompatDxTests Change-Id: If851db78416ed8caccfdf3eedae4427a861b7e67
-rw-r--r--src/main/java/com/android/tools/r8/dex/VirtualFile.java2
-rw-r--r--src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java3
-rw-r--r--src/test/java/com/android/tools/r8/compatdx/CompatDxTests.java13
3 files changed, 15 insertions, 3 deletions
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index 0e89d4a10..f336a3d2d 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -67,7 +67,7 @@ public class VirtualFile {
// TODO(sgjesse): Does "minimal main dex" combined with "leave space for growth" make sense?
}
- private static final int MAX_ENTRIES = (Short.MAX_VALUE << 1) + 1;
+ private static final int MAX_ENTRIES = Constants.U16BIT_MAX + 1;
/**
* When distributing classes across files we aim to leave some space. The amount of space left is
* driven by this constant.
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
index 7dab70aff..74a08003e 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -88,7 +88,7 @@ public class ObjectToOffsetMapping {
private void setIndexes(IndexedDexItem[] items) {
int index = 0;
for (IndexedDexItem item : items) {
- item.assignVirtualFileIndex(virtualFileId, index++);
+ item.assignVirtualFileIndex(virtualFileId, index);
// For strings collect the first jumbo string (if any).
if (index > Constants.MAX_NON_JUMBO_INDEX) {
assert item instanceof DexString;
@@ -96,6 +96,7 @@ public class ObjectToOffsetMapping {
firstJumboString = (DexString) item;
}
}
+ index++;
}
}
diff --git a/src/test/java/com/android/tools/r8/compatdx/CompatDxTests.java b/src/test/java/com/android/tools/r8/compatdx/CompatDxTests.java
index b3d31c54c..5af5c0c1d 100644
--- a/src/test/java/com/android/tools/r8/compatdx/CompatDxTests.java
+++ b/src/test/java/com/android/tools/r8/compatdx/CompatDxTests.java
@@ -100,10 +100,21 @@ public class CompatDxTests {
}
@Test
+ public void singleDexProgramFull() throws IOException, ExecutionException {
+ // Generate an application that fills the whole dex file.
+ AndroidApp generated =
+ MainDexListTests.generateApplication(
+ ImmutableList.of("A"), Constants.ANDROID_L_API, Constants.U16BIT_MAX + 1);
+ Path applicationJar = temp.newFile("application.jar").toPath();
+ generated.write(applicationJar, OutputMode.Indexed);
+ runDexer(applicationJar.toString());
+ }
+
+ @Test
public void singleDexProgramIsTooLarge() throws IOException, ExecutionException {
// Generate an application that will not fit into a single dex file.
AndroidApp generated = MainDexListTests.generateApplication(
- ImmutableList.of("A", "B"), Constants.ANDROID_L_API, Constants.U16BIT_MAX / 2 + 1);
+ ImmutableList.of("A", "B"), Constants.ANDROID_L_API, Constants.U16BIT_MAX / 2 + 2);
Path applicationJar = temp.newFile("application.jar").toPath();
generated.write(applicationJar, OutputMode.Indexed);
thrown.expect(CompilationError.class);