48 enum class C1StubId :int {
49 NO_STUBID = -1,
50 C1_STUBS_DO(C1_STUB_ID_ENUM_DECLARE)
51 NUM_STUBIDS
52 };
53 #undef C1_STUB_ID_ENUM_DECLARE
54
55 class Runtime1: public AllStatic {
56 friend class ArrayCopyStub;
57 friend class AOTCodeAddressTable;
58
59 public:
60 // statistics
61 #ifndef PRODUCT
62 static uint _generic_arraycopystub_cnt;
63 static uint _arraycopy_slowcase_cnt;
64 static uint _arraycopy_checkcast_cnt;
65 static uint _arraycopy_checkcast_attempt_cnt;
66 static uint _new_type_array_slowcase_cnt;
67 static uint _new_object_array_slowcase_cnt;
68 static uint _new_instance_slowcase_cnt;
69 static uint _new_multi_array_slowcase_cnt;
70 static uint _monitorenter_slowcase_cnt;
71 static uint _monitorexit_slowcase_cnt;
72 static uint _patch_code_slowcase_cnt;
73 static uint _throw_range_check_exception_count;
74 static uint _throw_index_exception_count;
75 static uint _throw_div0_exception_count;
76 static uint _throw_null_pointer_exception_count;
77 static uint _throw_class_cast_exception_count;
78 static uint _throw_incompatible_class_change_error_count;
79 static uint _throw_count;
80 #endif
81
82 private:
83 static CodeBlob* _blobs[(int)C1StubId::NUM_STUBIDS];
84 static const char* _blob_names[];
85
86 // stub generation
87 public:
88 static CodeBlob* generate_blob(BufferBlob* buffer_blob, C1StubId id, const char* name, bool expect_oop_map, StubAssemblerCodeGenClosure *cl);
89 static bool generate_blob_for(BufferBlob* blob, C1StubId id);
90 static OopMapSet* generate_code_for(C1StubId id, StubAssembler* sasm);
91 private:
92 static OopMapSet* generate_exception_throw(StubAssembler* sasm, address target, bool has_argument);
93 static OopMapSet* generate_handle_exception(C1StubId id, StubAssembler* sasm);
94 static void generate_unwind_exception(StubAssembler *sasm);
95 static OopMapSet* generate_patching(StubAssembler* sasm, address target);
96
97 static OopMapSet* generate_stub_call(StubAssembler* sasm, Register result, address entry,
98 Register arg1 = noreg, Register arg2 = noreg, Register arg3 = noreg);
99
100 // runtime entry points
101 static void new_instance (JavaThread* current, Klass* klass);
102 static void new_type_array (JavaThread* current, Klass* klass, jint length);
103 static void new_object_array(JavaThread* current, Klass* klass, jint length);
104 static void new_multi_array (JavaThread* current, Klass* klass, int rank, jint* dims);
105
106 static address counter_overflow(JavaThread* current, int bci, Method* method);
107
108 static void unimplemented_entry(JavaThread* current, C1StubId id);
109
110 static address exception_handler_for_pc(JavaThread* current);
111
112 static void throw_range_check_exception(JavaThread* current, int index, arrayOopDesc* a);
113 static void throw_index_exception(JavaThread* current, int index);
114 static void throw_div0_exception(JavaThread* current);
115 static void throw_null_pointer_exception(JavaThread* current);
116 static void throw_class_cast_exception(JavaThread* current, oopDesc* object);
117 static void throw_incompatible_class_change_error(JavaThread* current);
118 static void throw_array_store_exception(JavaThread* current, oopDesc* object);
119
120 static void monitorenter(JavaThread* current, oopDesc* obj, BasicObjectLock* lock);
121 static void monitorexit (JavaThread* current, BasicObjectLock* lock);
122
123 static void deoptimize(JavaThread* current, jint trap_request);
124
125 static int access_field_patching(JavaThread* current);
126 static int move_klass_patching(JavaThread* current);
127 static int move_mirror_patching(JavaThread* current);
128 static int move_appendix_patching(JavaThread* current);
129
130 static void patch_code(JavaThread* current, C1StubId stub_id);
131
132 public:
133 // initialization
134 static bool initialize(BufferBlob* blob);
135 static void initialize_pd();
136
137 // return offset in words
|
48 enum class C1StubId :int {
49 NO_STUBID = -1,
50 C1_STUBS_DO(C1_STUB_ID_ENUM_DECLARE)
51 NUM_STUBIDS
52 };
53 #undef C1_STUB_ID_ENUM_DECLARE
54
55 class Runtime1: public AllStatic {
56 friend class ArrayCopyStub;
57 friend class AOTCodeAddressTable;
58
59 public:
60 // statistics
61 #ifndef PRODUCT
62 static uint _generic_arraycopystub_cnt;
63 static uint _arraycopy_slowcase_cnt;
64 static uint _arraycopy_checkcast_cnt;
65 static uint _arraycopy_checkcast_attempt_cnt;
66 static uint _new_type_array_slowcase_cnt;
67 static uint _new_object_array_slowcase_cnt;
68 static uint _new_null_free_array_slowcase_cnt;
69 static uint _new_instance_slowcase_cnt;
70 static uint _new_multi_array_slowcase_cnt;
71 static uint _load_flat_array_slowcase_cnt;
72 static uint _store_flat_array_slowcase_cnt;
73 static uint _substitutability_check_slowcase_cnt;
74 static uint _buffer_inline_args_slowcase_cnt;
75 static uint _buffer_inline_args_no_receiver_slowcase_cnt;
76 static uint _monitorenter_slowcase_cnt;
77 static uint _monitorexit_slowcase_cnt;
78 static uint _patch_code_slowcase_cnt;
79 static uint _throw_range_check_exception_count;
80 static uint _throw_index_exception_count;
81 static uint _throw_div0_exception_count;
82 static uint _throw_null_pointer_exception_count;
83 static uint _throw_class_cast_exception_count;
84 static uint _throw_incompatible_class_change_error_count;
85 static uint _throw_illegal_monitor_state_exception_count;
86 static uint _throw_identity_exception_count;
87 static uint _throw_count;
88 #endif
89
90 private:
91 static CodeBlob* _blobs[(int)C1StubId::NUM_STUBIDS];
92 static const char* _blob_names[];
93 static void buffer_inline_args_impl(JavaThread* current, Method* m, bool allocate_receiver);
94
95 // stub generation
96 public:
97 static CodeBlob* generate_blob(BufferBlob* buffer_blob, C1StubId id, const char* name, bool expect_oop_map, StubAssemblerCodeGenClosure *cl);
98 static bool generate_blob_for(BufferBlob* blob, C1StubId id);
99 static OopMapSet* generate_code_for(C1StubId id, StubAssembler* sasm);
100 private:
101 static OopMapSet* generate_exception_throw(StubAssembler* sasm, address target, bool has_argument);
102 static OopMapSet* generate_handle_exception(C1StubId id, StubAssembler* sasm);
103 static void generate_unwind_exception(StubAssembler *sasm);
104 static OopMapSet* generate_patching(StubAssembler* sasm, address target);
105
106 static OopMapSet* generate_stub_call(StubAssembler* sasm, Register result, address entry,
107 Register arg1 = noreg, Register arg2 = noreg, Register arg3 = noreg);
108
109 // runtime entry points
110 static void new_instance (JavaThread* current, Klass* klass);
111 static void new_instance_no_inline(JavaThread* current, Klass* klass);
112 static void new_type_array (JavaThread* current, Klass* klass, jint length);
113 static void new_object_array(JavaThread* current, Klass* klass, jint length);
114 static void new_null_free_array(JavaThread* current, Klass* klass, jint length);
115 static void new_multi_array (JavaThread* current, Klass* klass, int rank, jint* dims);
116 static void load_flat_array(JavaThread* current, flatArrayOopDesc* array, int index);
117 static void store_flat_array(JavaThread* current, flatArrayOopDesc* array, int index, oopDesc* value);
118 static int substitutability_check(JavaThread* current, oopDesc* left, oopDesc* right);
119 static void buffer_inline_args(JavaThread* current, Method* method);
120 static void buffer_inline_args_no_receiver(JavaThread* current, Method* method);
121
122 static address counter_overflow(JavaThread* current, int bci, Method* method);
123
124 static void unimplemented_entry(JavaThread* current, C1StubId id);
125
126 static address exception_handler_for_pc(JavaThread* current);
127
128 static void throw_range_check_exception(JavaThread* current, int index, arrayOopDesc* a);
129 static void throw_index_exception(JavaThread* current, int index);
130 static void throw_div0_exception(JavaThread* current);
131 static void throw_null_pointer_exception(JavaThread* current);
132 static void throw_class_cast_exception(JavaThread* current, oopDesc* object);
133 static void throw_incompatible_class_change_error(JavaThread* current);
134 static void throw_illegal_monitor_state_exception(JavaThread* current);
135 static void throw_identity_exception(JavaThread* current, oopDesc* object);
136 static void throw_array_store_exception(JavaThread* current, oopDesc* object);
137
138 static void monitorenter(JavaThread* current, oopDesc* obj, BasicObjectLock* lock);
139 static void monitorexit (JavaThread* current, BasicObjectLock* lock);
140
141 static void deoptimize(JavaThread* current, jint trap_request);
142
143 static int access_field_patching(JavaThread* current);
144 static int move_klass_patching(JavaThread* current);
145 static int move_mirror_patching(JavaThread* current);
146 static int move_appendix_patching(JavaThread* current);
147
148 static void patch_code(JavaThread* current, C1StubId stub_id);
149
150 public:
151 // initialization
152 static bool initialize(BufferBlob* blob);
153 static void initialize_pd();
154
155 // return offset in words
|