diff options
author | Andreas Gampe <agampe@google.com> | 2014-12-17 18:43:01 -0800 |
---|---|---|
committer | Andreas Gampe <agampe@google.com> | 2014-12-29 10:52:02 -0800 |
commit | 1cc7dbabd03e0a6c09d68161417a21bd6f9df371 (patch) | |
tree | 8557bdff971e366909351af95a7c8ead82792986 /runtime/entrypoints/quick | |
parent | 5e0a9849d4e353c3726095b65ab07cefce40a636 (diff) | |
download | art-1cc7dbabd03e0a6c09d68161417a21bd6f9df371.tar.gz art-1cc7dbabd03e0a6c09d68161417a21bd6f9df371.tar.bz2 art-1cc7dbabd03e0a6c09d68161417a21bd6f9df371.zip |
ART: Reorder entrypoint argument order
Shuffle the ArtMethod* referrer backwards for easier removal.
Clean up ARM & MIPS assembly code.
Change some macros to make future changes easier.
Change-Id: Ie2862b68bd6e519438e83eecd9e1611df51d7945
Diffstat (limited to 'runtime/entrypoints/quick')
6 files changed, 93 insertions, 70 deletions
diff --git a/runtime/entrypoints/quick/quick_alloc_entrypoints.cc b/runtime/entrypoints/quick/quick_alloc_entrypoints.cc index c0b79b2b6c..1fd1150e0d 100644 --- a/runtime/entrypoints/quick/quick_alloc_entrypoints.cc +++ b/runtime/entrypoints/quick/quick_alloc_entrypoints.cc @@ -114,44 +114,44 @@ extern "C" mirror::Object* artAllocObjectFromCodeWithAccessCheck##suffix##suffix return AllocObjectFromCode<true, instrumented_bool>(type_idx, method, self, allocator_type); \ } \ extern "C" mirror::Array* artAllocArrayFromCode##suffix##suffix2( \ - uint32_t type_idx, mirror::ArtMethod* method, int32_t component_count, Thread* self) \ + uint32_t type_idx, int32_t component_count, mirror::ArtMethod* method, Thread* self) \ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { \ ScopedQuickEntrypointChecks sqec(self); \ - return AllocArrayFromCode<false, instrumented_bool>(type_idx, method, component_count, self, \ + return AllocArrayFromCode<false, instrumented_bool>(type_idx, component_count, method, self, \ allocator_type); \ } \ extern "C" mirror::Array* artAllocArrayFromCodeResolved##suffix##suffix2( \ - mirror::Class* klass, mirror::ArtMethod* method, int32_t component_count, Thread* self) \ + mirror::Class* klass, int32_t component_count, mirror::ArtMethod* method, Thread* self) \ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { \ ScopedQuickEntrypointChecks sqec(self); \ - return AllocArrayFromCodeResolved<false, instrumented_bool>(klass, method, component_count, self, \ + return AllocArrayFromCodeResolved<false, instrumented_bool>(klass, component_count, method, self, \ allocator_type); \ } \ extern "C" mirror::Array* artAllocArrayFromCodeWithAccessCheck##suffix##suffix2( \ - uint32_t type_idx, mirror::ArtMethod* method, int32_t component_count, Thread* self) \ + uint32_t type_idx, int32_t component_count, mirror::ArtMethod* method, Thread* self) \ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { \ ScopedQuickEntrypointChecks sqec(self); \ - return AllocArrayFromCode<true, instrumented_bool>(type_idx, method, component_count, self, \ + return AllocArrayFromCode<true, instrumented_bool>(type_idx, component_count, method, self, \ allocator_type); \ } \ extern "C" mirror::Array* artCheckAndAllocArrayFromCode##suffix##suffix2( \ - uint32_t type_idx, mirror::ArtMethod* method, int32_t component_count, Thread* self) \ + uint32_t type_idx, int32_t component_count, mirror::ArtMethod* method, Thread* self) \ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { \ ScopedQuickEntrypointChecks sqec(self); \ if (!instrumented_bool) { \ - return CheckAndAllocArrayFromCode(type_idx, method, component_count, self, false, allocator_type); \ + return CheckAndAllocArrayFromCode(type_idx, component_count, method, self, false, allocator_type); \ } else { \ - return CheckAndAllocArrayFromCodeInstrumented(type_idx, method, component_count, self, false, allocator_type); \ + return CheckAndAllocArrayFromCodeInstrumented(type_idx, component_count, method, self, false, allocator_type); \ } \ } \ extern "C" mirror::Array* artCheckAndAllocArrayFromCodeWithAccessCheck##suffix##suffix2( \ - uint32_t type_idx, mirror::ArtMethod* method, int32_t component_count, Thread* self) \ + uint32_t type_idx, int32_t component_count, mirror::ArtMethod* method, Thread* self) \ SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { \ ScopedQuickEntrypointChecks sqec(self); \ if (!instrumented_bool) { \ - return CheckAndAllocArrayFromCode(type_idx, method, component_count, self, true, allocator_type); \ + return CheckAndAllocArrayFromCode(type_idx, component_count, method, self, true, allocator_type); \ } else { \ - return CheckAndAllocArrayFromCodeInstrumented(type_idx, method, component_count, self, true, allocator_type); \ + return CheckAndAllocArrayFromCodeInstrumented(type_idx, component_count, method, self, true, allocator_type); \ } \ } @@ -165,24 +165,24 @@ GENERATE_ENTRYPOINTS_FOR_ALLOCATOR(BumpPointer, gc::kAllocatorTypeBumpPointer) GENERATE_ENTRYPOINTS_FOR_ALLOCATOR(TLAB, gc::kAllocatorTypeTLAB) #define GENERATE_ENTRYPOINTS(suffix) \ -extern "C" void* art_quick_alloc_array##suffix(uint32_t, void*, int32_t); \ -extern "C" void* art_quick_alloc_array_resolved##suffix(void* klass, void*, int32_t); \ -extern "C" void* art_quick_alloc_array_with_access_check##suffix(uint32_t, void*, int32_t); \ -extern "C" void* art_quick_alloc_object##suffix(uint32_t type_idx, void* method); \ -extern "C" void* art_quick_alloc_object_resolved##suffix(void* klass, void* method); \ -extern "C" void* art_quick_alloc_object_initialized##suffix(void* klass, void* method); \ -extern "C" void* art_quick_alloc_object_with_access_check##suffix(uint32_t type_idx, void* method); \ -extern "C" void* art_quick_check_and_alloc_array##suffix(uint32_t, void*, int32_t); \ -extern "C" void* art_quick_check_and_alloc_array_with_access_check##suffix(uint32_t, void*, int32_t); \ -extern "C" void* art_quick_alloc_array##suffix##_instrumented(uint32_t, void*, int32_t); \ -extern "C" void* art_quick_alloc_array_resolved##suffix##_instrumented(void* klass, void*, int32_t); \ -extern "C" void* art_quick_alloc_array_with_access_check##suffix##_instrumented(uint32_t, void*, int32_t); \ -extern "C" void* art_quick_alloc_object##suffix##_instrumented(uint32_t type_idx, void* method); \ -extern "C" void* art_quick_alloc_object_resolved##suffix##_instrumented(void* klass, void* method); \ -extern "C" void* art_quick_alloc_object_initialized##suffix##_instrumented(void* klass, void* method); \ -extern "C" void* art_quick_alloc_object_with_access_check##suffix##_instrumented(uint32_t type_idx, void* method); \ -extern "C" void* art_quick_check_and_alloc_array##suffix##_instrumented(uint32_t, void*, int32_t); \ -extern "C" void* art_quick_check_and_alloc_array_with_access_check##suffix##_instrumented(uint32_t, void*, int32_t); \ +extern "C" void* art_quick_alloc_array##suffix(uint32_t, int32_t, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_array_resolved##suffix(mirror::Class* klass, int32_t, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_array_with_access_check##suffix(uint32_t, int32_t, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_object##suffix(uint32_t type_idx, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_object_resolved##suffix(mirror::Class* klass, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_object_initialized##suffix(mirror::Class* klass, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_object_with_access_check##suffix(uint32_t type_idx, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_check_and_alloc_array##suffix(uint32_t, int32_t, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_check_and_alloc_array_with_access_check##suffix(uint32_t, int32_t, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_array##suffix##_instrumented(uint32_t, int32_t, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_array_resolved##suffix##_instrumented(mirror::Class* klass, int32_t, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_array_with_access_check##suffix##_instrumented(uint32_t, int32_t, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_object##suffix##_instrumented(uint32_t type_idx, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_object_resolved##suffix##_instrumented(mirror::Class* klass, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_object_initialized##suffix##_instrumented(mirror::Class* klass, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_alloc_object_with_access_check##suffix##_instrumented(uint32_t type_idx, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_check_and_alloc_array##suffix##_instrumented(uint32_t, int32_t, mirror::ArtMethod* ref); \ +extern "C" void* art_quick_check_and_alloc_array_with_access_check##suffix##_instrumented(uint32_t, int32_t, mirror::ArtMethod* ref); \ void SetQuickAllocEntryPoints##suffix(QuickEntryPoints* qpoints, bool instrumented) { \ if (instrumented) { \ qpoints->pAllocArray = art_quick_alloc_array##suffix##_instrumented; \ diff --git a/runtime/entrypoints/quick/quick_default_externs.h b/runtime/entrypoints/quick/quick_default_externs.h index 7d77721f7b..b7e8d50790 100644 --- a/runtime/entrypoints/quick/quick_default_externs.h +++ b/runtime/entrypoints/quick/quick_default_externs.h @@ -19,16 +19,25 @@ #include <cstdint> +namespace art { +namespace mirror { +class Array; +class ArtMethod; +class Class; +class Object; +} // namespace mirror +} // namespace art + // These are extern declarations of assembly stubs with common names. // Cast entrypoints. -extern "C" void art_quick_check_cast(void*, void*); +extern "C" void art_quick_check_cast(const art::mirror::Class*, const art::mirror::Class*); // DexCache entrypoints. -extern "C" void* art_quick_initialize_static_storage(uint32_t, void*); -extern "C" void* art_quick_initialize_type(uint32_t, void*); -extern "C" void* art_quick_initialize_type_and_verify_access(uint32_t, void*); -extern "C" void* art_quick_resolve_string(void*, uint32_t); +extern "C" void* art_quick_initialize_static_storage(uint32_t, art::mirror::ArtMethod*); +extern "C" void* art_quick_initialize_type(uint32_t, art::mirror::ArtMethod*); +extern "C" void* art_quick_initialize_type_and_verify_access(uint32_t, art::mirror::ArtMethod*); +extern "C" void* art_quick_resolve_string(uint32_t, art::mirror::ArtMethod*); // Field entrypoints. extern "C" int art_quick_set8_instance(uint32_t, void*, int8_t); @@ -57,14 +66,16 @@ extern "C" void* art_quick_get_obj_instance(uint32_t, void*); extern "C" void* art_quick_get_obj_static(uint32_t); // Array entrypoints. -extern "C" void art_quick_aput_obj_with_null_and_bound_check(void*, uint32_t, void*); -extern "C" void art_quick_aput_obj_with_bound_check(void*, uint32_t, void*); -extern "C" void art_quick_aput_obj(void*, uint32_t, void*); +extern "C" void art_quick_aput_obj_with_null_and_bound_check(art::mirror::Array*, int32_t, + art::mirror::Object*); +extern "C" void art_quick_aput_obj_with_bound_check(art::mirror::Array*, int32_t, + art::mirror::Object*); +extern "C" void art_quick_aput_obj(art::mirror::Array*, int32_t, art::mirror::Object*); extern "C" void art_quick_handle_fill_data(void*, void*); // Lock entrypoints. -extern "C" void art_quick_lock_object(void*); -extern "C" void art_quick_unlock_object(void*); +extern "C" void art_quick_lock_object(art::mirror::Object*); +extern "C" void art_quick_unlock_object(art::mirror::Object*); // Math entrypoints. extern "C" int64_t art_quick_d2l(double); @@ -99,7 +110,7 @@ extern "C" void art_quick_invoke_virtual_trampoline_with_access_check(uint32_t, extern "C" void art_quick_test_suspend(); // Throw entrypoints. -extern "C" void art_quick_deliver_exception(void*); +extern "C" void art_quick_deliver_exception(art::mirror::Object*); extern "C" void art_quick_throw_array_bounds(int32_t index, int32_t limit); extern "C" void art_quick_throw_div_zero(); extern "C" void art_quick_throw_no_such_method(int32_t method_idx); diff --git a/runtime/entrypoints/quick/quick_dexcache_entrypoints.cc b/runtime/entrypoints/quick/quick_dexcache_entrypoints.cc index 2e7c8bab43..348495d354 100644 --- a/runtime/entrypoints/quick/quick_dexcache_entrypoints.cc +++ b/runtime/entrypoints/quick/quick_dexcache_entrypoints.cc @@ -55,8 +55,8 @@ extern "C" mirror::Class* artInitializeTypeAndVerifyAccessFromCode(uint32_t type return ResolveVerifyAndClinit(type_idx, referrer, self, false, true); } -extern "C" mirror::String* artResolveStringFromCode(mirror::ArtMethod* referrer, - int32_t string_idx, +extern "C" mirror::String* artResolveStringFromCode(int32_t string_idx, + mirror::ArtMethod* referrer, Thread* self) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { ScopedQuickEntrypointChecks sqec(self); diff --git a/runtime/entrypoints/quick/quick_entrypoints.h b/runtime/entrypoints/quick/quick_entrypoints.h index 8c108a816d..db8c0e3c58 100644 --- a/runtime/entrypoints/quick/quick_entrypoints.h +++ b/runtime/entrypoints/quick/quick_entrypoints.h @@ -28,6 +28,7 @@ namespace art { namespace mirror { +class Array; class ArtMethod; class Class; class Object; diff --git a/runtime/entrypoints/quick/quick_entrypoints_enum.h b/runtime/entrypoints/quick/quick_entrypoints_enum.h index 84158cd8b0..5a95491fbc 100644 --- a/runtime/entrypoints/quick/quick_entrypoints_enum.h +++ b/runtime/entrypoints/quick/quick_entrypoints_enum.h @@ -18,6 +18,7 @@ #define ART_RUNTIME_ENTRYPOINTS_QUICK_QUICK_ENTRYPOINTS_ENUM_H_ #include "quick_entrypoints.h" +#include "quick_entrypoints_enum.h" #include "thread.h" namespace art { @@ -47,10 +48,20 @@ static ThreadOffset<pointer_size> GetThreadOffset(QuickEntrypointEnum trampoline #undef ENTRYPOINT_ENUM }; LOG(FATAL) << "Unexpected trampoline " << static_cast<int>(trampoline); - return ThreadOffset<pointer_size>(-1); + UNREACHABLE(); } -} // namespace art +// Do a check functions to be able to test whether the right signature is used. +template <QuickEntrypointEnum entrypoint, typename... Types> +void CheckEntrypointTypes(); +#define ENTRYPOINT_ENUM(name, ...) \ +template <> inline void CheckEntrypointTypes<kQuick ## name, __VA_ARGS__>() {}; // NOLINT [readability/braces] [4] +#include "quick_entrypoints_list.h" + QUICK_ENTRYPOINT_LIST(ENTRYPOINT_ENUM) +#undef QUICK_ENTRYPOINT_LIST +#undef ENTRYPOINT_ENUM + +} // namespace art #endif // ART_RUNTIME_ENTRYPOINTS_QUICK_QUICK_ENTRYPOINTS_ENUM_H_ diff --git a/runtime/entrypoints/quick/quick_entrypoints_list.h b/runtime/entrypoints/quick/quick_entrypoints_list.h index fbc7913d06..da454f3110 100644 --- a/runtime/entrypoints/quick/quick_entrypoints_list.h +++ b/runtime/entrypoints/quick/quick_entrypoints_list.h @@ -20,23 +20,23 @@ // All quick entrypoints. Format is name, return type, argument types. #define QUICK_ENTRYPOINT_LIST(V) \ - V(AllocArray, void*, uint32_t, void*, int32_t) \ - V(AllocArrayResolved, void*, void*, void*, int32_t) \ - V(AllocArrayWithAccessCheck, void*, uint32_t, void*, int32_t) \ - V(AllocObject, void*, uint32_t, void*) \ - V(AllocObjectResolved, void*, void*, void*) \ - V(AllocObjectInitialized, void*, void*, void*) \ - V(AllocObjectWithAccessCheck, void*, uint32_t, void*) \ - V(CheckAndAllocArray, void*, uint32_t, void*, int32_t) \ - V(CheckAndAllocArrayWithAccessCheck, void*, uint32_t, void*, int32_t) \ + V(AllocArray, void*, uint32_t, int32_t, mirror::ArtMethod*) \ + V(AllocArrayResolved, void*, mirror::Class*, int32_t, mirror::ArtMethod*) \ + V(AllocArrayWithAccessCheck, void*, uint32_t, int32_t, mirror::ArtMethod*) \ + V(AllocObject, void*, uint32_t, mirror::ArtMethod*) \ + V(AllocObjectResolved, void*, mirror::Class*, mirror::ArtMethod*) \ + V(AllocObjectInitialized, void*, mirror::Class*, mirror::ArtMethod*) \ + V(AllocObjectWithAccessCheck, void*, uint32_t, mirror::ArtMethod*) \ + V(CheckAndAllocArray, void*, uint32_t, int32_t, mirror::ArtMethod*) \ + V(CheckAndAllocArrayWithAccessCheck, void*, uint32_t, int32_t, mirror::ArtMethod*) \ \ V(InstanceofNonTrivial, uint32_t, const mirror::Class*, const mirror::Class*) \ - V(CheckCast, void , void*, void*) \ + V(CheckCast, void, const mirror::Class*, const mirror::Class*) \ \ - V(InitializeStaticStorage, void*, uint32_t, void*) \ - V(InitializeTypeAndVerifyAccess, void*, uint32_t, void*) \ - V(InitializeType, void*, uint32_t, void*) \ - V(ResolveString, void*, void*, uint32_t) \ + V(InitializeStaticStorage, void*, uint32_t, mirror::ArtMethod*) \ + V(InitializeTypeAndVerifyAccess, void*, uint32_t, mirror::ArtMethod*) \ + V(InitializeType, void*, uint32_t, mirror::ArtMethod*) \ + V(ResolveString, void*, uint32_t, mirror::ArtMethod*) \ \ V(Set8Instance, int, uint32_t, void*, int8_t) \ V(Set8Static, int, uint32_t, int8_t) \ @@ -63,21 +63,21 @@ V(GetObjInstance, void*, uint32_t, void*) \ V(GetObjStatic, void*, uint32_t) \ \ - V(AputObjectWithNullAndBoundCheck, void, void*, uint32_t, void*) \ - V(AputObjectWithBoundCheck, void, void*, uint32_t, void*) \ - V(AputObject, void, void*, uint32_t, void*) \ + V(AputObjectWithNullAndBoundCheck, void, mirror::Array*, int32_t, mirror::Object*) \ + V(AputObjectWithBoundCheck, void, mirror::Array*, int32_t, mirror::Object*) \ + V(AputObject, void, mirror::Array*, int32_t, mirror::Object*) \ V(HandleFillArrayData, void, void*, void*) \ \ V(JniMethodStart, uint32_t, Thread*) \ - V(JniMethodStartSynchronized, uint32_t, jobject to_lock, Thread* self) \ - V(JniMethodEnd, void, uint32_t cookie, Thread* self) \ - V(JniMethodEndSynchronized, void, uint32_t cookie, jobject locked, Thread* self) \ - V(JniMethodEndWithReference, mirror::Object*, jobject result, uint32_t cookie, Thread* self) \ - V(JniMethodEndWithReferenceSynchronized, mirror::Object*, jobject result, uint32_t cookie, jobject locked, Thread* self) \ + V(JniMethodStartSynchronized, uint32_t, jobject, Thread*) \ + V(JniMethodEnd, void, uint32_t, Thread*) \ + V(JniMethodEndSynchronized, void, uint32_t, jobject, Thread*) \ + V(JniMethodEndWithReference, mirror::Object*, jobject, uint32_t, Thread*) \ + V(JniMethodEndWithReferenceSynchronized, mirror::Object*, jobject, uint32_t, jobject, Thread*) \ V(QuickGenericJniTrampoline, void, mirror::ArtMethod*) \ \ - V(LockObject, void, void*) \ - V(UnlockObject, void, void*) \ + V(LockObject, void, mirror::Object*) \ + V(UnlockObject, void, mirror::Object*) \ \ V(CmpgDouble, int32_t, double, double) \ V(CmpgFloat, int32_t, float, float) \ @@ -114,7 +114,7 @@ \ V(TestSuspend, void, void) \ \ - V(DeliverException, void, void*) \ + V(DeliverException, void, mirror::Object*) \ V(ThrowArrayBounds, void, int32_t, int32_t) \ V(ThrowDivZero, void, void) \ V(ThrowNoSuchMethod, void, int32_t) \ |