102 } |
104 } |
103 return NULL; |
105 return NULL; |
104 } |
106 } |
105 |
107 |
106 |
108 |
107 static bool find_field(InstanceKlass* ik, |
|
108 Symbol* name_symbol, Symbol* signature_symbol, |
|
109 fieldDescriptor* fd, |
|
110 bool is_static = false, bool allow_super = false) { |
|
111 if (allow_super || is_static) { |
|
112 return ik->find_field(name_symbol, signature_symbol, is_static, fd) != NULL; |
|
113 } else { |
|
114 return ik->find_local_field(name_symbol, signature_symbol, fd); |
|
115 } |
|
116 } |
|
117 |
|
118 // Helpful routine for computing field offsets at run time rather than hardcoding them |
109 // Helpful routine for computing field offsets at run time rather than hardcoding them |
119 static void |
110 // Finds local fields only, including static fields. Static field offsets are from the |
120 compute_offset(int &dest_offset, |
111 // beginning of the mirror. |
121 Klass* klass, Symbol* name_symbol, Symbol* signature_symbol, |
112 static void compute_offset(int &dest_offset, |
122 bool is_static = false, bool allow_super = false) { |
113 InstanceKlass* ik, Symbol* name_symbol, Symbol* signature_symbol, |
|
114 bool is_static = false) { |
123 fieldDescriptor fd; |
115 fieldDescriptor fd; |
124 InstanceKlass* ik = InstanceKlass::cast(klass); |
116 if (ik == NULL) { |
125 if (!find_field(ik, name_symbol, signature_symbol, &fd, is_static, allow_super)) { |
|
126 ResourceMark rm; |
117 ResourceMark rm; |
127 tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string()); |
118 log_error(class)("Mismatch JDK version for field: %s type: %s", name_symbol->as_C_string(), signature_symbol->as_C_string()); |
|
119 vm_exit_during_initialization("Invalid layout of preloaded class"); |
|
120 } |
|
121 |
|
122 if (!ik->find_local_field(name_symbol, signature_symbol, &fd) || fd.is_static() != is_static) { |
|
123 ResourceMark rm; |
|
124 log_error(class)("Invalid layout of %s field: %s type: %s", ik->external_name(), |
|
125 name_symbol->as_C_string(), signature_symbol->as_C_string()); |
128 #ifndef PRODUCT |
126 #ifndef PRODUCT |
129 ik->print(); |
127 // Prints all fields and offsets |
130 tty->print_cr("all fields:"); |
128 Log(class) lt; |
131 for (AllFieldStream fs(ik); !fs.done(); fs.next()) { |
129 LogStream ls(lt.error()); |
132 tty->print_cr(" name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int()); |
130 ik->print_on(&ls); |
133 } |
|
134 #endif //PRODUCT |
131 #endif //PRODUCT |
135 vm_exit_during_initialization("Invalid layout of preloaded class: use -Xlog:class+load=info to see the origin of the problem class"); |
132 vm_exit_during_initialization("Invalid layout of preloaded class: use -Xlog:class+load=info to see the origin of the problem class"); |
136 } |
133 } |
137 dest_offset = fd.offset(); |
134 dest_offset = fd.offset(); |
138 } |
135 } |
139 |
136 |
|
137 // Overloading to pass name as a string. |
|
138 static void compute_offset(int& dest_offset, InstanceKlass* ik, |
|
139 const char* name_string, Symbol* signature_symbol, |
|
140 bool is_static = false) { |
|
141 TempNewSymbol name = SymbolTable::probe(name_string, (int)strlen(name_string)); |
|
142 if (name == NULL) { |
|
143 ResourceMark rm; |
|
144 log_error(class)("Name %s should be in the SymbolTable since its class is loaded", name_string); |
|
145 vm_exit_during_initialization("Invalid layout of preloaded class", ik->external_name()); |
|
146 } |
|
147 compute_offset(dest_offset, ik, name, signature_symbol, is_static); |
|
148 } |
|
149 |
140 // Same as above but for "optional" offsets that might not be present in certain JDK versions |
150 // Same as above but for "optional" offsets that might not be present in certain JDK versions |
|
151 // Old versions should be cleaned out since Hotspot only supports the current JDK, and this |
|
152 // function should be removed. |
141 static void |
153 static void |
142 compute_optional_offset(int& dest_offset, |
154 compute_optional_offset(int& dest_offset, |
143 Klass* klass, Symbol* name_symbol, Symbol* signature_symbol, |
155 InstanceKlass* ik, Symbol* name_symbol, Symbol* signature_symbol) { |
144 bool allow_super = false) { |
|
145 fieldDescriptor fd; |
156 fieldDescriptor fd; |
146 InstanceKlass* ik = InstanceKlass::cast(klass); |
157 if (ik->find_local_field(name_symbol, signature_symbol, &fd)) { |
147 if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) { |
|
148 dest_offset = fd.offset(); |
158 dest_offset = fd.offset(); |
149 } |
159 } |
150 } |
160 } |
151 |
|
152 |
161 |
153 int java_lang_String::value_offset = 0; |
162 int java_lang_String::value_offset = 0; |
154 int java_lang_String::hash_offset = 0; |
163 int java_lang_String::hash_offset = 0; |
155 int java_lang_String::coder_offset = 0; |
164 int java_lang_String::coder_offset = 0; |
156 |
165 |
1159 |
1168 |
1160 void java_lang_Class::compute_offsets() { |
1169 void java_lang_Class::compute_offsets() { |
1161 assert(!offsets_computed, "offsets should be initialized only once"); |
1170 assert(!offsets_computed, "offsets should be initialized only once"); |
1162 offsets_computed = true; |
1171 offsets_computed = true; |
1163 |
1172 |
1164 Klass* k = SystemDictionary::Class_klass(); |
1173 InstanceKlass* k = SystemDictionary::Class_klass(); |
1165 // The classRedefinedCount field is only present starting in 1.5, |
1174 compute_offset(classRedefinedCount_offset, k, "classRedefinedCount", vmSymbols::int_signature()); |
1166 // so don't go fatal. |
1175 compute_offset(_class_loader_offset, k, "classLoader", vmSymbols::classloader_signature()); |
1167 compute_optional_offset(classRedefinedCount_offset, |
1176 compute_offset(_component_mirror_offset, k, "componentType", vmSymbols::class_signature()); |
1168 k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature()); |
1177 compute_offset(_module_offset, k, "module", vmSymbols::module_signature()); |
1169 |
|
1170 // Needs to be optional because the old build runs Queens during bootstrapping |
|
1171 // and jdk8-9 doesn't have coordinated pushes yet. |
|
1172 compute_optional_offset(_class_loader_offset, |
|
1173 k, vmSymbols::classLoader_name(), |
|
1174 vmSymbols::classloader_signature()); |
|
1175 |
|
1176 compute_offset(_component_mirror_offset, |
|
1177 k, vmSymbols::componentType_name(), |
|
1178 vmSymbols::class_signature()); |
|
1179 |
|
1180 compute_offset(_module_offset, |
|
1181 k, vmSymbols::module_name(), |
|
1182 vmSymbols::module_signature()); |
|
1183 |
1178 |
1184 // Init lock is a C union with component_mirror. Only instanceKlass mirrors have |
1179 // Init lock is a C union with component_mirror. Only instanceKlass mirrors have |
1185 // init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops |
1180 // init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops |
1186 // GC treats them the same. |
1181 // GC treats them the same. |
1187 _init_lock_offset = _component_mirror_offset; |
1182 _init_lock_offset = _component_mirror_offset; |
1232 |
1227 |
1233 |
1228 |
1234 void java_lang_Thread::compute_offsets() { |
1229 void java_lang_Thread::compute_offsets() { |
1235 assert(_group_offset == 0, "offsets should be initialized only once"); |
1230 assert(_group_offset == 0, "offsets should be initialized only once"); |
1236 |
1231 |
1237 Klass* k = SystemDictionary::Thread_klass(); |
1232 InstanceKlass* k = SystemDictionary::Thread_klass(); |
1238 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
1233 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
1239 compute_offset(_group_offset, k, vmSymbols::group_name(), vmSymbols::threadgroup_signature()); |
1234 compute_offset(_group_offset, k, vmSymbols::group_name(), vmSymbols::threadgroup_signature()); |
1240 compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature()); |
1235 compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), |
1241 compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature()); |
1236 vmSymbols::classloader_signature()); |
|
1237 compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), |
|
1238 vmSymbols::accesscontrolcontext_signature()); |
1242 compute_offset(_priority_offset, k, vmSymbols::priority_name(), vmSymbols::int_signature()); |
1239 compute_offset(_priority_offset, k, vmSymbols::priority_name(), vmSymbols::int_signature()); |
1243 compute_offset(_daemon_offset, k, vmSymbols::daemon_name(), vmSymbols::bool_signature()); |
1240 compute_offset(_daemon_offset, k, vmSymbols::daemon_name(), vmSymbols::bool_signature()); |
1244 compute_offset(_eetop_offset, k, vmSymbols::eetop_name(), vmSymbols::long_signature()); |
1241 compute_offset(_eetop_offset, k, "eetop", vmSymbols::long_signature()); |
1245 compute_offset(_stillborn_offset, k, vmSymbols::stillborn_name(), vmSymbols::bool_signature()); |
1242 compute_offset(_stillborn_offset, k, "stillborn", vmSymbols::bool_signature()); |
1246 // The stackSize field is only present starting in 1.4, so don't go fatal. |
1243 compute_offset(_stackSize_offset, k, "stackSize", vmSymbols::long_signature()); |
1247 compute_optional_offset(_stackSize_offset, k, vmSymbols::stackSize_name(), vmSymbols::long_signature()); |
1244 compute_offset(_tid_offset, k, "tid", vmSymbols::long_signature()); |
1248 // The tid and thread_status fields are only present starting in 1.5, so don't go fatal. |
1245 compute_offset(_thread_status_offset, k, "threadStatus", vmSymbols::int_signature()); |
1249 compute_optional_offset(_tid_offset, k, vmSymbols::thread_id_name(), vmSymbols::long_signature()); |
1246 compute_offset(_park_blocker_offset, k, "parkBlocker", vmSymbols::object_signature()); |
1250 compute_optional_offset(_thread_status_offset, k, vmSymbols::thread_status_name(), vmSymbols::int_signature()); |
1247 compute_offset(_park_event_offset, k, "nativeParkEventPointer", vmSymbols::long_signature()); |
1251 // The parkBlocker field is only present starting in 1.6, so don't go fatal. |
|
1252 compute_optional_offset(_park_blocker_offset, k, vmSymbols::park_blocker_name(), vmSymbols::object_signature()); |
|
1253 compute_optional_offset(_park_event_offset, k, vmSymbols::park_event_name(), |
|
1254 vmSymbols::long_signature()); |
|
1255 } |
1248 } |
1256 |
1249 |
1257 |
1250 |
1258 JavaThread* java_lang_Thread::thread(oop java_thread) { |
1251 JavaThread* java_lang_Thread::thread(oop java_thread) { |
1259 return (JavaThread*)java_thread->address_field(_eetop_offset); |
1252 return (JavaThread*)java_thread->address_field(_eetop_offset); |
1499 compute_offset(_ngroups_offset, k, vmSymbols::ngroups_name(), vmSymbols::int_signature()); |
1492 compute_offset(_ngroups_offset, k, vmSymbols::ngroups_name(), vmSymbols::int_signature()); |
1500 } |
1493 } |
1501 |
1494 |
1502 |
1495 |
1503 void java_lang_Throwable::compute_offsets() { |
1496 void java_lang_Throwable::compute_offsets() { |
1504 Klass* k = SystemDictionary::Throwable_klass(); |
1497 InstanceKlass* k = SystemDictionary::Throwable_klass(); |
1505 compute_offset(depth_offset, k, vmSymbols::depth_name(), vmSymbols::int_signature()); |
1498 compute_offset(backtrace_offset, k, "backtrace", vmSymbols::object_signature()); |
|
1499 compute_offset(detailMessage_offset, k, "detailMessage", vmSymbols::string_signature()); |
|
1500 compute_offset(stackTrace_offset, k, "stackTrace", vmSymbols::java_lang_StackTraceElement_array()); |
|
1501 compute_offset(depth_offset, k, "depth", vmSymbols::int_signature()); |
|
1502 compute_offset(static_unassigned_stacktrace_offset, k, "UNASSIGNED_STACK", vmSymbols::java_lang_StackTraceElement_array(), |
|
1503 /*is_static*/true); |
1506 } |
1504 } |
1507 |
1505 |
1508 oop java_lang_Throwable::unassigned_stacktrace() { |
1506 oop java_lang_Throwable::unassigned_stacktrace() { |
1509 InstanceKlass* ik = SystemDictionary::Throwable_klass(); |
1507 InstanceKlass* ik = SystemDictionary::Throwable_klass(); |
1510 address addr = ik->static_field_addr(static_unassigned_stacktrace_offset); |
1508 address addr = ik->static_field_addr(static_unassigned_stacktrace_offset); |
2268 Symbol* name = method->name(); |
2266 Symbol* name = method->name(); |
2269 java_lang_StackTraceElement::fill_in(stack_trace_element, holder, method, version, bci, name, CHECK); |
2267 java_lang_StackTraceElement::fill_in(stack_trace_element, holder, method, version, bci, name, CHECK); |
2270 } |
2268 } |
2271 |
2269 |
2272 void java_lang_StackFrameInfo::compute_offsets() { |
2270 void java_lang_StackFrameInfo::compute_offsets() { |
2273 Klass* k = SystemDictionary::StackFrameInfo_klass(); |
2271 InstanceKlass* k = SystemDictionary::StackFrameInfo_klass(); |
2274 compute_offset(_memberName_offset, k, vmSymbols::memberName_name(), vmSymbols::object_signature()); |
2272 compute_offset(_memberName_offset, k, "memberName", vmSymbols::object_signature()); |
2275 compute_offset(_bci_offset, k, vmSymbols::bci_name(), vmSymbols::short_signature()); |
2273 compute_offset(_bci_offset, k, "bci", vmSymbols::short_signature()); |
2276 STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
2274 STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
2277 } |
2275 } |
2278 |
2276 |
2279 void java_lang_LiveStackFrameInfo::compute_offsets() { |
2277 void java_lang_LiveStackFrameInfo::compute_offsets() { |
2280 Klass* k = SystemDictionary::LiveStackFrameInfo_klass(); |
2278 InstanceKlass* k = SystemDictionary::LiveStackFrameInfo_klass(); |
2281 compute_offset(_monitors_offset, k, vmSymbols::monitors_name(), vmSymbols::object_array_signature()); |
2279 compute_offset(_monitors_offset, k, "monitors", vmSymbols::object_array_signature()); |
2282 compute_offset(_locals_offset, k, vmSymbols::locals_name(), vmSymbols::object_array_signature()); |
2280 compute_offset(_locals_offset, k, "locals", vmSymbols::object_array_signature()); |
2283 compute_offset(_operands_offset, k, vmSymbols::operands_name(), vmSymbols::object_array_signature()); |
2281 compute_offset(_operands_offset, k, "operands", vmSymbols::object_array_signature()); |
2284 compute_offset(_mode_offset, k, vmSymbols::mode_name(), vmSymbols::int_signature()); |
2282 compute_offset(_mode_offset, k, "mode", vmSymbols::int_signature()); |
2285 } |
2283 } |
2286 |
2284 |
2287 void java_lang_reflect_AccessibleObject::compute_offsets() { |
2285 void java_lang_reflect_AccessibleObject::compute_offsets() { |
2288 Klass* k = SystemDictionary::reflect_AccessibleObject_klass(); |
2286 InstanceKlass* k = SystemDictionary::reflect_AccessibleObject_klass(); |
2289 compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature()); |
2287 compute_offset(override_offset, k, "override", vmSymbols::bool_signature()); |
2290 } |
2288 } |
2291 |
2289 |
2292 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { |
2290 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) { |
2293 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2291 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2294 return (jboolean) reflect->bool_field(override_offset); |
2292 return (jboolean) reflect->bool_field(override_offset); |
2298 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2296 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2299 reflect->bool_field_put(override_offset, (int) value); |
2297 reflect->bool_field_put(override_offset, (int) value); |
2300 } |
2298 } |
2301 |
2299 |
2302 void java_lang_reflect_Method::compute_offsets() { |
2300 void java_lang_reflect_Method::compute_offsets() { |
2303 Klass* k = SystemDictionary::reflect_Method_klass(); |
2301 InstanceKlass* k = SystemDictionary::reflect_Method_klass(); |
2304 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
2302 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
2305 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
2303 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
2306 compute_offset(returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature()); |
2304 compute_offset(returnType_offset, k, vmSymbols::returnType_name(), vmSymbols::class_signature()); |
2307 compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); |
2305 compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); |
2308 compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); |
2306 compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); |
2479 assert(has_type_annotations_field(), "type_annotations field must be present"); |
2477 assert(has_type_annotations_field(), "type_annotations field must be present"); |
2480 method->obj_field_put(type_annotations_offset, value); |
2478 method->obj_field_put(type_annotations_offset, value); |
2481 } |
2479 } |
2482 |
2480 |
2483 void java_lang_reflect_Constructor::compute_offsets() { |
2481 void java_lang_reflect_Constructor::compute_offsets() { |
2484 Klass* k = SystemDictionary::reflect_Constructor_klass(); |
2482 InstanceKlass* k = SystemDictionary::reflect_Constructor_klass(); |
2485 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
2483 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
2486 compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); |
2484 compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature()); |
2487 compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); |
2485 compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature()); |
2488 compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); |
2486 compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); |
2489 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); |
2487 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); |
2621 assert(has_type_annotations_field(), "type_annotations field must be present"); |
2619 assert(has_type_annotations_field(), "type_annotations field must be present"); |
2622 constructor->obj_field_put(type_annotations_offset, value); |
2620 constructor->obj_field_put(type_annotations_offset, value); |
2623 } |
2621 } |
2624 |
2622 |
2625 void java_lang_reflect_Field::compute_offsets() { |
2623 void java_lang_reflect_Field::compute_offsets() { |
2626 Klass* k = SystemDictionary::reflect_Field_klass(); |
2624 InstanceKlass* k = SystemDictionary::reflect_Field_klass(); |
2627 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
2625 compute_offset(clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
2628 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
2626 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
2629 compute_offset(type_offset, k, vmSymbols::type_name(), vmSymbols::class_signature()); |
2627 compute_offset(type_offset, k, vmSymbols::type_name(), vmSymbols::class_signature()); |
2630 compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); |
2628 compute_offset(slot_offset, k, vmSymbols::slot_name(), vmSymbols::int_signature()); |
2631 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); |
2629 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); |
2745 assert(has_type_annotations_field(), "type_annotations field must be present"); |
2743 assert(has_type_annotations_field(), "type_annotations field must be present"); |
2746 field->obj_field_put(type_annotations_offset, value); |
2744 field->obj_field_put(type_annotations_offset, value); |
2747 } |
2745 } |
2748 |
2746 |
2749 void reflect_ConstantPool::compute_offsets() { |
2747 void reflect_ConstantPool::compute_offsets() { |
2750 Klass* k = SystemDictionary::reflect_ConstantPool_klass(); |
2748 InstanceKlass* k = SystemDictionary::reflect_ConstantPool_klass(); |
2751 // This null test can be removed post beta |
2749 // The field is called ConstantPool* in the sun.reflect.ConstantPool class. |
2752 if (k != NULL) { |
2750 compute_offset(_oop_offset, k, "constantPoolOop", vmSymbols::object_signature()); |
2753 // The field is called ConstantPool* in the sun.reflect.ConstantPool class. |
|
2754 compute_offset(_oop_offset, k, vmSymbols::ConstantPool_name(), vmSymbols::object_signature()); |
|
2755 } |
|
2756 } |
2751 } |
2757 |
2752 |
2758 void java_lang_reflect_Parameter::compute_offsets() { |
2753 void java_lang_reflect_Parameter::compute_offsets() { |
2759 Klass* k = SystemDictionary::reflect_Parameter_klass(); |
2754 InstanceKlass* k = SystemDictionary::reflect_Parameter_klass(); |
2760 if(NULL != k) { |
2755 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
2761 compute_offset(name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
2756 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); |
2762 compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature()); |
2757 compute_offset(index_offset, k, vmSymbols::index_name(), vmSymbols::int_signature()); |
2763 compute_offset(index_offset, k, vmSymbols::index_name(), vmSymbols::int_signature()); |
2758 compute_offset(executable_offset, k, vmSymbols::executable_name(), vmSymbols::executable_signature()); |
2764 compute_offset(executable_offset, k, vmSymbols::executable_name(), vmSymbols::executable_signature()); |
|
2765 } |
|
2766 } |
2759 } |
2767 |
2760 |
2768 Handle java_lang_reflect_Parameter::create(TRAPS) { |
2761 Handle java_lang_reflect_Parameter::create(TRAPS) { |
2769 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2762 assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem"); |
2770 Symbol* name = vmSymbols::java_lang_reflect_Parameter(); |
2763 Symbol* name = vmSymbols::java_lang_reflect_Parameter(); |
3135 int java_lang_invoke_ResolvedMethodName::_vmholder_offset; |
3127 int java_lang_invoke_ResolvedMethodName::_vmholder_offset; |
3136 |
3128 |
3137 int java_lang_invoke_LambdaForm::_vmentry_offset; |
3129 int java_lang_invoke_LambdaForm::_vmentry_offset; |
3138 |
3130 |
3139 void java_lang_invoke_MethodHandle::compute_offsets() { |
3131 void java_lang_invoke_MethodHandle::compute_offsets() { |
3140 Klass* k = SystemDictionary::MethodHandle_klass(); |
3132 InstanceKlass* k = SystemDictionary::MethodHandle_klass(); |
3141 if (k != NULL) { |
3133 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature()); |
3142 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature()); |
3134 compute_offset(_form_offset, k, "form", vmSymbols::java_lang_invoke_LambdaForm_signature()); |
3143 compute_offset(_form_offset, k, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature()); |
|
3144 } |
|
3145 } |
3135 } |
3146 |
3136 |
3147 void java_lang_invoke_MemberName::compute_offsets() { |
3137 void java_lang_invoke_MemberName::compute_offsets() { |
3148 Klass* k = SystemDictionary::MemberName_klass(); |
3138 InstanceKlass* k = SystemDictionary::MemberName_klass(); |
3149 assert (k != NULL, "jdk mismatch"); |
|
3150 compute_offset(_clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
3139 compute_offset(_clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature()); |
3151 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
3140 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature()); |
3152 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::object_signature()); |
3141 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::object_signature()); |
3153 compute_offset(_flags_offset, k, vmSymbols::flags_name(), vmSymbols::int_signature()); |
3142 compute_offset(_flags_offset, k, vmSymbols::flags_name(), vmSymbols::int_signature()); |
3154 compute_offset(_method_offset, k, vmSymbols::method_name(), vmSymbols::java_lang_invoke_ResolvedMethodName_signature()); |
3143 compute_offset(_method_offset, k, vmSymbols::method_name(), vmSymbols::java_lang_invoke_ResolvedMethodName_signature()); |
3155 MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
3144 MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
3156 } |
3145 } |
3157 |
3146 |
3158 void java_lang_invoke_ResolvedMethodName::compute_offsets() { |
3147 void java_lang_invoke_ResolvedMethodName::compute_offsets() { |
3159 Klass* k = SystemDictionary::ResolvedMethodName_klass(); |
3148 InstanceKlass* k = SystemDictionary::ResolvedMethodName_klass(); |
3160 assert(k != NULL, "jdk mismatch"); |
3149 assert(k != NULL, "jdk mismatch"); |
3161 RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
3150 RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
3162 } |
3151 } |
3163 |
3152 |
3164 void java_lang_invoke_LambdaForm::compute_offsets() { |
3153 void java_lang_invoke_LambdaForm::compute_offsets() { |
3165 Klass* k = SystemDictionary::LambdaForm_klass(); |
3154 InstanceKlass* k = SystemDictionary::LambdaForm_klass(); |
3166 assert (k != NULL, "jdk mismatch"); |
3155 assert (k != NULL, "jdk mismatch"); |
3167 compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature()); |
3156 compute_offset(_vmentry_offset, k, "vmentry", vmSymbols::java_lang_invoke_MemberName_signature()); |
3168 } |
3157 } |
3169 |
3158 |
3170 bool java_lang_invoke_LambdaForm::is_instance(oop obj) { |
3159 bool java_lang_invoke_LambdaForm::is_instance(oop obj) { |
3171 return obj != NULL && is_subclass(obj->klass()); |
3160 return obj != NULL && is_subclass(obj->klass()); |
3172 } |
3161 } |
3432 int java_security_AccessControlContext::_isPrivileged_offset = 0; |
3415 int java_security_AccessControlContext::_isPrivileged_offset = 0; |
3433 int java_security_AccessControlContext::_isAuthorized_offset = -1; |
3416 int java_security_AccessControlContext::_isAuthorized_offset = -1; |
3434 |
3417 |
3435 void java_security_AccessControlContext::compute_offsets() { |
3418 void java_security_AccessControlContext::compute_offsets() { |
3436 assert(_isPrivileged_offset == 0, "offsets should be initialized only once"); |
3419 assert(_isPrivileged_offset == 0, "offsets should be initialized only once"); |
3437 fieldDescriptor fd; |
3420 InstanceKlass* k = SystemDictionary::AccessControlContext_klass(); |
3438 InstanceKlass* ik = SystemDictionary::AccessControlContext_klass(); |
3421 |
3439 |
3422 compute_offset(_context_offset, k, "context", vmSymbols::protectiondomain_signature()); |
3440 if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) { |
3423 compute_offset(_privilegedContext_offset, k, "privilegedContext", vmSymbols::accesscontrolcontext_signature()); |
3441 fatal("Invalid layout of java.security.AccessControlContext"); |
3424 compute_offset(_isPrivileged_offset, k, "isPrivileged", vmSymbols::bool_signature()); |
3442 } |
3425 compute_offset(_isAuthorized_offset, k, "isAuthorized", vmSymbols::bool_signature()); |
3443 _context_offset = fd.offset(); |
|
3444 |
|
3445 if (!ik->find_local_field(vmSymbols::privilegedContext_name(), vmSymbols::accesscontrolcontext_signature(), &fd)) { |
|
3446 fatal("Invalid layout of java.security.AccessControlContext"); |
|
3447 } |
|
3448 _privilegedContext_offset = fd.offset(); |
|
3449 |
|
3450 if (!ik->find_local_field(vmSymbols::isPrivileged_name(), vmSymbols::bool_signature(), &fd)) { |
|
3451 fatal("Invalid layout of java.security.AccessControlContext"); |
|
3452 } |
|
3453 _isPrivileged_offset = fd.offset(); |
|
3454 |
|
3455 // The offset may not be present for bootstrapping with older JDK. |
|
3456 if (ik->find_local_field(vmSymbols::isAuthorized_name(), vmSymbols::bool_signature(), &fd)) { |
|
3457 _isAuthorized_offset = fd.offset(); |
|
3458 } |
|
3459 } |
3426 } |
3460 |
3427 |
3461 |
3428 |
3462 bool java_security_AccessControlContext::is_authorized(Handle context) { |
3429 bool java_security_AccessControlContext::is_authorized(Handle context) { |
3463 assert(context.not_null() && context->klass() == SystemDictionary::AccessControlContext_klass(), "Invalid type"); |
3430 assert(context.not_null() && context->klass() == SystemDictionary::AccessControlContext_klass(), "Invalid type"); |
3502 |
3469 |
3503 void java_lang_ClassLoader::compute_offsets() { |
3470 void java_lang_ClassLoader::compute_offsets() { |
3504 assert(!offsets_computed, "offsets should be initialized only once"); |
3471 assert(!offsets_computed, "offsets should be initialized only once"); |
3505 offsets_computed = true; |
3472 offsets_computed = true; |
3506 |
3473 |
3507 // The field indicating parallelCapable (parallelLockMap) is only present starting in 7, |
3474 InstanceKlass* k1 = SystemDictionary::ClassLoader_klass(); |
3508 Klass* k1 = SystemDictionary::ClassLoader_klass(); |
3475 compute_offset(parallelCapable_offset, |
3509 compute_optional_offset(parallelCapable_offset, |
3476 k1, "parallelLockMap", vmSymbols::concurrenthashmap_signature()); |
3510 k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature()); |
|
3511 |
3477 |
3512 compute_offset(name_offset, |
3478 compute_offset(name_offset, |
3513 k1, vmSymbols::name_name(), vmSymbols::string_signature()); |
3479 k1, vmSymbols::name_name(), vmSymbols::string_signature()); |
3514 |
3480 |
3515 compute_offset(unnamedModule_offset, |
3481 compute_offset(unnamedModule_offset, |
3516 k1, vmSymbols::unnamedModule_name(), vmSymbols::module_signature()); |
3482 k1, "unnamedModule", vmSymbols::module_signature()); |
|
3483 |
|
3484 compute_offset(parent_offset, k1, "parent", vmSymbols::classloader_signature()); |
3517 |
3485 |
3518 CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
3486 CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET); |
3519 } |
3487 } |
3520 |
3488 |
3521 oop java_lang_ClassLoader::parent(oop loader) { |
3489 oop java_lang_ClassLoader::parent(oop loader) { |
3598 assert(is_instance(loader), "loader must be oop"); |
3566 assert(is_instance(loader), "loader must be oop"); |
3599 return loader->obj_field(unnamedModule_offset); |
3567 return loader->obj_field(unnamedModule_offset); |
3600 } |
3568 } |
3601 |
3569 |
3602 // Support for java_lang_System |
3570 // Support for java_lang_System |
3603 int java_lang_System::in_offset_in_bytes() { |
3571 // |
3604 return (InstanceMirrorKlass::offset_of_static_fields() + static_in_offset); |
3572 void java_lang_System::compute_offsets() { |
3605 } |
3573 InstanceKlass* k = SystemDictionary::System_klass(); |
3606 |
3574 compute_offset(static_in_offset, k, "in", vmSymbols::input_stream_signature(), true); |
3607 |
3575 compute_offset(static_out_offset, k, "out", vmSymbols::print_stream_signature(), true); |
3608 int java_lang_System::out_offset_in_bytes() { |
3576 compute_offset(static_err_offset, k, "err", vmSymbols::print_stream_signature(), true); |
3609 return (InstanceMirrorKlass::offset_of_static_fields() + static_out_offset); |
3577 compute_offset(static_security_offset, k, "security", vmSymbols::security_manager_signature(), true); |
3610 } |
3578 } |
3611 |
3579 |
3612 |
3580 int java_lang_System::in_offset_in_bytes() { return static_in_offset; } |
3613 int java_lang_System::err_offset_in_bytes() { |
3581 int java_lang_System::out_offset_in_bytes() { return static_out_offset; } |
3614 return (InstanceMirrorKlass::offset_of_static_fields() + static_err_offset); |
3582 int java_lang_System::err_offset_in_bytes() { return static_err_offset; } |
3615 } |
|
3616 |
3583 |
3617 |
3584 |
3618 bool java_lang_System::has_security_manager() { |
3585 bool java_lang_System::has_security_manager() { |
3619 InstanceKlass* ik = SystemDictionary::System_klass(); |
3586 InstanceKlass* ik = SystemDictionary::System_klass(); |
3620 address addr = ik->static_field_addr(static_security_offset); |
3587 address addr = ik->static_field_addr(static_security_offset); |
3715 int reflect_ConstantPool::_oop_offset; |
3681 int reflect_ConstantPool::_oop_offset; |
3716 int reflect_UnsafeStaticFieldAccessorImpl::_base_offset; |
3682 int reflect_UnsafeStaticFieldAccessorImpl::_base_offset; |
3717 |
3683 |
3718 |
3684 |
3719 // Support for java_lang_StackTraceElement |
3685 // Support for java_lang_StackTraceElement |
|
3686 void java_lang_StackTraceElement::compute_offsets() { |
|
3687 InstanceKlass* k = SystemDictionary::StackTraceElement_klass(); |
|
3688 compute_offset(declaringClassObject_offset, k, "declaringClassObject", vmSymbols::class_signature()); |
|
3689 compute_offset(classLoaderName_offset, k, "classLoaderName", vmSymbols::string_signature()); |
|
3690 compute_offset(moduleName_offset, k, "moduleName", vmSymbols::string_signature()); |
|
3691 compute_offset(moduleVersion_offset, k, "moduleVersion", vmSymbols::string_signature()); |
|
3692 compute_offset(declaringClass_offset, k, "declaringClass", vmSymbols::string_signature()); |
|
3693 compute_offset(methodName_offset, k, "methodName", vmSymbols::string_signature()); |
|
3694 compute_offset(fileName_offset, k, "fileName", vmSymbols::string_signature()); |
|
3695 compute_offset(lineNumber_offset, k, "lineNumber", vmSymbols::int_signature()); |
|
3696 } |
3720 |
3697 |
3721 void java_lang_StackTraceElement::set_fileName(oop element, oop value) { |
3698 void java_lang_StackTraceElement::set_fileName(oop element, oop value) { |
3722 element->obj_field_put(fileName_offset, value); |
3699 element->obj_field_put(fileName_offset, value); |
3723 } |
3700 } |
3724 |
3701 |
3773 void java_lang_LiveStackFrameInfo::set_mode(oop element, int value) { |
3750 void java_lang_LiveStackFrameInfo::set_mode(oop element, int value) { |
3774 element->int_field_put(_mode_offset, value); |
3751 element->int_field_put(_mode_offset, value); |
3775 } |
3752 } |
3776 |
3753 |
3777 // Support for java Assertions - java_lang_AssertionStatusDirectives. |
3754 // Support for java Assertions - java_lang_AssertionStatusDirectives. |
|
3755 |
|
3756 void java_lang_AssertionStatusDirectives::compute_offsets() { |
|
3757 InstanceKlass* k = SystemDictionary::AssertionStatusDirectives_klass(); |
|
3758 compute_offset(classes_offset, k, "classes", vmSymbols::string_array_signature()); |
|
3759 compute_offset(classEnabled_offset, k, "classEnabled", vmSymbols::bool_array_signature()); |
|
3760 compute_offset(packages_offset, k, "packages", vmSymbols::string_array_signature()); |
|
3761 compute_offset(packageEnabled_offset, k, "packageEnabled", vmSymbols::bool_array_signature()); |
|
3762 compute_offset(deflt_offset, k, "deflt", vmSymbols::bool_signature()); |
|
3763 } |
|
3764 |
3778 |
3765 |
3779 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) { |
3766 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) { |
3780 o->obj_field_put(classes_offset, val); |
3767 o->obj_field_put(classes_offset, val); |
3781 } |
3768 } |
3782 |
3769 |
3802 return _limit_offset; |
3789 return _limit_offset; |
3803 } |
3790 } |
3804 |
3791 |
3805 |
3792 |
3806 void java_nio_Buffer::compute_offsets() { |
3793 void java_nio_Buffer::compute_offsets() { |
3807 Klass* k = SystemDictionary::nio_Buffer_klass(); |
3794 InstanceKlass* k = SystemDictionary::nio_Buffer_klass(); |
3808 assert(k != NULL, "must be loaded in 1.4+"); |
3795 assert(k != NULL, "must be loaded in 1.4+"); |
3809 compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature()); |
3796 compute_offset(_limit_offset, k, "limit", vmSymbols::int_signature()); |
3810 } |
3797 } |
3811 |
3798 |
3812 void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) { |
3799 void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) { |
3813 if (_owner_offset != 0) return; |
3800 if (_owner_offset != 0) return; |
3814 |
3801 |
3815 SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK); |
3802 SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK); |
3816 Klass* k = SystemDictionary::abstract_ownable_synchronizer_klass(); |
3803 InstanceKlass* k = SystemDictionary::abstract_ownable_synchronizer_klass(); |
3817 compute_offset(_owner_offset, k, |
3804 compute_offset(_owner_offset, k, |
3818 vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature()); |
3805 "exclusiveOwnerThread", vmSymbols::thread_signature()); |
3819 } |
3806 } |
3820 |
3807 |
3821 oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) { |
3808 oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) { |
3822 assert(_owner_offset != 0, "Must be initialized"); |
3809 assert(_owner_offset != 0, "Must be initialized"); |
3823 return obj->obj_field(_owner_offset); |
3810 return obj->obj_field(_owner_offset); |
|
3811 } |
|
3812 |
|
3813 static int member_offset(int hardcoded_offset) { |
|
3814 return (hardcoded_offset * heapOopSize) + instanceOopDesc::base_offset_in_bytes(); |
3824 } |
3815 } |
3825 |
3816 |
3826 // Compute hard-coded offsets |
3817 // Compute hard-coded offsets |
3827 // Invoked before SystemDictionary::initialize, so pre-loaded classes |
3818 // Invoked before SystemDictionary::initialize, so pre-loaded classes |
3828 // are not available to determine the offset_of_static_fields. |
3819 // are not available to determine the offset_of_static_fields. |
3829 void JavaClasses::compute_hard_coded_offsets() { |
3820 void JavaClasses::compute_hard_coded_offsets() { |
3830 const int x = heapOopSize; |
|
3831 const int header = instanceOopDesc::base_offset_in_bytes(); |
|
3832 |
|
3833 // Throwable Class |
|
3834 java_lang_Throwable::backtrace_offset = java_lang_Throwable::hc_backtrace_offset * x + header; |
|
3835 java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header; |
|
3836 java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header; |
|
3837 java_lang_Throwable::static_unassigned_stacktrace_offset = java_lang_Throwable::hc_static_unassigned_stacktrace_offset * x; |
|
3838 |
3821 |
3839 // java_lang_boxing_object |
3822 // java_lang_boxing_object |
3840 java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset + header; |
3823 java_lang_boxing_object::value_offset = member_offset(java_lang_boxing_object::hc_value_offset); |
3841 java_lang_boxing_object::long_value_offset = align_up((java_lang_boxing_object::hc_value_offset + header), BytesPerLong); |
3824 java_lang_boxing_object::long_value_offset = align_up(member_offset(java_lang_boxing_object::hc_value_offset), BytesPerLong); |
3842 |
3825 |
3843 // java_lang_ref_Reference: |
3826 // java_lang_ref_Reference |
3844 java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header; |
3827 java_lang_ref_Reference::referent_offset = member_offset(java_lang_ref_Reference::hc_referent_offset); |
3845 java_lang_ref_Reference::queue_offset = java_lang_ref_Reference::hc_queue_offset * x + header; |
3828 java_lang_ref_Reference::queue_offset = member_offset(java_lang_ref_Reference::hc_queue_offset); |
3846 java_lang_ref_Reference::next_offset = java_lang_ref_Reference::hc_next_offset * x + header; |
3829 java_lang_ref_Reference::next_offset = member_offset(java_lang_ref_Reference::hc_next_offset); |
3847 java_lang_ref_Reference::discovered_offset = java_lang_ref_Reference::hc_discovered_offset * x + header; |
3830 java_lang_ref_Reference::discovered_offset = member_offset(java_lang_ref_Reference::hc_discovered_offset); |
3848 // Artificial fields for java_lang_ref_Reference |
|
3849 // The first field is for the discovered field added in 1.4 |
|
3850 java_lang_ref_Reference::number_of_fake_oop_fields = 1; |
|
3851 |
|
3852 // java_lang_ref_SoftReference Class |
|
3853 java_lang_ref_SoftReference::timestamp_offset = align_up((java_lang_ref_SoftReference::hc_timestamp_offset * x + header), BytesPerLong); |
|
3854 // Don't multiply static fields because they are always in wordSize units |
|
3855 java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x; |
|
3856 |
|
3857 // java_lang_ClassLoader |
|
3858 java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header; |
|
3859 |
|
3860 // java_lang_System |
|
3861 java_lang_System::static_in_offset = java_lang_System::hc_static_in_offset * x; |
|
3862 java_lang_System::static_out_offset = java_lang_System::hc_static_out_offset * x; |
|
3863 java_lang_System::static_err_offset = java_lang_System::hc_static_err_offset * x; |
|
3864 java_lang_System::static_security_offset = java_lang_System::hc_static_security_offset * x; |
|
3865 |
|
3866 // java_lang_StackTraceElement |
|
3867 java_lang_StackTraceElement::declaringClassObject_offset = java_lang_StackTraceElement::hc_declaringClassObject_offset * x + header; |
|
3868 java_lang_StackTraceElement::classLoaderName_offset = java_lang_StackTraceElement::hc_classLoaderName_offset * x + header; |
|
3869 java_lang_StackTraceElement::moduleName_offset = java_lang_StackTraceElement::hc_moduleName_offset * x + header; |
|
3870 java_lang_StackTraceElement::moduleVersion_offset = java_lang_StackTraceElement::hc_moduleVersion_offset * x + header; |
|
3871 java_lang_StackTraceElement::declaringClass_offset = java_lang_StackTraceElement::hc_declaringClass_offset * x + header; |
|
3872 java_lang_StackTraceElement::methodName_offset = java_lang_StackTraceElement::hc_methodName_offset * x + header; |
|
3873 java_lang_StackTraceElement::fileName_offset = java_lang_StackTraceElement::hc_fileName_offset * x + header; |
|
3874 java_lang_StackTraceElement::lineNumber_offset = java_lang_StackTraceElement::hc_lineNumber_offset * x + header; |
|
3875 java_lang_AssertionStatusDirectives::classes_offset = java_lang_AssertionStatusDirectives::hc_classes_offset * x + header; |
|
3876 java_lang_AssertionStatusDirectives::classEnabled_offset = java_lang_AssertionStatusDirectives::hc_classEnabled_offset * x + header; |
|
3877 java_lang_AssertionStatusDirectives::packages_offset = java_lang_AssertionStatusDirectives::hc_packages_offset * x + header; |
|
3878 java_lang_AssertionStatusDirectives::packageEnabled_offset = java_lang_AssertionStatusDirectives::hc_packageEnabled_offset * x + header; |
|
3879 java_lang_AssertionStatusDirectives::deflt_offset = java_lang_AssertionStatusDirectives::hc_deflt_offset * x + header; |
|
3880 |
|
3881 } |
3831 } |
3882 |
3832 |
3883 |
3833 |
3884 // Compute non-hard-coded field offsets of all the classes in this file |
3834 // Compute non-hard-coded field offsets of all the classes in this file |
3885 void JavaClasses::compute_offsets() { |
3835 void JavaClasses::compute_offsets() { |
3886 // java_lang_Class::compute_offsets was called earlier in bootstrap |
3836 // java_lang_Class::compute_offsets was called earlier in bootstrap |
|
3837 java_lang_System::compute_offsets(); |
3887 java_lang_ClassLoader::compute_offsets(); |
3838 java_lang_ClassLoader::compute_offsets(); |
3888 java_lang_Throwable::compute_offsets(); |
3839 java_lang_Throwable::compute_offsets(); |
3889 java_lang_Thread::compute_offsets(); |
3840 java_lang_Thread::compute_offsets(); |
3890 java_lang_ThreadGroup::compute_offsets(); |
3841 java_lang_ThreadGroup::compute_offsets(); |
|
3842 java_lang_AssertionStatusDirectives::compute_offsets(); |
|
3843 java_lang_ref_SoftReference::compute_offsets(); |
3891 java_lang_invoke_MethodHandle::compute_offsets(); |
3844 java_lang_invoke_MethodHandle::compute_offsets(); |
3892 java_lang_invoke_DirectMethodHandle::compute_offsets(); |
3845 java_lang_invoke_DirectMethodHandle::compute_offsets(); |
3893 java_lang_invoke_MemberName::compute_offsets(); |
3846 java_lang_invoke_MemberName::compute_offsets(); |
3894 java_lang_invoke_ResolvedMethodName::compute_offsets(); |
3847 java_lang_invoke_ResolvedMethodName::compute_offsets(); |
3895 java_lang_invoke_LambdaForm::compute_offsets(); |
3848 java_lang_invoke_LambdaForm::compute_offsets(); |
3945 klass_name, field_name, hardcoded_offset, fd.offset()); |
3899 klass_name, field_name, hardcoded_offset, fd.offset()); |
3946 return false; |
3900 return false; |
3947 } |
3901 } |
3948 } |
3902 } |
3949 |
3903 |
3950 |
|
3951 bool JavaClasses::check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) { |
|
3952 EXCEPTION_MARK; |
|
3953 fieldDescriptor fd; |
|
3954 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); |
|
3955 Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); |
|
3956 InstanceKlass* ik = InstanceKlass::cast(k); |
|
3957 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); |
|
3958 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); |
|
3959 if (!ik->find_local_field(f_name, f_sig, &fd)) { |
|
3960 tty->print_cr("Static field %s.%s not found", klass_name, field_name); |
|
3961 return false; |
|
3962 } |
|
3963 if (!fd.is_static()) { |
|
3964 tty->print_cr("Static field %s.%s appears to be nonstatic", klass_name, field_name); |
|
3965 return false; |
|
3966 } |
|
3967 if (fd.offset() == hardcoded_offset + InstanceMirrorKlass::offset_of_static_fields()) { |
|
3968 return true; |
|
3969 } else { |
|
3970 tty->print_cr("Offset of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_offset, fd.offset() - InstanceMirrorKlass::offset_of_static_fields()); |
|
3971 return false; |
|
3972 } |
|
3973 } |
|
3974 |
|
3975 |
|
3976 bool JavaClasses::check_constant(const char *klass_name, int hardcoded_constant, const char *field_name, const char* field_sig) { |
|
3977 EXCEPTION_MARK; |
|
3978 fieldDescriptor fd; |
|
3979 TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH); |
|
3980 Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH); |
|
3981 InstanceKlass* ik = InstanceKlass::cast(k); |
|
3982 TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH); |
|
3983 TempNewSymbol f_sig = SymbolTable::new_symbol(field_sig, CATCH); |
|
3984 if (!ik->find_local_field(f_name, f_sig, &fd)) { |
|
3985 tty->print_cr("Static field %s.%s not found", klass_name, field_name); |
|
3986 return false; |
|
3987 } |
|
3988 if (!fd.is_static() || !fd.has_initial_value()) { |
|
3989 tty->print_cr("Static field %s.%s appears to be non-constant", klass_name, field_name); |
|
3990 return false; |
|
3991 } |
|
3992 if (!fd.initial_value_tag().is_int()) { |
|
3993 tty->print_cr("Static field %s.%s is not an int", klass_name, field_name); |
|
3994 return false; |
|
3995 } |
|
3996 jint field_value = fd.int_initial_value(); |
|
3997 if (field_value == hardcoded_constant) { |
|
3998 return true; |
|
3999 } else { |
|
4000 tty->print_cr("Constant value of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_constant, field_value); |
|
4001 return false; |
|
4002 } |
|
4003 } |
|
4004 |
|
4005 |
|
4006 // Check the hard-coded field offsets of all the classes in this file |
3904 // Check the hard-coded field offsets of all the classes in this file |
4007 |
3905 |
4008 void JavaClasses::check_offsets() { |
3906 void JavaClasses::check_offsets() { |
4009 bool valid = true; |
3907 bool valid = true; |
4010 |
3908 |
4011 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
3909 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
4012 valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig) |
3910 valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig) |
4013 |
3911 |
4014 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
3912 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
4015 valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig) |
3913 valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig) |
4016 |
|
4017 #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \ |
|
4018 valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig) |
|
4019 |
|
4020 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \ |
|
4021 valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig) |
|
4022 |
|
4023 // java.lang.String |
|
4024 |
|
4025 CHECK_OFFSET("java/lang/String", java_lang_String, value, "[B"); |
|
4026 CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I"); |
|
4027 CHECK_OFFSET("java/lang/String", java_lang_String, coder, "B"); |
|
4028 |
|
4029 // java.lang.Class |
|
4030 |
|
4031 // Fake fields |
|
4032 // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked |
|
4033 // CHECK_OFFSET("java/lang/Class", java_lang_Class, array_klass); // %%% this needs to be checked |
|
4034 |
|
4035 // java.lang.Throwable |
|
4036 |
|
4037 CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, backtrace, "Ljava/lang/Object;"); |
|
4038 CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, detailMessage, "Ljava/lang/String;"); |
|
4039 CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, stackTrace, "[Ljava/lang/StackTraceElement;"); |
|
4040 CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, depth, "I"); |
|
4041 |
3914 |
4042 // Boxed primitive objects (java_lang_boxing_object) |
3915 // Boxed primitive objects (java_lang_boxing_object) |
4043 |
3916 |
4044 CHECK_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z"); |
3917 CHECK_OFFSET("java/lang/Boolean", java_lang_boxing_object, value, "Z"); |
4045 CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C"); |
3918 CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C"); |
4048 CHECK_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B"); |
3921 CHECK_OFFSET("java/lang/Byte", java_lang_boxing_object, value, "B"); |
4049 CHECK_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S"); |
3922 CHECK_OFFSET("java/lang/Short", java_lang_boxing_object, value, "S"); |
4050 CHECK_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I"); |
3923 CHECK_OFFSET("java/lang/Integer", java_lang_boxing_object, value, "I"); |
4051 CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J"); |
3924 CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J"); |
4052 |
3925 |
4053 // java.lang.ClassLoader |
|
4054 |
|
4055 CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent, "Ljava/lang/ClassLoader;"); |
|
4056 |
|
4057 // java.lang.System |
|
4058 |
|
4059 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, in, "Ljava/io/InputStream;"); |
|
4060 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, out, "Ljava/io/PrintStream;"); |
|
4061 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, err, "Ljava/io/PrintStream;"); |
|
4062 CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, security, "Ljava/lang/SecurityManager;"); |
|
4063 |
|
4064 // java.lang.StackTraceElement |
|
4065 |
|
4066 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClassObject, "Ljava/lang/Class;"); |
|
4067 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, classLoaderName, "Ljava/lang/String;"); |
|
4068 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, moduleName, "Ljava/lang/String;"); |
|
4069 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, moduleVersion, "Ljava/lang/String;"); |
|
4070 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClass, "Ljava/lang/String;"); |
|
4071 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, methodName, "Ljava/lang/String;"); |
|
4072 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, fileName, "Ljava/lang/String;"); |
|
4073 CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, lineNumber, "I"); |
|
4074 |
|
4075 // java.lang.ref.Reference |
3926 // java.lang.ref.Reference |
4076 |
3927 |
4077 CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, referent, "Ljava/lang/Object;"); |
3928 CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, referent, "Ljava/lang/Object;"); |
4078 CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, queue, "Ljava/lang/ref/ReferenceQueue;"); |
3929 CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, queue, "Ljava/lang/ref/ReferenceQueue;"); |
4079 CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, next, "Ljava/lang/ref/Reference;"); |
3930 CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, next, "Ljava/lang/ref/Reference;"); |
4080 // Fake field |
3931 // Fake field |
4081 //CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, discovered, "Ljava/lang/ref/Reference;"); |
3932 //CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, discovered, "Ljava/lang/ref/Reference;"); |
4082 |
|
4083 // java.lang.ref.SoftReference |
|
4084 |
|
4085 CHECK_OFFSET("java/lang/ref/SoftReference", java_lang_ref_SoftReference, timestamp, "J"); |
|
4086 CHECK_STATIC_OFFSET("java/lang/ref/SoftReference", java_lang_ref_SoftReference, clock, "J"); |
|
4087 |
|
4088 // java.lang.AssertionStatusDirectives |
|
4089 // |
|
4090 // The CheckAssertionStatusDirectives boolean can be removed from here and |
|
4091 // globals.hpp after the AssertionStatusDirectives class has been integrated |
|
4092 // into merlin "for some time." Without it, the vm will fail with early |
|
4093 // merlin builds. |
|
4094 |
|
4095 if (CheckAssertionStatusDirectives) { |
|
4096 const char* nm = "java/lang/AssertionStatusDirectives"; |
|
4097 const char* sig = "[Ljava/lang/String;"; |
|
4098 CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, classes, sig); |
|
4099 CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, classEnabled, "[Z"); |
|
4100 CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, packages, sig); |
|
4101 CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, packageEnabled, "[Z"); |
|
4102 CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, deflt, "Z"); |
|
4103 } |
|
4104 |
3933 |
4105 if (!valid) vm_exit_during_initialization("Hard-coded field offset verification failed"); |
3934 if (!valid) vm_exit_during_initialization("Hard-coded field offset verification failed"); |
4106 } |
3935 } |
4107 |
3936 |
4108 #endif // PRODUCT |
3937 #endif // PRODUCT |