OSDN Git Service

resolved conflicts for merge of 57a76b06 to master
authorElliott Hughes <enh@google.com>
Wed, 7 Nov 2012 04:33:51 +0000 (20:33 -0800)
committerElliott Hughes <enh@google.com>
Wed, 7 Nov 2012 04:33:51 +0000 (20:33 -0800)
Change-Id: If29e5cb05954bf55a24475c249558a8d5a1c391f

dx/junit-tests/Android.mk
dx/src/com/android/dx/command/Main.java
dx/src/com/android/dx/command/dexer/Main.java
dx/src/com/android/dx/dex/DexOptions.java
dx/src/com/android/dx/dex/code/OutputFinisher.java
dx/src/com/android/dx/merge/InstructionTransformer.java
vm/Android.mk

index 3f2c611..ee5e31b 100644 (file)
@@ -4,6 +4,5 @@ LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 LOCAL_JAVA_LIBRARIES := dx junit
-LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE:= dx-tests
 include $(BUILD_HOST_JAVA_LIBRARY)
index 10a1179..6540e35 100644 (file)
@@ -33,7 +33,7 @@ public class Main {
         "[--dump-width=<n>]\n" +
         "  [--dump-method=<name>[*]] [--verbose-dump] [--no-files] " +
         "[--core-library]\n" +
-        "  [--num-threads=<n>]\n" +
+        "  [--num-threads=<n>] [--incremental] [--force-jumbo]\n" +
         "  [<file>.class | <file>.{zip,jar,apk} | <directory>] ...\n" +
         "    Convert a set of classfiles into a dex file, optionally " +
         "embedded in a\n" +
index 80ddbd0..87f152a 100644 (file)
@@ -934,6 +934,10 @@ public class Main {
         /** whether to merge with the output dex file if it exists. */
         public boolean incremental = false;
 
+        /** whether to force generation of const-string/jumbo for all indexes,
+         *  to allow merges between dex files with many strings. */
+        public boolean forceJumbo = false;
+
         /** {@code non-null} after {@link #parse}; file name arguments */
         public String[] fileNames;
 
@@ -1140,6 +1144,8 @@ public class Main {
                     numThreads = Integer.parseInt(parser.getLastValue());
                 } else if (parser.isArg("--incremental")) {
                     incremental = true;
+                } else if (parser.isArg("--force-jumbo")) {
+                    forceJumbo = true;
                 } else {
                     System.err.println("unknown option: " + parser.getCurrent());
                     throw new UsageException();
@@ -1180,6 +1186,7 @@ public class Main {
 
             dexOptions = new DexOptions();
             dexOptions.targetApiLevel = targetApiLevel;
+            dexOptions.forceJumbo = forceJumbo;
         }
     }
 
index 0357384..0a07451 100644 (file)
@@ -23,6 +23,9 @@ public class DexOptions {
     /** target API level */
     public int targetApiLevel = DexFormat.API_NO_EXTENDED_OPCODES;
 
+    /** force generation of jumbo opcodes */
+    public boolean forceJumbo = false;
+
     /**
      * Gets the dex file magic number corresponding to this instance.
      */
index 3602de8..c9387fa 100644 (file)
@@ -504,7 +504,14 @@ public final class OutputFinisher {
 
         while (guess != null) {
             if (guess.getFormat().isCompatible(insn)) {
-                break;
+                /*
+                 * Don't break out for const_string to generate jumbo version
+                 * when option is enabled.
+                 */
+                if (!dexOptions.forceJumbo ||
+                    guess.getOpcode() != Opcodes.CONST_STRING) {
+                    break;
+                }
             }
 
             guess = Dops.getNextOrNull(guess, dexOptions);
index 62c3a49..6051e17 100644 (file)
@@ -17,6 +17,7 @@
 package com.android.dx.merge;
 
 import com.android.dx.io.CodeReader;
+import com.android.dx.io.Opcodes;
 import com.android.dx.io.instructions.DecodedInstruction;
 import com.android.dx.io.instructions.ShortArrayCodeOutput;
 import com.android.dx.util.DexException;
@@ -66,7 +67,8 @@ final class InstructionTransformer {
         public void visit(DecodedInstruction[] all, DecodedInstruction one) {
             int stringId = one.getIndex();
             int mappedId = indexMap.adjustString(stringId);
-            jumboCheck(stringId, mappedId);
+            boolean isJumbo = (one.getOpcode() == Opcodes.CONST_STRING_JUMBO);
+            jumboCheck(isJumbo, mappedId);
             mappedInstructions[mappedAt++] = one.withIndex(mappedId);
         }
     }
@@ -75,7 +77,8 @@ final class InstructionTransformer {
         public void visit(DecodedInstruction[] all, DecodedInstruction one) {
             int fieldId = one.getIndex();
             int mappedId = indexMap.adjustField(fieldId);
-            jumboCheck(fieldId, mappedId);
+            boolean isJumbo = (one.getOpcode() == Opcodes.CONST_STRING_JUMBO);
+            jumboCheck(isJumbo, mappedId);
             mappedInstructions[mappedAt++] = one.withIndex(mappedId);
         }
     }
@@ -84,7 +87,8 @@ final class InstructionTransformer {
         public void visit(DecodedInstruction[] all, DecodedInstruction one) {
             int typeId = one.getIndex();
             int mappedId = indexMap.adjustType(typeId);
-            jumboCheck(typeId, mappedId);
+            boolean isJumbo = (one.getOpcode() == Opcodes.CONST_STRING_JUMBO);
+            jumboCheck(isJumbo, mappedId);
             mappedInstructions[mappedAt++] = one.withIndex(mappedId);
         }
     }
@@ -93,14 +97,16 @@ final class InstructionTransformer {
         public void visit(DecodedInstruction[] all, DecodedInstruction one) {
             int methodId = one.getIndex();
             int mappedId = indexMap.adjustMethod(methodId);
-            jumboCheck(methodId, mappedId);
+            boolean isJumbo = (one.getOpcode() == Opcodes.CONST_STRING_JUMBO);
+            jumboCheck(isJumbo, mappedId);
             mappedInstructions[mappedAt++] = one.withIndex(mappedId);
         }
     }
 
-    private static void jumboCheck(int oldIndex, int newIndex) {
-        if ((oldIndex <= 0xffff) && (newIndex > 0xffff)) {
-            throw new DexException("Cannot handle conversion to jumbo index!");
+    private static void jumboCheck(boolean isJumbo, int newIndex) {
+        if (!isJumbo && (newIndex > 0xffff)) {
+            throw new DexException("Cannot merge new index " + newIndex +
+                                   " into a non-jumbo instruction!");
         }
     }
 }
index 3c1c669..c9b510b 100644 (file)
@@ -55,6 +55,9 @@ ifneq ($(strip $(WITH_ADDRESS_SANITIZER)),)
     LOCAL_CFLAGS := $(filter-out $(CLANG_CONFIG_UNKNOWN_CFLAGS),$(LOCAL_CFLAGS))
 endif
 
+# TODO: split out the asflags.
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
+
 include $(BUILD_SHARED_LIBRARY)
 
 # Derivation #1
@@ -62,6 +65,8 @@ include $(BUILD_SHARED_LIBRARY)
 include $(LOCAL_PATH)/ReconfigureDvm.mk
 LOCAL_CFLAGS += -UNDEBUG -DDEBUG=1 -DLOG_NDEBUG=1 -DWITH_DALVIK_ASSERT \
                 -DWITH_JIT_TUNING $(target_smp_flag)
+# TODO: split out the asflags.
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
 LOCAL_MODULE := libdvm_assert
 include $(BUILD_SHARED_LIBRARY)
 
@@ -72,6 +77,8 @@ ifneq ($(dvm_arch),mips)    # MIPS support for self-verification is incomplete
     include $(LOCAL_PATH)/ReconfigureDvm.mk
     LOCAL_CFLAGS += -UNDEBUG -DDEBUG=1 -DLOG_NDEBUG=1 -DWITH_DALVIK_ASSERT \
                     -DWITH_SELF_VERIFICATION $(target_smp_flag)
+    # TODO: split out the asflags.
+    LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
     LOCAL_MODULE := libdvm_sv
     include $(BUILD_SHARED_LIBRARY)
 
@@ -82,6 +89,8 @@ endif # dvm_arch!=mips
 WITH_JIT := false
 include $(LOCAL_PATH)/ReconfigureDvm.mk
 LOCAL_CFLAGS += $(target_smp_flag)
+# TODO: split out the asflags.
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
 LOCAL_MODULE := libdvm_interp
 include $(BUILD_SHARED_LIBRARY)
 
@@ -126,6 +135,8 @@ ifeq ($(WITH_HOST_DALVIK),true)
     endif
 
     LOCAL_CFLAGS += $(host_smp_flag)
+    # TODO: split out the asflags.
+    LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
     LOCAL_MODULE_TAGS := optional
     LOCAL_MODULE := libdvm