1 /*
2 * Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 #include "classfile/javaClasses.inline.hpp"
25 #include "code/compiledIC.hpp"
26 #include "compiler/compileBroker.hpp"
27 #include "compiler/compilerThread.hpp"
28 #include "compiler/oopMap.hpp"
29 #include "gc/shared/barrierSetNMethod.hpp"
30 #include "jvmci/jvmciCodeInstaller.hpp"
31 #include "jvmci/jvmciCompilerToVM.hpp"
32 #include "jvmci/jvmciRuntime.hpp"
33 #include "memory/universe.hpp"
34 #include "oops/compressedKlass.inline.hpp"
35 #include "oops/klass.inline.hpp"
36 #include "prims/jvmtiExport.hpp"
37 #include "prims/methodHandles.hpp"
38 #include "runtime/arguments.hpp"
39 #include "runtime/interfaceSupport.inline.hpp"
40 #include "runtime/jniHandles.inline.hpp"
41 #include "runtime/os.hpp"
42 #include "runtime/sharedRuntime.hpp"
43 #include "utilities/align.hpp"
44
45 // frequently used constants
46 // Allocate them with new so they are never destroyed (otherwise, a
47 // forced exit could destroy these objects while they are still in
48 // use).
49 ConstantOopWriteValue* CodeInstaller::_oop_null_scope_value = new (mtJVMCI) ConstantOopWriteValue(nullptr);
50 ConstantIntValue* CodeInstaller::_int_m1_scope_value = new (mtJVMCI) ConstantIntValue(-1);
51 ConstantIntValue* CodeInstaller::_int_0_scope_value = new (mtJVMCI) ConstantIntValue((jint)0);
52 ConstantIntValue* CodeInstaller::_int_1_scope_value = new (mtJVMCI) ConstantIntValue(1);
53 ConstantIntValue* CodeInstaller::_int_2_scope_value = new (mtJVMCI) ConstantIntValue(2);
54 LocationValue* CodeInstaller::_illegal_value = new (mtJVMCI) LocationValue(Location());
55 MarkerValue* CodeInstaller::_virtual_byte_array_marker = new (mtJVMCI) MarkerValue();
56
57 static bool is_set(u1 flags, u1 bit) {
58 return flags & bit;
59 }
60
61 oop HotSpotCompiledCodeStream::get_oop(int id, JVMCI_TRAPS) const {
62 if (_object_pool.is_null()) {
63 JVMCI_ERROR_NULL("object pool is null%s", context());
64 }
65 if (!_object_pool.is_null() && 0 <= id && id < _object_pool->length()) {
66 return _object_pool->obj_at(id);
67 }
68 JVMCI_ERROR_NULL("unknown direct object id %d%s", id, context());
69 }
70
71 u4 HotSpotCompiledCodeStream::offset() const {
72 u4 res = 0;
73 for (Chunk* c = _head; c != nullptr; c = c->next()) {
74 if (c == _chunk) {
75 res += _pos - c->data();
76 break;
77 } else {
78 res += c->size();
79 }
80 }
81 return res;
82 }
83
84 bool HotSpotCompiledCodeStream::available() const {
85 u4 rem = _chunk->data_end() - _pos;
86 for (Chunk* c = _chunk->next(); c != nullptr; c = c->next()) {
87 rem += c->size();
88 }
89 return rem;
90 }
91
92 void HotSpotCompiledCodeStream::dump_buffer(outputStream* st) const {
93 st->print_cr("HotSpotCompiledCode stream for %s:", code_desc());
94 int chunk_index = 0;
95 for (Chunk* c = _head; c != nullptr; c = c->next()) {
96 const u1* data = c->data();
97 const u1* data_end = c->data_end();
98
99 int to_dump = data_end - data;
100 st->print_cr("# chunk %d, %d bytes", chunk_index, to_dump);
101 st->print_data((void*) data, to_dump, true, false);
102 chunk_index++;
103 }
104 }
105
106 void HotSpotCompiledCodeStream::dump_buffer_tail(int len, outputStream* st) const {
107 const u1* start;
108 int avail = _pos - _chunk->data();
109 if (len >= avail) {
110 len = avail;
111 start = _chunk->data();
112 } else {
113 start = _pos - len;
114
115 // Ensure start is 16-byte aligned wrt chunk start
116 int start_offset = start - _chunk->data();
117 start -= (start_offset % 16);
118 len = _pos - start;
119 }
120
121 st->print_cr("Last %d bytes up to current read position " INTPTR_FORMAT " in HotSpotCompiledCode stream for %s:", len, p2i(_pos), code_desc());
122 st->print_data((void*) start, len, true, false);
123 }
124
125 const char* HotSpotCompiledCodeStream::context() const {
126 stringStream st;
127 st.cr();
128 st.print_cr("at " INTPTR_FORMAT " in HotSpotCompiledCode stream", p2i(_pos));
129 dump_buffer_tail(100, &st);
130 return st.as_string();
131 }
132
133 void HotSpotCompiledCodeStream::before_read(u1 size) {
134 if (_pos + size > _chunk->data_end()) {
135 Chunk* next = _chunk->next();
136 if (next == nullptr || size > next->size()) {
137 dump_buffer();
138 fatal("%s: reading %d bytes overflows buffer at " INTPTR_FORMAT, code_desc(), size, p2i(_pos));
139 }
140 _chunk = next;
141 _pos = _chunk->data();
142 }
143 }
144
145 // Reads a size followed by an ascii string from the stream and
146 // checks that they match `expect_size` and `expect_name` respectively. This
147 // implements a rudimentary type checking of the stream between the stream producer
148 // (Java) and the consumer (C++).
149 void HotSpotCompiledCodeStream::check_data(u2 expect_size, const char* expect_name) {
150 u2 actual_size = get_u1();
151 u2 ascii_len = get_u1();
152 const char* actual_name = (const char*) _pos;
153 char* end = (char*) _pos + ascii_len;
154 _pos = (const u1*) end;
155 if (strlen(expect_name) != ascii_len || strncmp(expect_name, actual_name, ascii_len) != 0) {
156 dump_buffer();
157 fatal("%s: expected \"%s\" at " INTPTR_FORMAT ", got \"%.*s\" (len: %d)",
158 code_desc(), expect_name, p2i(actual_name), ascii_len, actual_name, ascii_len);
159 }
160 if (actual_size != expect_size) {
161 dump_buffer();
162 fatal("%s: expected \"%s\" at " INTPTR_FORMAT " to have size %u, got %u",
163 code_desc(), expect_name, p2i(actual_name), expect_size, actual_size);
164 }
165 }
166
167 const char* HotSpotCompiledCodeStream::read_utf8(const char* name, JVMCI_TRAPS) {
168 jint utf_len = read_s4(name);
169 if (utf_len == -1) {
170 return nullptr;
171 }
172 guarantee(utf_len >= 0, "bad utf_len: %d", utf_len);
173
174 const char* utf = (const char*) _pos;
175 char* end = (char*) _pos + utf_len;
176 _pos = (const u1*) (end + 1);
177 if (*end != '\0') {
178 JVMCI_ERROR_NULL("UTF8 string at " INTPTR_FORMAT " of length %d missing 0 terminator: \"%.*s\"%s",
179 p2i(utf), utf_len, utf_len, utf, context());
180 }
181 return utf;
182 }
183
184 Method* HotSpotCompiledCodeStream::read_method(const char* name) {
185 return (Method*) read_u8(name);
186 }
187
188 Klass* HotSpotCompiledCodeStream::read_klass(const char* name) {
189 return (Klass*) read_u8(name);
190 }
191
192 ScopeValue* HotSpotCompiledCodeStream::virtual_object_at(int id, JVMCI_TRAPS) const {
193 if (_virtual_objects == nullptr) {
194 JVMCI_ERROR_NULL("virtual object id %d read outside scope of decoding DebugInfo%s", id, context());
195 }
196 if (id < 0 || id >= _virtual_objects->length()) {
197 JVMCI_ERROR_NULL("invalid virtual object id %d%s", id, context());
198 }
199 return _virtual_objects->at(id);
200 }
201
202 #ifndef PRODUCT
203 void CodeInstaller::verify_bci_constants(JVMCIEnv* env) {
204 #define CHECK_IN_SYNC(name) do { \
205 int expect = env->get_BytecodeFrame_ ## name ##_BCI(); \
206 int actual = name##_BCI; \
207 if (expect != actual) fatal("CodeInstaller::" #name "_BCI(%d) != BytecodeFrame." #name "_BCI(%d)", expect, actual); \
208 } while(0)
209
210 CHECK_IN_SYNC(UNWIND);
211 CHECK_IN_SYNC(BEFORE);
212 CHECK_IN_SYNC(AFTER);
213 CHECK_IN_SYNC(AFTER_EXCEPTION);
214 CHECK_IN_SYNC(UNKNOWN);
215 CHECK_IN_SYNC(INVALID_FRAMESTATE);
216 #undef CHECK_IN_SYNC
217 }
218 #endif
219
220 VMReg CodeInstaller::getVMRegFromLocation(HotSpotCompiledCodeStream* stream, int total_frame_size, JVMCI_TRAPS) {
221 u2 reg = stream->read_u2("register");
222 u2 offset = stream->read_u2("offset");
223
224 if (reg != NO_REGISTER) {
225 VMReg vmReg = CodeInstaller::get_hotspot_reg(reg, JVMCI_CHECK_NULL);
226 if (offset % 4 == 0) {
227 return vmReg->next(offset / 4);
228 } else {
229 JVMCI_ERROR_NULL("unaligned subregister offset %d in oop map%s", offset, stream->context());
230 }
231 } else {
232 if (offset % 4 == 0) {
233 VMReg vmReg = VMRegImpl::stack2reg(offset / 4);
234 if (!OopMapValue::legal_vm_reg_name(vmReg)) {
235 // This restriction only applies to VMRegs that are used in OopMap but
236 // since that's the only use of VMRegs it's simplest to put this test
237 // here. This test should also be equivalent legal_vm_reg_name but JVMCI
238 // clients can use max_oop_map_stack_stack_offset to detect this problem
239 // directly. The asserts just ensure that the tests are in agreement.
240 assert(offset > CompilerToVM::Data::max_oop_map_stack_offset(), "illegal VMReg");
241 JVMCI_ERROR_NULL("stack offset %d is too large to be encoded in OopMap (max %d)%s",
242 offset, CompilerToVM::Data::max_oop_map_stack_offset(), stream->context());
243 }
244 assert(OopMapValue::legal_vm_reg_name(vmReg), "illegal VMReg");
245 return vmReg;
246 } else {
247 JVMCI_ERROR_NULL("unaligned stack offset %d in oop map%s", offset, stream->context());
248 }
249 }
250 }
251
252 OopMap* CodeInstaller::create_oop_map(HotSpotCompiledCodeStream* stream, u1 debug_info_flags, JVMCI_TRAPS) {
253 assert(is_set(debug_info_flags, DI_HAS_REFERENCE_MAP), "must be");
254 u2 max_register_size = stream->read_u2("maxRegisterSize");
255 if (!_has_wide_vector && SharedRuntime::is_wide_vector(max_register_size)) {
256 if (SharedRuntime::polling_page_vectors_safepoint_handler_blob() == nullptr) {
257 JVMCI_ERROR_NULL("JVMCI is producing code using vectors larger than the runtime supports%s", stream->context());
258 }
259 _has_wide_vector = true;
260 }
261 u2 length = stream->read_u2("referenceMap:length");
262
263 OopMap* map = new OopMap(_total_frame_size, _parameter_count);
264 for (int i = 0; i < length; i++) {
265 bool has_derived = stream->read_bool("hasDerived");
266 u2 bytes = stream->read_u2("sizeInBytes");
267 VMReg vmReg = getVMRegFromLocation(stream, _total_frame_size, JVMCI_CHECK_NULL);
268 if (has_derived) {
269 // derived oop
270 if (bytes == LP64_ONLY(8) NOT_LP64(4)) {
271 VMReg baseReg = getVMRegFromLocation(stream, _total_frame_size, JVMCI_CHECK_NULL);
272 map->set_derived_oop(vmReg, baseReg);
273 } else {
274 JVMCI_ERROR_NULL("invalid derived oop size in ReferenceMap: %d%s", bytes, stream->context());
275 }
276 #ifdef _LP64
277 } else if (bytes == 8) {
278 // wide oop
279 map->set_oop(vmReg);
280 } else if (bytes == 4) {
281 // narrow oop
282 map->set_narrowoop(vmReg);
283 #else
284 } else if (bytes == 4) {
285 map->set_oop(vmReg);
286 #endif
287 } else {
288 JVMCI_ERROR_NULL("invalid oop size in ReferenceMap: %d%s", bytes, stream->context());
289 }
290 }
291
292 if (is_set(debug_info_flags, DI_HAS_CALLEE_SAVE_INFO)) {
293 length = stream->read_u2("calleeSaveInfo:length");
294 for (jint i = 0; i < length; i++) {
295 u2 jvmci_reg_number = stream->read_u2("register");
296 VMReg hotspot_reg = CodeInstaller::get_hotspot_reg(jvmci_reg_number, JVMCI_CHECK_NULL);
297 // HotSpot stack slots are 4 bytes
298 u2 jvmci_slot = stream->read_u2("slot");
299 jint hotspot_slot = jvmci_slot * VMRegImpl::slots_per_word;
300 VMReg hotspot_slot_as_reg = VMRegImpl::stack2reg(hotspot_slot);
301 map->set_callee_saved(hotspot_slot_as_reg, hotspot_reg);
302 #ifdef _LP64
303 // (copied from generate_oop_map() in c1_Runtime1_x86.cpp)
304 VMReg hotspot_slot_hi_as_reg = VMRegImpl::stack2reg(hotspot_slot + 1);
305 map->set_callee_saved(hotspot_slot_hi_as_reg, hotspot_reg->next());
306 #endif
307 }
308 }
309 return map;
310 }
311
312 void* CodeInstaller::record_metadata_reference(CodeSection* section, address dest, HotSpotCompiledCodeStream* stream, u1 tag, JVMCI_TRAPS) {
313 /*
314 * This method needs to return a raw (untyped) pointer, since the value of a pointer to the base
315 * class is in general not equal to the pointer of the subclass. When patching metaspace pointers,
316 * the compiler expects a direct pointer to the subclass (Klass* or Method*), not a pointer to the
317 * base class (Metadata* or MetaspaceObj*).
318 */
319 if (tag == PATCH_KLASS) {
320 Klass* klass = stream->read_klass("patch:klass");
321 int index = _oop_recorder->find_index(klass);
322 section->relocate(dest, metadata_Relocation::spec(index));
323 JVMCI_event_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string());
324 return klass;
325 } else if (tag == PATCH_METHOD) {
326 Method* method = stream->read_method("patch:method");
327 int index = _oop_recorder->find_index(method);
328 section->relocate(dest, metadata_Relocation::spec(index));
329 JVMCI_event_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string());
330 return method;
331 } else {
332 JVMCI_ERROR_NULL("unexpected metadata reference tag: %d%s", tag, stream->context());
333 }
334 }
335
336 #ifdef _LP64
337 narrowKlass CodeInstaller::record_narrow_metadata_reference(CodeSection* section, address dest, HotSpotCompiledCodeStream* stream, u1 tag, JVMCI_TRAPS) {
338 if (tag != PATCH_NARROW_KLASS) {
339 JVMCI_ERROR_0("unexpected compressed pointer tag %d%s", tag, stream->context());
340 }
341 Klass* klass = stream->read_klass("patch:klass");
342 int index = _oop_recorder->find_index(klass);
343 section->relocate(dest, metadata_Relocation::spec(index));
344 JVMCI_event_3("narrowKlass[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string());
345 guarantee(CompressedKlassPointers::is_encodable(klass), "klass cannot be compressed: %s", klass->external_name());
346 return CompressedKlassPointers::encode(klass);
347 }
348 #endif
349
350 ScopeValue* CodeInstaller::to_primitive_value(HotSpotCompiledCodeStream* stream, jlong raw, BasicType type, ScopeValue* &second, JVMCI_TRAPS) {
351 if (type == T_INT || type == T_FLOAT) {
352 jint prim = (jint) raw;
353 switch (prim) {
354 case -1: return _int_m1_scope_value;
355 case 0: return _int_0_scope_value;
356 case 1: return _int_1_scope_value;
357 case 2: return _int_2_scope_value;
358 default: return new ConstantIntValue(prim);
359 }
360 } else if (type == T_LONG || type == T_DOUBLE) {
361 jlong prim = raw;
362 second = _int_1_scope_value;
363 return new ConstantLongValue(prim);
364 } else {
365 JVMCI_ERROR_NULL("unexpected primitive constant type %s%s", basictype_to_str(type), stream->context());
366 }
367 }
368
369 Handle CodeInstaller::read_oop(HotSpotCompiledCodeStream* stream, u1 tag, JVMCI_TRAPS) {
370 oop obj;
371 if (tag == OBJECT_ID) {
372 obj = stream->get_oop(stream->read_u1("id"), JVMCI_CHECK_(Handle()));
373 } else if (tag == OBJECT_ID2) {
374 obj = stream->get_oop(stream->read_u2("id:2"), JVMCI_CHECK_(Handle()));
375 } else if (tag == JOBJECT) {
376 jlong object_handle = stream->read_u8("jobject");
377 obj = jvmci_env()->resolve_oop_handle(object_handle);
378 } else {
379 JVMCI_ERROR_(Handle(), "unexpected oop tag: %d", tag)
380 }
381 if (obj == nullptr) {
382 JVMCI_THROW_MSG_(InternalError, "Constant was unexpectedly null", Handle());
383 } else {
384 guarantee(oopDesc::is_oop_or_null(obj), "invalid oop: " INTPTR_FORMAT, p2i((oopDesc*) obj));
385 }
386 return Handle(stream->thread(), obj);
387 }
388
389 ScopeValue* CodeInstaller::get_scope_value(HotSpotCompiledCodeStream* stream, u1 tag, BasicType type, ScopeValue* &second, JVMCI_TRAPS) {
390 second = nullptr;
391 bool stack_slot_is_s2 = true;
392 switch (tag) {
393 case ILLEGAL: {
394 if (type != T_ILLEGAL) {
395 JVMCI_ERROR_NULL("unexpected illegal value, expected %s%s", basictype_to_str(type), stream->context());
396 }
397 return _illegal_value;
398 }
399 case REGISTER_PRIMITIVE:
400 case REGISTER_NARROW_OOP:
401 case REGISTER_OOP:
402 case REGISTER_VECTOR: {
403 u2 number = stream->read_u2("register");
404 VMReg hotspotRegister = get_hotspot_reg(number, JVMCI_CHECK_NULL);
405 if (is_general_purpose_reg(hotspotRegister)) {
406 Location::Type locationType;
407 if (type == T_OBJECT) {
408 locationType = tag == REGISTER_NARROW_OOP ? Location::narrowoop : Location::oop;
409 } else if (type == T_LONG) {
410 locationType = Location::lng;
411 } else if (type == T_INT || type == T_FLOAT || type == T_SHORT || type == T_CHAR || type == T_BYTE || type == T_BOOLEAN) {
412 locationType = Location::int_in_long;
413 } else {
414 JVMCI_ERROR_NULL("unexpected type %s in CPU register%s", basictype_to_str(type), stream->context());
415 }
416 ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister));
417 if (type == T_LONG) {
418 second = value;
419 }
420 return value;
421 } else {
422 Location::Type locationType;
423 if (type == T_FLOAT) {
424 // this seems weird, but the same value is used in c1_LinearScan
425 locationType = Location::normal;
426 } else if (type == T_DOUBLE) {
427 locationType = Location::dbl;
428 } else if (type == T_OBJECT && tag == REGISTER_VECTOR) {
429 locationType = Location::vector;
430 } else {
431 JVMCI_ERROR_NULL("unexpected type %s in floating point register%s", basictype_to_str(type), stream->context());
432 }
433 ScopeValue* value = new LocationValue(Location::new_reg_loc(locationType, hotspotRegister));
434 if (type == T_DOUBLE) {
435 second = value;
436 }
437 return value;
438 }
439 }
440 case STACK_SLOT4_PRIMITIVE:
441 case STACK_SLOT4_NARROW_OOP:
442 case STACK_SLOT4_OOP:
443 case STACK_SLOT4_VECTOR:
444 stack_slot_is_s2 = false;
445 // fall through
446 case STACK_SLOT_PRIMITIVE:
447 case STACK_SLOT_NARROW_OOP:
448 case STACK_SLOT_OOP:
449 case STACK_SLOT_VECTOR: {
450 jint offset = stack_slot_is_s2 ? (jshort) stream->read_s2("offset") : stream->read_s4("offset4");
451 if (stream->read_bool("addRawFrameSize")) {
452 offset += _total_frame_size;
453 }
454 Location::Type locationType;
455 if (type == T_OBJECT) {
456 locationType = tag == STACK_SLOT_VECTOR ? Location::vector : tag == STACK_SLOT_NARROW_OOP ? Location::narrowoop : Location::oop;
457 } else if (type == T_LONG) {
458 locationType = Location::lng;
459 } else if (type == T_DOUBLE) {
460 locationType = Location::dbl;
461 } else if (type == T_INT || type == T_FLOAT || type == T_SHORT || type == T_CHAR || type == T_BYTE || type == T_BOOLEAN) {
462 locationType = Location::normal;
463 } else {
464 JVMCI_ERROR_NULL("unexpected type %s in stack slot%s", basictype_to_str(type), stream->context());
465 }
466 ScopeValue* value = new LocationValue(Location::new_stk_loc(locationType, offset));
467 if (type == T_DOUBLE || type == T_LONG) {
468 second = value;
469 }
470 return value;
471 }
472 case NULL_CONSTANT: { return _oop_null_scope_value; }
473 case RAW_CONSTANT: { return new ConstantLongValue(stream->read_u8("primitive")); }
474 case PRIMITIVE_0: { ScopeValue* v = to_primitive_value(stream, 0, type, second, JVMCI_CHECK_NULL); return v; }
475 case PRIMITIVE4: { ScopeValue* v = to_primitive_value(stream, stream->read_s4("primitive4"), type, second, JVMCI_CHECK_NULL); return v; }
476 case PRIMITIVE8: { ScopeValue* v = to_primitive_value(stream, stream->read_s8("primitive8"), type, second, JVMCI_CHECK_NULL); return v; }
477 case VIRTUAL_OBJECT_ID: { ScopeValue* v = stream->virtual_object_at(stream->read_u1("id"), JVMCI_CHECK_NULL); return v; }
478 case VIRTUAL_OBJECT_ID2: { ScopeValue* v = stream->virtual_object_at(stream->read_u2("id:2"), JVMCI_CHECK_NULL); return v; }
479
480 case OBJECT_ID:
481 case OBJECT_ID2:
482 case JOBJECT: {
483 Handle obj = read_oop(stream, tag, JVMCI_CHECK_NULL);
484 return new ConstantOopWriteValue(JNIHandles::make_local(obj()));
485 }
486 default: {
487 JVMCI_ERROR_NULL("unexpected tag in scope: %d%s", tag, stream->context())
488 }
489 }
490 }
491
492 void CodeInstaller::record_object_value(ObjectValue* sv, HotSpotCompiledCodeStream* stream, JVMCI_TRAPS) {
493 oop javaMirror = JNIHandles::resolve(sv->klass()->as_ConstantOopWriteValue()->value());
494 Klass* klass = java_lang_Class::as_Klass(javaMirror);
495 bool isLongArray = klass == Universe::longArrayKlass();
496 bool isByteArray = klass == Universe::byteArrayKlass();
497
498 u2 length = stream->read_u2("values:length");
499 for (jint i = 0; i < length; i++) {
500 ScopeValue* cur_second = nullptr;
501 BasicType type = (BasicType) stream->read_u1("basicType");
502 ScopeValue* value;
503 u1 tag = stream->read_u1("tag");
504 if (tag == ILLEGAL) {
505 if (isByteArray && type == T_ILLEGAL) {
506 /*
507 * The difference between a virtualized large access and a deferred write is the kind stored in the slotKinds
508 * of the virtual object: in the virtualization case, the kind is illegal, in the deferred write case, the kind
509 * is access stack kind (an int).
510 */
511 value = _virtual_byte_array_marker;
512 } else {
513 value = _illegal_value;
514 if (type == T_DOUBLE || type == T_LONG) {
515 cur_second = _illegal_value;
516 }
517 }
518 } else {
519 value = get_scope_value(stream, tag, type, cur_second, JVMCI_CHECK);
520 }
521
522 if (isLongArray && cur_second == nullptr) {
523 // we're trying to put ints into a long array... this isn't really valid, but it's used for some optimizations.
524 // add an int 0 constant
525 cur_second = _int_0_scope_value;
526 }
527
528 if (isByteArray && cur_second != nullptr && (type == T_DOUBLE || type == T_LONG)) {
529 // we are trying to write a long in a byte Array. We will need to count the illegals to restore the type of
530 // the thing we put inside.
531 cur_second = nullptr;
532 }
533
534 if (cur_second != nullptr) {
535 sv->field_values()->append(cur_second);
536 }
537 assert(value != nullptr, "missing value");
538 sv->field_values()->append(value);
539 }
540 }
541
542 GrowableArray<ScopeValue*>* CodeInstaller::read_local_or_stack_values(HotSpotCompiledCodeStream* stream, u1 frame_flags, bool is_locals, JVMCI_TRAPS) {
543 u2 length;
544 if (is_locals) {
545 if (!is_set(frame_flags, DIF_HAS_LOCALS)) {
546 return nullptr;
547 }
548 length = stream->read_u2("numLocals");
549 } else {
550 if (!is_set(frame_flags, DIF_HAS_STACK)) {
551 return nullptr;
552 }
553 length = stream->read_u2("numStack");
554 }
555 GrowableArray<ScopeValue*>* values = new GrowableArray<ScopeValue*> (length);
556 for (int i = 0; i < length; i++) {
557 ScopeValue* second = nullptr;
558 BasicType type = (BasicType) stream->read_u1("basicType");
559 u1 tag = stream->read_u1("tag");
560 ScopeValue* first = get_scope_value(stream, tag, type, second, JVMCI_CHECK_NULL);
561 if (second != nullptr) {
562 if (i == length) {
563 JVMCI_ERROR_NULL("double-slot value not followed by Value.ILLEGAL%s", stream->context());
564 }
565 i++;
566 stream->read_u1("basicType");
567 tag = stream->read_u1("tag");
568 if (tag != ILLEGAL) {
569 JVMCI_ERROR_NULL("double-slot value not followed by Value.ILLEGAL%s", stream->context());
570 }
571 values->append(second);
572 }
573 values->append(first);
574 }
575 return values;
576 }
577
578 GrowableArray<MonitorValue*>* CodeInstaller::read_monitor_values(HotSpotCompiledCodeStream* stream, u1 frame_flags, JVMCI_TRAPS) {
579 if (!is_set(frame_flags, DIF_HAS_LOCKS)) {
580 return nullptr;
581 }
582 if (!_has_monitors) {
583 _has_monitors = true;
584 }
585 u2 length = stream->read_u2("numLocks");
586 GrowableArray<MonitorValue*>* monitors = new GrowableArray<MonitorValue*>(length);
587 for (int i = 0; i < length; i++) {
588 bool eliminated = stream->read_bool("isEliminated");
589 ScopeValue* second = nullptr;
590 ScopeValue* owner_value = get_scope_value(stream, stream->read_u1("tag"), T_OBJECT, second, JVMCI_CHECK_NULL);
591 assert(second == nullptr, "monitor cannot occupy two stack slots");
592
593 ScopeValue* lock_data_value = get_scope_value(stream, stream->read_u1("tag"), T_LONG, second, JVMCI_CHECK_NULL);
594 assert(second == lock_data_value, "monitor is LONG value that occupies two stack slots");
595 assert(lock_data_value->is_location(), "invalid monitor location");
596 Location lock_data_loc = ((LocationValue*) lock_data_value)->location();
597
598 monitors->append(new MonitorValue(owner_value, lock_data_loc, eliminated));
599 }
600 return monitors;
601 }
602
603 void CodeInstaller::initialize_dependencies(HotSpotCompiledCodeStream* stream, u1 code_flags, OopRecorder* oop_recorder, JVMCI_TRAPS) {
604 JavaThread* thread = stream->thread();
605 CompilerThread* compilerThread = thread->is_Compiler_thread() ? CompilerThread::cast(thread) : nullptr;
606 _oop_recorder = oop_recorder;
607 _dependencies = new Dependencies(&_arena, _oop_recorder, compilerThread != nullptr ? compilerThread->log() : nullptr);
608 if (is_set(code_flags, HCC_HAS_ASSUMPTIONS)) {
609 u2 length = stream->read_u2("assumptions:length");
610 for (int i = 0; i < length; ++i) {
611 u1 tag = stream->read_u1("tag");
612 switch (tag) {
613 case NO_FINALIZABLE_SUBCLASS: {
614 Klass* receiver_type = stream->read_klass("receiverType");
615 _dependencies->assert_has_no_finalizable_subclasses(receiver_type);
616 break;
617 }
618 case CONCRETE_SUBTYPE: {
619 Klass* context = stream->read_klass("context");
620 Klass* subtype = stream->read_klass("subtype");
621 assert(context->is_abstract(), "must be");
622 _dependencies->assert_abstract_with_unique_concrete_subtype(context, subtype);
623 break;
624 }
625 case LEAF_TYPE: {
626 Klass* context = stream->read_klass("context");
627 _dependencies->assert_leaf_type(context);
628 break;
629 }
630 case CONCRETE_METHOD: {
631 Klass* context = stream->read_klass("context");
632 Method* impl = stream->read_method("impl");
633 _dependencies->assert_unique_concrete_method(context, impl);
634 break;
635 }
636 case CALLSITE_TARGET_VALUE: {
637 u1 obj_tag = stream->read_u1("tag");
638 Handle callSite = read_oop(stream, obj_tag, JVMCI_CHECK);
639 obj_tag = stream->read_u1("tag");
640 Handle methodHandle = read_oop(stream, obj_tag, JVMCI_CHECK);
641 _dependencies->assert_call_site_target_value(callSite(), methodHandle());
642 break;
643 }
644 default: {
645 JVMCI_ERROR("unexpected assumption tag %d%s", tag, stream->context());
646 }
647 }
648 }
649 }
650 if (is_set(code_flags, HCC_HAS_METHODS)) {
651 u2 length = stream->read_u2("methods:length");
652 for (int i = 0; i < length; ++i) {
653 Method* method = stream->read_method("method");
654 if (JvmtiExport::can_hotswap_or_post_breakpoint()) {
655 _dependencies->assert_evol_method(method);
656 }
657 }
658 }
659 }
660
661 JVMCI::CodeInstallResult CodeInstaller::install_runtime_stub(CodeBlob*& cb,
662 const char* name,
663 CodeBuffer* buffer,
664 int stack_slots,
665 JVMCI_TRAPS) {
666 if (name == nullptr) {
667 JVMCI_ERROR_OK("stub should have a name");
668 }
669
670 name = os::strdup(name);
671 GrowableArray<RuntimeStub*> *stubs_to_free = nullptr;
672 #ifdef ASSERT
673 const char* val = Arguments::PropertyList_get_value(Arguments::system_properties(), "test.jvmci.forceRuntimeStubAllocFail");
674 if (val != nullptr && strstr(name , val) != nullptr) {
675 stubs_to_free = new GrowableArray<RuntimeStub*>();
676 JVMCI_event_1("forcing allocation of %s in code cache to fail", name);
677 }
678 #endif
679
680 do {
681 RuntimeStub* stub = RuntimeStub::new_runtime_stub(name,
682 buffer,
683 _offsets.value(CodeOffsets::Frame_Complete),
684 stack_slots,
685 _debug_recorder->_oopmaps,
686 /* caller_must_gc_arguments */ false,
687 /* alloc_fail_is_fatal */ false);
688 cb = stub;
689 if (stub == nullptr) {
690 // Allocation failed
691 #ifdef ASSERT
692 if (stubs_to_free != nullptr) {
693 JVMCI_event_1("allocation of %s in code cache failed, freeing %d stubs", name, stubs_to_free->length());
694 for (GrowableArrayIterator<RuntimeStub*> iter = stubs_to_free->begin(); iter != stubs_to_free->end(); ++iter) {
695 RuntimeStub::free(*iter);
696 }
697 }
698 #endif
699 return JVMCI::cache_full;
700 }
701 if (stubs_to_free == nullptr) {
702 return JVMCI::ok;
703 }
704 stubs_to_free->append(stub);
705 } while (true);
706 }
707
708 JVMCI::CodeInstallResult CodeInstaller::install(JVMCICompiler* compiler,
709 jlong compiled_code_buffer,
710 bool with_type_info,
711 JVMCIObject compiled_code,
712 objArrayHandle object_pool,
713 CodeBlob*& cb,
714 JVMCINMethodHandle& nmethod_handle,
715 JVMCIObject installed_code,
716 FailedSpeculation** failed_speculations,
717 char* speculations,
718 int speculations_len,
719 JVMCI_TRAPS) {
720
721 JavaThread* thread = JavaThread::current();
722 HotSpotCompiledCodeStream* stream = new HotSpotCompiledCodeStream(thread, (const u1*) compiled_code_buffer, with_type_info, object_pool);
723
724 u1 code_flags = stream->read_u1("code:flags");
725 bool is_nmethod = is_set(code_flags, HCC_IS_NMETHOD);
726 const char* name = stream->read_utf8("name", JVMCI_CHECK_OK);
727
728 methodHandle method;
729 jint entry_bci = -1;
730 JVMCICompileState* compile_state = nullptr;
731 bool has_unsafe_access = false;
732 bool has_scoped_access = false;
733 jint id = -1;
734
735 if (is_nmethod) {
736 method = methodHandle(thread, stream->read_method("method"));
737 entry_bci = is_nmethod ? stream->read_s4("entryBCI") : -1;
738 compile_state = (JVMCICompileState*) stream->read_u8("compileState");
739 has_unsafe_access = stream->read_bool("hasUnsafeAccess");
740 has_scoped_access = stream->read_bool("hasScopedAccess");
741 id = stream->read_s4("id");
742 }
743 stream->set_code_desc(name, method);
744
745 CodeBuffer buffer("JVMCI Compiler CodeBuffer");
746 OopRecorder* recorder = new OopRecorder(&_arena, true);
747 initialize_dependencies(stream, code_flags, recorder, JVMCI_CHECK_OK);
748
749 // Get instructions and constants CodeSections early because we need it.
750 _instructions = buffer.insts();
751 _constants = buffer.consts();
752
753 initialize_fields(stream, code_flags, method, buffer, JVMCI_CHECK_OK);
754 JVMCI::CodeInstallResult result = initialize_buffer(compiled_code, buffer, stream, code_flags, JVMCI_CHECK_OK);
755
756 u4 available = stream->available();
757 if (result == JVMCI::ok && available != 0) {
758 JVMCI_ERROR_OK("%d bytes remaining in stream%s", available, stream->context());
759 }
760
761 if (result != JVMCI::ok) {
762 return result;
763 }
764
765 int stack_slots = _total_frame_size / HeapWordSize; // conversion to words
766
767 if (!is_nmethod) {
768 return install_runtime_stub(cb, name, &buffer, stack_slots, JVMCI_CHECK_OK);
769 } else {
770 if (compile_state != nullptr) {
771 jvmci_env()->set_compile_state(compile_state);
772 }
773
774 if (id == -1) {
775 // Make sure a valid compile_id is associated with every compile
776 id = CompileBroker::assign_compile_id_unlocked(thread, method, entry_bci);
777 jvmci_env()->set_HotSpotCompiledNmethod_id(compiled_code, id);
778 }
779 if (!jvmci_env()->isa_HotSpotNmethod(installed_code)) {
780 JVMCI_THROW_MSG_(IllegalArgumentException, "InstalledCode object must be a HotSpotNmethod when installing a HotSpotCompiledNmethod", JVMCI::ok);
781 }
782
783 // Enforce that compiled methods have an nmethod barrier.
784 if (_nmethod_entry_patch_offset == -1) {
785 JVMCI_THROW_MSG_(IllegalArgumentException, "nmethod entry barrier is missing", JVMCI::ok);
786 }
787
788 JVMCIObject mirror = installed_code;
789 nmethod* nm = nullptr; // nm is an out parameter of register_method
790 result = runtime()->register_method(jvmci_env(),
791 method,
792 nm,
793 entry_bci,
794 &_offsets,
795 _orig_pc_offset,
796 &buffer,
797 stack_slots,
798 _debug_recorder->_oopmaps,
799 &_exception_handler_table,
800 &_implicit_exception_table,
801 compiler,
802 _debug_recorder,
803 _dependencies,
804 id,
805 _has_monitors,
806 has_unsafe_access,
807 has_scoped_access,
808 _has_wide_vector,
809 compiled_code,
810 mirror,
811 failed_speculations,
812 speculations,
813 speculations_len,
814 _nmethod_entry_patch_offset);
815 if (result == JVMCI::ok) {
816 guarantee(nm != nullptr, "successful compile must produce an nmethod");
817 nmethod_handle.set_nmethod(nm);
818 cb = nm;
819 if (compile_state == nullptr) {
820 // This compile didn't come through the CompileBroker so perform the printing here
821 DirectiveSet* directive = DirectivesStack::getMatchingDirective(method, compiler);
822 nm->maybe_print_nmethod(directive);
823 DirectivesStack::release(directive);
824
825 // Since this compilation didn't pass through the broker it wasn't logged yet.
826 if (PrintCompilation) {
827 ttyLocker ttyl;
828 if (name != nullptr) {
829 stringStream st;
830 st.print_cr("(hosted JVMCI compilation: %s)", name);
831 CompileTask::print(tty, nm, st.as_string());
832 } else {
833 CompileTask::print(tty, nm, "(hosted JVMCI compilation)");
834 }
835 }
836 }
837
838 BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod();
839
840 // an empty error buffer for use by the verify_barrier code
841 err_msg msg("");
842 if (!bs_nm->verify_barrier(nm, msg)) {
843 JVMCI_THROW_MSG_(IllegalArgumentException, err_msg("nmethod entry barrier is malformed: %s", msg.buffer()), JVMCI::ok);
844 }
845 }
846 }
847
848 if (cb != nullptr) {
849 // Make sure the pre-calculated constants section size was correct.
850 guarantee((cb->code_begin() - cb->content_begin()) >= _constants_size, "%d < %d", (int)(cb->code_begin() - cb->content_begin()), _constants_size);
851 }
852 return result;
853 }
854
855 void CodeInstaller::initialize_fields(HotSpotCompiledCodeStream* stream, u1 code_flags, methodHandle& method, CodeBuffer& buffer, JVMCI_TRAPS) {
856 if (!method.is_null()) {
857 _parameter_count = method->size_of_parameters();
858 JVMCI_event_2("installing code for %s", method->name_and_sig_as_C_string());
859 } else {
860 // Must be a HotSpotCompiledCode for a stub.
861 // Only used in OopMap constructor for non-product builds
862 _parameter_count = 0;
863 }
864 _sites_count = stream->read_s4("sites:length");
865 _code_size = stream->read_s4("targetCodeSize");
866 _total_frame_size = stream->read_s4("totalFrameSize");
867 if (!is_set(code_flags, HCC_HAS_DEOPT_RESCUE_SLOT)) {
868 _orig_pc_offset = -1;
869 } else {
870 _orig_pc_offset = stream->read_s4("offset");
871 if (stream->read_bool("addRawFrameSize")) {
872 _orig_pc_offset += _total_frame_size;
873 }
874 if (_orig_pc_offset < 0) {
875 JVMCI_ERROR("invalid deopt rescue slot: %d%s", _orig_pc_offset, stream->context());
876 }
877 }
878
879 // Pre-calculate the constants section size. This is required for PC-relative addressing.
880 u4 data_section_size = stream->read_u4("dataSectionSize");
881 u1 data_section_alignment = stream->read_u1("dataSectionAlignment");
882 buffer.set_const_section_alignment(data_section_alignment);
883 if ((_constants->alignment() % data_section_alignment) != 0) {
884 JVMCI_ERROR("invalid data section alignment: %d [constants alignment: %d]%s",
885 data_section_alignment, _constants->alignment(), stream->context());
886 }
887 _constants_size = data_section_size;
888 _next_call_type = INVOKE_INVALID;
889 _has_monitors = false;
890 _has_wide_vector = false;
891 _nmethod_entry_patch_offset = -1;
892 }
893
894 u1 CodeInstaller::as_read_oop_tag(HotSpotCompiledCodeStream* stream, u1 patch_object_tag, JVMCI_TRAPS) {
895 switch (patch_object_tag) {
896 case PATCH_OBJECT_ID:
897 case PATCH_NARROW_OBJECT_ID: {
898 return OBJECT_ID;
899 }
900 case PATCH_OBJECT_ID2:
901 case PATCH_NARROW_OBJECT_ID2: {
902 return OBJECT_ID2;
903 }
904 case PATCH_NARROW_JOBJECT:
905 case PATCH_JOBJECT: {
906 return JOBJECT;
907 }
908 default: {
909 JVMCI_ERROR_0("unknown object patch tag: %d%s", patch_object_tag, stream->context());
910 }
911 }
912 }
913
914 int CodeInstaller::estimate_stubs_size(HotSpotCompiledCodeStream* stream, JVMCI_TRAPS) {
915 // Estimate the number of static call stubs that might be emitted.
916 u2 static_call_stubs = stream->read_u2("numStaticCallStubs");
917 u2 trampoline_stubs = stream->read_u2("numTrampolineStubs");
918 int size = static_call_stubs * CompiledDirectCall::to_interp_stub_size();
919 size += trampoline_stubs * CompiledDirectCall::to_trampoline_stub_size();
920 return size;
921 }
922
923 // perform data and call relocation on the CodeBuffer
924 JVMCI::CodeInstallResult CodeInstaller::initialize_buffer(JVMCIObject compiled_code, CodeBuffer& buffer, HotSpotCompiledCodeStream* stream, u1 code_flags, JVMCI_TRAPS) {
925 JavaThread* thread = stream->thread();
926 HandleMark hm(thread);
927 int locs_buffer_size = _sites_count * (relocInfo::length_limit + sizeof(relocInfo));
928
929
930 // Allocate enough space in the stub section for the static call
931 // stubs. Stubs have extra relocs but they are managed by the stub
932 // section itself so they don't need to be accounted for in the
933 // locs_buffer above.
934 int stubs_size = estimate_stubs_size(stream, JVMCI_CHECK_OK);
935
936 assert((CodeBuffer::SECT_INSTS == CodeBuffer::SECT_STUBS - 1) &&
937 (CodeBuffer::SECT_CONSTS == CodeBuffer::SECT_INSTS - 1), "sections order: consts, insts, stubs");
938 // buffer content: [constants + code_align] + [code + stubs_align] + [stubs]
939 int total_size = align_up(_constants_size, buffer.insts()->alignment()) +
940 align_up(_code_size, buffer.stubs()->alignment()) +
941 stubs_size;
942
943 if (total_size > JVMCINMethodSizeLimit) {
944 return JVMCI::code_too_large;
945 }
946
947 buffer.initialize(total_size, locs_buffer_size);
948 if (buffer.blob() == nullptr) {
949 return JVMCI::cache_full;
950 }
951 buffer.initialize_stubs_size(stubs_size);
952 buffer.initialize_consts_size(_constants_size);
953
954 _debug_recorder = new DebugInformationRecorder(_oop_recorder);
955 _debug_recorder->set_oopmaps(new OopMapSet());
956
957 buffer.initialize_oop_recorder(_oop_recorder);
958
959 // copy the constant data into the newly created CodeBuffer
960 address end_data = _constants->start() + _constants_size;
961 JVMCIObject data_section = jvmci_env()->get_HotSpotCompiledCode_dataSection(compiled_code);
962 JVMCIENV->copy_bytes_to(data_section, (jbyte*) _constants->start(), 0, _constants_size);
963 _constants->set_end(end_data);
964
965 // copy the code into the newly created CodeBuffer
966 address end_pc = _instructions->start() + _code_size;
967 guarantee(_instructions->allocates2(end_pc), "initialize should have reserved enough space for all the code");
968
969 JVMCIPrimitiveArray code = jvmci_env()->get_HotSpotCompiledCode_targetCode(compiled_code);
970 JVMCIENV->copy_bytes_to(code, (jbyte*) _instructions->start(), 0, _code_size);
971 _instructions->set_end(end_pc);
972
973
974 u2 length = stream->read_u2("dataSectionPatches:length");
975 for (int i = 0; i < length; i++) {
976 address dest = _constants->start() + stream->read_u4("patch:pcOffset");
977 u1 tag = stream->read_u1("tag");
978
979 switch (tag) {
980 case PATCH_METHOD:
981 case PATCH_KLASS: {
982 *((void**) dest) = record_metadata_reference(_constants, dest, stream, tag, JVMCI_CHECK_OK);
983 break;
984 }
985 case PATCH_NARROW_KLASS: {
986 #ifdef _LP64
987 *((narrowKlass*) dest) = record_narrow_metadata_reference(_constants, dest, stream, tag, JVMCI_CHECK_OK);
988 #else
989 JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode");
990 #endif
991 break;
992 }
993 case PATCH_OBJECT_ID:
994 case PATCH_OBJECT_ID2:
995 case PATCH_NARROW_OBJECT_ID:
996 case PATCH_NARROW_OBJECT_ID2:
997 case PATCH_JOBJECT:
998 case PATCH_NARROW_JOBJECT: {
999 bool narrow = tag == PATCH_NARROW_OBJECT_ID || tag == PATCH_NARROW_OBJECT_ID2 || tag == PATCH_NARROW_JOBJECT;
1000 u1 read_tag = as_read_oop_tag(stream, tag, JVMCI_CHECK_OK);
1001 record_oop_patch(stream, dest, read_tag, narrow, JVMCI_CHECK_OK);
1002 break;
1003 }
1004 default: {
1005 JVMCI_ERROR_OK("invalid constant tag: %d%s", tag, stream->context());
1006 break;
1007 }
1008 }
1009 }
1010
1011 jint last_pc_offset = -1;
1012 for (int i = 0; i < _sites_count; i++) {
1013 u4 pc_offset = stream->read_s4("site:pcOffset");
1014 u1 tag = stream->read_u1("tag");
1015 switch (tag) {
1016 case SITE_FOREIGN_CALL:
1017 case SITE_FOREIGN_CALL_NO_DEBUG_INFO:
1018 case SITE_CALL: {
1019 site_Call(buffer, tag, pc_offset, stream, JVMCI_CHECK_OK);
1020 break;
1021 }
1022 case SITE_SAFEPOINT:
1023 case SITE_IMPLICIT_EXCEPTION:
1024 case SITE_IMPLICIT_EXCEPTION_DISPATCH: {
1025 site_Safepoint(buffer, pc_offset, stream, tag, JVMCI_CHECK_OK);
1026 break;
1027 }
1028 case SITE_INFOPOINT: {
1029 site_Infopoint(buffer, pc_offset, stream, JVMCI_CHECK_OK);
1030 break;
1031 }
1032 case SITE_MARK: {
1033 site_Mark(buffer, pc_offset, stream, JVMCI_CHECK_OK);
1034 break;
1035 }
1036 case SITE_DATA_PATCH: {
1037 site_DataPatch(buffer, pc_offset, stream, JVMCI_CHECK_OK);
1038 break;
1039 }
1040 case SITE_EXCEPTION_HANDLER: {
1041 site_ExceptionHandler(pc_offset, stream);
1042 break;
1043 }
1044 default: {
1045 JVMCI_ERROR_OK("unexpected site tag at " INTPTR_FORMAT ": %d", p2i(stream->pos() - 1), tag);
1046 }
1047 }
1048
1049 last_pc_offset = pc_offset;
1050
1051 if ((i % 32 == 0) && SafepointMechanism::should_process(thread)) {
1052 // Force a safepoint to mitigate pause time installing large code
1053 ThreadToNativeFromVM ttnfv(thread);
1054 }
1055 }
1056
1057 if (is_set(code_flags, HCC_HAS_COMMENTS)) {
1058 u2 length = stream->read_u2("comments:length");
1059 for (int i = 0; i < length; i++) {
1060 u4 pc_offset = stream->read_u4("comment:pcOffset");
1061 const char* text = stream->read_utf8("comment:text", JVMCI_CHECK_OK);
1062 #ifndef PRODUCT
1063 buffer.block_comment(pc_offset, text);
1064 #endif
1065 }
1066 }
1067 if (_has_auto_box) {
1068 JavaThread* THREAD = thread; // For exception macros.
1069 JVMCI::ensure_box_caches_initialized(CHECK_(JVMCI::ok));
1070 }
1071 return JVMCI::ok;
1072 }
1073
1074 void CodeInstaller::record_oop_patch(HotSpotCompiledCodeStream* stream, address dest, u1 read_tag, bool narrow, JVMCI_TRAPS) {
1075 Handle obj = read_oop(stream, read_tag, JVMCI_CHECK);
1076 jobject value = JNIHandles::make_local(obj());
1077 int oop_index = _oop_recorder->find_index(value);
1078 if (narrow) {
1079 #ifdef _LP64
1080 _constants->relocate(dest, oop_Relocation::spec(oop_index), relocInfo::narrow_oop_in_const);
1081 #else
1082 JVMCI_ERROR("unexpected compressed oop in 32-bit mode");
1083 #endif
1084 } else {
1085 _constants->relocate(dest, oop_Relocation::spec(oop_index));
1086 }
1087 }
1088
1089 void CodeInstaller::site_ExceptionHandler(jint pc_offset, HotSpotCompiledCodeStream* stream) {
1090 u4 handler_offset = stream->read_u4("site:handlerPos");
1091
1092 // Subtable header
1093 _exception_handler_table.add_entry(HandlerTableEntry(1, pc_offset, 0));
1094
1095 // Subtable entry
1096 _exception_handler_table.add_entry(HandlerTableEntry(-1, handler_offset, 0));
1097 }
1098
1099 void CodeInstaller::read_virtual_objects(HotSpotCompiledCodeStream* stream, JVMCI_TRAPS) {
1100 u2 length = stream->read_u2("virtualObjects:length");
1101 if (length == 0) {
1102 return;
1103 }
1104 GrowableArray<ScopeValue*> *objects = new GrowableArray<ScopeValue*>(length, length, nullptr);
1105 stream->set_virtual_objects(objects);
1106 // Create the unique ObjectValues
1107 JavaThread* thread = stream->thread();
1108 for (int id = 0; id < length; id++) {
1109 Klass* klass = stream->read_klass("type");
1110 bool is_auto_box = stream->read_bool("isAutoBox");
1111 if (is_auto_box) {
1112 _has_auto_box = true;
1113 }
1114 oop javaMirror = klass->java_mirror();
1115 ScopeValue *klass_sv = new ConstantOopWriteValue(JNIHandles::make_local(javaMirror));
1116 ObjectValue* sv = is_auto_box ? new AutoBoxObjectValue(id, klass_sv) : new ObjectValue(id, klass_sv);
1117 objects->at_put(id, sv);
1118 }
1119 // All the values which could be referenced by the VirtualObjects
1120 // exist, so now describe all the VirtualObjects themselves.
1121 for (int id = 0; id < length; id++) {
1122 record_object_value(objects->at(id)->as_ObjectValue(), stream, JVMCI_CHECK);
1123 }
1124 _debug_recorder->dump_object_pool(objects);
1125
1126 stream->set_virtual_objects(objects);
1127 }
1128
1129 int CodeInstaller::map_jvmci_bci(int bci) {
1130 if (bci < 0) {
1131 switch (bci) {
1132 case BEFORE_BCI: return BeforeBci;
1133 case AFTER_BCI: return AfterBci;
1134 case UNWIND_BCI: return UnwindBci;
1135 case AFTER_EXCEPTION_BCI: return AfterExceptionBci;
1136 case UNKNOWN_BCI: return UnknownBci;
1137 case INVALID_FRAMESTATE_BCI: return InvalidFrameStateBci;
1138 }
1139 ShouldNotReachHere();
1140 }
1141 return bci;
1142 }
1143
1144 void CodeInstaller::record_scope(jint pc_offset, HotSpotCompiledCodeStream* stream, u1 debug_info_flags, bool full_info, bool is_mh_invoke, bool return_oop, JVMCI_TRAPS) {
1145 if (full_info) {
1146 read_virtual_objects(stream, JVMCI_CHECK);
1147 }
1148 if (is_set(debug_info_flags, DI_HAS_FRAMES)) {
1149 u2 depth = stream->read_u2("depth");
1150 for (int i = 0; i < depth; i++) {
1151 Thread* thread = Thread::current();
1152 methodHandle method(thread, stream->read_method("method"));
1153 jint bci = map_jvmci_bci(stream->read_s4("bci"));
1154 if (bci == BEFORE_BCI) {
1155 bci = SynchronizationEntryBCI;
1156 }
1157
1158 JVMCI_event_2("Recording scope pc_offset=%d bci=%d method=%s", pc_offset, bci, method->name_and_sig_as_C_string());
1159
1160 bool reexecute = false;
1161 bool rethrow_exception = false;
1162
1163 DebugToken* locals_token = nullptr;
1164 DebugToken* stack_token = nullptr;
1165 DebugToken* monitors_token = nullptr;
1166
1167 if (full_info) {
1168 u1 frame_flags = stream->read_u1("flags");
1169 rethrow_exception = is_set(frame_flags, DIF_RETHROW_EXCEPTION);
1170
1171 if (bci >= 0) {
1172 reexecute = !is_set(frame_flags, DIF_DURING_CALL);
1173 }
1174
1175 GrowableArray<ScopeValue*>* locals = read_local_or_stack_values(stream, frame_flags, true, JVMCI_CHECK);
1176 GrowableArray<ScopeValue*>* stack = read_local_or_stack_values(stream, frame_flags, false, JVMCI_CHECK);
1177 GrowableArray<MonitorValue*>* monitors = read_monitor_values(stream, frame_flags, JVMCI_CHECK);
1178
1179 locals_token = _debug_recorder->create_scope_values(locals);
1180 stack_token = _debug_recorder->create_scope_values(stack);
1181 monitors_token = _debug_recorder->create_monitor_values(monitors);
1182 }
1183
1184 // has_ea_local_in_scope and arg_escape should be added to JVMCI
1185 const bool has_ea_local_in_scope = false;
1186 const bool arg_escape = false;
1187 _debug_recorder->describe_scope(pc_offset, method, nullptr, bci, reexecute, rethrow_exception, is_mh_invoke, return_oop,
1188 has_ea_local_in_scope, arg_escape,
1189 locals_token, stack_token, monitors_token);
1190 }
1191 }
1192 if (full_info) {
1193 // Clear the virtual objects as they are specific to one DebugInfo
1194 stream->set_virtual_objects(nullptr);
1195 }
1196 }
1197
1198 void CodeInstaller::site_Safepoint(CodeBuffer& buffer, jint pc_offset, HotSpotCompiledCodeStream* stream, u1 tag, JVMCI_TRAPS) {
1199 u1 flags = stream->read_u1("debugInfo:flags");
1200 OopMap *map = create_oop_map(stream, flags, JVMCI_CHECK);
1201 _debug_recorder->add_safepoint(pc_offset, map);
1202 record_scope(pc_offset, stream, flags, true, JVMCI_CHECK);
1203 _debug_recorder->end_safepoint(pc_offset);
1204 if (_orig_pc_offset < 0) {
1205 JVMCI_ERROR("method contains safepoint, but has no deopt rescue slot");
1206 }
1207 if (tag == SITE_IMPLICIT_EXCEPTION_DISPATCH) {
1208 jint dispatch_offset = stream->read_s4("dispatchOffset");
1209 _implicit_exception_table.append(pc_offset, dispatch_offset);
1210 } else if (tag == SITE_IMPLICIT_EXCEPTION) {
1211 _implicit_exception_table.add_deoptimize(pc_offset);
1212 }
1213 }
1214
1215 void CodeInstaller::site_Infopoint(CodeBuffer& buffer, jint pc_offset, HotSpotCompiledCodeStream* stream, JVMCI_TRAPS) {
1216 u1 flags = stream->read_u1("debugInfo:flags");
1217 _debug_recorder->add_non_safepoint(pc_offset);
1218 record_scope(pc_offset, stream, flags, false, JVMCI_CHECK);
1219 _debug_recorder->end_non_safepoint(pc_offset);
1220 }
1221
1222 void CodeInstaller::site_Call(CodeBuffer& buffer, u1 tag, jint pc_offset, HotSpotCompiledCodeStream* stream, JVMCI_TRAPS) {
1223 JavaThread* thread = stream->thread();
1224 jlong target = stream->read_u8("target");
1225 methodHandle method;
1226 bool direct_call = false;
1227 if (tag == SITE_CALL) {
1228 method = methodHandle(thread, (Method*) target);
1229 assert(Method::is_valid_method(method()), "invalid method");
1230 direct_call = stream->read_bool("direct");
1231 if (method.is_null()) {
1232 JVMCI_THROW(NullPointerException);
1233 }
1234 }
1235
1236 NativeInstruction* inst = nativeInstruction_at(_instructions->start() + pc_offset);
1237 jint next_pc_offset = CodeInstaller::pd_next_offset(inst, pc_offset, JVMCI_CHECK);
1238
1239 if (tag != SITE_FOREIGN_CALL_NO_DEBUG_INFO) {
1240 u1 flags = stream->read_u1("debugInfo:flags");
1241 OopMap *map = create_oop_map(stream, flags, JVMCI_CHECK);
1242 _debug_recorder->add_safepoint(next_pc_offset, map);
1243
1244 if (!method.is_null()) {
1245 vmIntrinsics::ID iid = method->intrinsic_id();
1246 bool is_mh_invoke = false;
1247 if (direct_call) {
1248 is_mh_invoke = !method->is_static() && (iid == vmIntrinsics::_compiledLambdaForm ||
1249 (MethodHandles::is_signature_polymorphic(iid) && MethodHandles::is_signature_polymorphic_intrinsic(iid)));
1250 }
1251 bool return_oop = method->is_returning_oop();
1252 record_scope(next_pc_offset, stream, flags, true, is_mh_invoke, return_oop, JVMCI_CHECK);
1253 } else {
1254 record_scope(next_pc_offset, stream, flags, true, JVMCI_CHECK);
1255 }
1256 }
1257
1258 if (tag != SITE_CALL) {
1259 jlong foreign_call_destination = target;
1260 CodeInstaller::pd_relocate_ForeignCall(inst, foreign_call_destination, JVMCI_CHECK);
1261 } else {
1262 CodeInstaller::pd_relocate_JavaMethod(buffer, method, pc_offset, JVMCI_CHECK);
1263 if (_next_call_type == INVOKESTATIC || _next_call_type == INVOKESPECIAL) {
1264 // Need a static call stub for transitions from compiled to interpreted.
1265 MacroAssembler masm(&buffer);
1266 if (CompiledDirectCall::emit_to_interp_stub(&masm, _instructions->start() + pc_offset) == nullptr) {
1267 JVMCI_ERROR("could not emit to_interp stub - code cache is full");
1268 }
1269 }
1270 }
1271
1272 _next_call_type = INVOKE_INVALID;
1273
1274 if (tag != SITE_FOREIGN_CALL_NO_DEBUG_INFO) {
1275 _debug_recorder->end_safepoint(next_pc_offset);
1276 }
1277 }
1278
1279 void CodeInstaller::site_DataPatch(CodeBuffer& buffer, jint pc_offset, HotSpotCompiledCodeStream* stream, JVMCI_TRAPS) {
1280 u1 tag = stream->read_u1("tag");
1281 switch (tag) {
1282 case PATCH_OBJECT_ID:
1283 case PATCH_OBJECT_ID2:
1284 case PATCH_NARROW_OBJECT_ID:
1285 case PATCH_NARROW_OBJECT_ID2:
1286 case PATCH_JOBJECT:
1287 case PATCH_NARROW_JOBJECT: {
1288 bool narrow = tag == PATCH_NARROW_OBJECT_ID || tag == PATCH_NARROW_OBJECT_ID2 || tag == PATCH_NARROW_JOBJECT;
1289 u1 read_tag = as_read_oop_tag(stream, tag, JVMCI_CHECK);
1290 Handle obj = read_oop(stream, read_tag, JVMCI_CHECK);
1291 pd_patch_OopConstant(pc_offset, obj, narrow, JVMCI_CHECK);
1292 break;
1293 }
1294 case PATCH_METHOD:
1295 case PATCH_KLASS:
1296 case PATCH_NARROW_KLASS: {
1297 pd_patch_MetaspaceConstant(pc_offset, stream, tag, JVMCI_CHECK);
1298 break;
1299 }
1300 case PATCH_DATA_SECTION_REFERENCE: {
1301 int data_offset = stream->read_u4("data:offset");
1302 if (0 <= data_offset && data_offset < _constants_size) {
1303 if (!is_aligned(data_offset, CompilerToVM::Data::get_data_section_item_alignment())) {
1304 JVMCI_ERROR("data offset 0x%x is not %d-byte aligned%s", data_offset, relocInfo::addr_unit(), stream->context());
1305 }
1306 pd_patch_DataSectionReference(pc_offset, data_offset, JVMCI_CHECK);
1307 } else {
1308 JVMCI_ERROR("data offset 0x%x points outside data section (size 0x%x)%s", data_offset, _constants_size, stream->context());
1309 }
1310 break;
1311 }
1312 default: {
1313 JVMCI_ERROR("unknown data patch tag: %d%s", tag, stream->context());
1314 }
1315 }
1316 }
1317
1318 void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, HotSpotCompiledCodeStream* stream, JVMCI_TRAPS) {
1319 u1 id = stream->read_u1("mark:id");
1320 address pc = _instructions->start() + pc_offset;
1321
1322 if (pd_relocate(pc, id)) {
1323 return;
1324 }
1325
1326 switch (id) {
1327 case UNVERIFIED_ENTRY:
1328 _offsets.set_value(CodeOffsets::Entry, pc_offset);
1329 break;
1330 case VERIFIED_ENTRY:
1331 _offsets.set_value(CodeOffsets::Verified_Entry, pc_offset);
1332 break;
1333 case OSR_ENTRY:
1334 _offsets.set_value(CodeOffsets::OSR_Entry, pc_offset);
1335 break;
1336 case EXCEPTION_HANDLER_ENTRY:
1337 _offsets.set_value(CodeOffsets::Exceptions, pc_offset);
1338 break;
1339 case DEOPT_HANDLER_ENTRY:
1340 _offsets.set_value(CodeOffsets::Deopt, pc_offset);
1341 break;
1342 case DEOPT_MH_HANDLER_ENTRY:
1343 _offsets.set_value(CodeOffsets::DeoptMH, pc_offset);
1344 break;
1345 case FRAME_COMPLETE:
1346 _offsets.set_value(CodeOffsets::Frame_Complete, pc_offset);
1347 break;
1348 case ENTRY_BARRIER_PATCH:
1349 _nmethod_entry_patch_offset = pc_offset;
1350 break;
1351 case INVOKEVIRTUAL:
1352 case INVOKEINTERFACE:
1353 case INLINE_INVOKE:
1354 case INVOKESTATIC:
1355 case INVOKESPECIAL:
1356 _next_call_type = (MarkId) id;
1357 _invoke_mark_pc = pc;
1358 break;
1359 case CARD_TABLE_SHIFT:
1360 case CARD_TABLE_ADDRESS:
1361 case HEAP_TOP_ADDRESS:
1362 case HEAP_END_ADDRESS:
1363 case NARROW_KLASS_BASE_ADDRESS:
1364 case NARROW_OOP_BASE_ADDRESS:
1365 case CRC_TABLE_ADDRESS:
1366 case LOG_OF_HEAP_REGION_GRAIN_BYTES:
1367 case INLINE_CONTIGUOUS_ALLOCATION_SUPPORTED:
1368 case VERIFY_OOPS:
1369 case VERIFY_OOP_BITS:
1370 case VERIFY_OOP_MASK:
1371 case VERIFY_OOP_COUNT_ADDRESS:
1372 break;
1373
1374 default:
1375 JVMCI_ERROR("invalid mark id: %d%s", id, stream->context());
1376 break;
1377 }
1378 }
--- EOF ---