Refactor runtime support builder.
Also, add inline assembly for load offset from current thread.
Change-Id: I5c32c04a5ab9a8574acbaf8ee3e08761ebe33d4f
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index bdad82b..620ba39 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -214,14 +214,10 @@
frame_address = irb_.CreatePtrToInt(frame_address, irb_.getPtrEquivIntTy());
// Get thread.stack_end_
- llvm::Value* thread_object_addr =
- irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
-
llvm::Value* stack_end =
- irb_.LoadFromObjectOffset(thread_object_addr,
- Thread::StackEndOffset().Int32Value(),
- irb_.getPtrEquivIntTy(),
- kTBAARuntimeInfo);
+ irb_.Runtime().EmitLoadFromThreadOffset(Thread::StackEndOffset().Int32Value(),
+ irb_.getPtrEquivIntTy(),
+ kTBAARuntimeInfo);
// Check the frame address < thread.stack_end_ ?
llvm::Value* is_stack_overflow = irb_.CreateICmpULT(frame_address, stack_end);
@@ -1263,22 +1259,16 @@
DecodedInstruction dec_insn(insn);
- // Get thread
- llvm::Value* thread_object_addr =
- irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
-
// Get thread-local exception field address
llvm::Value* exception_object_addr =
- irb_.LoadFromObjectOffset(thread_object_addr,
- Thread::ExceptionOffset().Int32Value(),
- irb_.getJObjectTy(),
- kTBAAJRuntime);
+ irb_.Runtime().EmitLoadFromThreadOffset(Thread::ExceptionOffset().Int32Value(),
+ irb_.getJObjectTy(),
+ kTBAAJRuntime);
// Set thread-local exception field address to NULL
- irb_.StoreToObjectOffset(thread_object_addr,
- Thread::ExceptionOffset().Int32Value(),
- irb_.getJNull(),
- kTBAAJRuntime);
+ irb_.Runtime().EmitStoreToThreadOffset(Thread::ExceptionOffset().Int32Value(),
+ irb_.getJNull(),
+ kTBAAJRuntime);
// Keep the exception object in the Dalvik register
EmitStoreDalvikReg(dec_insn.vA, kObject, kAccurate, exception_object_addr);
@@ -1464,7 +1454,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+ llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
llvm::Function* runtime_func =
irb_.GetRuntime(InitializeTypeAndVerifyAccess);
@@ -1512,7 +1502,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+ llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
EmitUpdateDexPC(dex_pc);
@@ -1562,7 +1552,7 @@
EmitGuard_NullPointerException(dex_pc, object_addr);
}
- llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+ llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
irb_.CreateCall2(irb_.GetRuntime(LockObject), object_addr, thread_object_addr);
@@ -1584,7 +1574,7 @@
EmitUpdateDexPC(dex_pc);
- llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+ llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
irb_.CreateCall2(irb_.GetRuntime(UnlockObject), object_addr, thread_object_addr);
@@ -1762,7 +1752,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+ llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
EmitUpdateDexPC(dex_pc);
@@ -1805,7 +1795,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+ llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
EmitUpdateDexPC(dex_pc);
@@ -2508,7 +2498,7 @@
llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
- llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+ llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
EmitUpdateDexPC(dex_pc);
@@ -3039,7 +3029,7 @@
llvm::Value* caller_method_object_addr = EmitLoadMethodObjectAddr();
- llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+ llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
EmitUpdateDexPC(dex_pc);
@@ -3694,8 +3684,7 @@
return;
}
- llvm::Value* exception_pending =
- irb_.CreateCall(irb_.GetRuntime(IsExceptionPending));
+ llvm::Value* exception_pending = irb_.Runtime().EmitIsExceptionPending();
llvm::BasicBlock* block_cont = CreateBasicBlockWithDexPC(dex_pc, "cont");
@@ -3715,11 +3704,7 @@
return;
}
- llvm::Value* runtime_func = irb_.GetRuntime(TestSuspend);
-
- llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
-
- irb_.CreateCall(runtime_func, thread_object_addr);
+ irb_.Runtime().EmitTestSuspend();
}
@@ -3960,9 +3945,15 @@
llvm::Value* shadow_frame_upcast =
irb_.CreateConstGEP2_32(shadow_frame_, 0, 0);
- llvm::Value* result =
- irb_.CreateCall3(irb_.GetRuntime(is_inline ? PushShadowFrame : PushShadowFrameNoInline),
- shadow_frame_upcast, method_object_addr, irb_.getJInt(shadow_frame_size_));
+ llvm::Value* result;
+ if (is_inline) {
+ result = irb_.Runtime().EmitPushShadowFrame(shadow_frame_upcast, method_object_addr,
+ shadow_frame_size_);
+ } else {
+ DCHECK(shadow_frame_size_ == 0);
+ result = irb_.Runtime().EmitPushShadowFrameNoInline(shadow_frame_upcast, method_object_addr,
+ shadow_frame_size_);
+ }
irb_.CreateStore(result, old_shadow_frame_, kTBAARegister);
}
@@ -3981,14 +3972,12 @@
irb_.CreateCondBr(need_pop, bb_pop, bb_cont, kUnlikely);
irb_.SetInsertPoint(bb_pop);
- irb_.CreateCall(irb_.GetRuntime(PopShadowFrame),
- irb_.CreateLoad(old_shadow_frame_, kTBAARegister));
+ irb_.Runtime().EmitPopShadowFrame(irb_.CreateLoad(old_shadow_frame_, kTBAARegister));
irb_.CreateBr(bb_cont);
irb_.SetInsertPoint(bb_cont);
} else {
- irb_.CreateCall(irb_.GetRuntime(PopShadowFrame),
- irb_.CreateLoad(old_shadow_frame_, kTBAARegister));
+ irb_.Runtime().EmitPopShadowFrame(irb_.CreateLoad(old_shadow_frame_, kTBAARegister));
}
}