diff options
| author | 2012-01-13 12:11:37 +0800 | |
|---|---|---|
| committer | 2012-02-17 20:17:39 -0800 | |
| commit | 9e0dbe424ae0c17d843bbbdd2ab61ffde8eb3e68 (patch) | |
| tree | cf1cc2b341add6092a5b783eebeef9494927e540 /src/compiler_llvm/method_compiler.cc | |
| parent | 2aa2e39548e194c5514d6534149ca1078021eab1 (diff) | |
Implement monitor-enter and monitor-exit instructions.
Change-Id: I7d5637289497e91366691993bc805a322d9bc492
Diffstat (limited to 'src/compiler_llvm/method_compiler.cc')
| -rw-r--r-- | src/compiler_llvm/method_compiler.cc | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc index 59b31d49aa..3bd79c7ed9 100644 --- a/src/compiler_llvm/method_compiler.cc +++ b/src/compiler_llvm/method_compiler.cc @@ -1217,14 +1217,35 @@ void MethodCompiler::EmitInsn_LoadConstantClass(uint32_t dex_pc, void MethodCompiler::EmitInsn_MonitorEnter(uint32_t dex_pc, Instruction const* insn) { - // UNIMPLEMENTED(WARNING); + + Instruction::DecodedInstruction dec_insn(insn); + + llvm::Value* object_addr = + EmitLoadDalvikReg(dec_insn.vA_, kObject, kAccurate); + + // TODO: Slow path always. May not need NullPointerException check. + EmitGuard_NullPointerException(dex_pc, object_addr); + + irb_.CreateCall(irb_.GetRuntime(LockObject), object_addr); + EmitGuard_ExceptionLandingPad(dex_pc); + irb_.CreateBr(GetNextBasicBlock(dex_pc)); } void MethodCompiler::EmitInsn_MonitorExit(uint32_t dex_pc, Instruction const* insn) { - // UNIMPLEMENTED(WARNING); + + Instruction::DecodedInstruction dec_insn(insn); + + llvm::Value* object_addr = + EmitLoadDalvikReg(dec_insn.vA_, kObject, kAccurate); + + EmitGuard_NullPointerException(dex_pc, object_addr); + + irb_.CreateCall(irb_.GetRuntime(UnlockObject), object_addr); + EmitGuard_ExceptionLandingPad(dex_pc); + irb_.CreateBr(GetNextBasicBlock(dex_pc)); } |