| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ART_SRC_RUNTIME_SUPPORT_H_ |
| #define ART_SRC_RUNTIME_SUPPORT_H_ |
| |
| #include "class_linker.h" |
| #include "object.h" |
| #include "thread_list.h" |
| #include "utils.h" |
| |
| namespace art { |
| |
| extern void CheckSuspendFromCode(Thread* thread); |
| extern Array* CheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count, |
| Thread* self, bool access_check); |
| extern void DebugMe(Method* method, uint32_t info); |
| extern void UpdateDebuggerFromCode(Method* method, Thread* thread , int32_t dex_pc, Method** sp); |
| extern Object* DecodeJObjectInThread(Thread* thread, jobject obj); |
| extern Field* FindFieldFromCode(uint32_t field_idx, const Method* referrer, Thread* self, |
| bool is_static, bool is_primitive, bool is_set, size_t expected_size); |
| extern void* FindNativeMethod(Thread* thread); |
| extern void ThrowAbstractMethodErrorFromCode(Method* method, Thread* thread, Method** sp); |
| const void* UnresolvedDirectMethodTrampolineFromCode(Method*, Method**, Thread*, |
| Runtime::TrampolineType); |
| extern Class* ResolveVerifyAndClinit(uint32_t type_idx, const Method* referrer, Thread* self, |
| bool can_run_clinit, bool verify_access); |
| extern Class* InitializeTypeFromCode(uint32_t type_idx, Method* method); |
| uint32_t IsAssignableFromCode(const Class* klass, const Class* ref_class); |
| void ObjectInitFromCode(Object* o); |
| extern void LockObjectFromCode(Thread* thread, Object* obj); |
| uint32_t TraceMethodUnwindFromCode(Thread* self); |
| extern int CmpgDouble(double a, double b); |
| extern int CmplDouble(double a, double b); |
| extern int CmpgFloat(float a, float b); |
| extern int CmplFloat(float a, float b); |
| extern int64_t D2L(double d); |
| extern int64_t F2L(float f); |
| |
| } // namespace art |
| /* Helper for both JNI and regular compiled code */ |
| extern "C" void art_deliver_exception_from_code(void*); |
| |
| extern "C" void art_proxy_invoke_handler(); |
| |
| #if defined(__arm__) |
| /* Compiler helpers */ |
| extern "C" int32_t art_get32_static_from_code(uint32_t); |
| extern "C" int64_t art_get64_static_from_code(uint32_t); |
| extern "C" void* art_get_obj_static_from_code(uint32_t); |
| extern "C" int32_t art_get32_instance_from_code(uint32_t, void*); |
| extern "C" int64_t art_get64_instance_from_code(uint32_t, void*); |
| extern "C" void* art_get_obj_instance_from_code(uint32_t, void*); |
| extern "C" int art_set32_static_from_code(uint32_t, int32_t); |
| extern "C" int art_set64_static_from_code(uint32_t, int64_t); |
| extern "C" int art_set_obj_static_from_code(uint32_t, void*); |
| extern "C" int art_set32_instance_from_code(uint32_t, void*, int32_t); |
| extern "C" int art_set64_instance_from_code(uint32_t, void*, int64_t); |
| extern "C" int art_set_obj_instance_from_code(uint32_t, void*, void*); |
| extern "C" void art_can_put_array_element_from_code(void*, void*); |
| extern "C" void art_check_cast_from_code(void*, void*); |
| extern "C" void art_do_long_jump(uint32_t*, uint32_t*); |
| extern "C" void art_handle_fill_data_from_code(void*, void*); |
| extern "C" void art_invoke_direct_trampoline_with_access_check(uint32_t, void*); |
| extern "C" void art_invoke_interface_trampoline(uint32_t, void*); |
| extern "C" void art_invoke_interface_trampoline_with_access_check(uint32_t, void*); |
| extern "C" void art_invoke_static_trampoline_with_access_check(uint32_t, void*); |
| extern "C" void art_invoke_super_trampoline_with_access_check(uint32_t, void*); |
| extern "C" void art_invoke_virtual_trampoline_with_access_check(uint32_t, void*); |
| extern "C" void art_lock_object_from_code(void*); |
| extern "C" void art_test_suspend(); |
| extern "C" void art_throw_array_bounds_from_code(int32_t index, int32_t limit); |
| extern "C" void art_throw_div_zero_from_code(); |
| extern "C" void art_throw_neg_array_size_from_code(int32_t size); |
| extern "C" void art_throw_no_such_method_from_code(int32_t method_idx); |
| extern "C" void art_throw_null_pointer_exception_from_code(); |
| extern "C" void art_throw_stack_overflow_from_code(void*); |
| extern "C" void art_throw_verification_error_from_code(int32_t src1, int32_t ref); |
| extern "C" void art_unlock_object_from_code(void*); |
| extern "C" void* art_alloc_array_from_code(uint32_t, void*, int32_t); |
| extern "C" void* art_alloc_array_from_code_with_access_check(uint32_t, void*, int32_t); |
| extern "C" void* art_alloc_object_from_code(uint32_t type_idx, void* method); |
| extern "C" void* art_alloc_object_from_code_with_access_check(uint32_t type_idx, void* method); |
| extern "C" void* art_check_and_alloc_array_from_code(uint32_t, void*, int32_t); |
| extern "C" void* art_check_and_alloc_array_from_code_with_access_check(uint32_t, void*, int32_t); |
| extern "C" void* art_initialize_static_storage_from_code(uint32_t, void*); |
| extern "C" void* art_initialize_type_from_code(uint32_t, void*); |
| extern "C" void* art_initialize_type_and_verify_access_from_code(uint32_t, void*); |
| extern "C" void art_trace_entry_from_code(void*); |
| extern "C" void art_trace_exit_from_code(); |
| extern "C" void* art_resolve_string_from_code(void*, uint32_t); |
| extern "C" void art_update_debugger(void*, void*, int32_t, void*); |
| extern "C" void art_work_around_app_jni_bugs(); |
| |
| /* Conversions */ |
| extern "C" float __aeabi_i2f(int op1); // INT_TO_FLOAT |
| extern "C" int __aeabi_f2iz(float op1); // FLOAT_TO_INT |
| extern "C" float __aeabi_d2f(double op1); // DOUBLE_TO_FLOAT |
| extern "C" double __aeabi_f2d(float op1); // FLOAT_TO_DOUBLE |
| extern "C" double __aeabi_i2d(int op1); // INT_TO_DOUBLE |
| extern "C" int __aeabi_d2iz(double op1); // DOUBLE_TO_INT |
| extern "C" float __aeabi_l2f(long op1); // LONG_TO_FLOAT |
| extern "C" double __aeabi_l2d(long op1); // LONG_TO_DOUBLE |
| |
| /* Single-precision FP arithmetics */ |
| extern "C" float __aeabi_fadd(float a, float b); // ADD_FLOAT[_2ADDR] |
| extern "C" float __aeabi_fsub(float a, float b); // SUB_FLOAT[_2ADDR] |
| extern "C" float __aeabi_fdiv(float a, float b); // DIV_FLOAT[_2ADDR] |
| extern "C" float __aeabi_fmul(float a, float b); // MUL_FLOAT[_2ADDR] |
| extern "C" float fmodf(float a, float b); // REM_FLOAT[_2ADDR] |
| |
| /* Double-precision FP arithmetics */ |
| extern "C" double __aeabi_dadd(double a, double b); // ADD_DOUBLE[_2ADDR] |
| extern "C" double __aeabi_dsub(double a, double b); // SUB_DOUBLE[_2ADDR] |
| extern "C" double __aeabi_ddiv(double a, double b); // DIV_DOUBLE[_2ADDR] |
| extern "C" double __aeabi_dmul(double a, double b); // MUL_DOUBLE[_2ADDR] |
| extern "C" double fmod(double a, double b); // REM_DOUBLE[_2ADDR] |
| |
| /* Integer arithmetics */ |
| extern "C" int __aeabi_idivmod(int op1, int op2); // REM_INT[_2ADDR|_LIT8|_LIT16] |
| extern "C" int __aeabi_idiv(int op1, int op2); // DIV_INT[_2ADDR|_LIT8|_LIT16] |
| |
| /* Long long arithmetics - REM_LONG[_2ADDR] and DIV_LONG[_2ADDR] */ |
| extern "C" long long __aeabi_ldivmod(long long op1, long long op2); |
| extern "C" long long __aeabi_lmul(long long op1, long long op2); |
| extern "C" uint64_t art_shl_long(uint64_t, uint32_t); |
| extern "C" uint64_t art_shr_long(uint64_t, uint32_t); |
| extern "C" uint64_t art_ushr_long(uint64_t, uint32_t); |
| |
| #endif |
| |
| #if defined(__mips__) |
| /* Conversions */ |
| extern "C" float __floatsisf(int op1); // INT_TO_FLOAT |
| extern "C" int __fixsfsi(float op1); // FLOAT_TO_INT |
| extern "C" float __truncdfsf2(double op1); // DOUBLE_TO_FLOAT |
| extern "C" double __extendsfdf2(float op1); // FLOAT_TO_DOUBLE |
| extern "C" double __floatsidf(int op1); // INT_TO_DOUBLE |
| extern "C" int __fixdfsi(double op1); // DOUBLE_TO_INT |
| extern "C" float __floatdisf(long long op1); // LONG_TO_FLOAT |
| extern "C" double __floatdidf(long long op1); // LONG_TO_DOUBLE |
| extern "C" long long __fixsfdi(float op1); // FLOAT_TO_LONG |
| extern "C" long long __fixdfdi(double op1); // DOUBLE_TO_LONG |
| |
| /* Single-precision FP arithmetics */ |
| extern "C" float __addsf3(float a, float b); // ADD_FLOAT[_2ADDR] |
| extern "C" float __subsf3(float a, float b); // SUB_FLOAT[_2ADDR] |
| extern "C" float __divsf3(float a, float b); // DIV_FLOAT[_2ADDR] |
| extern "C" float __mulsf3(float a, float b); // MUL_FLOAT[_2ADDR] |
| extern "C" float fmodf(float a, float b); // REM_FLOAT[_2ADDR] |
| |
| /* Double-precision FP arithmetics */ |
| extern "C" double __adddf3(double a, double b); // ADD_DOUBLE[_2ADDR] |
| extern "C" double __subdf3(double a, double b); // SUB_DOUBLE[_2ADDR] |
| extern "C" double __divdf3(double a, double b); // DIV_DOUBLE[_2ADDR] |
| extern "C" double __muldf3(double a, double b); // MUL_DOUBLE[_2ADDR] |
| extern "C" double fmod(double a, double b); // REM_DOUBLE[_2ADDR] |
| |
| /* Long long arithmetics - REM_LONG[_2ADDR] and DIV_LONG[_2ADDR] */ |
| extern "C" long long __divdi3(long long op1, long long op2); |
| extern "C" long long __moddi3(long long op1, long long op2); |
| #endif |
| |
| #endif // ART_SRC_RUNTIME_SUPPORT_H_ |