blob: d05ece0b9690629a61419c6d71f7fe60a8fee840 [file] [log] [blame]
buzbee54330722011-08-23 16:46:55 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#ifndef ART_SRC_RUNTIME_SUPPORT_H_
4#define ART_SRC_RUNTIME_SUPPORT_H_
5
Shih-wei Liao2d831012011-09-28 22:06:53 -07006#include "class_linker.h"
7#include "object.h"
8#include "thread_list.h"
9#include "utils.h"
10
11namespace art {
12
Ian Rogersce9eca62011-10-07 17:11:03 -070013extern Array* CheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count,
14 Thread* self);
Shih-wei Liao2d831012011-09-28 22:06:53 -070015extern void DebugMe(Method* method, uint32_t info);
16extern Object* DecodeJObjectInThread(Thread* thread, jobject obj);
Ian Rogersce9eca62011-10-07 17:11:03 -070017extern Field* FindFieldFromCode(uint32_t field_idx, const Method* referrer, bool is_static);
Shih-wei Liao2d831012011-09-28 22:06:53 -070018extern void* FindNativeMethod(Thread* thread);
19extern void ThrowAbstractMethodErrorFromCode(Method* method, Thread* thread, Method** sp);
Ian Rogers1cb0a1d2011-10-06 15:24:35 -070020void* UnresolvedDirectMethodTrampolineFromCode(int32_t, void*, Thread*, Runtime::TrampolineType);
Ian Rogersce9eca62011-10-07 17:11:03 -070021extern Class* InitializeStaticStorage(uint32_t type_idx, const Method* referrer, Thread* self);
Shih-wei Liao2d831012011-09-28 22:06:53 -070022extern Class* InitializeTypeFromCode(uint32_t type_idx, Method* method);
23extern void ResolveMethodFromCode(Method* method, uint32_t method_idx);
24extern void LockObjectFromCode(Thread* thread, Object* obj);
Ian Rogers4f0d07c2011-10-06 23:38:47 -070025extern "C" void artCheckSuspendFromJni(Thread* thread);
Shih-wei Liao2d831012011-09-28 22:06:53 -070026extern int64_t D2L(double d);
27extern int64_t F2L(float f);
28
29} // namespace art
Ian Rogersad42e132011-09-17 20:23:33 -070030/* Helper for both JNI and regular compiled code */
Ian Rogersff1ed472011-09-20 13:46:24 -070031extern "C" void art_deliver_exception_from_code(void*);
Ian Rogersad42e132011-09-17 20:23:33 -070032
buzbee54330722011-08-23 16:46:55 -070033#if defined(__arm__)
buzbee7b1b86d2011-08-26 18:59:10 -070034 /* Compiler helpers */
Ian Rogers21d9e832011-09-23 17:05:09 -070035 extern "C" void* art_alloc_object_from_code(uint32_t type_idx, void* method);
Elliott Hughesb408de72011-10-04 14:35:05 -070036 extern "C" void* art_alloc_array_from_code(uint32_t, void*, int32_t);
37 extern "C" void* art_check_and_alloc_array_from_code(uint32_t, void*, int32_t);
Ian Rogerse51a5112011-09-23 14:16:35 -070038 extern "C" void art_can_put_array_element_from_code(void*, void*);
Ian Rogersff1ed472011-09-20 13:46:24 -070039 extern "C" void art_check_cast_from_code(void*, void*);
Ian Rogersce9eca62011-10-07 17:11:03 -070040 extern "C" void* art_find_instance_field_from_code(uint32_t, void*);
41 extern "C" void* art_find_static_field_from_code(uint32_t, void*);
42 extern "C" int32_t art_get32_static_from_code(uint32_t, void*);
43 extern "C" int64_t art_get64_static_from_code(uint32_t, void*);
44 extern "C" void* art_get_obj_static_from_code(uint32_t, void*);
Ian Rogersff1ed472011-09-20 13:46:24 -070045 extern "C" void art_handle_fill_data_from_code(void*, void*);
Ian Rogerscbba6ac2011-09-22 16:28:37 -070046 extern "C" void* art_initialize_static_storage_from_code(uint32_t, void*);
Ian Rogers4f0d07c2011-10-06 23:38:47 -070047 extern "C" void art_invoke_interface_trampoline(uint32_t, void*);
Ian Rogersce9eca62011-10-07 17:11:03 -070048 extern "C" int art_set32_static_from_code(uint32_t, void*, int32_t);
49 extern "C" int art_set64_static_from_code(uint32_t, void*, int64_t);
50 extern "C" int art_set_obj_static_from_code(uint32_t, void*, void*);
Ian Rogerscbba6ac2011-09-22 16:28:37 -070051 extern "C" void art_test_suspend();
Ian Rogersff1ed472011-09-20 13:46:24 -070052 extern "C" void art_throw_array_bounds_from_code(int32_t index, int32_t limit);
53 extern "C" void art_throw_div_zero_from_code();
Ian Rogersc0c8dc82011-09-24 18:15:59 -070054 extern "C" void art_throw_neg_array_size_from_code(int32_t size);
55 extern "C" void art_throw_no_such_method_from_code(int32_t method_idx);
Ian Rogersff1ed472011-09-20 13:46:24 -070056 extern "C" void art_throw_null_pointer_exception_from_code();
Ian Rogers932746a2011-09-22 18:57:50 -070057 extern "C" void art_throw_stack_overflow_from_code(void*);
Ian Rogersc0c8dc82011-09-24 18:15:59 -070058 extern "C" void art_throw_verification_error_from_code(int32_t src1, int32_t ref);
Ian Rogers4f0d07c2011-10-06 23:38:47 -070059 extern "C" void art_lock_object_from_code(void*);
60 extern "C" void art_unlock_object_from_code(void*);
buzbee7b1b86d2011-08-26 18:59:10 -070061
62 /* Conversions */
63 extern "C" float __aeabi_i2f(int op1); // OP_INT_TO_FLOAT
64 extern "C" int __aeabi_f2iz(float op1); // OP_FLOAT_TO_INT
65 extern "C" float __aeabi_d2f(double op1); // OP_DOUBLE_TO_FLOAT
66 extern "C" double __aeabi_f2d(float op1); // OP_FLOAT_TO_DOUBLE
67 extern "C" double __aeabi_i2d(int op1); // OP_INT_TO_DOUBLE
68 extern "C" int __aeabi_d2iz(double op1); // OP_DOUBLE_TO_INT
69 extern "C" float __aeabi_l2f(long op1); // OP_LONG_TO_FLOAT
70 extern "C" double __aeabi_l2d(long op1); // OP_LONG_TO_DOUBLE
71
72 /* Single-precision FP arithmetics */
73 extern "C" float __aeabi_fadd(float a, float b); // OP_ADD_FLOAT[_2ADDR]
74 extern "C" float __aeabi_fsub(float a, float b); // OP_SUB_FLOAT[_2ADDR]
75 extern "C" float __aeabi_fdiv(float a, float b); // OP_DIV_FLOAT[_2ADDR]
76 extern "C" float __aeabi_fmul(float a, float b); // OP_MUL_FLOAT[_2ADDR]
77 extern "C" float fmodf(float a, float b); // OP_REM_FLOAT[_2ADDR]
78
79 /* Double-precision FP arithmetics */
80 extern "C" double __aeabi_dadd(double a, double b); // OP_ADD_DOUBLE[_2ADDR]
81 extern "C" double __aeabi_dsub(double a, double b); // OP_SUB_DOUBLE[_2ADDR]
82 extern "C" double __aeabi_ddiv(double a, double b); // OP_DIV_DOUBLE[_2ADDR]
83 extern "C" double __aeabi_dmul(double a, double b); // OP_MUL_DOUBLE[_2ADDR]
84 extern "C" double fmod(double a, double b); // OP_REM_DOUBLE[_2ADDR]
85
86 /* Integer arithmetics */
87 extern "C" int __aeabi_idivmod(int op1, int op2); // OP_REM_INT[_2ADDR|_LIT8|_LIT16]
88 extern "C" int __aeabi_idiv(int op1, int op2); // OP_DIV_INT[_2ADDR|_LIT8|_LIT16]
89
Ian Rogersff1ed472011-09-20 13:46:24 -070090 /* Long long arithmetics - OP_REM_LONG[_2ADDR] & OP_DIV_LONG[_2ADDR] */
91 extern "C" long long __aeabi_ldivmod(long long op1, long long op2);
92 extern "C" long long __aeabi_lmul(long long op1, long long op2);
Ian Rogerscbba6ac2011-09-22 16:28:37 -070093 extern "C" uint64_t art_shl_long(uint64_t, uint32_t);
94 extern "C" uint64_t art_shr_long(uint64_t, uint32_t);
95 extern "C" uint64_t art_ushr_long(uint64_t, uint32_t);
buzbee7b1b86d2011-08-26 18:59:10 -070096
buzbee54330722011-08-23 16:46:55 -070097#endif
98
buzbee54330722011-08-23 16:46:55 -070099#endif // ART_SRC_RUNTIME_SUPPORT_H_