1 /*
2 * Copyright (c) 1997, 2010, 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 *
49 #ifdef TARGET_OS_FAMILY_linux
50 # include "thread_linux.inline.hpp"
51 #endif
52 #ifdef TARGET_OS_FAMILY_solaris
53 # include "thread_solaris.inline.hpp"
54 #endif
55 #ifdef TARGET_OS_FAMILY_windows
56 # include "thread_windows.inline.hpp"
57 #endif
58
59 static bool find_field(instanceKlass* ik,
60 Symbol* name_symbol, Symbol* signature_symbol,
61 fieldDescriptor* fd,
62 bool allow_super = false) {
63 if (allow_super)
64 return ik->find_field(name_symbol, signature_symbol, fd) != NULL;
65 else
66 return ik->find_local_field(name_symbol, signature_symbol, fd);
67 }
68
69 // Helpful routine for computing field offsets at run time rather than hardcoding them
70 static void
71 compute_offset(int &dest_offset,
72 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
73 bool allow_super = false) {
74 fieldDescriptor fd;
75 instanceKlass* ik = instanceKlass::cast(klass_oop);
76 if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
77 ResourceMark rm;
78 tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
79 fatal("Invalid layout of preloaded class");
80 }
81 dest_offset = fd.offset();
82 }
83
84 // Same as above but for "optional" offsets that might not be present in certain JDK versions
85 static void
86 compute_optional_offset(int& dest_offset,
87 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
88 bool allow_super = false) {
2183 int java_dyn_MethodHandle::_vmentry_offset;
2184 int java_dyn_MethodHandle::_vmslots_offset;
2185
2186 int sun_dyn_MemberName::_clazz_offset;
2187 int sun_dyn_MemberName::_name_offset;
2188 int sun_dyn_MemberName::_type_offset;
2189 int sun_dyn_MemberName::_flags_offset;
2190 int sun_dyn_MemberName::_vmtarget_offset;
2191 int sun_dyn_MemberName::_vmindex_offset;
2192
2193 int sun_dyn_DirectMethodHandle::_vmindex_offset;
2194
2195 int sun_dyn_BoundMethodHandle::_argument_offset;
2196 int sun_dyn_BoundMethodHandle::_vmargslot_offset;
2197
2198 int sun_dyn_AdapterMethodHandle::_conversion_offset;
2199
2200 void java_dyn_MethodHandle::compute_offsets() {
2201 klassOop k = SystemDictionary::MethodHandle_klass();
2202 if (k != NULL && EnableMethodHandles) {
2203 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_dyn_MethodType_signature(), true);
2204 compute_offset(_vmtarget_offset, k, vmSymbols::vmtarget_name(), vmSymbols::object_signature(), true);
2205 compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::machine_word_signature(), true);
2206
2207 // Note: MH.vmslots (if it is present) is a hoisted copy of MH.type.form.vmslots.
2208 // It is optional pending experiments to keep or toss.
2209 compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), true);
2210 }
2211 }
2212
2213 void sun_dyn_MemberName::compute_offsets() {
2214 klassOop k = SystemDictionary::MemberName_klass();
2215 if (k != NULL && EnableMethodHandles) {
2216 compute_offset(_clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
2217 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature());
2218 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::object_signature());
2219 compute_offset(_flags_offset, k, vmSymbols::flags_name(), vmSymbols::int_signature());
2220 compute_offset(_vmtarget_offset, k, vmSymbols::vmtarget_name(), vmSymbols::object_signature());
2221 compute_offset(_vmindex_offset, k, vmSymbols::vmindex_name(), vmSymbols::int_signature());
2222 }
2223 }
2224
2225 void sun_dyn_DirectMethodHandle::compute_offsets() {
2226 klassOop k = SystemDictionary::DirectMethodHandle_klass();
2227 if (k != NULL && EnableMethodHandles) {
2228 compute_offset(_vmindex_offset, k, vmSymbols::vmindex_name(), vmSymbols::int_signature(), true);
2229 }
2487
2488 int java_dyn_MethodTypeForm::vmslots(oop mtform) {
2489 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2490 return mtform->int_field(_vmslots_offset);
2491 }
2492
2493 oop java_dyn_MethodTypeForm::erasedType(oop mtform) {
2494 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2495 return mtform->obj_field(_erasedType_offset);
2496 }
2497
2498 oop java_dyn_MethodTypeForm::genericInvoker(oop mtform) {
2499 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2500 return mtform->obj_field(_genericInvoker_offset);
2501 }
2502
2503
2504 // Support for java_dyn_CallSite
2505
2506 int java_dyn_CallSite::_target_offset;
2507 int java_dyn_CallSite::_caller_method_offset;
2508 int java_dyn_CallSite::_caller_bci_offset;
2509
2510 void java_dyn_CallSite::compute_offsets() {
2511 if (!EnableInvokeDynamic) return;
2512 klassOop k = SystemDictionary::CallSite_klass();
2513 if (k != NULL) {
2514 compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_dyn_MethodHandle_signature());
2515 compute_offset(_caller_method_offset, k, vmSymbols::vmmethod_name(), vmSymbols::sun_dyn_MemberName_signature());
2516 compute_offset(_caller_bci_offset, k, vmSymbols::vmindex_name(), vmSymbols::int_signature());
2517 }
2518 }
2519
2520 oop java_dyn_CallSite::target(oop site) {
2521 return site->obj_field(_target_offset);
2522 }
2523
2524 void java_dyn_CallSite::set_target(oop site, oop target) {
2525 site->obj_field_put(_target_offset, target);
2526 }
2527
2528 oop java_dyn_CallSite::caller_method(oop site) {
2529 return site->obj_field(_caller_method_offset);
2530 }
2531
2532 void java_dyn_CallSite::set_caller_method(oop site, oop ref) {
2533 site->obj_field_put(_caller_method_offset, ref);
2534 }
2535
2536 jint java_dyn_CallSite::caller_bci(oop site) {
2537 return site->int_field(_caller_bci_offset);
2538 }
2539
2540 void java_dyn_CallSite::set_caller_bci(oop site, jint bci) {
2541 site->int_field_put(_caller_bci_offset, bci);
2542 }
2543
2544
2545 // Support for java_security_AccessControlContext
2546
2547 int java_security_AccessControlContext::_context_offset = 0;
2548 int java_security_AccessControlContext::_privilegedContext_offset = 0;
2549 int java_security_AccessControlContext::_isPrivileged_offset = 0;
2550
2551 void java_security_AccessControlContext::compute_offsets() {
2552 assert(_isPrivileged_offset == 0, "offsets should be initialized only once");
2553 fieldDescriptor fd;
2554 instanceKlass* ik = instanceKlass::cast(SystemDictionary::AccessControlContext_klass());
2555
2556 if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) {
2557 fatal("Invalid layout of java.security.AccessControlContext");
2558 }
2559 _context_offset = fd.offset();
2560
2561 if (!ik->find_local_field(vmSymbols::privilegedContext_name(), vmSymbols::accesscontrolcontext_signature(), &fd)) {
2562 fatal("Invalid layout of java.security.AccessControlContext");
2563 }
|
1 /*
2 * Copyright (c) 1997, 2011, 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 *
49 #ifdef TARGET_OS_FAMILY_linux
50 # include "thread_linux.inline.hpp"
51 #endif
52 #ifdef TARGET_OS_FAMILY_solaris
53 # include "thread_solaris.inline.hpp"
54 #endif
55 #ifdef TARGET_OS_FAMILY_windows
56 # include "thread_windows.inline.hpp"
57 #endif
58
59 static bool find_field(instanceKlass* ik,
60 Symbol* name_symbol, Symbol* signature_symbol,
61 fieldDescriptor* fd,
62 bool allow_super = false) {
63 if (allow_super)
64 return ik->find_field(name_symbol, signature_symbol, fd) != NULL;
65 else
66 return ik->find_local_field(name_symbol, signature_symbol, fd);
67 }
68
69 static bool find_hacked_field(instanceKlass* ik,
70 Symbol* name_symbol, Symbol* signature_symbol,
71 fieldDescriptor* fd,
72 bool allow_super = false) {
73 bool found = find_field(ik, name_symbol, signature_symbol, fd, allow_super);
74 if (!found && AllowTransitionalJSR292) {
75 Symbol* backup_sig = SystemDictionary::find_backup_signature(signature_symbol);
76 if (backup_sig != NULL) {
77 found = find_field(ik, name_symbol, backup_sig, fd, allow_super);
78 if (TraceMethodHandles) {
79 ResourceMark rm;
80 tty->print_cr("MethodHandles: %s.%s: backup for %s => %s%s",
81 ik->name()->as_C_string(), name_symbol->as_C_string(),
82 signature_symbol->as_C_string(), backup_sig->as_C_string(),
83 (found ? "" : " (NOT FOUND)"));
84 }
85 }
86 }
87 return found;
88 }
89 #define find_field find_hacked_field /* remove after AllowTransitionalJSR292 */
90
91 // Helpful routine for computing field offsets at run time rather than hardcoding them
92 static void
93 compute_offset(int &dest_offset,
94 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
95 bool allow_super = false) {
96 fieldDescriptor fd;
97 instanceKlass* ik = instanceKlass::cast(klass_oop);
98 if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
99 ResourceMark rm;
100 tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
101 fatal("Invalid layout of preloaded class");
102 }
103 dest_offset = fd.offset();
104 }
105
106 // Same as above but for "optional" offsets that might not be present in certain JDK versions
107 static void
108 compute_optional_offset(int& dest_offset,
109 klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
110 bool allow_super = false) {
2205 int java_dyn_MethodHandle::_vmentry_offset;
2206 int java_dyn_MethodHandle::_vmslots_offset;
2207
2208 int sun_dyn_MemberName::_clazz_offset;
2209 int sun_dyn_MemberName::_name_offset;
2210 int sun_dyn_MemberName::_type_offset;
2211 int sun_dyn_MemberName::_flags_offset;
2212 int sun_dyn_MemberName::_vmtarget_offset;
2213 int sun_dyn_MemberName::_vmindex_offset;
2214
2215 int sun_dyn_DirectMethodHandle::_vmindex_offset;
2216
2217 int sun_dyn_BoundMethodHandle::_argument_offset;
2218 int sun_dyn_BoundMethodHandle::_vmargslot_offset;
2219
2220 int sun_dyn_AdapterMethodHandle::_conversion_offset;
2221
2222 void java_dyn_MethodHandle::compute_offsets() {
2223 klassOop k = SystemDictionary::MethodHandle_klass();
2224 if (k != NULL && EnableMethodHandles) {
2225 bool allow_super = false;
2226 if (AllowTransitionalJSR292) allow_super = true; // temporary, to access sun.dyn.MethodHandleImpl
2227 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_dyn_MethodType_signature(), allow_super);
2228 compute_offset(_vmtarget_offset, k, vmSymbols::vmtarget_name(), vmSymbols::object_signature(), allow_super);
2229 compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::machine_word_signature(), allow_super);
2230
2231 // Note: MH.vmslots (if it is present) is a hoisted copy of MH.type.form.vmslots.
2232 // It is optional pending experiments to keep or toss.
2233 compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), allow_super);
2234 }
2235 }
2236
2237 void sun_dyn_MemberName::compute_offsets() {
2238 klassOop k = SystemDictionary::MemberName_klass();
2239 if (k != NULL && EnableMethodHandles) {
2240 compute_offset(_clazz_offset, k, vmSymbols::clazz_name(), vmSymbols::class_signature());
2241 compute_offset(_name_offset, k, vmSymbols::name_name(), vmSymbols::string_signature());
2242 compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::object_signature());
2243 compute_offset(_flags_offset, k, vmSymbols::flags_name(), vmSymbols::int_signature());
2244 compute_offset(_vmtarget_offset, k, vmSymbols::vmtarget_name(), vmSymbols::object_signature());
2245 compute_offset(_vmindex_offset, k, vmSymbols::vmindex_name(), vmSymbols::int_signature());
2246 }
2247 }
2248
2249 void sun_dyn_DirectMethodHandle::compute_offsets() {
2250 klassOop k = SystemDictionary::DirectMethodHandle_klass();
2251 if (k != NULL && EnableMethodHandles) {
2252 compute_offset(_vmindex_offset, k, vmSymbols::vmindex_name(), vmSymbols::int_signature(), true);
2253 }
2511
2512 int java_dyn_MethodTypeForm::vmslots(oop mtform) {
2513 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2514 return mtform->int_field(_vmslots_offset);
2515 }
2516
2517 oop java_dyn_MethodTypeForm::erasedType(oop mtform) {
2518 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2519 return mtform->obj_field(_erasedType_offset);
2520 }
2521
2522 oop java_dyn_MethodTypeForm::genericInvoker(oop mtform) {
2523 assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2524 return mtform->obj_field(_genericInvoker_offset);
2525 }
2526
2527
2528 // Support for java_dyn_CallSite
2529
2530 int java_dyn_CallSite::_target_offset;
2531
2532 void java_dyn_CallSite::compute_offsets() {
2533 if (!EnableInvokeDynamic) return;
2534 klassOop k = SystemDictionary::CallSite_klass();
2535 if (k != NULL) {
2536 compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_dyn_MethodHandle_signature());
2537 }
2538 }
2539
2540 oop java_dyn_CallSite::target(oop site) {
2541 return site->obj_field(_target_offset);
2542 }
2543
2544 void java_dyn_CallSite::set_target(oop site, oop target) {
2545 site->obj_field_put(_target_offset, target);
2546 }
2547
2548
2549 // Support for java_security_AccessControlContext
2550
2551 int java_security_AccessControlContext::_context_offset = 0;
2552 int java_security_AccessControlContext::_privilegedContext_offset = 0;
2553 int java_security_AccessControlContext::_isPrivileged_offset = 0;
2554
2555 void java_security_AccessControlContext::compute_offsets() {
2556 assert(_isPrivileged_offset == 0, "offsets should be initialized only once");
2557 fieldDescriptor fd;
2558 instanceKlass* ik = instanceKlass::cast(SystemDictionary::AccessControlContext_klass());
2559
2560 if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) {
2561 fatal("Invalid layout of java.security.AccessControlContext");
2562 }
2563 _context_offset = fd.offset();
2564
2565 if (!ik->find_local_field(vmSymbols::privilegedContext_name(), vmSymbols::accesscontrolcontext_signature(), &fd)) {
2566 fatal("Invalid layout of java.security.AccessControlContext");
2567 }
|