Merge "Revert "Support for a set of verifier failures."" into ics-mr1-plus-art
diff --git a/src/compiler_llvm/art_module.ll b/src/compiler_llvm/art_module.ll
index 6f7fdfb..35f99f7 100644
--- a/src/compiler_llvm/art_module.ll
+++ b/src/compiler_llvm/art_module.ll
@@ -70,33 +70,33 @@
; Object Space
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-declare %JavaObject* @art_alloc_object_from_code(i32, %JavaObject*)
+declare %JavaObject* @art_alloc_object_from_code(i32, %JavaObject*, %JavaObject*)
declare %JavaObject* @art_alloc_object_from_code_with_access_check(
- i32, %JavaObject*)
+ i32, %JavaObject*, %JavaObject*)
-declare %JavaObject* @art_alloc_array_from_code(i32, %JavaObject*, i32)
+declare %JavaObject* @art_alloc_array_from_code(i32, %JavaObject*, i32, %JavaObject*)
declare %JavaObject* @art_alloc_array_from_code_with_access_check(
- i32, %JavaObject*, i32)
+ i32, %JavaObject*, i32, %JavaObject*)
declare %JavaObject* @art_check_and_alloc_array_from_code(
- i32, %JavaObject*, i32)
+ i32, %JavaObject*, i32, %JavaObject*)
declare %JavaObject* @art_check_and_alloc_array_from_code_with_access_check(
- i32, %JavaObject*, i32)
+ i32, %JavaObject*, i32, %JavaObject*)
declare void @art_find_instance_field_from_code(i32, %JavaObject*)
declare void @art_find_static_field_from_code(i32, %JavaObject*)
declare %JavaObject* @art_find_static_method_from_code_with_access_check(
- i32, %JavaObject*, %JavaObject*)
+ i32, %JavaObject*, %JavaObject*, %JavaObject*)
declare %JavaObject* @art_find_direct_method_from_code_with_access_check(
- i32, %JavaObject*, %JavaObject*)
+ i32, %JavaObject*, %JavaObject*, %JavaObject*)
declare %JavaObject* @art_find_virtual_method_from_code_with_access_check(
- i32, %JavaObject*, %JavaObject*)
+ i32, %JavaObject*, %JavaObject*, %JavaObject*)
declare %JavaObject* @art_find_super_method_from_code_with_access_check(
- i32, %JavaObject*, %JavaObject*)
+ i32, %JavaObject*, %JavaObject*, %JavaObject*)
declare %JavaObject* @art_find_interface_method_from_code_with_access_check(
- i32, %JavaObject*, %JavaObject*)
+ i32, %JavaObject*, %JavaObject*, %JavaObject*)
declare %JavaObject* @art_find_interface_method_from_code(
- i32, %JavaObject*, %JavaObject*)
+ i32, %JavaObject*, %JavaObject*, %JavaObject*)
declare %JavaObject* @art_initialize_static_storage_from_code(i32, %JavaObject*)
declare %JavaObject* @art_initialize_type_from_code(i32, %JavaObject*)
diff --git a/src/compiler_llvm/compiler_llvm.cc b/src/compiler_llvm/compiler_llvm.cc
index 443950d..8945210 100644
--- a/src/compiler_llvm/compiler_llvm.cc
+++ b/src/compiler_llvm/compiler_llvm.cc
@@ -318,8 +318,10 @@
art::OatCompilationUnit oat_compilation_unit(
class_loader, class_linker, dex_file, *dex_cache, code_item,
method_idx, access_flags);
-
- return ContextOf(compiler)->CompileDexMethod(&oat_compilation_unit);
+ art::compiler_llvm::CompilerLLVM* compiler_llvm = ContextOf(compiler);
+ art::CompiledMethod* result = compiler_llvm->CompileDexMethod(&oat_compilation_unit);
+ compiler_llvm->MaterializeIfThresholdReached();
+ return result;
}
extern "C" art::CompiledMethod* ArtJniCompileMethod(art::Compiler& compiler,
@@ -340,7 +342,10 @@
extern "C" art::CompiledInvokeStub* ArtCreateInvokeStub(art::Compiler& compiler, bool is_static,
const char* shorty, uint32_t shorty_len) {
- return ContextOf(compiler)->CreateInvokeStub(is_static, shorty);
+ art::compiler_llvm::CompilerLLVM* compiler_llvm = ContextOf(compiler);
+ art::CompiledInvokeStub* result = compiler_llvm->CreateInvokeStub(is_static, shorty);
+ compiler_llvm->MaterializeIfThresholdReached();
+ return result;
}
extern "C" void compilerLLVMSetBitcodeFileName(art::Compiler& compiler,
diff --git a/src/compiler_llvm/generated/art_module.cc b/src/compiler_llvm/generated/art_module.cc
index 1b9bcf5..510383a 100644
--- a/src/compiler_llvm/generated/art_module.cc
+++ b/src/compiler_llvm/generated/art_module.cc
@@ -128,6 +128,7 @@
std::vector<Type*>FuncTy_12_args;
FuncTy_12_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_12_args.push_back(PointerTy_1);
+FuncTy_12_args.push_back(PointerTy_1);
FunctionType* FuncTy_12 = FunctionType::get(
/*Result=*/PointerTy_1,
/*Params=*/FuncTy_12_args,
@@ -137,6 +138,7 @@
FuncTy_13_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_13_args.push_back(PointerTy_1);
FuncTy_13_args.push_back(IntegerType::get(mod->getContext(), 32));
+FuncTy_13_args.push_back(PointerTy_1);
FunctionType* FuncTy_13 = FunctionType::get(
/*Result=*/PointerTy_1,
/*Params=*/FuncTy_13_args,
@@ -154,32 +156,32 @@
FuncTy_15_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_15_args.push_back(PointerTy_1);
FuncTy_15_args.push_back(PointerTy_1);
+FuncTy_15_args.push_back(PointerTy_1);
FunctionType* FuncTy_15 = FunctionType::get(
/*Result=*/PointerTy_1,
/*Params=*/FuncTy_15_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_16_args;
-FuncTy_16_args.push_back(PointerTy_1);
FuncTy_16_args.push_back(IntegerType::get(mod->getContext(), 32));
+FuncTy_16_args.push_back(PointerTy_1);
FunctionType* FuncTy_16 = FunctionType::get(
/*Result=*/PointerTy_1,
/*Params=*/FuncTy_16_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_17_args;
-FuncTy_17_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_17_args.push_back(PointerTy_1);
FuncTy_17_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_17 = FunctionType::get(
- /*Result=*/IntegerType::get(mod->getContext(), 32),
+ /*Result=*/PointerTy_1,
/*Params=*/FuncTy_17_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_18_args;
FuncTy_18_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_18_args.push_back(PointerTy_1);
-FuncTy_18_args.push_back(IntegerType::get(mod->getContext(), 64));
+FuncTy_18_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_18 = FunctionType::get(
/*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_18_args,
@@ -188,7 +190,7 @@
std::vector<Type*>FuncTy_19_args;
FuncTy_19_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_19_args.push_back(PointerTy_1);
-FuncTy_19_args.push_back(PointerTy_1);
+FuncTy_19_args.push_back(IntegerType::get(mod->getContext(), 64));
FunctionType* FuncTy_19 = FunctionType::get(
/*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_19_args,
@@ -197,6 +199,7 @@
std::vector<Type*>FuncTy_20_args;
FuncTy_20_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_20_args.push_back(PointerTy_1);
+FuncTy_20_args.push_back(PointerTy_1);
FunctionType* FuncTy_20 = FunctionType::get(
/*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_20_args,
@@ -206,17 +209,15 @@
FuncTy_21_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_21_args.push_back(PointerTy_1);
FunctionType* FuncTy_21 = FunctionType::get(
- /*Result=*/IntegerType::get(mod->getContext(), 64),
+ /*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_21_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_22_args;
FuncTy_22_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_22_args.push_back(PointerTy_1);
-FuncTy_22_args.push_back(PointerTy_1);
-FuncTy_22_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_22 = FunctionType::get(
- /*Result=*/IntegerType::get(mod->getContext(), 32),
+ /*Result=*/IntegerType::get(mod->getContext(), 64),
/*Params=*/FuncTy_22_args,
/*isVarArg=*/false);
@@ -224,7 +225,7 @@
FuncTy_23_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_23_args.push_back(PointerTy_1);
FuncTy_23_args.push_back(PointerTy_1);
-FuncTy_23_args.push_back(IntegerType::get(mod->getContext(), 64));
+FuncTy_23_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_23 = FunctionType::get(
/*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_23_args,
@@ -234,7 +235,7 @@
FuncTy_24_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_24_args.push_back(PointerTy_1);
FuncTy_24_args.push_back(PointerTy_1);
-FuncTy_24_args.push_back(PointerTy_1);
+FuncTy_24_args.push_back(IntegerType::get(mod->getContext(), 64));
FunctionType* FuncTy_24 = FunctionType::get(
/*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_24_args,
@@ -244,16 +245,18 @@
FuncTy_25_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_25_args.push_back(PointerTy_1);
FuncTy_25_args.push_back(PointerTy_1);
+FuncTy_25_args.push_back(PointerTy_1);
FunctionType* FuncTy_25 = FunctionType::get(
- /*Result=*/IntegerType::get(mod->getContext(), 64),
+ /*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_25_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_26_args;
+FuncTy_26_args.push_back(IntegerType::get(mod->getContext(), 32));
FuncTy_26_args.push_back(PointerTy_1);
FuncTy_26_args.push_back(PointerTy_1);
FunctionType* FuncTy_26 = FunctionType::get(
- /*Result=*/PointerTy_1,
+ /*Result=*/IntegerType::get(mod->getContext(), 64),
/*Params=*/FuncTy_26_args,
/*isVarArg=*/false);
@@ -261,7 +264,7 @@
FuncTy_27_args.push_back(PointerTy_1);
FuncTy_27_args.push_back(PointerTy_1);
FunctionType* FuncTy_27 = FunctionType::get(
- /*Result=*/IntegerType::get(mod->getContext(), 32),
+ /*Result=*/PointerTy_1,
/*Params=*/FuncTy_27_args,
/*isVarArg=*/false);
@@ -269,50 +272,51 @@
FuncTy_28_args.push_back(PointerTy_1);
FuncTy_28_args.push_back(PointerTy_1);
FunctionType* FuncTy_28 = FunctionType::get(
- /*Result=*/Type::getVoidTy(mod->getContext()),
+ /*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_28_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_29_args;
-FuncTy_29_args.push_back(Type::getDoubleTy(mod->getContext()));
+FuncTy_29_args.push_back(PointerTy_1);
+FuncTy_29_args.push_back(PointerTy_1);
FunctionType* FuncTy_29 = FunctionType::get(
- /*Result=*/IntegerType::get(mod->getContext(), 64),
+ /*Result=*/Type::getVoidTy(mod->getContext()),
/*Params=*/FuncTy_29_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_30_args;
FuncTy_30_args.push_back(Type::getDoubleTy(mod->getContext()));
FunctionType* FuncTy_30 = FunctionType::get(
- /*Result=*/IntegerType::get(mod->getContext(), 32),
+ /*Result=*/IntegerType::get(mod->getContext(), 64),
/*Params=*/FuncTy_30_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_31_args;
-FuncTy_31_args.push_back(Type::getFloatTy(mod->getContext()));
+FuncTy_31_args.push_back(Type::getDoubleTy(mod->getContext()));
FunctionType* FuncTy_31 = FunctionType::get(
- /*Result=*/IntegerType::get(mod->getContext(), 64),
+ /*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_31_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_32_args;
FuncTy_32_args.push_back(Type::getFloatTy(mod->getContext()));
FunctionType* FuncTy_32 = FunctionType::get(
- /*Result=*/IntegerType::get(mod->getContext(), 32),
+ /*Result=*/IntegerType::get(mod->getContext(), 64),
/*Params=*/FuncTy_32_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_33_args;
-FuncTy_33_args.push_back(PointerTy_1);
-FuncTy_33_args.push_back(PointerTy_1);
-FuncTy_33_args.push_back(IntegerType::get(mod->getContext(), 32));
-FuncTy_33_args.push_back(IntegerType::get(mod->getContext(), 1));
+FuncTy_33_args.push_back(Type::getFloatTy(mod->getContext()));
FunctionType* FuncTy_33 = FunctionType::get(
- /*Result=*/PointerTy_1,
+ /*Result=*/IntegerType::get(mod->getContext(), 32),
/*Params=*/FuncTy_33_args,
/*isVarArg=*/false);
std::vector<Type*>FuncTy_34_args;
FuncTy_34_args.push_back(PointerTy_1);
+FuncTy_34_args.push_back(PointerTy_1);
+FuncTy_34_args.push_back(IntegerType::get(mod->getContext(), 32));
+FuncTy_34_args.push_back(IntegerType::get(mod->getContext(), 1));
FunctionType* FuncTy_34 = FunctionType::get(
/*Result=*/PointerTy_1,
/*Params=*/FuncTy_34_args,
@@ -321,8 +325,15 @@
std::vector<Type*>FuncTy_35_args;
FuncTy_35_args.push_back(PointerTy_1);
FunctionType* FuncTy_35 = FunctionType::get(
- /*Result=*/Type::getVoidTy(mod->getContext()),
+ /*Result=*/PointerTy_1,
/*Params=*/FuncTy_35_args,
+ /*isVarArg=*/false);
+
+std::vector<Type*>FuncTy_36_args;
+FuncTy_36_args.push_back(PointerTy_1);
+FunctionType* FuncTy_36 = FunctionType::get(
+ /*Result=*/Type::getVoidTy(mod->getContext()),
+ /*Params=*/FuncTy_36_args,
/*isVarArg=*/true);
@@ -672,7 +683,7 @@
Function* func_art_initialize_static_storage_from_code = mod->getFunction("art_initialize_static_storage_from_code");
if (!func_art_initialize_static_storage_from_code) {
func_art_initialize_static_storage_from_code = Function::Create(
- /*Type=*/FuncTy_12,
+ /*Type=*/FuncTy_16,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_initialize_static_storage_from_code", mod); // (external, no body)
func_art_initialize_static_storage_from_code->setCallingConv(CallingConv::C);
@@ -683,7 +694,7 @@
Function* func_art_initialize_type_from_code = mod->getFunction("art_initialize_type_from_code");
if (!func_art_initialize_type_from_code) {
func_art_initialize_type_from_code = Function::Create(
- /*Type=*/FuncTy_12,
+ /*Type=*/FuncTy_16,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_initialize_type_from_code", mod); // (external, no body)
func_art_initialize_type_from_code->setCallingConv(CallingConv::C);
@@ -694,7 +705,7 @@
Function* func_art_initialize_type_and_verify_access_from_code = mod->getFunction("art_initialize_type_and_verify_access_from_code");
if (!func_art_initialize_type_and_verify_access_from_code) {
func_art_initialize_type_and_verify_access_from_code = Function::Create(
- /*Type=*/FuncTy_12,
+ /*Type=*/FuncTy_16,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_initialize_type_and_verify_access_from_code", mod); // (external, no body)
func_art_initialize_type_and_verify_access_from_code->setCallingConv(CallingConv::C);
@@ -705,7 +716,7 @@
Function* func_art_resolve_string_from_code = mod->getFunction("art_resolve_string_from_code");
if (!func_art_resolve_string_from_code) {
func_art_resolve_string_from_code = Function::Create(
- /*Type=*/FuncTy_16,
+ /*Type=*/FuncTy_17,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_resolve_string_from_code", mod); // (external, no body)
func_art_resolve_string_from_code->setCallingConv(CallingConv::C);
@@ -716,7 +727,7 @@
Function* func_art_set32_static_from_code = mod->getFunction("art_set32_static_from_code");
if (!func_art_set32_static_from_code) {
func_art_set32_static_from_code = Function::Create(
- /*Type=*/FuncTy_17,
+ /*Type=*/FuncTy_18,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_set32_static_from_code", mod); // (external, no body)
func_art_set32_static_from_code->setCallingConv(CallingConv::C);
@@ -727,7 +738,7 @@
Function* func_art_set64_static_from_code = mod->getFunction("art_set64_static_from_code");
if (!func_art_set64_static_from_code) {
func_art_set64_static_from_code = Function::Create(
- /*Type=*/FuncTy_18,
+ /*Type=*/FuncTy_19,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_set64_static_from_code", mod); // (external, no body)
func_art_set64_static_from_code->setCallingConv(CallingConv::C);
@@ -738,7 +749,7 @@
Function* func_art_set_obj_static_from_code = mod->getFunction("art_set_obj_static_from_code");
if (!func_art_set_obj_static_from_code) {
func_art_set_obj_static_from_code = Function::Create(
- /*Type=*/FuncTy_19,
+ /*Type=*/FuncTy_20,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_set_obj_static_from_code", mod); // (external, no body)
func_art_set_obj_static_from_code->setCallingConv(CallingConv::C);
@@ -749,7 +760,7 @@
Function* func_art_get32_static_from_code = mod->getFunction("art_get32_static_from_code");
if (!func_art_get32_static_from_code) {
func_art_get32_static_from_code = Function::Create(
- /*Type=*/FuncTy_20,
+ /*Type=*/FuncTy_21,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_get32_static_from_code", mod); // (external, no body)
func_art_get32_static_from_code->setCallingConv(CallingConv::C);
@@ -760,7 +771,7 @@
Function* func_art_get64_static_from_code = mod->getFunction("art_get64_static_from_code");
if (!func_art_get64_static_from_code) {
func_art_get64_static_from_code = Function::Create(
- /*Type=*/FuncTy_21,
+ /*Type=*/FuncTy_22,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_get64_static_from_code", mod); // (external, no body)
func_art_get64_static_from_code->setCallingConv(CallingConv::C);
@@ -771,7 +782,7 @@
Function* func_art_get_obj_static_from_code = mod->getFunction("art_get_obj_static_from_code");
if (!func_art_get_obj_static_from_code) {
func_art_get_obj_static_from_code = Function::Create(
- /*Type=*/FuncTy_12,
+ /*Type=*/FuncTy_16,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_get_obj_static_from_code", mod); // (external, no body)
func_art_get_obj_static_from_code->setCallingConv(CallingConv::C);
@@ -782,7 +793,7 @@
Function* func_art_set32_instance_from_code = mod->getFunction("art_set32_instance_from_code");
if (!func_art_set32_instance_from_code) {
func_art_set32_instance_from_code = Function::Create(
- /*Type=*/FuncTy_22,
+ /*Type=*/FuncTy_23,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_set32_instance_from_code", mod); // (external, no body)
func_art_set32_instance_from_code->setCallingConv(CallingConv::C);
@@ -793,7 +804,7 @@
Function* func_art_set64_instance_from_code = mod->getFunction("art_set64_instance_from_code");
if (!func_art_set64_instance_from_code) {
func_art_set64_instance_from_code = Function::Create(
- /*Type=*/FuncTy_23,
+ /*Type=*/FuncTy_24,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_set64_instance_from_code", mod); // (external, no body)
func_art_set64_instance_from_code->setCallingConv(CallingConv::C);
@@ -804,7 +815,7 @@
Function* func_art_set_obj_instance_from_code = mod->getFunction("art_set_obj_instance_from_code");
if (!func_art_set_obj_instance_from_code) {
func_art_set_obj_instance_from_code = Function::Create(
- /*Type=*/FuncTy_24,
+ /*Type=*/FuncTy_25,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_set_obj_instance_from_code", mod); // (external, no body)
func_art_set_obj_instance_from_code->setCallingConv(CallingConv::C);
@@ -815,7 +826,7 @@
Function* func_art_get32_instance_from_code = mod->getFunction("art_get32_instance_from_code");
if (!func_art_get32_instance_from_code) {
func_art_get32_instance_from_code = Function::Create(
- /*Type=*/FuncTy_19,
+ /*Type=*/FuncTy_20,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_get32_instance_from_code", mod); // (external, no body)
func_art_get32_instance_from_code->setCallingConv(CallingConv::C);
@@ -826,7 +837,7 @@
Function* func_art_get64_instance_from_code = mod->getFunction("art_get64_instance_from_code");
if (!func_art_get64_instance_from_code) {
func_art_get64_instance_from_code = Function::Create(
- /*Type=*/FuncTy_25,
+ /*Type=*/FuncTy_26,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_get64_instance_from_code", mod); // (external, no body)
func_art_get64_instance_from_code->setCallingConv(CallingConv::C);
@@ -837,7 +848,7 @@
Function* func_art_get_obj_instance_from_code = mod->getFunction("art_get_obj_instance_from_code");
if (!func_art_get_obj_instance_from_code) {
func_art_get_obj_instance_from_code = Function::Create(
- /*Type=*/FuncTy_15,
+ /*Type=*/FuncTy_12,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_get_obj_instance_from_code", mod); // (external, no body)
func_art_get_obj_instance_from_code->setCallingConv(CallingConv::C);
@@ -848,7 +859,7 @@
Function* func_art_decode_jobject_in_thread = mod->getFunction("art_decode_jobject_in_thread");
if (!func_art_decode_jobject_in_thread) {
func_art_decode_jobject_in_thread = Function::Create(
- /*Type=*/FuncTy_26,
+ /*Type=*/FuncTy_27,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_decode_jobject_in_thread", mod); // (external, no body)
func_art_decode_jobject_in_thread->setCallingConv(CallingConv::C);
@@ -859,7 +870,7 @@
Function* func_art_is_assignable_from_code = mod->getFunction("art_is_assignable_from_code");
if (!func_art_is_assignable_from_code) {
func_art_is_assignable_from_code = Function::Create(
- /*Type=*/FuncTy_27,
+ /*Type=*/FuncTy_28,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_is_assignable_from_code", mod); // (external, no body)
func_art_is_assignable_from_code->setCallingConv(CallingConv::C);
@@ -870,7 +881,7 @@
Function* func_art_check_cast_from_code = mod->getFunction("art_check_cast_from_code");
if (!func_art_check_cast_from_code) {
func_art_check_cast_from_code = Function::Create(
- /*Type=*/FuncTy_28,
+ /*Type=*/FuncTy_29,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_check_cast_from_code", mod); // (external, no body)
func_art_check_cast_from_code->setCallingConv(CallingConv::C);
@@ -881,7 +892,7 @@
Function* func_art_check_put_array_element_from_code = mod->getFunction("art_check_put_array_element_from_code");
if (!func_art_check_put_array_element_from_code) {
func_art_check_put_array_element_from_code = Function::Create(
- /*Type=*/FuncTy_28,
+ /*Type=*/FuncTy_29,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_check_put_array_element_from_code", mod); // (external, no body)
func_art_check_put_array_element_from_code->setCallingConv(CallingConv::C);
@@ -892,7 +903,7 @@
Function* func_D2L = mod->getFunction("D2L");
if (!func_D2L) {
func_D2L = Function::Create(
- /*Type=*/FuncTy_29,
+ /*Type=*/FuncTy_30,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"D2L", mod); // (external, no body)
func_D2L->setCallingConv(CallingConv::C);
@@ -903,7 +914,7 @@
Function* func_D2I = mod->getFunction("D2I");
if (!func_D2I) {
func_D2I = Function::Create(
- /*Type=*/FuncTy_30,
+ /*Type=*/FuncTy_31,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"D2I", mod); // (external, no body)
func_D2I->setCallingConv(CallingConv::C);
@@ -914,7 +925,7 @@
Function* func_F2L = mod->getFunction("F2L");
if (!func_F2L) {
func_F2L = Function::Create(
- /*Type=*/FuncTy_31,
+ /*Type=*/FuncTy_32,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"F2L", mod); // (external, no body)
func_F2L->setCallingConv(CallingConv::C);
@@ -925,7 +936,7 @@
Function* func_F2I = mod->getFunction("F2I");
if (!func_F2I) {
func_F2I = Function::Create(
- /*Type=*/FuncTy_32,
+ /*Type=*/FuncTy_33,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"F2I", mod); // (external, no body)
func_F2I->setCallingConv(CallingConv::C);
@@ -936,7 +947,7 @@
Function* func_art_mark_gc_card_from_code = mod->getFunction("art_mark_gc_card_from_code");
if (!func_art_mark_gc_card_from_code) {
func_art_mark_gc_card_from_code = Function::Create(
- /*Type=*/FuncTy_28,
+ /*Type=*/FuncTy_29,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_mark_gc_card_from_code", mod); // (external, no body)
func_art_mark_gc_card_from_code->setCallingConv(CallingConv::C);
@@ -947,7 +958,7 @@
Function* func_art_ensure_resolved_from_code = mod->getFunction("art_ensure_resolved_from_code");
if (!func_art_ensure_resolved_from_code) {
func_art_ensure_resolved_from_code = Function::Create(
- /*Type=*/FuncTy_33,
+ /*Type=*/FuncTy_34,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_ensure_resolved_from_code", mod); // (external, no body)
func_art_ensure_resolved_from_code->setCallingConv(CallingConv::C);
@@ -958,7 +969,7 @@
Function* func_art_fix_stub_from_code = mod->getFunction("art_fix_stub_from_code");
if (!func_art_fix_stub_from_code) {
func_art_fix_stub_from_code = Function::Create(
- /*Type=*/FuncTy_34,
+ /*Type=*/FuncTy_35,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_fix_stub_from_code", mod); // (external, no body)
func_art_fix_stub_from_code->setCallingConv(CallingConv::C);
@@ -969,7 +980,7 @@
Function* func_art_proxy_invoke_handler_from_code = mod->getFunction("art_proxy_invoke_handler_from_code");
if (!func_art_proxy_invoke_handler_from_code) {
func_art_proxy_invoke_handler_from_code = Function::Create(
- /*Type=*/FuncTy_35,
+ /*Type=*/FuncTy_36,
/*Linkage=*/GlobalValue::ExternalLinkage,
/*Name=*/"art_proxy_invoke_handler_from_code", mod); // (external, no body)
func_art_proxy_invoke_handler_from_code->setCallingConv(CallingConv::C);
diff --git a/src/compiler_llvm/jni_compiler.cc b/src/compiler_llvm/jni_compiler.cc
index b35d792..198cd1a 100644
--- a/src/compiler_llvm/jni_compiler.cc
+++ b/src/compiler_llvm/jni_compiler.cc
@@ -259,6 +259,9 @@
Thread::StateOffset().Int32Value(),
irb_.getInt32(kRunnable));
+ // Do a suspend check
+ irb_.CreateCall(irb_.GetRuntime(TestSuspend));
+
if (return_shorty == 'L') {
// If the return value is reference, it may point to SIRT, we should decode it.
retval = irb_.CreateCall2(irb_.GetRuntime(DecodeJObjectInThread),
@@ -293,6 +296,12 @@
// Verify the generated bitcode
llvm::verifyFunction(*func_, llvm::PrintMessageAction);
+ // Add the memory usage approximation of the compilation unit
+ cunit_->AddMemUsageApproximation((sirt_size * 4 + 50) * 50);
+ // NOTE: We will emit 4 LLVM instructions per object argument,
+ // And about 50 instructions for other operations. (Some runtime support will be inlined.)
+ // Beside, we guess that we have to use 50 bytes to represent one LLVM instruction.
+
CompiledMethod* compiled_method =
new CompiledMethod(cunit_->GetInstructionSet(),
cunit_->GetElfIndex(),
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index fa8a827..556dd51 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -1736,10 +1736,12 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
+ llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+
EmitUpdateLineNumFromDexPC(dex_pc);
llvm::Value* object_addr =
- irb_.CreateCall2(runtime_func, type_index_value, method_object_addr);
+ irb_.CreateCall3(runtime_func, type_index_value, method_object_addr, thread_object_addr);
EmitGuard_ExceptionLandingPad(dex_pc);
@@ -1777,11 +1779,13 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
+ llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+
EmitUpdateLineNumFromDexPC(dex_pc);
llvm::Value* object_addr =
- irb_.CreateCall3(runtime_func, type_index_value, method_object_addr,
- array_length_value);
+ irb_.CreateCall4(runtime_func, type_index_value, method_object_addr,
+ array_length_value, thread_object_addr);
EmitGuard_ExceptionLandingPad(dex_pc);
@@ -3074,13 +3078,16 @@
llvm::Value* caller_method_object_addr = EmitLoadMethodObjectAddr();
+ llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+
EmitUpdateLineNumFromDexPC(dex_pc);
llvm::Value* callee_method_object_addr =
- irb_.CreateCall3(runtime_func,
+ irb_.CreateCall4(runtime_func,
callee_method_idx_value,
this_addr,
- caller_method_object_addr);
+ caller_method_object_addr,
+ thread_object_addr);
EmitGuard_ExceptionLandingPad(dex_pc);
diff --git a/src/compiler_llvm/runtime_support_llvm.cc b/src/compiler_llvm/runtime_support_llvm.cc
index 0fd3611..69ef05d 100644
--- a/src/compiler_llvm/runtime_support_llvm.cc
+++ b/src/compiler_llvm/runtime_support_llvm.cc
@@ -195,86 +195,102 @@
// Object Space
//----------------------------------------------------------------------------
-Object* art_alloc_object_from_code(uint32_t type_idx, Method* referrer) {
- return AllocObjectFromCode(type_idx, referrer, art_get_current_thread_from_code(), false);
+Object* art_alloc_object_from_code(uint32_t type_idx,
+ Method* referrer,
+ Thread* thread) {
+ return AllocObjectFromCode(type_idx, referrer, thread, false);
}
-Object* art_alloc_object_from_code_with_access_check(uint32_t type_idx, Method* referrer) {
- return AllocObjectFromCode(type_idx, referrer, art_get_current_thread_from_code(), true);
+Object* art_alloc_object_from_code_with_access_check(uint32_t type_idx,
+ Method* referrer,
+ Thread* thread) {
+ return AllocObjectFromCode(type_idx, referrer, thread, true);
}
-Object* art_alloc_array_from_code(uint32_t type_idx, Method* referrer, uint32_t length) {
- return AllocArrayFromCode(type_idx, referrer, length, art_get_current_thread_from_code(), false);
+Object* art_alloc_array_from_code(uint32_t type_idx,
+ Method* referrer,
+ uint32_t length,
+ Thread* thread) {
+ return AllocArrayFromCode(type_idx, referrer, length, thread, false);
}
Object* art_alloc_array_from_code_with_access_check(uint32_t type_idx,
Method* referrer,
- uint32_t length) {
- return AllocArrayFromCode(type_idx, referrer, length, art_get_current_thread_from_code(), true);
+ uint32_t length,
+ Thread* thread) {
+ return AllocArrayFromCode(type_idx, referrer, length, thread, true);
}
Object* art_check_and_alloc_array_from_code(uint32_t type_idx,
Method* referrer,
- uint32_t length) {
- return CheckAndAllocArrayFromCode(type_idx, referrer, length, art_get_current_thread_from_code(), false);
+ uint32_t length,
+ Thread* thread) {
+ return CheckAndAllocArrayFromCode(type_idx, referrer, length, thread, false);
}
Object* art_check_and_alloc_array_from_code_with_access_check(uint32_t type_idx,
Method* referrer,
- uint32_t length) {
- return CheckAndAllocArrayFromCode(type_idx, referrer, length, art_get_current_thread_from_code(), true);
+ uint32_t length,
+ Thread* thread) {
+ return CheckAndAllocArrayFromCode(type_idx, referrer, length, thread, true);
}
static Method* FindMethodHelper(uint32_t method_idx, Object* this_object, Method* caller_method,
- bool access_check, InvokeType type) {
+ bool access_check, InvokeType type, Thread* thread) {
Method* method = FindMethodFast(method_idx, this_object, caller_method, access_check, type);
if (UNLIKELY(method == NULL)) {
method = FindMethodFromCode(method_idx, this_object, caller_method,
- art_get_current_thread_from_code(), access_check, type);
+ thread, access_check, type);
if (UNLIKELY(method == NULL)) {
- CHECK(art_get_current_thread_from_code()->IsExceptionPending());
+ CHECK(thread->IsExceptionPending());
return 0; // failure
}
}
- DCHECK(!art_get_current_thread_from_code()->IsExceptionPending());
+ DCHECK(!thread->IsExceptionPending());
return method;
}
Object* art_find_static_method_from_code_with_access_check(uint32_t method_idx,
Object* this_object,
- Method* referrer) {
- return FindMethodHelper(method_idx, this_object, referrer, true, kStatic);
+ Method* referrer,
+ Thread* thread) {
+ return FindMethodHelper(method_idx, this_object, referrer, true, kStatic, thread);
}
Object* art_find_direct_method_from_code_with_access_check(uint32_t method_idx,
Object* this_object,
- Method* referrer) {
- return FindMethodHelper(method_idx, this_object, referrer, true, kDirect);
+ Method* referrer,
+ Thread* thread) {
+ return FindMethodHelper(method_idx, this_object, referrer, true, kDirect, thread);
}
Object* art_find_virtual_method_from_code_with_access_check(uint32_t method_idx,
Object* this_object,
- Method* referrer) {
- return FindMethodHelper(method_idx, this_object, referrer, true, kVirtual);
+ Method* referrer,
+ Thread* thread) {
+ return FindMethodHelper(method_idx, this_object, referrer, true, kVirtual, thread);
}
Object* art_find_super_method_from_code_with_access_check(uint32_t method_idx,
Object* this_object,
- Method* referrer) {
- return FindMethodHelper(method_idx, this_object, referrer, true, kSuper);
+ Method* referrer,
+ Thread* thread) {
+ return FindMethodHelper(method_idx, this_object, referrer, true, kSuper, thread);
}
Object*
art_find_interface_method_from_code_with_access_check(uint32_t method_idx,
Object* this_object,
- Method* referrer) {
- return FindMethodHelper(method_idx, this_object, referrer, true, kInterface);
+ Method* referrer,
+ Thread* thread) {
+ return FindMethodHelper(method_idx, this_object, referrer, true, kInterface, thread);
}
Object* art_find_interface_method_from_code(uint32_t method_idx,
Object* this_object,
- Method* referrer) {
- return FindMethodHelper(method_idx, this_object, referrer, false, kInterface);
+ Method* referrer,
+ Thread* thread) {
+ return FindMethodHelper(method_idx, this_object, referrer, false, kInterface, thread);
}
Object* art_initialize_static_storage_from_code(uint32_t type_idx, Method* referrer) {
diff --git a/src/compiler_llvm/upcall_compiler.cc b/src/compiler_llvm/upcall_compiler.cc
index 691d7e5..4b99cf7 100644
--- a/src/compiler_llvm/upcall_compiler.cc
+++ b/src/compiler_llvm/upcall_compiler.cc
@@ -184,7 +184,7 @@
llvm::verifyFunction(*func, llvm::PrintMessageAction);
// Add the memory usage approximation of the compilation unit
- cunit_->AddMemUsageApproximation((shorty_size * 3 + 8) * 500);
+ cunit_->AddMemUsageApproximation((shorty_size * 3 + 8) * 50);
// NOTE: We will emit 3 LLVM instructions per shorty for the argument,
// plus 3 for pointer arithmetic, and 5 for code_addr, retval, ret_addr,
// store ret_addr, and ret_void. Beside, we guess that we have to use
diff --git a/src/native/dalvik_system_VMRuntime.cc b/src/native/dalvik_system_VMRuntime.cc
index 140faff..caac283 100644
--- a/src/native/dalvik_system_VMRuntime.cc
+++ b/src/native/dalvik_system_VMRuntime.cc
@@ -124,9 +124,11 @@
return env->NewStringUTF(Runtime::Current()->GetVersion());
}
+#if !defined(ART_USE_LLVM_COMPILER)
static void DisableCheckJniCallback(Thread* t, void*) {
t->GetJniEnv()->SetCheckJniEnabled(false);
}
+#endif
static void VMRuntime_setTargetSdkVersion(JNIEnv*, jobject, jint targetSdkVersion) {
// This is the target SDK version of the app we're about to run.
@@ -136,6 +138,7 @@
Runtime* runtime = Runtime::Current();
JavaVMExt* vm = runtime->GetJavaVM();
+#if !defined(ART_USE_LLVM_COMPILER)
if (vm->check_jni) {
LOG(WARNING) << "Turning off CheckJNI so we can turn on JNI app bug workarounds...";
ScopedThreadListLock thread_list_lock;
@@ -145,7 +148,12 @@
LOG(INFO) << "Turning on JNI app bug workarounds for target SDK version "
<< targetSdkVersion << "...";
+
vm->work_around_app_jni_bugs = true;
+#else
+ LOG(WARNING) << "LLVM does not work-around app jni bugs.";
+ vm->work_around_app_jni_bugs = false;
+#endif
}
}
diff --git a/src/object.cc b/src/object.cc
index 158f0e6..8c101ba 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -591,6 +591,10 @@
DCHECK(Thread::Current() == self);
CHECK(IsNative()) << PrettyMethod(this);
CHECK(native_method != NULL) << PrettyMethod(this);
+#if defined(ART_USE_LLVM_COMPILER)
+ SetFieldPtr<const void*>(OFFSET_OF_OBJECT_MEMBER(Method, native_method_),
+ native_method, false);
+#else
if (!self->GetJniEnv()->vm->work_around_app_jni_bugs) {
SetFieldPtr<const void*>(OFFSET_OF_OBJECT_MEMBER(Method, native_method_),
native_method, false);
@@ -608,6 +612,7 @@
SetFieldPtr<const uint8_t*>(OFFSET_OF_OBJECT_MEMBER(Method, gc_map_),
reinterpret_cast<const uint8_t*>(native_method), false);
}
+#endif
}
void Method::UnregisterNative(Thread* self) {
diff --git a/src/runtime_linux.cc b/src/runtime_linux.cc
index c96b1e5..c4d4b3c 100644
--- a/src/runtime_linux.cc
+++ b/src/runtime_linux.cc
@@ -188,13 +188,15 @@
<< (has_address ? StringPrintf(" fault addr %p", info->si_addr) : "");
Backtrace();
- // TODO: make this part optional, like it is on the device?
- // Wait for debugger to attach.
- LOG(INTERNAL_FATAL) << "********************************************************\n"
- << "* Process " << getpid() << " has been suspended while crashing. Attach gdb:\n"
- << "* gdb -p " << getpid() << "\n"
- << "********************************************************\n";
- while (true) {
+ // TODO: instead, get debuggerd running on the host, try to connect, and hang around on success.
+ if (getenv("debug_db_uid") != NULL) {
+ LOG(INTERNAL_FATAL) << "********************************************************\n"
+ << "* Process " << getpid() << " has been suspended while crashing. Attach gdb:\n"
+ << "* gdb -p " << getpid() << "\n"
+ << "********************************************************\n";
+ // Wait for debugger to attach.
+ while (true) {
+ }
}
}
diff --git a/src/thread.cc b/src/thread.cc
index 24697ce..04c5105 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -220,7 +220,7 @@
// Tell the kernel to stop using it.
ss.ss_sp = NULL;
ss.ss_flags = SS_DISABLE;
- ss.ss_size = 0;
+ ss.ss_size = SIGSTKSZ; // Avoid ENOMEM failure with Mac OS' buggy libc.
SigAltStack(&ss, NULL);
// Free it.