Refactor the temporary solution of the stubs.
Also, fix test 032 and 088.
Change-Id: I84049356b29ca6d9a5c852c926190de76b285780
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 615e600..5485ba6 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -2782,38 +2782,27 @@
<< PrettyMethod(callee_method_idx, *dex_file_);
}
-llvm::Value* MethodCompiler::EmitEnsureInitialized(llvm::Value* callee_method_object_addr,
- uint32_t method_idx,
- bool is_static,
- llvm::Value* code_addr) {
- llvm::FunctionType* method_type = GetFunctionType(method_idx, is_static);
-
- // TODO: Inline check
- llvm::Value* runtime_func = irb_.GetRuntime(EnsureInitialized);
- llvm::Value* result = irb_.CreateCall2(runtime_func,
- callee_method_object_addr,
- irb_.CreatePointerCast(code_addr,
- irb_.getJObjectTy()));
- return irb_.CreatePointerCast(result, method_type->getPointerTo());
-}
-
llvm::Value* MethodCompiler::EmitEnsureResolved(llvm::Value* callee,
llvm::Value* caller,
uint32_t dex_method_idx,
- Instruction::Code instr_code) {
- // TODO: Inline check
- llvm::Value* runtime_func = irb_.GetRuntime(EnsureResolved);
- return irb_.CreateCall4(runtime_func,
- callee,
- caller,
- irb_.getInt32(dex_method_idx),
- irb_.getInt32(instr_code));
+ bool is_virtual) {
+ // TODO: Remove this after we solve the trampoline related problems.
+ return irb_.CreateCall4(irb_.GetRuntime(EnsureResolved),
+ callee,
+ caller,
+ irb_.getInt32(dex_method_idx),
+ irb_.getInt1(is_virtual));
}
-void MethodCompiler::EmitEnsureLink(llvm::Value* method_object_addr) {
- // TODO: Inline check
- llvm::Value* runtime_func = irb_.GetRuntime(EnsureLink);
- irb_.CreateCall(runtime_func, method_object_addr);
+llvm::Value* MethodCompiler::EmitFixStub(llvm::Value* callee_method_object_addr,
+ uint32_t method_idx,
+ bool is_static) {
+ // TODO: Remove this after we solve the link and trampoline related problems.
+ llvm::Value* code_addr = irb_.CreateCall(irb_.GetRuntime(FixStub), callee_method_object_addr);
+
+ llvm::FunctionType* method_type = GetFunctionType(method_idx, is_static);
+
+ return irb_.CreatePointerCast(code_addr, method_type->getPointerTo());
}
void MethodCompiler::EmitInsn_InvokeVirtualSuperSlow(uint32_t dex_pc,
@@ -2842,28 +2831,23 @@
EmitUpdateLineNumFromDexPC(dex_pc);
- llvm::Value* callee_method_object_addr_ =
+ llvm::Value* callee_method_object_addr =
irb_.CreateCall3(runtime_func,
callee_method_idx_value, this_addr, method_object_addr);
EmitGuard_ExceptionLandingPad(dex_pc);
- llvm::Value* callee_method_object_addr = EmitEnsureResolved(callee_method_object_addr_,
- method_object_addr,
- callee_method_idx,
- (is_virtual ?
- Instruction::INVOKE_VIRTUAL :
- Instruction::INVOKE_SUPER));
-
- EmitEnsureLink(callee_method_object_addr);
-
- llvm::Value* code_addr_ =
+#if 0
+ llvm::Value* code_addr =
EmitLoadCodeAddr(callee_method_object_addr, callee_method_idx, false);
+#else
+ // TODO: Remove this after we solve the link and trampoline related problems.
+ llvm::Value* code_addr = EmitFixStub(callee_method_object_addr,
+ callee_method_idx,
+ false);
+ EmitGuard_ExceptionLandingPad(dex_pc);
+#endif
- llvm::Value* code_addr = EmitEnsureInitialized(callee_method_object_addr,
- callee_method_idx,
- false,
- code_addr_);
// Load the actual parameter
std::vector<llvm::Value*> args;
args.push_back(callee_method_object_addr);
@@ -2908,25 +2892,26 @@
// Load callee method code address (branch destination)
llvm::Value* vtable_addr = EmitLoadVTableAddr(class_object_addr);
- llvm::Value* method_object_addr_ =
+ llvm::Value* method_object_addr =
EmitLoadMethodObjectAddrFromVTable(vtable_addr,
callee_method->GetMethodIndex());
- llvm::Value* method_object_addr = EmitEnsureResolved(method_object_addr_,
- EmitLoadMethodObjectAddr(),
- callee_method_idx,
- Instruction::INVOKE_VIRTUAL);
+#if 0
+ llvm::Value* code_addr =
+ EmitLoadCodeAddr(method_object_addr, callee_method_idx, false);
+#else
+ // TODO: Remove this after we solve the link and trampoline related problems.
+ method_object_addr = EmitEnsureResolved(method_object_addr,
+ EmitLoadMethodObjectAddr(),
+ callee_method_idx,
+ true);
+ EmitGuard_ExceptionLandingPad(dex_pc);
- EmitEnsureLink(method_object_addr);
-
- llvm::Value* code_addr_ =
- EmitLoadCodeAddr(method_object_addr, callee_method_idx, false);
-
- llvm::Value* code_addr = EmitEnsureInitialized(method_object_addr,
- callee_method_idx,
- false,
- code_addr_);
-
+ llvm::Value* code_addr = EmitFixStub(method_object_addr,
+ callee_method_idx,
+ false);
+ EmitGuard_ExceptionLandingPad(dex_pc);
+#endif
// Load actual parameters
std::vector<llvm::Value*> args;
args.push_back(method_object_addr);
@@ -3009,25 +2994,26 @@
// Load method object from virtual table
llvm::Value* vtable_addr = EmitLoadVTableAddr(super_class_addr);
- llvm::Value* callee_method_object_addr_ =
+ llvm::Value* callee_method_object_addr =
EmitLoadMethodObjectAddrFromVTable(vtable_addr,
callee_method->GetMethodIndex());
- llvm::Value* callee_method_object_addr = EmitEnsureResolved(callee_method_object_addr_,
- method_object_addr,
- callee_method_idx,
- Instruction::INVOKE_SUPER);
-
- EmitEnsureLink(callee_method_object_addr);
-
- llvm::Value* code_addr_ =
- EmitLoadCodeAddr(callee_method_object_addr,
- callee_method_idx, false);
-
- llvm::Value* code_addr = EmitEnsureInitialized(callee_method_object_addr,
+#if 0
+ llvm::Value* code_addr =
+ EmitLoadCodeAddr(callee_method_object_addr, callee_method_idx, false);
+#else
+ // TODO: Remove this after we solve the link and trampoline related problems.
+ callee_method_object_addr = EmitEnsureResolved(callee_method_object_addr,
+ method_object_addr,
callee_method_idx,
- false,
- code_addr_);
+ true);
+ EmitGuard_ExceptionLandingPad(dex_pc);
+
+ llvm::Value* code_addr = EmitFixStub(callee_method_object_addr,
+ callee_method_idx,
+ false);
+ EmitGuard_ExceptionLandingPad(dex_pc);
+#endif
// Load actual parameters
std::vector<llvm::Value*> args;
@@ -3087,24 +3073,26 @@
llvm::Value* callee_method_object_field_addr =
EmitLoadDexCacheResolvedMethodFieldAddr(callee_method_idx);
- llvm::Value* callee_method_object_addr_ =
+ llvm::Value* callee_method_object_addr =
irb_.CreateLoad(callee_method_object_field_addr);
- llvm::Value* callee_method_object_addr = EmitEnsureResolved(callee_method_object_addr_,
- EmitLoadMethodObjectAddr(),
- callee_method_idx,
- Instruction::INVOKE_DIRECT);
+#if 0
+ llvm::Value* code_addr =
+ EmitLoadCodeAddr(callee_method_object_addr, callee_method_idx, is_static);
+#else
+ // TODO: Remove this after we solve the link and trampoline related problems.
+ callee_method_object_addr = EmitEnsureResolved(callee_method_object_addr,
+ EmitLoadMethodObjectAddr(),
+ callee_method_idx,
+ false);
+ EmitGuard_ExceptionLandingPad(dex_pc);
- EmitEnsureLink(callee_method_object_addr);
-
- llvm::Value* code_addr_ =
- EmitLoadCodeAddr(callee_method_object_addr, callee_method_idx, is_static);
-
- llvm::Value* code_addr = EmitEnsureInitialized(callee_method_object_addr,
- callee_method_idx,
- is_static,
- code_addr_);
- EmitGuard_ExceptionLandingPad(dex_pc);
+ llvm::Value* code_addr = EmitFixStub(callee_method_object_addr,
+ callee_method_idx,
+ is_static);
+ EmitGuard_ExceptionLandingPad(dex_pc);
+ // FixStub may resolve method, so we need to reload method.
+#endif
// Load the actual parameter
std::vector<llvm::Value*> args;
@@ -3156,26 +3144,22 @@
EmitUpdateLineNumFromDexPC(dex_pc);
- llvm::Value* callee_method_object_addr_ =
+ llvm::Value* callee_method_object_addr =
irb_.CreateCall3(runtime_func,
callee_method_idx_value, this_addr, method_object_addr);
EmitGuard_ExceptionLandingPad(dex_pc);
- llvm::Value* callee_method_object_addr = EmitEnsureResolved(callee_method_object_addr_,
- method_object_addr,
- callee_method_idx,
- Instruction::INVOKE_INTERFACE);
-
- EmitEnsureLink(callee_method_object_addr);
-
- llvm::Value* code_addr_ =
+#if 0
+ llvm::Value* code_addr =
EmitLoadCodeAddr(callee_method_object_addr, callee_method_idx, false);
-
- llvm::Value* code_addr = EmitEnsureInitialized(callee_method_object_addr,
- callee_method_idx,
- false,
- code_addr_);
+#else
+ // TODO: Remove this after we solve the link and trampoline related problems.
+ llvm::Value* code_addr = EmitFixStub(callee_method_object_addr,
+ callee_method_idx,
+ false);
+ EmitGuard_ExceptionLandingPad(dex_pc);
+#endif
// Load the actual parameter
std::vector<llvm::Value*> args;