1 /* 2 * Copyright (c) 2011, 2024, 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 #ifndef SHARE_JVMCI_JVMCIJAVACLASSES_HPP 25 #define SHARE_JVMCI_JVMCIJAVACLASSES_HPP 26 27 #include "classfile/vmSymbols.hpp" 28 #include "jvmci/jvmciExceptions.hpp" 29 #include "jvmci/jvmciObject.hpp" 30 31 /* 32 * This macro defines the structure of the JVMCI classes accessed from VM code. It is used to 33 * generate accessors similar to javaClasses.hpp, but with specializations for HotSpot and JNI based 34 * access. 35 * 36 * HotSpotJVMCI: This class contains accessors based on the VM internal 37 * interface to Java. It is used for JVMCI Java code executing on the HotSpot heap. 38 * 39 * JNIJVMCI: This class contains JNI based accessors and is used for JVMCI 40 * Java code executing in the JVMCI shared library. 41 */ 42 43 #define JVMCI_CLASSES_DO(start_class, \ 44 end_class, \ 45 char_field, \ 46 int_field, \ 47 boolean_field, \ 48 long_field, \ 49 float_field, \ 50 object_field, \ 51 primarray_field, \ 52 objectarray_field, \ 53 static_object_field, \ 54 static_objectarray_field, \ 55 static_int_field, \ 56 static_boolean_field, \ 57 jvmci_method, \ 58 jvmci_constructor) \ 59 start_class(Architecture, jdk_vm_ci_code_Architecture) \ 60 object_field(Architecture, wordKind, "Ljdk/vm/ci/meta/PlatformKind;") \ 61 end_class \ 62 start_class(HotSpotResolvedObjectTypeImpl, jdk_vm_ci_hotspot_HotSpotResolvedObjectTypeImpl) \ 63 long_field(HotSpotResolvedObjectTypeImpl, klassPointer) \ 64 end_class \ 65 start_class(HotSpotResolvedPrimitiveType, jdk_vm_ci_hotspot_HotSpotResolvedPrimitiveType) \ 66 object_field(HotSpotResolvedPrimitiveType, mirror, "Ljdk/vm/ci/hotspot/HotSpotObjectConstantImpl;") \ 67 object_field(HotSpotResolvedPrimitiveType, kind, "Ljdk/vm/ci/meta/JavaKind;") \ 68 static_objectarray_field(HotSpotResolvedPrimitiveType, primitives, "[Ljdk/vm/ci/hotspot/HotSpotResolvedPrimitiveType;") \ 69 end_class \ 70 start_class(HotSpotResolvedJavaFieldImpl, jdk_vm_ci_hotspot_HotSpotResolvedJavaFieldImpl) \ 71 object_field(HotSpotResolvedJavaFieldImpl, type, "Ljdk/vm/ci/meta/JavaType;") \ 72 object_field(HotSpotResolvedJavaFieldImpl, holder, "Ljdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;") \ 73 int_field(HotSpotResolvedJavaFieldImpl, offset) \ 74 end_class \ 75 start_class(FieldInfo, jdk_vm_ci_hotspot_HotSpotResolvedObjectTypeImpl_FieldInfo) \ 76 int_field(FieldInfo, nameIndex) \ 77 int_field(FieldInfo, signatureIndex) \ 78 int_field(FieldInfo, offset) \ 79 int_field(FieldInfo, classfileFlags) \ 80 int_field(FieldInfo, internalFlags) \ 81 int_field(FieldInfo, initializerIndex) \ 82 jvmci_constructor(FieldInfo, "(IIIIII)V") \ 83 end_class \ 84 start_class(HotSpotResolvedJavaMethodImpl, jdk_vm_ci_hotspot_HotSpotResolvedJavaMethodImpl) \ 85 long_field(HotSpotResolvedJavaMethodImpl, methodHandle) \ 86 end_class \ 87 start_class(HotSpotMethodData, jdk_vm_ci_hotspot_HotSpotMethodData) \ 88 long_field(HotSpotMethodData, methodDataPointer) \ 89 end_class \ 90 start_class(InstalledCode, jdk_vm_ci_code_InstalledCode) \ 91 long_field(InstalledCode, address) \ 92 long_field(InstalledCode, entryPoint) \ 93 long_field(InstalledCode, version) \ 94 object_field(InstalledCode, name, "Ljava/lang/String;") \ 95 end_class \ 96 start_class(HotSpotInstalledCode, jdk_vm_ci_hotspot_HotSpotInstalledCode) \ 97 int_field(HotSpotInstalledCode, size) \ 98 long_field(HotSpotInstalledCode, codeStart) \ 99 int_field(HotSpotInstalledCode, codeSize) \ 100 end_class \ 101 start_class(HotSpotNmethod, jdk_vm_ci_hotspot_HotSpotNmethod) \ 102 boolean_field(HotSpotNmethod, isDefault) \ 103 long_field(HotSpotNmethod, compileIdSnapshot) \ 104 object_field(HotSpotNmethod, method, "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;") \ 105 jvmci_constructor(HotSpotNmethod, "(Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;Ljava/lang/String;ZJ)V") \ 106 end_class \ 107 start_class(HotSpotCompiledCode, jdk_vm_ci_hotspot_HotSpotCompiledCode) \ 108 primarray_field(HotSpotCompiledCode, targetCode, "[B") \ 109 primarray_field(HotSpotCompiledCode, dataSection, "[B") \ 110 end_class \ 111 start_class(HotSpotCompiledNmethod, jdk_vm_ci_hotspot_HotSpotCompiledNmethod) \ 112 object_field(HotSpotCompiledNmethod, installationFailureMessage, "Ljava/lang/String;") \ 113 int_field(HotSpotCompiledNmethod, id) \ 114 end_class \ 115 start_class(VMField, jdk_vm_ci_hotspot_VMField) \ 116 object_field(VMField, name, "Ljava/lang/String;") \ 117 object_field(VMField, type, "Ljava/lang/String;") \ 118 long_field(VMField, offset) \ 119 long_field(VMField, address) \ 120 object_field(VMField, value, "Ljava/lang/Object;") \ 121 jvmci_constructor(VMField, "(Ljava/lang/String;Ljava/lang/String;JJLjava/lang/Object;)V") \ 122 end_class \ 123 start_class(VMFlag, jdk_vm_ci_hotspot_VMFlag) \ 124 object_field(VMFlag, name, "Ljava/lang/String;") \ 125 object_field(VMFlag, type, "Ljava/lang/String;") \ 126 object_field(VMFlag, value, "Ljava/lang/Object;") \ 127 jvmci_constructor(VMFlag, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V") \ 128 end_class \ 129 start_class(VMIntrinsicMethod, jdk_vm_ci_hotspot_VMIntrinsicMethod) \ 130 object_field(VMIntrinsicMethod, declaringClass, "Ljava/lang/String;") \ 131 object_field(VMIntrinsicMethod, name, "Ljava/lang/String;") \ 132 object_field(VMIntrinsicMethod, descriptor, "Ljava/lang/String;") \ 133 int_field(VMIntrinsicMethod, id) \ 134 boolean_field(VMIntrinsicMethod, isAvailable) \ 135 boolean_field(VMIntrinsicMethod, c1Supported) \ 136 boolean_field(VMIntrinsicMethod, c2Supported) \ 137 jvmci_constructor(VMIntrinsicMethod, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZZZ)V") \ 138 end_class \ 139 start_class(HotSpotCompilationRequestResult, jdk_vm_ci_hotspot_HotSpotCompilationRequestResult) \ 140 object_field(HotSpotCompilationRequestResult, failureMessage, "Ljava/lang/String;") \ 141 boolean_field(HotSpotCompilationRequestResult, retry) \ 142 int_field(HotSpotCompilationRequestResult, inlinedBytecodes) \ 143 end_class \ 144 start_class(BytecodeFrame, jdk_vm_ci_code_BytecodeFrame) \ 145 int_field(BytecodeFrame, numLocals) \ 146 int_field(BytecodeFrame, numStack) \ 147 int_field(BytecodeFrame, numLocks) \ 148 static_int_field(BytecodeFrame, UNKNOWN_BCI) \ 149 static_int_field(BytecodeFrame, UNWIND_BCI) \ 150 static_int_field(BytecodeFrame, BEFORE_BCI) \ 151 static_int_field(BytecodeFrame, AFTER_BCI) \ 152 static_int_field(BytecodeFrame, AFTER_EXCEPTION_BCI) \ 153 static_int_field(BytecodeFrame, INVALID_FRAMESTATE_BCI) \ 154 end_class \ 155 start_class(BytecodePosition, jdk_vm_ci_code_BytecodePosition) \ 156 object_field(BytecodePosition, caller, "Ljdk/vm/ci/code/BytecodePosition;") \ 157 object_field(BytecodePosition, method, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \ 158 int_field(BytecodePosition, bci) \ 159 end_class \ 160 start_class(JavaConstant, jdk_vm_ci_meta_JavaConstant) \ 161 static_object_field(JavaConstant, ILLEGAL, "Ljdk/vm/ci/meta/PrimitiveConstant;") \ 162 static_object_field(JavaConstant, NULL_POINTER, "Ljdk/vm/ci/meta/JavaConstant;") \ 163 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, JavaConstant, forPrimitive, forPrimitive_signature) \ 164 end_class \ 165 start_class(ResolvedJavaMethod, jdk_vm_ci_meta_ResolvedJavaMethod) \ 166 end_class \ 167 start_class(PrimitiveConstant, jdk_vm_ci_meta_PrimitiveConstant) \ 168 object_field(PrimitiveConstant, kind, "Ljdk/vm/ci/meta/JavaKind;") \ 169 long_field(PrimitiveConstant, primitive) \ 170 end_class \ 171 start_class(HotSpotObjectConstantImpl, jdk_vm_ci_hotspot_HotSpotObjectConstantImpl) \ 172 boolean_field(HotSpotObjectConstantImpl, compressed) \ 173 end_class \ 174 start_class(DirectHotSpotObjectConstantImpl, jdk_vm_ci_hotspot_DirectHotSpotObjectConstantImpl) \ 175 object_field(DirectHotSpotObjectConstantImpl, object, "Ljava/lang/Object;") \ 176 jvmci_constructor(DirectHotSpotObjectConstantImpl, "(Ljava/lang/Object;Z)V") \ 177 end_class \ 178 start_class(IndirectHotSpotObjectConstantImpl, jdk_vm_ci_hotspot_IndirectHotSpotObjectConstantImpl) \ 179 long_field(IndirectHotSpotObjectConstantImpl, objectHandle) \ 180 jvmci_constructor(IndirectHotSpotObjectConstantImpl, "(JZZ)V") \ 181 end_class \ 182 start_class(JavaKind, jdk_vm_ci_meta_JavaKind) \ 183 char_field(JavaKind, typeChar) \ 184 end_class \ 185 start_class(ValueKind, jdk_vm_ci_meta_ValueKind) \ 186 object_field(ValueKind, platformKind, "Ljdk/vm/ci/meta/PlatformKind;") \ 187 end_class \ 188 start_class(HotSpotStackFrameReference, jdk_vm_ci_hotspot_HotSpotStackFrameReference) \ 189 object_field(HotSpotStackFrameReference, compilerToVM, "Ljdk/vm/ci/hotspot/CompilerToVM;") \ 190 boolean_field(HotSpotStackFrameReference, objectsMaterialized) \ 191 long_field(HotSpotStackFrameReference, stackPointer) \ 192 int_field(HotSpotStackFrameReference, frameNumber) \ 193 int_field(HotSpotStackFrameReference, bci) \ 194 object_field(HotSpotStackFrameReference, method, "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;") \ 195 objectarray_field(HotSpotStackFrameReference, locals, "[Ljava/lang/Object;") \ 196 primarray_field(HotSpotStackFrameReference, localIsVirtual, "[Z") \ 197 end_class \ 198 start_class(HotSpotConstantPool, jdk_vm_ci_hotspot_HotSpotConstantPool) \ 199 long_field(HotSpotConstantPool, constantPoolHandle) \ 200 end_class \ 201 start_class(HotSpotJVMCIRuntime, jdk_vm_ci_hotspot_HotSpotJVMCIRuntime) \ 202 objectarray_field(HotSpotJVMCIRuntime, excludeFromJVMCICompilation, "[Ljava/lang/Module;") \ 203 jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, compileMethod, compileMethod_signature) \ 204 jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, isGCSupported, int_bool_signature) \ 205 jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, isIntrinsicSupported, int_bool_signature) \ 206 jvmci_method(CallNonvirtualVoidMethod, GetMethodID, call_special, void, HotSpotJVMCIRuntime, bootstrapFinished, void_method_signature) \ 207 jvmci_method(CallNonvirtualVoidMethod, GetMethodID, call_special, void, HotSpotJVMCIRuntime, shutdown, void_method_signature) \ 208 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, HotSpotJVMCIRuntime, runtime, runtime_signature) \ 209 jvmci_method(CallObjectMethod, GetMethodID, call_virtual, JVMCIObject, HotSpotJVMCIRuntime, getCompiler, getCompiler_signature) \ 210 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, HotSpotJVMCIRuntime, exceptionToString, exceptionToString_signature) \ 211 jvmci_method(CallStaticVoidMethod, GetStaticMethodID, call_static, void, HotSpotJVMCIRuntime, postTranslation, object_void_signature) \ 212 end_class \ 213 start_class(JVMCIError, jdk_vm_ci_common_JVMCIError) \ 214 jvmci_constructor(JVMCIError, "(Ljava/lang/String;)V") \ 215 end_class \ 216 start_class(InspectedFrameVisitor, jdk_vm_ci_code_stack_InspectedFrameVisitor) \ 217 end_class \ 218 start_class(Services, jdk_vm_ci_services_Services) \ 219 end_class \ 220 start_class(JVMCI, jdk_vm_ci_runtime_JVMCI) \ 221 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, JVMCI, getRuntime, getRuntime_signature) \ 222 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, JVMCI, initializeRuntime, initializeRuntime_signature) \ 223 end_class \ 224 start_class(Object, java_lang_Object) \ 225 end_class \ 226 start_class(String, java_lang_String) \ 227 end_class \ 228 start_class(Class, java_lang_Class) \ 229 jvmci_method(CallObjectMethod, GetMethodID, call_virtual, JVMCIObject, Class, getName, void_string_signature) \ 230 end_class \ 231 start_class(VMSupport, jdk_internal_vm_VMSupport) \ 232 jvmci_method(CallStaticIntMethod, GetStaticMethodID, call_static, int, VMSupport, encodeThrowable, encodeThrowable_signature) \ 233 jvmci_method(CallStaticVoidMethod, GetStaticMethodID, call_static, void, VMSupport, decodeAndThrowThrowable, decodeAndThrowThrowable_signature) \ 234 end_class \ 235 start_class(ArrayIndexOutOfBoundsException, java_lang_ArrayIndexOutOfBoundsException) \ 236 jvmci_constructor(ArrayIndexOutOfBoundsException, "(Ljava/lang/String;)V") \ 237 end_class \ 238 start_class(IllegalStateException, java_lang_IllegalStateException) \ 239 jvmci_constructor(IllegalStateException, "(Ljava/lang/String;)V") \ 240 end_class \ 241 start_class(NullPointerException, java_lang_NullPointerException) \ 242 jvmci_constructor(NullPointerException, "(Ljava/lang/String;)V") \ 243 end_class \ 244 start_class(IllegalArgumentException, java_lang_IllegalArgumentException) \ 245 jvmci_constructor(IllegalArgumentException, "(Ljava/lang/String;)V") \ 246 end_class \ 247 start_class(InternalError, java_lang_InternalError) \ 248 jvmci_constructor(InternalError, "(Ljava/lang/String;)V") \ 249 end_class \ 250 start_class(OutOfMemoryError, java_lang_OutOfMemoryError) \ 251 jvmci_constructor(OutOfMemoryError, "(Ljava/lang/String;)V") \ 252 end_class \ 253 start_class(NoClassDefFoundError, java_lang_NoClassDefFoundError) \ 254 jvmci_constructor(NoClassDefFoundError, "(Ljava/lang/String;)V") \ 255 end_class \ 256 start_class(InvalidInstalledCodeException, jdk_vm_ci_code_InvalidInstalledCodeException) \ 257 jvmci_constructor(InvalidInstalledCodeException, "(Ljava/lang/String;)V") \ 258 end_class \ 259 start_class(UnsatisfiedLinkError, java_lang_UnsatisfiedLinkError) \ 260 jvmci_constructor(UnsatisfiedLinkError, "(Ljava/lang/String;)V") \ 261 end_class \ 262 start_class(UnsupportedOperationException, java_lang_UnsupportedOperationException) \ 263 jvmci_constructor(UnsupportedOperationException, "(Ljava/lang/String;)V") \ 264 end_class \ 265 start_class(StackTraceElement, java_lang_StackTraceElement) \ 266 object_field(StackTraceElement, declaringClass, "Ljava/lang/String;") \ 267 object_field(StackTraceElement, methodName, "Ljava/lang/String;") \ 268 object_field(StackTraceElement, fileName, "Ljava/lang/String;") \ 269 int_field(StackTraceElement, lineNumber) \ 270 jvmci_constructor(StackTraceElement, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V") \ 271 end_class \ 272 start_class(Throwable, java_lang_Throwable) \ 273 object_field(Throwable, detailMessage, "Ljava/lang/String;") \ 274 end_class \ 275 /* end*/ 276 277 class JVMCICompiler; 278 class JVMCIEnv; 279 280 #define START_CLASS(simpleClassName, fullClassName) \ 281 class simpleClassName { \ 282 friend class JVMCIEnv; \ 283 static void initialize(JVMCI_TRAPS); \ 284 static bool is_instance(JVMCIEnv* jvmciEnv, JVMCIObject object); \ 285 286 #define END_CLASS }; 287 288 #define EMPTY_CAST 289 #define CHAR_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jchar) 290 #define INT_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jint) 291 #define BOOLEAN_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jboolean) 292 #define LONG_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jlong) 293 #define FLOAT_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jfloat) 294 295 #define OBJECT_FIELD(simpleClassName, name, signature) OOPISH_FIELD(simpleClassName, name, JVMCIObject, oop) 296 #define OBJECTARRAY_FIELD(simpleClassName, name, signature) OOPISH_FIELD(simpleClassName, name, JVMCIObjectArray, objArrayOop) 297 #define PRIMARRAY_FIELD(simpleClassName, name, signature) OOPISH_FIELD(simpleClassName, name, JVMCIPrimitiveArray, typeArrayOop) 298 299 #define STATIC_INT_FIELD(simpleClassName, name) STATIC_FIELD(simpleClassName, name, jint) 300 #define STATIC_BOOLEAN_FIELD(simpleClassName, name) STATIC_FIELD(simpleClassName, name, jboolean) 301 #define STATIC_OBJECT_FIELD(simpleClassName, name, signature) STATIC_OOPISH_FIELD(simpleClassName, name, JVMCIObject, oop) 302 #define STATIC_OBJECTARRAY_FIELD(simpleClassName, name, signature) STATIC_OOPISH_FIELD(simpleClassName, name, JVMCIObjectArray, objArrayOop) 303 304 #define HS_START_CLASS(simpleClassName, fullClassName) \ 305 START_CLASS(simpleClassName, fullClassName) \ 306 friend class HotSpotJVMCI; \ 307 private: \ 308 static void check(oop obj, const char* field_name, int offset); \ 309 static InstanceKlass* _klass; \ 310 public: \ 311 static InstanceKlass* klass() { assert(_klass != nullptr, "uninit"); return _klass; } \ 312 static Symbol* symbol() { return vmSymbols::fullClassName(); } 313 314 #define FIELD(simpleClassName, name, type) \ 315 private: \ 316 static int _##name##_offset; \ 317 public: \ 318 static type get_ ## name(JVMCIEnv* env, JVMCIObject obj) { return name(env, resolve(obj)); } \ 319 static void set_ ## name(JVMCIEnv* env, JVMCIObject obj, type x) { set_ ## name(env, resolve(obj), x); } \ 320 static type name(JVMCIEnv* env, oop obj); \ 321 static void set_ ## name(JVMCIEnv* env, oop obj, type x); 322 323 #define OOPISH_FIELD(simpleClassName, name, type, hstype) \ 324 private: \ 325 static int _##name##_offset; \ 326 public: \ 327 static type get_ ## name(JVMCIEnv* env, JVMCIObject obj) { return (type) wrap(name(env, resolve(obj))); } \ 328 static void set_ ## name(JVMCIEnv* env, JVMCIObject obj, type x) { set_ ## name(env, resolve(obj), (hstype) resolve(x)); } \ 329 static hstype name(JVMCIEnv* env, oop obj); \ 330 static void set_ ## name(JVMCIEnv* env, oop obj, hstype x); 331 332 #define STATIC_FIELD(simpleClassName, name, type) \ 333 private: \ 334 static int _##name##_offset; \ 335 public: \ 336 static type get_ ## name(JVMCIEnv* env); \ 337 static void set_ ## name(JVMCIEnv* env, type x); 338 339 #define STATIC_OOPISH_FIELD(simpleClassName, name, type, hstype) \ 340 private: \ 341 static int _##name##_offset; \ 342 public: \ 343 static type get_ ## name(JVMCIEnv* env) { return (type) wrap(name(env)); } \ 344 static void set_ ## name(JVMCIEnv* env, type x) { set_ ## name(env, (hstype) resolve(x)); } \ 345 static hstype name(JVMCIEnv* env); \ 346 static void set_ ## name(JVMCIEnv* env, hstype hstype); 347 348 #define METHOD(jniCallType, jniGetMethod, hsCallType, returnType, simpleClassName, methodName, signatureSymbolName) 349 #define CONSTRUCTOR(className, signature) 350 351 /** 352 * VM internal interface to Java classes, methods and objects. For example: 353 * 354 * class HotSpotJVMCI { 355 * ... 356 * class Architecture { 357 * static void initialize(JVMCIEnv* env); 358 * static bool is_instance(JVMCIEnv* env, JVMCIObject object); 359 * private: 360 * static void check(oop obj, const char *field_name, int offset); 361 * public: 362 * static InstanceKlass *klass() { ... } 363 * static Symbol *symbol() { return vmSymbols::jdk_vm_ci_code_Architecture(); } 364 * private: 365 * static int _wordKind_offset; 366 * public: 367 * static JVMCIObject get_wordKind(JVMCIEnv *env, JVMCIObject obj) { ... } 368 * static void set_wordKind(JVMCIEnv *env, JVMCIObject obj, JVMCIObject x) { ... } 369 * static oop wordKind(JVMCIEnv *env, oop obj); 370 * static void set_wordKind(JVMCIEnv *env, oop obj, oop x); 371 * } 372 * ... 373 * }; 374 */ 375 class HotSpotJVMCI { 376 friend class JVMCIEnv; 377 378 public: 379 380 static oop resolve(JVMCIObject obj); 381 382 static arrayOop resolve(JVMCIArray obj); 383 static objArrayOop resolve(JVMCIObjectArray obj); 384 static typeArrayOop resolve(JVMCIPrimitiveArray obj); 385 386 static JVMCIObject wrap(jobject obj) { return JVMCIObject(obj, true); } 387 static JVMCIObject wrap(oop obj); 388 389 static inline Method* asMethod(JVMCIEnv* env, oop jvmci_method) { 390 return *(Method**) HotSpotResolvedJavaMethodImpl::methodHandle(env, jvmci_method); 391 } 392 static inline ConstantPool* asConstantPool(JVMCIEnv* env, oop jvmci_constant_pool) { 393 return *(ConstantPool**) HotSpotConstantPool::constantPoolHandle(env, jvmci_constant_pool); 394 } 395 396 static void compute_offsets(TRAPS); 397 static void compute_offset(int &dest_offset, Klass* klass, const char* name, const char* signature, bool static_field, TRAPS); 398 399 JVMCI_CLASSES_DO(HS_START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, BOOLEAN_FIELD, LONG_FIELD, FLOAT_FIELD, OBJECT_FIELD, PRIMARRAY_FIELD, OBJECTARRAY_FIELD, STATIC_OBJECT_FIELD, STATIC_OBJECTARRAY_FIELD, STATIC_INT_FIELD, STATIC_BOOLEAN_FIELD, METHOD, CONSTRUCTOR) 400 }; 401 402 #undef HS_START_CLASS 403 404 #define JNI_START_CLASS(simpleClassName, fullClassName) \ 405 START_CLASS(simpleClassName, fullClassName) \ 406 friend class JNIJVMCI; \ 407 private: \ 408 static void check(JVMCIEnv* jvmciEnv, JVMCIObject obj, const char* field_name, jfieldID offset); \ 409 static jclass _class; \ 410 public: \ 411 static jclass clazz() { assert(_class != nullptr, #fullClassName " uninitialized"); return _class; } \ 412 static jclass fullClassName ##_class() { assert(_class != nullptr, "uninit"); return _class; } 413 414 #undef METHOD 415 #undef CONSTRUCTOR 416 #undef FIELD 417 #undef OOPISH_FIELD 418 #undef STATIC_FIELD 419 #undef STATIC_OOPISH_FIELD 420 421 #define FIELD(simpleClassName, name, type) \ 422 private: \ 423 static jfieldID _##name##_field_id; \ 424 public: \ 425 static type get_ ## name(JVMCIEnv* jvmciEnv, JVMCIObject obj); \ 426 static void set_ ## name(JVMCIEnv* jvmciEnv, JVMCIObject obj, type x); 427 428 #define OOPISH_FIELD(simpleClassName, name, type, hstype) \ 429 FIELD(simpleClassName, name, type) 430 431 #define STATIC_FIELD(simpleClassName, name, type) \ 432 private: \ 433 static jfieldID _##name##_field_id; \ 434 public: \ 435 static type get_ ## name(JVMCIEnv* jvmciEnv); \ 436 static void set_ ## name(JVMCIEnv* jvmciEnv, type x); 437 438 #define STATIC_OOPISH_FIELD(simpleClassName, name, type, hstype) \ 439 STATIC_FIELD(simpleClassName, name, type) 440 441 #define METHOD(jniCallType, jniGetMethod, hsCallType, returnType, className, methodName, signatureSymbolName) \ 442 public: \ 443 static jmethodID methodName##_method() { return _##methodName##_method; } \ 444 private: \ 445 static jmethodID _##methodName##_method; 446 447 #define CONSTRUCTOR(className, signature) \ 448 public: \ 449 static jmethodID constructor() { return _constructor; } \ 450 private: \ 451 static jmethodID _constructor; 452 453 /** 454 * JNI based interface to Java classes, methods and objects. For example: 455 * 456 * class JNIJVMCI { 457 * ... 458 * class Architecture { 459 * static void initialize(JVMCIEnv* env); 460 * static bool is_instance(JVMCIEnv* env, JVMCIObject object); 461 * private: 462 * static void check(oop obj, const char *field_name, int offset); 463 * static jclass _class; 464 * public: 465 * static jclass clazz() { return _class; } 466 * static jclass jdk_vm_ci_code_Architecture_class() { return _class; } 467 * private: 468 * static jfieldID _wordKind_field_id; 469 * public: 470 * static JVMCIObject get_wordKind(JVMCIEnv *env, JVMCIObject obj) { ... } 471 * static void set_wordKind(JVMCIEnv *env, JVMCIObject obj, JVMCIObject x) { ... } 472 * } 473 * ... 474 * }; 475 */ 476 class JNIJVMCI { 477 friend class JVMCIEnv; 478 479 static jclass _byte_array; 480 static jclass _box_classes[T_CONFLICT+1]; 481 static jfieldID _box_fields[T_CONFLICT+1]; 482 static jmethodID _box_constructors[T_CONFLICT+1]; 483 static jmethodID _Class_getName_method; 484 485 static jmethodID _HotSpotResolvedJavaMethodImpl_fromMetaspace_method; 486 static jmethodID _HotSpotConstantPool_fromMetaspace_method; 487 static jmethodID _HotSpotResolvedObjectTypeImpl_fromMetaspace_method; 488 static jmethodID _HotSpotResolvedPrimitiveType_fromMetaspace_method; 489 490 public: 491 static jmethodID Class_getName_method() { return _Class_getName_method; } 492 493 static jclass byte_array() { assert(_byte_array != nullptr, "uninit"); return _byte_array; } 494 495 static jclass box_class(BasicType type) { assert(_box_classes[type]!= nullptr, "uninit"); return _box_classes[type]; } 496 static jfieldID box_field(BasicType type) { assert(_box_fields[type]!= nullptr, "uninit"); return _box_fields[type]; } 497 static jmethodID box_constructor(BasicType type) { assert(_box_constructors[type]!= nullptr, "uninit"); return _box_constructors[type]; } 498 499 static jmethodID HotSpotResolvedJavaMethodImpl_fromMetaspace_method() { assert(_HotSpotResolvedJavaMethodImpl_fromMetaspace_method != nullptr, "uninit"); return _HotSpotResolvedJavaMethodImpl_fromMetaspace_method; } 500 static jmethodID HotSpotConstantPool_fromMetaspace_method() { assert(_HotSpotConstantPool_fromMetaspace_method != nullptr, "uninit"); return _HotSpotConstantPool_fromMetaspace_method; } 501 static jmethodID HotSpotResolvedObjectTypeImpl_fromMetaspace_method() { assert(_HotSpotResolvedObjectTypeImpl_fromMetaspace_method != nullptr, "uninit"); return _HotSpotResolvedObjectTypeImpl_fromMetaspace_method; } 502 static jmethodID HotSpotResolvedPrimitiveType_fromMetaspace_method() { assert(_HotSpotResolvedPrimitiveType_fromMetaspace_method != nullptr, "uninit"); return _HotSpotResolvedPrimitiveType_fromMetaspace_method; } 503 504 static void initialize_ids(JNIEnv* env); 505 static void initialize_field_id(JNIEnv* env, jfieldID &dest_offset, jclass klass, const char* klass_name, const char* name, const char* signature, bool static_field); 506 static void register_natives(JNIEnv* env); 507 508 static jobject resolve_handle(JVMCIObject obj) { return obj.as_jobject(); } 509 static JVMCIObject wrap(jobject obj) { return JVMCIObject(obj, false); } 510 511 JVMCI_CLASSES_DO(JNI_START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, BOOLEAN_FIELD, LONG_FIELD, FLOAT_FIELD, OBJECT_FIELD, PRIMARRAY_FIELD, OBJECTARRAY_FIELD, STATIC_OBJECT_FIELD, STATIC_OBJECTARRAY_FIELD, STATIC_INT_FIELD, STATIC_BOOLEAN_FIELD, METHOD, CONSTRUCTOR) 512 }; 513 514 #undef JNI_START_CLASS 515 #undef START_CLASS 516 #undef END_CLASS 517 #undef METHOD 518 #undef CONSTRUCTOR 519 #undef FIELD 520 #undef CHAR_FIELD 521 #undef INT_FIELD 522 #undef BOOLEAN_FIELD 523 #undef LONG_FIELD 524 #undef FLOAT_FIELD 525 #undef OBJECT_FIELD 526 #undef PRIMARRAY_FIELD 527 #undef OBJECTARRAY_FIELD 528 #undef FIELD 529 #undef OOPISH_FIELD 530 #undef STATIC_FIELD 531 #undef STATIC_OOPISH_FIELD 532 #undef STATIC_FIELD 533 #undef STATIC_OBJECT_FIELD 534 #undef STATIC_OBJECTARRAY_FIELD 535 #undef STATIC_INT_FIELD 536 #undef STATIC_BOOLEAN_FIELD 537 #undef STATIC_PRIMITIVE_FIELD 538 #undef EMPTY_CAST 539 540 #endif // SHARE_JVMCI_JVMCIJAVACLASSES_HPP