Created --runtime-arg switch for dex2oat to pass arguments to runtime.

This replaces the -Xms, -Xmx, and -verbose options.

Change-Id: Idc023b6d369bd8b5df932b9f2eb6dbc79d591ab1
diff --git a/build/Android.oat.mk b/build/Android.oat.mk
index 00aa8cf..50c05ab 100644
--- a/build/Android.oat.mk
+++ b/build/Android.oat.mk
@@ -49,12 +49,12 @@
 $(HOST_CORE_OAT): $(HOST_CORE_DEX) $(DEX2OAT_DEPENDENCY)
 	@echo "host dex2oat: $@ ($?)"
 	@mkdir -p $(dir $@)
-	$(hide) $(DEX2OAT) -Xms16m -Xmx16m $(addprefix --dex-file=,$(filter-out $(DEX2OAT),$^)) --oat=$@ --image=$(HOST_CORE_IMG) --base=$(IMG_HOST_BASE_ADDRESS)
+	$(hide) $(DEX2OAT) --runtime-arg -Xms16m --runtime-arg -Xmx16m $(addprefix --dex-file=,$(filter-out $(DEX2OAT),$^)) --oat=$@ --image=$(HOST_CORE_IMG) --base=$(IMG_HOST_BASE_ADDRESS)
 
 $(TARGET_CORE_OAT): $(TARGET_CORE_DEX) $(DEX2OAT_DEPENDENCY)
 	@echo "target dex2oat: $@ ($?)"
 	@mkdir -p $(dir $@)
-	$(hide) $(DEX2OAT) -Xms32m -Xmx32m $(addprefix --dex-file=,$(filter-out $(DEX2OAT),$^)) --oat=$@ --image=$(TARGET_CORE_IMG) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
+	$(hide) $(DEX2OAT) --runtime-arg -Xms32m --runtime-arg -Xmx32m $(addprefix --dex-file=,$(filter-out $(DEX2OAT),$^)) --oat=$@ --image=$(TARGET_CORE_IMG) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
 
 $(HOST_CORE_IMG): $(HOST_CORE_OAT)
 
@@ -70,6 +70,6 @@
 $(TARGET_BOOT_OAT): $(TARGET_BOOT_DEX) $(DEX2OAT_DEPENDENCY)
 	@echo "target dex2oat: $@ ($?)"
 	@mkdir -p $(dir $@)
-	$(hide) $(DEX2OAT) -Xms256m -Xmx256m $(addprefix --dex-file=,$(filter-out $(DEX2OAT),$^)) --oat=$@ --image=$(TARGET_BOOT_IMG) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
+	$(hide) $(DEX2OAT) --runtime-arg -Xms256m --runtime-arg -Xmx256m $(addprefix --dex-file=,$(filter-out $(DEX2OAT),$^)) --oat=$@ --image=$(TARGET_BOOT_IMG) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
 
 $(TARGET_BOOT_IMG): $(TARGET_BOOT_OAT)
diff --git a/build/Android.oattest.mk b/build/Android.oattest.mk
index 89cd906..7233f08 100644
--- a/build/Android.oattest.mk
+++ b/build/Android.oattest.mk
@@ -40,7 +40,7 @@
 define build-art-oat
 $(2): $(1) $(3) $(DEX2OAT_DEPENDENCY)
 	@echo "target dex2oat: $$@ ($$?)"
-	$(hide) $(DEX2OAT) -Xms16m -Xmx16m --boot-image=$(3) $(addprefix --dex-file=,$$<) --oat=$$@ --host-prefix=$(PRODUCT_OUT)
+	$(hide) $(DEX2OAT) --runtime-arg -Xms16m --runtime-arg -Xmx16m --boot-image=$(3) $(addprefix --dex-file=,$$<) --oat=$$@ --host-prefix=$(PRODUCT_OUT)
 endef
 
 ########################################################################
diff --git a/src/class_linker.cc b/src/class_linker.cc
index afb6721..7c07f00 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -567,8 +567,8 @@
 
     execl("/system/bin/dex2oatd",
           "/system/bin/dex2oatd",
-          "-Xms64m",
-          "-Xmx64m",
+          "--runtime-arg", "-Xms64m",
+          "--runtime-arg", "-Xmx64m",
           boot_image_option.c_str(),
           dex_file_option.c_str(),
           oat_file_option.c_str(),
diff --git a/src/dex2oat.cc b/src/dex2oat.cc
index 455b8b9..6a39241 100644
--- a/src/dex2oat.cc
+++ b/src/dex2oat.cc
@@ -52,14 +52,10 @@
           "      Example: --host-prefix=out/target/product/crespo\n"
           "\n");
   fprintf(stderr,
-          "  -Xms<n> may be used to specify an initial heap size for the runtime used to\n"
-          "      run dex2oat\n"
-          "      Example: -Xms256m\n"
-          "\n");
-  fprintf(stderr,
-          "  -Xmx<n> may be used to specify a maximum heap size for the runtime used to\n"
-          "      run dex2oat\n"
-          "      Example: -Xmx256m\n"
+          "  --runtime-arg <argument>: used to specify various arguments for the runtime,\n"
+          "      such as initial heap size, maximum heap size, and verbose output.\n"
+          "      Use a separate --runtime-arg switch for each argument.\n"
+          "      Example: --runtime-arg -Xms256m\n"
           "\n");
   exit(EXIT_FAILURE);
 }
