Lazy pushing shadow frame.
Function:
aget v0, v1, v2
return v0
Original:
push shadow frame;
if (null pointer) { throw; pop shadow frame; unwind; }
if (index out of bounds) { throw; pop shadow frame; unwind; }
load from array;
pop shadow frame;
return;
New:
if (null pointer) { push shadow frame; throw; pop shadow frame; unwind; }
if (index out of bounds) { push shadow frame; throw; pop shadow frame; unwind; }
load from array;
return;
Change-Id: I7fc0ff12b9a5454f8e1491b9ce1cdef3afcbed23
diff --git a/src/compiler_llvm/generated/art_module.cc b/src/compiler_llvm/generated/art_module.cc
index f25a88b..1f88e8d 100644
--- a/src/compiler_llvm/generated/art_module.cc
+++ b/src/compiler_llvm/generated/art_module.cc
@@ -84,6 +84,8 @@
std::vector<Type*>FuncTy_6_args;
FuncTy_6_args.push_back(PointerTy_2);
+FuncTy_6_args.push_back(PointerTy_1);
+FuncTy_6_args.push_back(IntegerType::get(mod->getContext(), 32));
FunctionType* FuncTy_6 = FunctionType::get(
/*Result=*/PointerTy_2,
/*Params=*/FuncTy_6_args,
@@ -423,6 +425,17 @@
AttrListPtr func_art_push_shadow_frame_from_code_PAL;
func_art_push_shadow_frame_from_code->setAttributes(func_art_push_shadow_frame_from_code_PAL);
+Function* func_art_push_shadow_frame_noinline_from_code = mod->getFunction("art_push_shadow_frame_noinline_from_code");
+if (!func_art_push_shadow_frame_noinline_from_code) {
+func_art_push_shadow_frame_noinline_from_code = Function::Create(
+ /*Type=*/FuncTy_6,
+ /*Linkage=*/GlobalValue::ExternalLinkage,
+ /*Name=*/"art_push_shadow_frame_noinline_from_code", mod); // (external, no body)
+func_art_push_shadow_frame_noinline_from_code->setCallingConv(CallingConv::C);
+}
+AttrListPtr func_art_push_shadow_frame_noinline_from_code_PAL;
+func_art_push_shadow_frame_noinline_from_code->setAttributes(func_art_push_shadow_frame_noinline_from_code_PAL);
+
Function* func_art_pop_shadow_frame_from_code = mod->getFunction("art_pop_shadow_frame_from_code");
if (!func_art_pop_shadow_frame_from_code) {
func_art_pop_shadow_frame_from_code = Function::Create(