summaryrefslogtreecommitdiff
path: root/src/compiler_llvm/jni_compiler.cc
diff options
context:
space:
mode:
author TDYa127 <tdy@google.com> 2012-04-11 05:57:28 -0700
committer Shih-wei Liao <sliao@google.com> 2012-04-11 11:01:21 -0700
commit5bb8601175bbb9cd761c715f4ba04f84d65e913b (patch)
tree441c62e467b6c7a355d9ad65ea88a923abbb409b /src/compiler_llvm/jni_compiler.cc
parent933abf8ce64e522b1c45b191b796bf2208a760d9 (diff)
Fix 044-proxy. Implement proxy for now, working on x86 and ARM.
Already added a TODO to do the assembly code for x86 and ARM for proxy. Use LLVM .ll for multi-architecture now. Change-Id: Ibdeeee113dcf284592e9d7769d3044438cb1e453
Diffstat (limited to 'src/compiler_llvm/jni_compiler.cc')
-rw-r--r--src/compiler_llvm/jni_compiler.cc103
1 files changed, 40 insertions, 63 deletions
diff --git a/src/compiler_llvm/jni_compiler.cc b/src/compiler_llvm/jni_compiler.cc
index 252daef685..68ce2d88b5 100644
--- a/src/compiler_llvm/jni_compiler.cc
+++ b/src/compiler_llvm/jni_compiler.cc
@@ -88,9 +88,9 @@ CompiledMethod* JniCompiler::Compile() {
} else {
// Load class object
this_object_or_class_object =
- LoadFromObjectOffset(method_object_addr,
- Method::DeclaringClassOffset().Int32Value(),
- irb_.getJObjectTy());
+ irb_.LoadFromObjectOffset(method_object_addr,
+ Method::DeclaringClassOffset().Int32Value(),
+ irb_.getJObjectTy());
}
// Actual argument (ignore method and this object)
arg_begin = arg_iter;
@@ -126,34 +126,35 @@ CompiledMethod* JniCompiler::Compile() {
irb_.CreateStore(method_object_addr, method_field_addr);
// Store the line number
- StoreToObjectOffset(shadow_frame_,
- ShadowFrame::LineNumOffset(),
- irb_.getInt32(dex_file_->GetLineNumFromPC(method_, 0)));
+ irb_.StoreToObjectOffset(shadow_frame_,
+ ShadowFrame::LineNumOffset(),
+ irb_.getInt32(dex_file_->GetLineNumFromPC(method_, 0)));
// Store the number of the pointer slots
- StoreToObjectOffset(shadow_frame_,
- ShadowFrame::NumberOfReferencesOffset(),
- irb_.getInt32(sirt_size));
+ irb_.StoreToObjectOffset(shadow_frame_,
+ ShadowFrame::NumberOfReferencesOffset(),
+ irb_.getInt32(sirt_size));
// Push the shadow frame
llvm::Value* shadow_frame_upcast = irb_.CreateConstGEP2_32(shadow_frame_, 0, 0);
irb_.CreateCall(irb_.GetRuntime(PushShadowFrame), shadow_frame_upcast);
// Get JNIEnv
- llvm::Value* jni_env_object_addr = LoadFromObjectOffset(thread_object_addr,
- Thread::JniEnvOffset().Int32Value(),
- irb_.getJObjectTy());
+ llvm::Value* jni_env_object_addr =
+ irb_.LoadFromObjectOffset(thread_object_addr,
+ Thread::JniEnvOffset().Int32Value(),
+ irb_.getJObjectTy());
// Set thread state to kNative
- StoreToObjectOffset(thread_object_addr,
- Thread::StateOffset().Int32Value(),
- irb_.getInt32(kNative));
+ irb_.StoreToObjectOffset(thread_object_addr,
+ Thread::StateOffset().Int32Value(),
+ irb_.getInt32(kNative));
// Get callee code_addr
llvm::Value* code_addr =
- LoadFromObjectOffset(method_object_addr,
- Method::NativeMethodOffset().Int32Value(),
- GetFunctionType(method_idx_, is_static, true)->getPointerTo());
+ irb_.LoadFromObjectOffset(method_object_addr,
+ Method::NativeMethodOffset().Int32Value(),
+ GetFunctionType(method_idx_, is_static, true)->getPointerTo());
// Load actual parameters
std::vector<llvm::Value*> args;
@@ -230,18 +231,18 @@ CompiledMethod* JniCompiler::Compile() {
// saved_local_ref_cookie = env->local_ref_cookie
llvm::Value* saved_local_ref_cookie =
- LoadFromObjectOffset(jni_env_object_addr,
- JNIEnvExt::LocalRefCookieOffset().Int32Value(),
- irb_.getInt32Ty());
+ irb_.LoadFromObjectOffset(jni_env_object_addr,
+ JNIEnvExt::LocalRefCookieOffset().Int32Value(),
+ irb_.getInt32Ty());
// env->local_ref_cookie = env->locals.segment_state
llvm::Value* segment_state =
- LoadFromObjectOffset(jni_env_object_addr,
- JNIEnvExt::SegmentStateOffset().Int32Value(),
- irb_.getInt32Ty());
- StoreToObjectOffset(jni_env_object_addr,
- JNIEnvExt::LocalRefCookieOffset().Int32Value(),
- segment_state);
+ irb_.LoadFromObjectOffset(jni_env_object_addr,
+ JNIEnvExt::SegmentStateOffset().Int32Value(),
+ irb_.getInt32Ty());
+ irb_.StoreToObjectOffset(jni_env_object_addr,
+ JNIEnvExt::LocalRefCookieOffset().Int32Value(),
+ segment_state);
// Call!!!
@@ -254,9 +255,9 @@ CompiledMethod* JniCompiler::Compile() {
}
// Set thread state to kRunnable
- StoreToObjectOffset(thread_object_addr,
- Thread::StateOffset().Int32Value(),
- irb_.getInt32(kRunnable));
+ irb_.StoreToObjectOffset(thread_object_addr,
+ Thread::StateOffset().Int32Value(),
+ irb_.getInt32(kRunnable));
if (return_shorty == 'L') {
// If the return value is reference, it may point to SIRT, we should decode it.
@@ -267,17 +268,17 @@ CompiledMethod* JniCompiler::Compile() {
// env->locals.segment_state = env->local_ref_cookie
llvm::Value* local_ref_cookie =
- LoadFromObjectOffset(jni_env_object_addr,
- JNIEnvExt::LocalRefCookieOffset().Int32Value(),
- irb_.getInt32Ty());
- StoreToObjectOffset(jni_env_object_addr,
- JNIEnvExt::SegmentStateOffset().Int32Value(),
- local_ref_cookie);
+ irb_.LoadFromObjectOffset(jni_env_object_addr,
+ JNIEnvExt::LocalRefCookieOffset().Int32Value(),
+ irb_.getInt32Ty());
+ irb_.StoreToObjectOffset(jni_env_object_addr,
+ JNIEnvExt::SegmentStateOffset().Int32Value(),
+ local_ref_cookie);
// env->local_ref_cookie = saved_local_ref_cookie
- StoreToObjectOffset(jni_env_object_addr,
- JNIEnvExt::LocalRefCookieOffset().Int32Value(),
- saved_local_ref_cookie);
+ irb_.StoreToObjectOffset(jni_env_object_addr,
+ JNIEnvExt::LocalRefCookieOffset().Int32Value(),
+ saved_local_ref_cookie);
// Pop the shadow frame
irb_.CreateCall(irb_.GetRuntime(PopShadowFrame));
@@ -348,29 +349,5 @@ llvm::FunctionType* JniCompiler::GetFunctionType(uint32_t method_idx,
return llvm::FunctionType::get(ret_type, args_type, false);
}
-llvm::Value* JniCompiler::LoadFromObjectOffset(llvm::Value* object_addr,
- int32_t offset,
- llvm::Type* type) {
- // Convert offset to llvm::value
- llvm::Value* llvm_offset = irb_.getPtrEquivInt(offset);
- // Calculate the value's address
- llvm::Value* value_addr = irb_.CreatePtrDisp(object_addr, llvm_offset, type->getPointerTo());
- // Load
- return irb_.CreateLoad(value_addr);
-}
-
-void JniCompiler::StoreToObjectOffset(llvm::Value* object_addr,
- int32_t offset,
- llvm::Value* new_value) {
- // Convert offset to llvm::value
- llvm::Value* llvm_offset = irb_.getPtrEquivInt(offset);
- // Calculate the value's address
- llvm::Value* value_addr = irb_.CreatePtrDisp(object_addr,
- llvm_offset,
- new_value->getType()->getPointerTo());
- // Store
- irb_.CreateStore(new_value, value_addr);
-}
-
} // namespace compiler_llvm
} // namespace art