Merge "More MIPS support." into ics-mr1-plus-art
diff --git a/Android.mk b/Android.mk
index 6de5eff..cd96c52 100644
--- a/Android.mk
+++ b/Android.mk
@@ -177,7 +177,7 @@
 define declare-oat-target-target
 .PHONY: oat-target-$(1)
 oat-target-$(1): $(PRODUCT_OUT)/$(1) $(TARGET_BOOT_IMG_OUT) $(DEX2OAT_DEPENDENCY)
-	$(DEX2OAT) --runtime-arg -Xms64m --runtime-arg -Xmx64m --boot-image=$(TARGET_BOOT_IMG_OUT) --dex-file=$(PRODUCT_OUT)/$(1) --dex-location=/$(1) --oat-file=$(call art-cache-out,$(1).oat) --host-prefix=$(PRODUCT_OUT)
+	$(DEX2OAT) $(PARALLEL_ART_COMPILE_JOBS) --runtime-arg -Xms64m --runtime-arg -Xmx64m --boot-image=$(TARGET_BOOT_IMG_OUT) --dex-file=$(PRODUCT_OUT)/$(1) --dex-location=/$(1) --oat-file=$(call art-cache-out,$(1).oat) --host-prefix=$(PRODUCT_OUT)
 
 OAT_TARGET_TARGETS += oat-target-$(1)
 endef
diff --git a/build/Android.common.mk b/build/Android.common.mk
index e62602c..5e93af5 100644
--- a/build/Android.common.mk
+++ b/build/Android.common.mk
@@ -89,6 +89,10 @@
 
 ART_TARGET_DEBUG_CFLAGS := $(art_debug_cflags)
 
+ifeq ($(ART_USE_LLVM_COMPILER),true)
+PARALLEL_ART_COMPILE_JOBS := -j8
+endif
+
 DEX2OAT_SRC_FILES := \
 	src/dex2oat.cc
 
diff --git a/build/Android.oat.mk b/build/Android.oat.mk
index 05bddf4..372992f 100644
--- a/build/Android.oat.mk
+++ b/build/Android.oat.mk
@@ -53,29 +53,15 @@
 HOST_CORE_IMG_OUT := $(HOST_OUT_JAVA_LIBRARIES)/core.art
 TARGET_CORE_IMG_OUT := $(ART_TEST_OUT)/core.art
 
-ifeq ($(ART_USE_LLVM_COMPILER),true)
- $(HOST_CORE_IMG_OUT): $(HOST_CORE_DEX_FILES) $(DEX2OAT_DEPENDENCY)
+$(HOST_CORE_IMG_OUT): $(HOST_CORE_DEX_FILES) $(DEX2OAT_DEPENDENCY)
 	@echo "host dex2oat: $@ ($?)"
 	@mkdir -p $(dir $@)
-	$(hide) $(DEX2OAT) -j8 --runtime-arg -Xms16m --runtime-arg -Xmx16m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(HOST_CORE_DEX_FILES)) $(addprefix --dex-location=,$(HOST_CORE_DEX_LOCATIONS)) --oat-file=$(HOST_CORE_OAT_OUT) --oat-location=$(HOST_CORE_OAT) --image=$(HOST_CORE_IMG_OUT) --base=$(IMG_HOST_BASE_ADDRESS) --instruction-set=X86
-else
- $(HOST_CORE_IMG_OUT): $(HOST_CORE_DEX_FILES) $(DEX2OAT_DEPENDENCY)
-	@echo "host dex2oat: $@ ($?)"
-	@mkdir -p $(dir $@)
-	$(hide) $(DEX2OAT) --runtime-arg -Xms16m --runtime-arg -Xmx16m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(HOST_CORE_DEX_FILES)) $(addprefix --dex-location=,$(HOST_CORE_DEX_LOCATIONS)) --oat-file=$(HOST_CORE_OAT_OUT) --oat-location=$(HOST_CORE_OAT) --image=$(HOST_CORE_IMG_OUT) --base=$(IMG_HOST_BASE_ADDRESS) --instruction-set=X86
-endif
+	$(hide) $(DEX2OAT) $(PARALLEL_ART_COMPILE_JOBS) --runtime-arg -Xms16m --runtime-arg -Xmx16m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(HOST_CORE_DEX_FILES)) $(addprefix --dex-location=,$(HOST_CORE_DEX_LOCATIONS)) --oat-file=$(HOST_CORE_OAT_OUT) --oat-location=$(HOST_CORE_OAT) --image=$(HOST_CORE_IMG_OUT) --base=$(IMG_HOST_BASE_ADDRESS) --instruction-set=X86
 
