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