diff options
| author | 2012-05-28 21:49:23 -0700 | |
|---|---|---|
| committer | 2012-06-03 08:59:14 -0700 | |
| commit | af543476661966c83a1e1c4db4fbef0d9a2d3afa (patch) | |
| tree | 25a85124f4f3ecc96292d8d9d74d70eb62be1f22 /src/compiler_llvm/jni_compiler.cc | |
| parent | cb8f890e0723c4c9379aaf5c58bc80096c043f21 (diff) | |
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
Diffstat (limited to 'src/compiler_llvm/jni_compiler.cc')
| -rw-r--r-- | src/compiler_llvm/jni_compiler.cc | 16 |
1 files changed, 2 insertions, 14 deletions
diff --git a/src/compiler_llvm/jni_compiler.cc b/src/compiler_llvm/jni_compiler.cc index c76c80d88b..e66674cfe8 100644 --- a/src/compiler_llvm/jni_compiler.cc +++ b/src/compiler_llvm/jni_compiler.cc @@ -115,29 +115,17 @@ CompiledMethod* JniCompiler::Compile() { llvm::StructType* shadow_frame_type = irb_.getShadowFrameTy(sirt_size); llvm::AllocaInst* shadow_frame_ = irb_.CreateAlloca(shadow_frame_type); - // Store the method pointer - llvm::Value* method_field_addr = - irb_.CreatePtrDisp(shadow_frame_, - irb_.getPtrEquivInt(ShadowFrame::MethodOffset()), - irb_.getJObjectTy()->getPointerTo()); - irb_.CreateStore(method_object_addr, method_field_addr, kTBAAShadowFrame); - // Store the dex pc irb_.StoreToObjectOffset(shadow_frame_, ShadowFrame::DexPCOffset(), irb_.getInt32(0), kTBAAShadowFrame); - // Store the number of the pointer slots - irb_.StoreToObjectOffset(shadow_frame_, - ShadowFrame::NumberOfReferencesOffset(), - irb_.getInt32(sirt_size), - kTBAAShadowFrame); - // Push the shadow frame llvm::Value* shadow_frame_upcast = irb_.CreateConstGEP2_32(shadow_frame_, 0, 0); llvm::Value* old_shadow_frame = - irb_.CreateCall(irb_.GetRuntime(PushShadowFrame), shadow_frame_upcast); + irb_.CreateCall3(irb_.GetRuntime(PushShadowFrame), + shadow_frame_upcast, method_object_addr, irb_.getInt32(sirt_size)); // Get JNIEnv llvm::Value* jni_env_object_addr = |