-ifeq ($(ART_USE_LLVM_COMPILER),true)
 $(TARGET_CORE_IMG_OUT): $(TARGET_CORE_DEX_FILES) $(DEX2OAT_DEPENDENCY)
 	@echo "target dex2oat: $@ ($?)"
 	@mkdir -p $(dir $@)
-	$(hide) $(DEX2OAT) -j8 --runtime-arg -Xms16m --runtime-arg -Xmx16m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(TARGET_CORE_DEX_FILES)) $(addprefix --dex-location=,$(TARGET_CORE_DEX_LOCATIONS)) --oat-file=$(TARGET_CORE_OAT_OUT) --oat-location=$(TARGET_CORE_OAT) --image=$(TARGET_CORE_IMG_OUT) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
-else
-$(TARGET_CORE_IMG_OUT): $(TARGET_CORE_DEX_FILES) $(DEX2OAT_DEPENDENCY)
-	@echo "target dex2oat: $@ ($?)"
-	@mkdir -p $(dir $@)
-	$(hide) $(DEX2OAT) --runtime-arg -Xms16m --runtime-arg -Xmx16m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(TARGET_CORE_DEX_FILES)) $(addprefix --dex-location=,$(TARGET_CORE_DEX_LOCATIONS)) --oat-file=$(TARGET_CORE_OAT_OUT) --oat-location=$(TARGET_CORE_OAT) --image=$(TARGET_CORE_IMG_OUT) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
-endif
+	$(hide) $(DEX2OAT) $(PARALLEL_ART_COMPILE_JOBS) --runtime-arg -Xms16m --runtime-arg -Xmx16m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(TARGET_CORE_DEX_FILES)) $(addprefix --dex-location=,$(TARGET_CORE_DEX_LOCATIONS)) --oat-file=$(TARGET_CORE_OAT_OUT) --oat-location=$(TARGET_CORE_OAT) --image=$(TARGET_CORE_IMG_OUT) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
 
 $(HOST_CORE_OAT_OUT): $(HOST_CORE_IMG_OUT)
 
@@ -91,17 +77,10 @@
 TARGET_BOOT_OAT_OUT := $(patsubst %.art,%.oat,$(TARGET_BOOT_IMG_OUT))
 TARGET_BOOT_OAT := $(subst $(PRODUCT_OUT),,$(TARGET_BOOT_OAT_OUT))
 
-ifeq ($(ART_USE_LLVM_COMPILER),true)
- $(TARGET_BOOT_IMG_OUT): $(TARGET_BOOT_DEX_FILES) $(DEX2OAT_DEPENDENCY)
+$(TARGET_BOOT_IMG_OUT): $(TARGET_BOOT_DEX_FILES) $(DEX2OAT_DEPENDENCY)
 	@echo "target dex2oat: $@ ($?)"
 	@mkdir -p $(dir $@)
-	$(hide) $(DEX2OAT) -j8 --runtime-arg -Xms256m --runtime-arg -Xmx256m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(TARGET_BOOT_DEX_FILES)) $(addprefix --dex-location=,$(TARGET_BOOT_DEX_LOCATIONS)) --oat-file=$(TARGET_BOOT_OAT_OUT) --oat-location=$(TARGET_BOOT_OAT) --image=$(TARGET_BOOT_IMG_OUT) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
-else
- $(TARGET_BOOT_IMG_OUT): $(TARGET_BOOT_DEX_FILES) $(DEX2OAT_DEPENDENCY)
-	@echo "target dex2oat: $@ ($?)"
-	@mkdir -p $(dir $@)
-	$(hide) $(DEX2OAT) --runtime-arg -Xms256m --runtime-arg -Xmx256m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(TARGET_BOOT_DEX_FILES)) $(addprefix --dex-location=,$(TARGET_BOOT_DEX_LOCATIONS)) --oat-file=$(TARGET_BOOT_OAT_OUT) --oat-location=$(TARGET_BOOT_OAT) --image=$(TARGET_BOOT_IMG_OUT) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
-endif
+	$(hide) $(DEX2OAT) $(PARALLEL_ART_COMPILE_JOBS) --runtime-arg -Xms256m --runtime-arg -Xmx256m --image-classes=$(PRELOADED_CLASSES) $(addprefix --dex-file=,$(TARGET_BOOT_DEX_FILES)) $(addprefix --dex-location=,$(TARGET_BOOT_DEX_LOCATIONS)) --oat-file=$(TARGET_BOOT_OAT_OUT) --oat-location=$(TARGET_BOOT_OAT) --image=$(TARGET_BOOT_IMG_OUT) --base=$(IMG_TARGET_BASE_ADDRESS) --host-prefix=$(PRODUCT_OUT)
 
 $(TARGET_BOOT_OAT_OUT): $(TARGET_BOOT_IMG_OUT)
 
