Add a non-moving option to dvmMalloc and make use of it.

At present, class objects, non-moving arrays, and interned strings have
location dependencies in native code.  Allocating non-moving is a no-op
for the present heap, but this option will have an effect after the
copying collector is integrated.

Change-Id: I674f83a086ac65db303baab0599831f80f52a4a5
diff --git a/vm/alloc/Alloc.h b/vm/alloc/Alloc.h
index 6637cd6..c215fc2 100644
--- a/vm/alloc/Alloc.h
+++ b/vm/alloc/Alloc.h
@@ -25,6 +25,7 @@
 enum {
     ALLOC_DEFAULT = 0x00,
     ALLOC_DONT_TRACK = 0x01,  /* don't add to internal tracking list */
+    ALLOC_NON_MOVING = 0x02,
 };
 
 /*
diff --git a/vm/native/dalvik_system_VMRuntime.cpp b/vm/native/dalvik_system_VMRuntime.cpp
index b704e3e..7345386 100644
--- a/vm/native/dalvik_system_VMRuntime.cpp
+++ b/vm/native/dalvik_system_VMRuntime.cpp
@@ -113,7 +113,7 @@
     ClassObject* arrayClass = dvmFindArrayClassForElement(elementClass);
     ArrayObject* newArray = dvmAllocArrayByClass(arrayClass,
                                                  length,
-                                                 ALLOC_DEFAULT);
+                                                 ALLOC_NON_MOVING);
     if (newArray == NULL) {
         assert(dvmCheckException(dvmThreadSelf()));
         RETURN_VOID();
diff --git a/vm/oo/Array.cpp b/vm/oo/Array.cpp
index e186edf..baf9d3c 100644
--- a/vm/oo/Array.cpp
+++ b/vm/oo/Array.cpp
@@ -363,7 +363,7 @@
      * Array classes are simple enough that we don't need to do a full
      * link step.
      */
-    newClass = (ClassObject*) dvmMalloc(sizeof(*newClass), ALLOC_DEFAULT);
+    newClass = (ClassObject*) dvmMalloc(sizeof(*newClass), ALLOC_NON_MOVING);
     if (newClass == NULL)
         return NULL;
     DVM_OBJECT_INIT(&newClass->obj, gDvm.classJavaLangClass);
diff --git a/vm/oo/Class.cpp b/vm/oo/Class.cpp
index 2311f8a..15511c2 100644
--- a/vm/oo/Class.cpp
+++ b/vm/oo/Class.cpp
@@ -341,7 +341,7 @@
     const char* descriptor = dexGetPrimitiveTypeDescriptor(primitiveType);
     assert(descriptor != NULL);
 
-    ClassObject* newClass = (ClassObject*) dvmMalloc(sizeof(*newClass), ALLOC_DEFAULT);
+    ClassObject* newClass = (ClassObject*) dvmMalloc(sizeof(*newClass), ALLOC_NON_MOVING);
     if (newClass == NULL) {
         return false;
     }
@@ -375,7 +375,7 @@
      * because it is an instance of itself.
      */
     ClassObject* clazz = (ClassObject*)
-        dvmMalloc(classObjectSize(CLASS_SFIELD_SLOTS), ALLOC_DEFAULT);
+        dvmMalloc(classObjectSize(CLASS_SFIELD_SLOTS), ALLOC_NON_MOVING);
     if (clazz == NULL) {
         return false;
     }
@@ -1766,7 +1766,7 @@
         newClass = gDvm.classJavaLangClass;
     } else {
         size_t size = classObjectSize(pHeader->staticFieldsSize);
-        newClass = (ClassObject*) dvmMalloc(size, ALLOC_DEFAULT);
+        newClass = (ClassObject*) dvmMalloc(size, ALLOC_NON_MOVING);
     }
     if (newClass == NULL)
         return NULL;
diff --git a/vm/reflect/Proxy.cpp b/vm/reflect/Proxy.cpp
index 59d3d47..6953930 100644
--- a/vm/reflect/Proxy.cpp
+++ b/vm/reflect/Proxy.cpp
@@ -105,7 +105,7 @@
     size_t newClassSize =
         sizeof(ClassObject) + kProxySFieldCount * sizeof(StaticField);
     ClassObject* newClass =
-        (ClassObject*) dvmMalloc(newClassSize, ALLOC_DEFAULT);
+        (ClassObject*) dvmMalloc(newClassSize, ALLOC_NON_MOVING);
     if (newClass == NULL)
         goto bail;
     DVM_OBJECT_INIT(&newClass->obj, gDvm.classJavaLangClass);