@@ -81,9 +77,7 @@
   std::string boot_image_option;
   uintptr_t image_base = 0;
   std::string host_prefix;
-  const char* Xms = NULL;
-  const char* Xmx = NULL;
-  const char* verbose = NULL;
+  std::vector<const char*> runtime_args;
 
   for (int i = 0; i < argc; i++) {
     const StringPiece option(argv[i]);
@@ -113,12 +107,12 @@
       boot_image_option += boot_image_filename;
     } else if (option.starts_with("--host-prefix=")) {
       host_prefix = option.substr(strlen("--host-prefix=")).data();
-    } else if (option.starts_with("-Xms")) {
-      Xms = option.data();
-    } else if (option.starts_with("-Xmx")) {
-      Xmx = option.data();
-    } else if (option.starts_with("-verbose:")) {
-      verbose = option.data();
+    } else if (option == "--runtime-arg") {
+      if (++i >= argc) {
+        fprintf(stderr, "Missing required argument for --runtime-arg\n");
+        usage();
+      }
+      runtime_args.push_back(argv[i]);
     } else {
       fprintf(stderr, "unknown argument %s\n", option.data());
       usage();
@@ -161,18 +155,12 @@
   } else {
     options.push_back(std::make_pair(boot_image_option.c_str(), reinterpret_cast<void*>(NULL)));
   }
-  if (Xms != NULL) {
-    options.push_back(std::make_pair(Xms, reinterpret_cast<void*>(NULL)));
-  }
-  if (Xmx != NULL) {
-    options.push_back(std::make_pair(Xmx, reinterpret_cast<void*>(NULL)));
-  }
-  if (verbose != NULL) {
-    options.push_back(std::make_pair(verbose, reinterpret_cast<void*>(NULL)));
-  }
   if (!host_prefix.empty()) {
     options.push_back(std::make_pair("host-prefix", host_prefix.c_str()));
   }
+  for (size_t i = 0; i < runtime_args.size(); i++) {
+    options.push_back(std::make_pair(runtime_args[i], reinterpret_cast<void*>(NULL)));
+  }
   UniquePtr<Runtime> runtime(Runtime::Create(options, false));
   if (runtime.get() == NULL) {
     fprintf(stderr, "could not create runtime\n");
diff --git a/src/oatopt.cc b/src/oatopt.cc
index 133af59..c792b4d 100644
--- a/src/oatopt.cc
+++ b/src/oatopt.cc
@@ -51,8 +51,8 @@
 
   execl("/system/bin/dex2oatd",
         "/system/bin/dex2oatd",
-        "-Xms64m",
-        "-Xmx64m",
+        "--runtime-arg", "-Xms64m",
+        "--runtime-arg", "-Xmx64m",
         "--boot-image=/data/art-cache/boot.art",
         dex_file_option.c_str(),
         oat_file_option.c_str(),
diff --git a/test/003-omnibus-opcodes/build b/test/003-omnibus-opcodes/build
index 47abae2..d5aa786 100644
--- a/test/003-omnibus-opcodes/build
+++ b/test/003-omnibus-opcodes/build
@@ -24,9 +24,3 @@
 
 dx -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex classes
 zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar classes.dex
-
-dex2oatd -Xms16m -Xmx16m \
-    --boot-image=${ANDROID_PRODUCT_OUT}/data/art-test/core.art \
-    --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar \
-    --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat \
-    --host-prefix=${ANDROID_PRODUCT_OUT}
diff --git a/test/023-many-interfaces/build b/test/023-many-interfaces/build
index 171eaae..ebe722e 100644
--- a/test/023-many-interfaces/build
+++ b/test/023-many-interfaces/build
@@ -26,9 +26,3 @@
 
 dx --debug --dex --dump-to=classes.lst --output=classes.dex classes
 zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar classes.dex
-
-dex2oatd -Xms16m -Xmx16m \
-    --boot-image=${ANDROID_PRODUCT_OUT}/data/art-test/core.art \
-    --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar \
-    --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat \
-    --host-prefix=${ANDROID_PRODUCT_OUT}
diff --git a/test/056-const-string-jumbo/build b/test/056-const-string-jumbo/build
index d7a8268..a563cd0 100644
--- a/test/056-const-string-jumbo/build
+++ b/test/056-const-string-jumbo/build
@@ -45,9 +45,3 @@
 dx -JXmx500m --debug --dex --no-optimize --positions=none --no-locals \
     --dump-to=classes.lst --output=classes.dex classes
 zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar classes.dex
-
-dex2oatd -Xms16m -Xmx16m \
-    --boot-image=${ANDROID_PRODUCT_OUT}/data/art-test/core.art \
-    --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar \
-    --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat \
-    --host-prefix=${ANDROID_PRODUCT_OUT}
diff --git a/test/085-old-style-inner-class/build b/test/085-old-style-inner-class/build
index 32f7a86..b7e12ae 100644
--- a/test/085-old-style-inner-class/build
+++ b/test/085-old-style-inner-class/build
@@ -27,9 +27,3 @@
     --dump-width=1000 classes 2>/dev/null
 
 zip ${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar classes.dex
-
-dex2oatd -Xms16m -Xmx16m \
-    --boot-image=${ANDROID_PRODUCT_OUT}/data/art-test/core.art \
-    --dex-file=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.jar \
-    --oat=${ANDROID_PRODUCT_OUT}/data/art-test/$TEST_NAME.oat \
-    --host-prefix=${ANDROID_PRODUCT_OUT}