diff --git a/src/compiler_llvm/compilation_unit.h b/src/compiler_llvm/compilation_unit.h
index 2f98521..fb5f4e4 100644
--- a/src/compiler_llvm/compilation_unit.h
+++ b/src/compiler_llvm/compilation_unit.h
@@ -98,7 +98,7 @@
 
   bool IsMaterializeThresholdReached() const {
     MutexLock GUARD(cunit_lock_);
-    return (mem_usage_ > 100000000u); // (threshold: 100 MB)
+    return (mem_usage_ > 10000000u); // (threshold: 10 MB)
   }
 
   void AddMemUsageApproximation(size_t usage) {
diff --git a/src/compiler_llvm/jni_compiler.cc b/src/compiler_llvm/jni_compiler.cc
index 02985f7..5a8cc46 100644
--- a/src/compiler_llvm/jni_compiler.cc
+++ b/src/compiler_llvm/jni_compiler.cc
@@ -112,11 +112,6 @@
   llvm::StructType* shadow_frame_type = irb_.getShadowFrameTy(sirt_size);
   llvm::AllocaInst* shadow_frame_ = irb_.CreateAlloca(shadow_frame_type);
 
-  // Zero-initialization of the shadow frame
-  llvm::ConstantAggregateZero* zero_initializer =
-    llvm::ConstantAggregateZero::get(shadow_frame_type);
-  irb_.CreateStore(zero_initializer, shadow_frame_);
-
   // Store the method pointer
   llvm::Value* method_field_addr =
     irb_.CreatePtrDisp(shadow_frame_,
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 8d6b251..1253d37 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -36,12 +36,9 @@
 #include <iomanip>
 
 #include <llvm/BasicBlock.h>
-#include <llvm/DerivedTypes.h>
 #include <llvm/Function.h>
 #include <llvm/GlobalVariable.h>
 #include <llvm/Intrinsics.h>
-#include <llvm/Module.h>
-#include <llvm/Type.h>
 
 namespace art {
 namespace compiler_llvm {
@@ -2131,15 +2128,13 @@
     EmitGuard_GarbageCollectionSuspend(dex_pc);
   }
 
-  if (src1_reg_cat == kRegZero && src2_reg_cat == kRegZero) {
-    irb_.CreateBr(GetBasicBlock(dex_pc + branch_offset));
-    return;
-  }
-
   llvm::Value* src1_value;
   llvm::Value* src2_value;
 
-  if (src1_reg_cat != kRegZero && src2_reg_cat != kRegZero) {
+  if (src1_reg_cat == kRegZero && src2_reg_cat == kRegZero) {
+    src1_value = irb_.getInt32(0);
+    src2_value = irb_.getInt32(0);
+  } else if (src1_reg_cat != kRegZero && src2_reg_cat != kRegZero) {
     CHECK_EQ(src1_reg_cat, src2_reg_cat);
 
     if (src1_reg_cat == kRegCat1nr) {
@@ -2199,15 +2194,13 @@
     EmitGuard_GarbageCollectionSuspend(dex_pc);
   }
 
-  if (src_reg_cat == kRegZero) {
-    irb_.CreateBr(GetBasicBlock(dex_pc + branch_offset));
-    return;
-  }
-
   llvm::Value* src1_value;
   llvm::Value* src2_value;
 
-  if (src_reg_cat == kRegCat1nr) {
+  if (src_reg_cat == kRegZero) {
+    src1_value = irb_.getInt32(0);
+    src2_value = irb_.getInt32(0);
+  } else if (src_reg_cat == kRegCat1nr) {
     src1_value = EmitLoadDalvikReg(dec_insn.vA, kInt, kAccurate);
     src2_value = irb_.getInt32(0);
   } else {
@@ -2840,8 +2833,8 @@
       if (direct_method != 0u &&
           direct_method != static_cast<uintptr_t>(-1)) {
         callee_method_object_addr =
-          EmitLoadSDCalleeDirectMethodObjectAddr(callee_method_idx,
-                                                 direct_method);
+          irb_.CreateIntToPtr(irb_.getPtrEquivInt(direct_method),
+                              irb_.getJObjectTy());
       } else {
         callee_method_object_addr =
           EmitLoadSDCalleeMethodObjectAddr(callee_method_idx);
@@ -2992,27 +2985,6 @@
 
 
 llvm::Value* MethodCompiler::
-EmitLoadSDCalleeDirectMethodObjectAddr(uint32_t callee_method_idx,
-                                       uintptr_t direct_method) {
-  std::string direct_method_name(
-    StringPrintf("ArtMethodObject_%08lx",
-                 static_cast<unsigned long>(direct_method)));
-
-  llvm::GlobalVariable* direct_method_addr =
-    module_->getGlobalVariable(direct_method_name);
-
-  if (direct_method_addr == NULL) {
-    direct_method_addr =
-      new llvm::GlobalVariable(*module_, irb_.getJObjectTy()->getElementType(),
-                               false, llvm::GlobalVariable::ExternalLinkage,
-                               NULL, direct_method_name);
-  }
-
-  return direct_method_addr;
-}
-
-
-llvm::Value* MethodCompiler::
 EmitLoadSDCalleeMethodObjectAddr(uint32_t callee_method_idx) {
   llvm::Value* callee_method_object_field_addr =
     EmitLoadDexCacheResolvedMethodFieldAddr(callee_method_idx);
diff --git a/src/compiler_llvm/method_compiler.h b/src/compiler_llvm/method_compiler.h
index 84c55d6..7dded33 100644
--- a/src/compiler_llvm/method_compiler.h
+++ b/src/compiler_llvm/method_compiler.h
@@ -215,9 +215,6 @@
 
   llvm::Value* EmitLoadSDCalleeMethodObjectAddr(uint32_t callee_method_idx);
 
-  llvm::Value* EmitLoadSDCalleeDirectMethodObjectAddr(uint32_t callee_method_idx,
-                                                      uintptr_t direct_method);
-
   llvm::Value* EmitLoadVirtualCalleeMethodObjectAddr(int vtable_idx,
                                                      llvm::Value* this_addr);
 
diff --git a/src/compiler_llvm/runtime_support_llvm.cc b/src/compiler_llvm/runtime_support_llvm.cc
index 1ebbef9..092c71b 100644
--- a/src/compiler_llvm/runtime_support_llvm.cc
+++ b/src/compiler_llvm/runtime_support_llvm.cc
@@ -509,8 +509,8 @@
     Thread* thread = art_get_current_thread_from_code();
     thread->ThrowNewExceptionF("Ljava/lang/ClassCastException;",
                                "%s cannot be cast to %s",
-                               PrettyDescriptor(dest_type).c_str(),
-                               PrettyDescriptor(src_type).c_str());
+                               PrettyDescriptor(src_type).c_str(),
+                               PrettyDescriptor(dest_type).c_str());
   }
 }
 
@@ -797,15 +797,6 @@
     }
   }
 
-  // Fixed method object address
-  const char method_object_prefix[] = "ArtMethodObject_";
-  const size_t method_object_prefix_len = sizeof(method_object_prefix) - 1;
-  if (strncmp(name, method_object_prefix, method_object_prefix_len) == 0) {
-    const char* addr_str = name + method_object_prefix_len;
-    unsigned long addr_int = strtoul(addr_str, NULL, 16);
-    return reinterpret_cast<void*>(addr_int);
-  }
-
   LOG(FATAL) << "Error: Can't find symbol " << name;
   return 0;
 }
diff --git a/src/verifier/method_verifier.cc b/src/verifier/method_verifier.cc
index 60b17d6..18078d2 100644
--- a/src/verifier/method_verifier.cc
+++ b/src/verifier/method_verifier.cc
@@ -2585,20 +2585,20 @@
   if (is_super) {
     DCHECK(method_type == METHOD_VIRTUAL);
     const RegType& super = GetDeclaringClass().GetSuperClass(&reg_types_);
+    if (super.IsConflict()) {  // unknown super class
+      Fail(VERIFY_ERROR_NO_METHOD) << "unknown super class in invoke-super from "
+                                   << PrettyMethod(method_idx_, *dex_file_)
+                                   << " to super " << PrettyMethod(res_method);
+      return NULL;
+    }
     Class* super_klass = super.GetClass();
     if (res_method->GetMethodIndex() >= super_klass->GetVTable()->GetLength()) {
-      if (super.IsConflict()) {  // Only Object has no super class
-        Fail(VERIFY_ERROR_NO_METHOD) << "invalid invoke-super from "
-                                     << PrettyMethod(method_idx_, *dex_file_)
-                                     << " to super " << PrettyMethod(res_method);
-      } else {
-        MethodHelper mh(res_method);
-        Fail(VERIFY_ERROR_NO_METHOD) << "invalid invoke-super from "
-                                     << PrettyMethod(method_idx_, *dex_file_)
-                                     << " to super " << super
-                                     << "." << mh.GetName()
-                                     << mh.GetSignature();
-      }
+      MethodHelper mh(res_method);
+      Fail(VERIFY_ERROR_NO_METHOD) << "invalid invoke-super from "
+                                   << PrettyMethod(method_idx_, *dex_file_)
+                                   << " to super " << super
+                                   << "." << mh.GetName()
+                                   << mh.GetSignature();
       return NULL;
     }
   }