summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ian Rogers <irogers@google.com> 2013-01-23 14:25:30 -0800
committer Ian Rogers <irogers@google.com> 2013-01-23 14:26:19 -0800
commit948c508b46035d46185f58a72d8cdb3bc269b089 (patch)
tree21e9ce75200076ba759e7ba7ab8db6a0c6338abd
parent7a22fa657b972e8323692368975bc5a7be1cc0f5 (diff)
Fix LLVM build.
Also tidy up get/set_current_thread_from_code with assertions rather than comments. Change-Id: I7e2f348aff9aa61cc0650d630c84c77302f3e91b
-rw-r--r--src/compiler_llvm/runtime_support_llvm.cc102
1 files changed, 40 insertions, 62 deletions
diff --git a/src/compiler_llvm/runtime_support_llvm.cc b/src/compiler_llvm/runtime_support_llvm.cc
index d2ea70f843..d3552e94c4 100644
--- a/src/compiler_llvm/runtime_support_llvm.cc
+++ b/src/compiler_llvm/runtime_support_llvm.cc
@@ -47,24 +47,16 @@ namespace art {
// Thread
//----------------------------------------------------------------------------
-// This is used by other runtime support functions, NOT FROM CODE. The REAL GetCurrentThread is
-// implemented by IRBuilder. (So, ARM can't return R9 in this function.)
-// TODO: Maybe remove these which are implemented by IRBuilder after refactor runtime support.
Thread* art_get_current_thread_from_code() {
-#if defined(__i386__)
- Thread* ptr;
- __asm__ __volatile__("movl %%fs:(%1), %0"
- : "=r"(ptr) // output
- : "r"(THREAD_SELF_OFFSET) // input
- :); // clobber
- return ptr;
-#else
- return Thread::Current();
+#if defined(__arm__) || defined(__i386__)
+ LOG(FATAL) << "UNREACHABLE";
#endif
+ return Thread::Current();
}
void* art_set_current_thread_from_code(void* thread_object_addr) {
- // Nothing to be done.
+ // Hijacked to set r9 on ARM.
+ LOG(FATAL) << "UNREACHABLE";
return NULL;
}
@@ -114,47 +106,37 @@ bool art_is_exception_pending_from_code() {
return false;
}
-void art_throw_div_zero_from_code()
- SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- Thread* thread = art_get_current_thread_from_code();
- thread->ThrowNewException("Ljava/lang/ArithmeticException;",
- "divide by zero");
+void art_throw_div_zero_from_code() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ Thread::Current()->ThrowNewException("Ljava/lang/ArithmeticException;",
+ "divide by zero");
}
void art_throw_array_bounds_from_code(int32_t index, int32_t length)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- Thread* thread = art_get_current_thread_from_code();
- thread->ThrowNewExceptionF("Ljava/lang/ArrayIndexOutOfBoundsException;",
- "length=%d; index=%d", length, index);
+ Thread::Current()->ThrowNewExceptionF("Ljava/lang/ArrayIndexOutOfBoundsException;",
+ "length=%d; index=%d", length, index);
}
void art_throw_no_such_method_from_code(int32_t method_idx)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- Thread* thread = art_get_current_thread_from_code();
- // We need the calling method as context for the method_idx
- AbstractMethod* method = thread->GetCurrentMethod();
+ // We need the calling method as context for the method_idx.
+ AbstractMethod* method = Thread::Current()->GetCurrentMethod();
ThrowNoSuchMethodError(method_idx, method);
}
void art_throw_null_pointer_exception_from_code(uint32_t dex_pc)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- Thread* thread = art_get_current_thread_from_code();
- NthCallerVisitor visitor(thread->GetManagedStack(), thread->GetInstrumentationStack(), 0);
- visitor.WalkStack();
- AbstractMethod* throw_method = visitor.caller;
+ AbstractMethod* throw_method =
+ Thread::Current()->GetManagedStack()->GetTopShadowFrame()->GetMethod();
ThrowNullPointerExceptionFromDexPC(throw_method, dex_pc);
}
-void art_throw_stack_overflow_from_code()
- SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- Thread* thread = art_get_current_thread_from_code();
- ThrowStackOverflowError(thread);
+void art_throw_stack_overflow_from_code() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ ThrowStackOverflowError(Thread::Current());
}
-void art_throw_exception_from_code(Object* exception)
- SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- Thread* thread = art_get_current_thread_from_code();
- thread->DeliverException(static_cast<Throwable*>(exception));
+void art_throw_exception_from_code(Object* exception) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
+ Thread::Current()->DeliverException(static_cast<Throwable*>(exception));
}
void* art_get_and_clear_exception(Thread* self)
@@ -165,11 +147,9 @@ void* art_get_and_clear_exception(Thread* self)
return exception;
}
-int32_t art_find_catch_block_from_code(AbstractMethod* current_method,
- uint32_t ti_offset)
+int32_t art_find_catch_block_from_code(AbstractMethod* current_method, uint32_t ti_offset)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
- Thread* thread = art_get_current_thread_from_code();
- Class* exception_type = thread->GetException()->GetClass();
+ Class* exception_type = Thread::Current()->GetException()->GetClass();
MethodHelper mh(current_method);
const DexFile::CodeItem* code_item = mh.GetCodeItem();
DCHECK_LT(ti_offset, code_item->tries_size_);
@@ -358,7 +338,7 @@ int32_t art_set32_static_from_code(uint32_t field_idx, AbstractMethod* referrer,
field->Set32(field->GetDeclaringClass(), new_value);
return 0;
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
StaticPrimitiveWrite, sizeof(uint32_t));
if (LIKELY(field != NULL)) {
field->Set32(field->GetDeclaringClass(), new_value);
@@ -374,7 +354,7 @@ int32_t art_set64_static_from_code(uint32_t field_idx, AbstractMethod* referrer,
field->Set64(field->GetDeclaringClass(), new_value);
return 0;
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
StaticPrimitiveWrite, sizeof(uint64_t));
if (LIKELY(field != NULL)) {
field->Set64(field->GetDeclaringClass(), new_value);
@@ -390,7 +370,7 @@ int32_t art_set_obj_static_from_code(uint32_t field_idx, AbstractMethod* referre
field->SetObj(field->GetDeclaringClass(), new_value);
return 0;
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
StaticObjectWrite, sizeof(Object*));
if (LIKELY(field != NULL)) {
field->SetObj(field->GetDeclaringClass(), new_value);
@@ -405,7 +385,7 @@ int32_t art_get32_static_from_code(uint32_t field_idx, AbstractMethod* referrer)
if (LIKELY(field != NULL)) {
return field->Get32(field->GetDeclaringClass());
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
StaticPrimitiveRead, sizeof(uint32_t));
if (LIKELY(field != NULL)) {
return field->Get32(field->GetDeclaringClass());
@@ -419,7 +399,7 @@ int64_t art_get64_static_from_code(uint32_t field_idx, AbstractMethod* referrer)
if (LIKELY(field != NULL)) {
return field->Get64(field->GetDeclaringClass());
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
StaticPrimitiveRead, sizeof(uint64_t));
if (LIKELY(field != NULL)) {
return field->Get64(field->GetDeclaringClass());
@@ -433,7 +413,7 @@ Object* art_get_obj_static_from_code(uint32_t field_idx, AbstractMethod* referre
if (LIKELY(field != NULL)) {
return field->GetObj(field->GetDeclaringClass());
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
StaticObjectRead, sizeof(Object*));
if (LIKELY(field != NULL)) {
return field->GetObj(field->GetDeclaringClass());
@@ -449,7 +429,7 @@ int32_t art_set32_instance_from_code(uint32_t field_idx, AbstractMethod* referre
field->Set32(obj, new_value);
return 0;
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
InstancePrimitiveWrite, sizeof(uint32_t));
if (LIKELY(field != NULL)) {
field->Set32(obj, new_value);
@@ -466,7 +446,7 @@ int32_t art_set64_instance_from_code(uint32_t field_idx, AbstractMethod* referre
field->Set64(obj, new_value);
return 0;
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
InstancePrimitiveWrite, sizeof(uint64_t));
if (LIKELY(field != NULL)) {
field->Set64(obj, new_value);
@@ -483,7 +463,7 @@ int32_t art_set_obj_instance_from_code(uint32_t field_idx, AbstractMethod* refer
field->SetObj(obj, new_value);
return 0;
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
InstanceObjectWrite, sizeof(Object*));
if (LIKELY(field != NULL)) {
field->SetObj(obj, new_value);
@@ -498,7 +478,7 @@ int32_t art_get32_instance_from_code(uint32_t field_idx, AbstractMethod* referre
if (LIKELY(field != NULL)) {
return field->Get32(obj);
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
InstancePrimitiveRead, sizeof(uint32_t));
if (LIKELY(field != NULL)) {
return field->Get32(obj);
@@ -512,7 +492,7 @@ int64_t art_get64_instance_from_code(uint32_t field_idx, AbstractMethod* referre
if (LIKELY(field != NULL)) {
return field->Get64(obj);
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
InstancePrimitiveRead, sizeof(uint64_t));
if (LIKELY(field != NULL)) {
return field->Get64(obj);
@@ -526,7 +506,7 @@ Object* art_get_obj_instance_from_code(uint32_t field_idx, AbstractMethod* refer
if (LIKELY(field != NULL)) {
return field->GetObj(obj);
}
- field = FindFieldFromCode(field_idx, referrer, art_get_current_thread_from_code(),
+ field = FindFieldFromCode(field_idx, referrer, Thread::Current(),
InstanceObjectRead, sizeof(Object*));
if (LIKELY(field != NULL)) {
return field->GetObj(obj);
@@ -587,11 +567,10 @@ void art_check_cast_from_code(const Class* dest_type, const Class* src_type)
DCHECK(dest_type->IsClass()) << PrettyClass(dest_type);
DCHECK(src_type->IsClass()) << PrettyClass(src_type);
if (UNLIKELY(!dest_type->IsAssignableFrom(src_type))) {
- Thread* thread = art_get_current_thread_from_code();
- thread->ThrowNewExceptionF("Ljava/lang/ClassCastException;",
- "%s cannot be cast to %s",
- PrettyDescriptor(src_type).c_str(),
- PrettyDescriptor(dest_type).c_str());
+ Thread::Current()->ThrowNewExceptionF("Ljava/lang/ClassCastException;",
+ "%s cannot be cast to %s",
+ PrettyDescriptor(src_type).c_str(),
+ PrettyDescriptor(dest_type).c_str());
}
}
@@ -606,11 +585,10 @@ void art_check_put_array_element_from_code(const Object* element, const Object*
Class* component_type = array_class->GetComponentType();
Class* element_class = element->GetClass();
if (UNLIKELY(!component_type->IsAssignableFrom(element_class))) {
- Thread* thread = art_get_current_thread_from_code();
- thread->ThrowNewExceptionF("Ljava/lang/ArrayStoreException;",
- "%s cannot be stored in an array of type %s",
- PrettyDescriptor(element_class).c_str(),
- PrettyDescriptor(array_class).c_str());
+ Thread::Current()->ThrowNewExceptionF("Ljava/lang/ArrayStoreException;",
+ "%s cannot be stored in an array of type %s",
+ PrettyDescriptor(element_class).c_str(),
+ PrettyDescriptor(array_class).c_str());
}
return;
}