Code cleanup. Full sharpening.
Change-Id: I6e8238f64a6a8fe15f9ff018ab88a9a615282cbf
diff --git a/src/class_linker.cc b/src/class_linker.cc
index f78090b..a904800 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -1362,28 +1362,6 @@
return GetOatMethodFor(method).GetCode();
}
-void ClassLinker::LinkOatCodeFor(Method* method) {
- Class* declaring_class = method->GetDeclaringClass();
- ClassHelper kh(declaring_class);
- const OatFile* oat_file = FindOpenedOatFileForDexFile(kh.GetDexFile());
- if (oat_file != NULL) {
- // NOTE: We have to check the availability of OatFile first. Because
- // GetOatMethodFor(...) will try to find the OatFile and there's
- // an assert in GetOatMethodFor(...). Besides, due to the return
- // type of OatClass::GetOatMethod(...), we can't return a failure value
- // back.
-
- // TODO: Remove this workaround.
- OatFile::OatMethod oat_method = GetOatMethodFor(method);
- if (method->GetCode() == NULL) {
- method->SetCode(oat_method.GetCode());
- }
- if (method->GetInvokeStub() == NULL) {
- method->SetInvokeStub(oat_method.GetInvokeStub());
- }
- }
-}
-
void ClassLinker::FixupStaticTrampolines(Class* klass) {
ClassHelper kh(klass);
const DexFile::ClassDef* dex_class_def = kh.GetClassDef();
@@ -2211,14 +2189,6 @@
size_t num_virtual_methods = methods->GetLength();
klass->SetVirtualMethods(AllocObjectArray<Method>(num_virtual_methods));
for (size_t i = 0; i < num_virtual_methods; ++i) {
-#if defined(ART_USE_LLVM_COMPILER)
- Method* method = methods->Get(i);
- // Ensure link.
- // TODO: Remove this after fixing the link problem by in-place linking.
- if (method->GetCode() == NULL || method->GetInvokeStub() == NULL) {
- Runtime::Current()->GetClassLinker()->LinkOatCodeFor(methods->Get(i));
- }
-#endif
SirtRef<Method> prototype(methods->Get(i));
klass->SetVirtualMethod(i, CreateProxyMethod(klass, prototype));
}
diff --git a/src/class_linker.h b/src/class_linker.h
index 6cf2e14..26ce31e 100644
--- a/src/class_linker.h
+++ b/src/class_linker.h
@@ -277,8 +277,6 @@
// Get the oat code for a method when its class isn't yet initialized
const void* GetOatCodeFor(const Method* method);
- void LinkOatCodeFor(Method* method);
-
// Relocate the OatFiles (ELF images)
void RelocateExecutable();
diff --git a/src/compiler_llvm/art_module.ll b/src/compiler_llvm/art_module.ll
index 457efa2..eb2e1b8 100644
--- a/src/compiler_llvm/art_module.ll
+++ b/src/compiler_llvm/art_module.ll
@@ -172,6 +172,4 @@
declare void @art_mark_gc_card_from_code(%JavaObject*, %JavaObject*)
-declare %JavaObject* @art_fix_stub_from_code(%JavaObject*)
-
declare void @art_proxy_invoke_handler_from_code(%JavaObject*, ...)
diff --git a/src/compiler_llvm/generated/art_module.cc b/src/compiler_llvm/generated/art_module.cc
index 491d1ec..033316d 100644
--- a/src/compiler_llvm/generated/art_module.cc
+++ b/src/compiler_llvm/generated/art_module.cc
@@ -976,17 +976,6 @@
AttrListPtr func_art_mark_gc_card_from_code_PAL;
func_art_mark_gc_card_from_code->setAttributes(func_art_mark_gc_card_from_code_PAL);
-Function* func_art_fix_stub_from_code = mod->getFunction("art_fix_stub_from_code");
-if (!func_art_fix_stub_from_code) {
-func_art_fix_stub_from_code = Function::Create(
- /*Type=*/FuncTy_4,
- /*Linkage=*/GlobalValue::ExternalLinkage,
- /*Name=*/"art_fix_stub_from_code", mod); // (external, no body)
-func_art_fix_stub_from_code->setCallingConv(CallingConv::C);
-}
-AttrListPtr func_art_fix_stub_from_code_PAL;
-func_art_fix_stub_from_code->setAttributes(func_art_fix_stub_from_code_PAL);
-
Function* func_art_proxy_invoke_handler_from_code = mod->getFunction("art_proxy_invoke_handler_from_code");
if (!func_art_proxy_invoke_handler_from_code) {
func_art_proxy_invoke_handler_from_code = Function::Create(
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index 6c3bdb0..13f2327 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -2738,7 +2738,7 @@
// Compute invoke related information for compiler decision
int vtable_idx = -1;
- uintptr_t direct_code = 0; // Currently unused
+ uintptr_t direct_code = 0;
uintptr_t direct_method = 0;
bool is_fast_path = compiler_->
ComputeInvokeInfo(callee_method_idx, oat_compilation_unit_,
@@ -2834,11 +2834,19 @@
}
}
- llvm::Value* code_addr =
- irb_.LoadFromObjectOffset(callee_method_object_addr,
- Method::GetCodeOffset().Int32Value(),
- GetFunctionType(callee_method_idx, is_static)->getPointerTo(),
- kTBAAJRuntime);
+ llvm::Value* code_addr;
+ if (direct_code != 0u &&
+ direct_code != static_cast<uintptr_t>(-1)) {
+ code_addr =
+ irb_.CreateIntToPtr(irb_.getPtrEquivInt(direct_code),
+ GetFunctionType(callee_method_idx, is_static)->getPointerTo());
+ } else {
+ code_addr =
+ irb_.LoadFromObjectOffset(callee_method_object_addr,
+ Method::GetCodeOffset().Int32Value(),
+ GetFunctionType(callee_method_idx, is_static)->getPointerTo(),
+ kTBAAJRuntime);
+ }
// Invoke callee
EmitUpdateDexPC(dex_pc);
diff --git a/src/compiler_llvm/method_compiler.h b/src/compiler_llvm/method_compiler.h
index ec27d96..41c43f0 100644
--- a/src/compiler_llvm/method_compiler.h
+++ b/src/compiler_llvm/method_compiler.h
@@ -201,14 +201,6 @@
void EmitInsn_SPut(GEN_INSN_ARGS, JType field_jty);
// INVOKE instructions
- llvm::Value* EmitFixStub(llvm::Value* callee_method_object_addr,
- uint32_t method_idx,
- bool is_static);
- llvm::Value* EmitEnsureResolved(llvm::Value* callee,
- llvm::Value* caller,
- uint32_t dex_method_idx,
- bool is_virtual);
-
void EmitInsn_Invoke(GEN_INSN_ARGS,
InvokeType invoke_type,
InvokeArgFmt arg_fmt);
diff --git a/src/compiler_llvm/runtime_support_func_list.h b/src/compiler_llvm/runtime_support_func_list.h
index 62729c6..30c6d6b 100644
--- a/src/compiler_llvm/runtime_support_func_list.h
+++ b/src/compiler_llvm/runtime_support_func_list.h
@@ -63,7 +63,6 @@
V(IsExceptionPending, art_is_exception_pending_from_code) \
V(FindCatchBlock, art_find_catch_block_from_code) \
V(MarkGCCard, art_mark_gc_card_from_code) \
- V(FixStub, art_fix_stub_from_code) \
V(ProxyInvokeHandler, art_proxy_invoke_handler_from_code) \
V(DecodeJObjectInThread, art_decode_jobject_in_thread) \
V(art_d2l, art_d2l) \
diff --git a/src/compiler_llvm/runtime_support_llvm.cc b/src/compiler_llvm/runtime_support_llvm.cc
index cfaaea4..155fb7c 100644
--- a/src/compiler_llvm/runtime_support_llvm.cc
+++ b/src/compiler_llvm/runtime_support_llvm.cc
@@ -639,21 +639,6 @@
}
}
-// TODO: This runtime support function is the temporary solution for the link issue.
-// It calls to this function before invoking any function, and this function will check:
-// 1. The code address is 0. -> Link the code by ELFLoader
-// That will solved by in-place linking at image loading.
-const void* art_fix_stub_from_code(Method* called) {
- const void* code = called->GetCode();
- // 1. The code address is 0. -> Link the code by ELFLoader
- if (UNLIKELY(code == NULL)) {
- Runtime::Current()->GetClassLinker()->LinkOatCodeFor(called);
- return called->GetCode();
- }
-
- return code;
-}
-
// Handler for invocation on proxy methods. We create a boxed argument array. And we invoke
// the invocation handler which is a field within the proxy object receiver.
void art_proxy_invoke_handler_from_code(Method* proxy_method, ...) {
diff --git a/src/compiler_llvm/runtime_support_llvm.h b/src/compiler_llvm/runtime_support_llvm.h
index 8ab28c6..dabd88f 100644
--- a/src/compiler_llvm/runtime_support_llvm.h
+++ b/src/compiler_llvm/runtime_support_llvm.h
@@ -63,8 +63,6 @@
void* art_find_runtime_support_func(void* context, char const* name);
-const void* art_fix_stub_from_code(Method* called);
-
} // namespace art
#endif // ART_SRC_COMPILER_LLVM_RUNTIME_SUPPORT_LLVM_H_
diff --git a/src/object.cc b/src/object.cc
index 94e1759..ecaef3b 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -526,14 +526,6 @@
bool have_executable_code = (GetCode() != NULL);
-#if defined(ART_USE_LLVM_COMPILER)
- if (stub == NULL || !have_executable_code) {
- Runtime::Current()->GetClassLinker()->LinkOatCodeFor(const_cast<Method*>(this));
- stub = GetInvokeStub();
- have_executable_code = (GetCode() != NULL);
- }
-#endif
-
if (Runtime::Current()->IsStarted() && have_executable_code && stub != NULL) {
bool log = false;
if (log) {