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/systemDictionary.hpp" 28 #include "oops/access.hpp" 29 #include "oops/instanceMirrorKlass.hpp" 30 #include "oops/oop.hpp" 31 32 class JVMCIJavaClasses : AllStatic { 33 public: 34 static void compute_offsets(TRAPS); 35 }; 36 37 /* This macro defines the structure of the JVMCI classes accessed from VM code. 38 * It will generate classes with accessors similar to javaClasses.hpp, but with specializations for oops, Handles and jni handles. 39 * 40 * The public interface of these classes will look like this: 41 42 * class StackSlot : AllStatic { 43 * public: 44 * static Klass* klass(); 45 * static jint index(oop obj); 46 * static jint index(Handle obj); 47 * static jint index(jobject obj); 48 * static void set_index(oop obj, jint x); 49 * static void set_index(Handle obj, jint x); 50 * static void set_index(jobject obj, jint x); 51 * }; 52 * 53 */ 54 55 #define COMPILER_CLASSES_DO(start_class, end_class, char_field, int_field, boolean_field, long_field, float_field, oop_field, typeArrayOop_field, objArrayOop_field, static_oop_field, static_objArrayOop_field, static_int_field, static_boolean_field) \ 56 start_class(Architecture) \ 57 oop_field(Architecture, wordKind, "Ljdk/vm/ci/meta/PlatformKind;") \ 58 end_class \ 59 start_class(TargetDescription) \ 60 oop_field(TargetDescription, arch, "Ljdk/vm/ci/code/Architecture;") \ 61 end_class \ 62 start_class(HotSpotResolvedObjectTypeImpl) \ 63 oop_field(HotSpotResolvedObjectTypeImpl, javaClass, "Ljava/lang/Class;") \ 64 end_class \ 65 start_class(HotSpotResolvedJavaMethodImpl) \ 66 long_field(HotSpotResolvedJavaMethodImpl, metaspaceMethod) \ 67 end_class \ 68 start_class(InstalledCode) \ 69 long_field(InstalledCode, address) \ 70 long_field(InstalledCode, entryPoint) \ 71 long_field(InstalledCode, version) \ 72 oop_field(InstalledCode, name, "Ljava/lang/String;") \ 73 end_class \ 74 start_class(HotSpotInstalledCode) \ 75 int_field(HotSpotInstalledCode, size) \ 76 long_field(HotSpotInstalledCode, codeStart) \ 77 int_field(HotSpotInstalledCode, codeSize) \ 78 end_class \ 79 start_class(HotSpotNmethod) \ 80 boolean_field(HotSpotNmethod, isDefault) \ 81 end_class \ 82 start_class(HotSpotCompiledCode) \ 83 oop_field(HotSpotCompiledCode, name, "Ljava/lang/String;") \ 84 typeArrayOop_field(HotSpotCompiledCode, targetCode, "[B") \ 85 int_field(HotSpotCompiledCode, targetCodeSize) \ 86 objArrayOop_field(HotSpotCompiledCode, sites, "[Ljdk/vm/ci/code/site/Site;") \ 87 objArrayOop_field(HotSpotCompiledCode, assumptions, "[Ljdk/vm/ci/meta/Assumptions$Assumption;") \ 88 objArrayOop_field(HotSpotCompiledCode, methods, "[Ljdk/vm/ci/meta/ResolvedJavaMethod;") \ 89 objArrayOop_field(HotSpotCompiledCode, comments, "[Ljdk/vm/ci/hotspot/HotSpotCompiledCode$Comment;") \ 90 typeArrayOop_field(HotSpotCompiledCode, dataSection, "[B") \ 91 int_field(HotSpotCompiledCode, dataSectionAlignment) \ 92 objArrayOop_field(HotSpotCompiledCode, dataSectionPatches, "[Ljdk/vm/ci/code/site/DataPatch;") \ 93 boolean_field(HotSpotCompiledCode, isImmutablePIC) \ 94 int_field(HotSpotCompiledCode, totalFrameSize) \ 95 oop_field(HotSpotCompiledCode, deoptRescueSlot, "Ljdk/vm/ci/code/StackSlot;") \ 96 end_class \ 97 start_class(HotSpotCompiledCode_Comment) \ 98 oop_field(HotSpotCompiledCode_Comment, text, "Ljava/lang/String;") \ 99 int_field(HotSpotCompiledCode_Comment, pcOffset) \ 100 end_class \ 101 start_class(HotSpotCompiledNmethod) \ 102 oop_field(HotSpotCompiledNmethod, method, "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;") \ 103 oop_field(HotSpotCompiledNmethod, installationFailureMessage, "Ljava/lang/String;") \ 104 int_field(HotSpotCompiledNmethod, entryBCI) \ 105 int_field(HotSpotCompiledNmethod, id) \ 106 long_field(HotSpotCompiledNmethod, jvmciEnv) \ 107 boolean_field(HotSpotCompiledNmethod, hasUnsafeAccess) \ 108 end_class \ 109 start_class(HotSpotJVMCIMetaAccessContext) \ 110 static_objArrayOop_field(HotSpotJVMCIMetaAccessContext, allContexts, "[Ljava/lang/ref/WeakReference;") \ 111 objArrayOop_field(HotSpotJVMCIMetaAccessContext, metadataRoots, "[Ljava/lang/Object;") \ 112 end_class \ 113 start_class(HotSpotForeignCallTarget) \ 114 long_field(HotSpotForeignCallTarget, address) \ 115 end_class \ 116 start_class(VMField) \ 117 oop_field(VMField, name, "Ljava/lang/String;") \ 118 oop_field(VMField, type, "Ljava/lang/String;") \ 119 long_field(VMField, offset) \ 120 long_field(VMField, address) \ 121 oop_field(VMField, value, "Ljava/lang/Object;") \ 122 end_class \ 123 start_class(VMFlag) \ 124 oop_field(VMFlag, name, "Ljava/lang/String;") \ 125 oop_field(VMFlag, type, "Ljava/lang/String;") \ 126 oop_field(VMFlag, value, "Ljava/lang/Object;") \ 127 end_class \ 128 start_class(VMIntrinsicMethod) \ 129 oop_field(VMIntrinsicMethod, declaringClass, "Ljava/lang/String;") \ 130 oop_field(VMIntrinsicMethod, name, "Ljava/lang/String;") \ 131 oop_field(VMIntrinsicMethod, descriptor, "Ljava/lang/String;") \ 132 int_field(VMIntrinsicMethod, id) \ 133 end_class \ 134 start_class(Assumptions_NoFinalizableSubclass) \ 135 oop_field(Assumptions_NoFinalizableSubclass, receiverType, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 136 end_class \ 137 start_class(Assumptions_ConcreteSubtype) \ 138 oop_field(Assumptions_ConcreteSubtype, context, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 139 oop_field(Assumptions_ConcreteSubtype, subtype, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 140 end_class \ 141 start_class(Assumptions_LeafType) \ 142 oop_field(Assumptions_LeafType, context, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 143 end_class \ 144 start_class(Assumptions_ConcreteMethod) \ 145 oop_field(Assumptions_ConcreteMethod, method, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \ 146 oop_field(Assumptions_ConcreteMethod, context, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 147 oop_field(Assumptions_ConcreteMethod, impl, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \ 148 end_class \ 149 start_class(Assumptions_CallSiteTargetValue) \ 150 oop_field(Assumptions_CallSiteTargetValue, callSite, "Ljdk/vm/ci/meta/JavaConstant;") \ 151 oop_field(Assumptions_CallSiteTargetValue, methodHandle, "Ljdk/vm/ci/meta/JavaConstant;") \ 152 end_class \ 153 start_class(site_Site) \ 154 int_field(site_Site, pcOffset) \ 155 end_class \ 156 start_class(site_Call) \ 157 oop_field(site_Call, target, "Ljdk/vm/ci/meta/InvokeTarget;") \ 158 oop_field(site_Call, debugInfo, "Ljdk/vm/ci/code/DebugInfo;") \ 159 end_class \ 160 start_class(site_DataPatch) \ 161 oop_field(site_DataPatch, reference, "Ljdk/vm/ci/code/site/Reference;") \ 162 end_class \ 163 start_class(site_ConstantReference) \ 164 oop_field(site_ConstantReference, constant, "Ljdk/vm/ci/meta/VMConstant;") \ 165 end_class \ 166 start_class(site_DataSectionReference) \ 167 int_field(site_DataSectionReference, offset) \ 168 end_class \ 169 start_class(site_InfopointReason) \ 170 static_oop_field(site_InfopointReason, SAFEPOINT, "Ljdk/vm/ci/code/site/InfopointReason;") \ 171 static_oop_field(site_InfopointReason, CALL, "Ljdk/vm/ci/code/site/InfopointReason;") \ 172 static_oop_field(site_InfopointReason, IMPLICIT_EXCEPTION, "Ljdk/vm/ci/code/site/InfopointReason;") \ 173 end_class \ 174 start_class(site_Infopoint) \ 175 oop_field(site_Infopoint, debugInfo, "Ljdk/vm/ci/code/DebugInfo;") \ 176 oop_field(site_Infopoint, reason, "Ljdk/vm/ci/code/site/InfopointReason;") \ 177 end_class \ 178 start_class(site_ExceptionHandler) \ 179 int_field(site_ExceptionHandler, handlerPos) \ 180 end_class \ 181 start_class(site_Mark) \ 182 oop_field(site_Mark, id, "Ljava/lang/Object;") \ 183 end_class \ 184 start_class(HotSpotCompilationRequestResult) \ 185 oop_field(HotSpotCompilationRequestResult, failureMessage, "Ljava/lang/String;") \ 186 boolean_field(HotSpotCompilationRequestResult, retry) \ 187 int_field(HotSpotCompilationRequestResult, inlinedBytecodes) \ 188 end_class \ 189 start_class(DebugInfo) \ 190 oop_field(DebugInfo, bytecodePosition, "Ljdk/vm/ci/code/BytecodePosition;") \ 191 oop_field(DebugInfo, referenceMap, "Ljdk/vm/ci/code/ReferenceMap;") \ 192 oop_field(DebugInfo, calleeSaveInfo, "Ljdk/vm/ci/code/RegisterSaveLayout;") \ 193 objArrayOop_field(DebugInfo, virtualObjectMapping, "[Ljdk/vm/ci/code/VirtualObject;") \ 194 end_class \ 195 start_class(HotSpotReferenceMap) \ 196 objArrayOop_field(HotSpotReferenceMap, objects, "[Ljdk/vm/ci/code/Location;") \ 197 objArrayOop_field(HotSpotReferenceMap, derivedBase, "[Ljdk/vm/ci/code/Location;") \ 198 typeArrayOop_field(HotSpotReferenceMap, sizeInBytes, "[I") \ 199 int_field(HotSpotReferenceMap, maxRegisterSize) \ 200 end_class \ 201 start_class(RegisterSaveLayout) \ 202 objArrayOop_field(RegisterSaveLayout, registers, "[Ljdk/vm/ci/code/Register;") \ 203 typeArrayOop_field(RegisterSaveLayout, slots, "[I") \ 204 end_class \ 205 start_class(BytecodeFrame) \ 206 objArrayOop_field(BytecodeFrame, values, "[Ljdk/vm/ci/meta/JavaValue;") \ 207 objArrayOop_field(BytecodeFrame, slotKinds, "[Ljdk/vm/ci/meta/JavaKind;") \ 208 int_field(BytecodeFrame, numLocals) \ 209 int_field(BytecodeFrame, numStack) \ 210 int_field(BytecodeFrame, numLocks) \ 211 boolean_field(BytecodeFrame, rethrowException) \ 212 boolean_field(BytecodeFrame, duringCall) \ 213 static_int_field(BytecodeFrame, UNKNOWN_BCI) \ 214 static_int_field(BytecodeFrame, UNWIND_BCI) \ 215 static_int_field(BytecodeFrame, BEFORE_BCI) \ 216 static_int_field(BytecodeFrame, AFTER_BCI) \ 217 static_int_field(BytecodeFrame, AFTER_EXCEPTION_BCI) \ 218 static_int_field(BytecodeFrame, INVALID_FRAMESTATE_BCI) \ 219 end_class \ 220 start_class(BytecodePosition) \ 221 oop_field(BytecodePosition, caller, "Ljdk/vm/ci/code/BytecodePosition;") \ 222 oop_field(BytecodePosition, method, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \ 223 int_field(BytecodePosition, bci) \ 224 end_class \ 225 start_class(JavaConstant) \ 226 end_class \ 227 start_class(PrimitiveConstant) \ 228 oop_field(PrimitiveConstant, kind, "Ljdk/vm/ci/meta/JavaKind;") \ 229 long_field(PrimitiveConstant, primitive) \ 230 end_class \ 231 start_class(RawConstant) \ 232 long_field(RawConstant, primitive) \ 233 end_class \ 234 start_class(NullConstant) \ 235 end_class \ 236 start_class(HotSpotCompressedNullConstant) \ 237 end_class \ 238 start_class(HotSpotObjectConstantImpl) \ 239 oop_field(HotSpotObjectConstantImpl, object, "Ljava/lang/Object;") \ 240 boolean_field(HotSpotObjectConstantImpl, compressed) \ 241 end_class \ 242 start_class(HotSpotMetaspaceConstantImpl) \ 243 oop_field(HotSpotMetaspaceConstantImpl, metaspaceObject, "Ljdk/vm/ci/hotspot/MetaspaceWrapperObject;") \ 244 boolean_field(HotSpotMetaspaceConstantImpl, compressed) \ 245 end_class \ 246 start_class(HotSpotSentinelConstant) \ 247 end_class \ 248 start_class(JavaKind) \ 249 char_field(JavaKind, typeChar) \ 250 static_oop_field(JavaKind, Boolean, "Ljdk/vm/ci/meta/JavaKind;") \ 251 static_oop_field(JavaKind, Byte, "Ljdk/vm/ci/meta/JavaKind;") \ 252 static_oop_field(JavaKind, Char, "Ljdk/vm/ci/meta/JavaKind;") \ 253 static_oop_field(JavaKind, Short, "Ljdk/vm/ci/meta/JavaKind;") \ 254 static_oop_field(JavaKind, Int, "Ljdk/vm/ci/meta/JavaKind;") \ 255 static_oop_field(JavaKind, Long, "Ljdk/vm/ci/meta/JavaKind;") \ 256 end_class \ 257 start_class(ValueKind) \ 258 oop_field(ValueKind, platformKind, "Ljdk/vm/ci/meta/PlatformKind;") \ 259 end_class \ 260 start_class(Value) \ 261 oop_field(Value, valueKind, "Ljdk/vm/ci/meta/ValueKind;") \ 262 static_oop_field(Value, ILLEGAL, "Ljdk/vm/ci/meta/AllocatableValue;") \ 263 end_class \ 264 start_class(RegisterValue) \ 265 oop_field(RegisterValue, reg, "Ljdk/vm/ci/code/Register;") \ 266 end_class \ 267 start_class(code_Location) \ 268 oop_field(code_Location, reg, "Ljdk/vm/ci/code/Register;") \ 269 int_field(code_Location, offset) \ 270 end_class \ 271 start_class(code_Register) \ 272 int_field(code_Register, number) \ 273 int_field(code_Register, encoding) \ 274 end_class \ 275 start_class(StackSlot) \ 276 int_field(StackSlot, offset) \ 277 boolean_field(StackSlot, addFrameSize) \ 278 end_class \ 279 start_class(VirtualObject) \ 280 int_field(VirtualObject, id) \ 281 oop_field(VirtualObject, type, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 282 objArrayOop_field(VirtualObject, values, "[Ljdk/vm/ci/meta/JavaValue;") \ 283 objArrayOop_field(VirtualObject, slotKinds, "[Ljdk/vm/ci/meta/JavaKind;") \ 284 end_class \ 285 start_class(StackLockValue) \ 286 oop_field(StackLockValue, owner, "Ljdk/vm/ci/meta/JavaValue;") \ 287 oop_field(StackLockValue, slot, "Ljdk/vm/ci/meta/AllocatableValue;") \ 288 boolean_field(StackLockValue, eliminated) \ 289 end_class \ 290 start_class(HotSpotSpeculationLog) \ 291 long_field(HotSpotSpeculationLog, lastFailed) \ 292 end_class \ 293 start_class(HotSpotStackFrameReference) \ 294 oop_field(HotSpotStackFrameReference, compilerToVM, "Ljdk/vm/ci/hotspot/CompilerToVM;") \ 295 boolean_field(HotSpotStackFrameReference, objectsMaterialized) \ 296 long_field(HotSpotStackFrameReference, stackPointer) \ 297 int_field(HotSpotStackFrameReference, frameNumber) \ 298 int_field(HotSpotStackFrameReference, bci) \ 299 oop_field(HotSpotStackFrameReference, method, "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;") \ 300 objArrayOop_field(HotSpotStackFrameReference, locals, "[Ljava/lang/Object;") \ 301 typeArrayOop_field(HotSpotStackFrameReference, localIsVirtual, "[Z") \ 302 end_class \ 303 start_class(HotSpotMetaData) \ 304 typeArrayOop_field(HotSpotMetaData, pcDescBytes, "[B") \ 305 typeArrayOop_field(HotSpotMetaData, scopesDescBytes, "[B") \ 306 typeArrayOop_field(HotSpotMetaData, relocBytes, "[B") \ 307 typeArrayOop_field(HotSpotMetaData, exceptionBytes, "[B") \ 308 typeArrayOop_field(HotSpotMetaData, oopMaps, "[B") \ 309 objArrayOop_field(HotSpotMetaData, metadata, "[Ljava/lang/Object;") \ 310 end_class \ 311 start_class(HotSpotConstantPool) \ 312 long_field(HotSpotConstantPool, metaspaceConstantPool) \ 313 end_class \ 314 start_class(HotSpotJVMCIRuntime) \ 315 int_field(HotSpotJVMCIRuntime, compilationLevelAdjustment) \ 316 end_class \ 317 /* end*/ 318 319 #define START_CLASS(name) \ 320 class name : AllStatic { \ 321 private: \ 322 friend class JVMCICompiler; \ 323 static void check(oop obj, const char* field_name, int offset); \ 324 static void compute_offsets(TRAPS); \ 325 public: \ 326 static InstanceKlass* klass() { return SystemDictionary::name##_klass_is_loaded() ? SystemDictionary::name##_klass() : NULL; } 327 328 #define END_CLASS }; 329 330 #define FIELD(name, type, accessor, cast) \ 331 static int _##name##_offset; \ 332 static type name(oop obj) { check(obj, #name, _##name##_offset); return cast obj->accessor(_##name##_offset); } \ 333 static type name(Handle obj) { check(obj(), #name, _##name##_offset); return cast obj->accessor(_##name##_offset); } \ 334 static type name(jobject obj); \ 335 static void set_##name(oop obj, type x) { check(obj, #name, _##name##_offset); obj->accessor##_put(_##name##_offset, x); } \ 336 static void set_##name(Handle obj, type x) { check(obj(), #name, _##name##_offset); obj->accessor##_put(_##name##_offset, x); } \ 337 static void set_##name(jobject obj, type x); \ 338 339 #define EMPTY_CAST 340 #define CHAR_FIELD(klass, name) FIELD(name, jchar, char_field, EMPTY_CAST) 341 #define INT_FIELD(klass, name) FIELD(name, jint, int_field, EMPTY_CAST) 342 #define BOOLEAN_FIELD(klass, name) FIELD(name, jboolean, bool_field, EMPTY_CAST) 343 #define LONG_FIELD(klass, name) FIELD(name, jlong, long_field, EMPTY_CAST) 344 #define FLOAT_FIELD(klass, name) FIELD(name, jfloat, float_field, EMPTY_CAST) 345 #define OOP_FIELD(klass, name, signature) FIELD(name, oop, obj_field, EMPTY_CAST) 346 #define OBJARRAYOOP_FIELD(klass, name, signature) FIELD(name, objArrayOop, obj_field, (objArrayOop)) 347 #define TYPEARRAYOOP_FIELD(klass, name, signature) FIELD(name, typeArrayOop, obj_field, (typeArrayOop)) 348 #define STATIC_OOP_FIELD(klassName, name, signature) STATIC_OOPISH_FIELD(klassName, name, oop, signature) 349 #define STATIC_OBJARRAYOOP_FIELD(klassName, name, signature) STATIC_OOPISH_FIELD(klassName, name, objArrayOop, signature) 350 #define STATIC_OOPISH_FIELD(klassName, name, type, signature) \ 351 static int _##name##_offset; \ 352 static type name(); \ 353 static void set_##name(type x); 354 #define STATIC_PRIMITIVE_FIELD(klassName, name, jtypename) \ 355 static int _##name##_offset; \ 356 static jtypename name(); \ 357 static void set_##name(jtypename x); 358 359 #define STATIC_INT_FIELD(klassName, name) STATIC_PRIMITIVE_FIELD(klassName, name, jint) 360 #define STATIC_BOOLEAN_FIELD(klassName, name) STATIC_PRIMITIVE_FIELD(klassName, name, jboolean) 361 362 COMPILER_CLASSES_DO(START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, BOOLEAN_FIELD, LONG_FIELD, FLOAT_FIELD, OOP_FIELD, TYPEARRAYOOP_FIELD, OBJARRAYOOP_FIELD, STATIC_OOP_FIELD, STATIC_OBJARRAYOOP_FIELD, STATIC_INT_FIELD, STATIC_BOOLEAN_FIELD) 363 #undef START_CLASS 364 #undef END_CLASS 365 #undef FIELD 366 #undef CHAR_FIELD 367 #undef INT_FIELD 368 #undef BOOLEAN_FIELD 369 #undef LONG_FIELD 370 #undef FLOAT_FIELD 371 #undef OOP_FIELD 372 #undef TYPEARRAYOOP_FIELD 373 #undef OBJARRAYOOP_FIELD 374 #undef STATIC_OOPISH_FIELD 375 #undef STATIC_OOP_FIELD 376 #undef STATIC_OBJARRAYOOP_FIELD 377 #undef STATIC_INT_FIELD 378 #undef STATIC_BOOLEAN_FIELD 379 #undef STATIC_PRIMITIVE_FIELD 380 #undef EMPTY_CAST 381 382 void compute_offset(int &dest_offset, Klass* klass, const char* name, const char* signature, bool static_field, TRAPS); 383 384 #endif // SHARE_JVMCI_JVMCIJAVACLASSES_HPP | 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 "jvmci/jvmciExceptions.hpp" 28 #include "runtime/jniHandles.inline.hpp" 29 30 /* 31 * This macro defines the structure of the JVMCI classes accessed from VM code. It is used to 32 * generate accessors similar to javaClasses.hpp, but with specializations for HotSpot and JNI based 33 * access. 34 * 35 * HotSpotJVMCI: This class contains accessors based on the VM internal 36 * interface to Java. It is used for JVMCI Java code executing on the HotSpot heap. 37 * 38 * JNIJVMCI: This class contains JNI based accessors and is used for JVMCI 39 * Java code executing in the JVMCI shared library. 40 */ 41 42 #define JVMCI_CLASSES_DO(start_class, \ 43 end_class, \ 44 char_field, \ 45 int_field, \ 46 boolean_field, \ 47 long_field, \ 48 float_field, \ 49 object_field, \ 50 primarray_field, \ 51 objectarray_field, \ 52 static_object_field, \ 53 static_objectarray_field, \ 54 static_int_field, \ 55 static_boolean_field, \ 56 jvmci_method, \ 57 jvmci_constructor) \ 58 start_class(Services, jdk_vm_ci_services_Services) \ 59 jvmci_method(CallStaticVoidMethod, GetStaticMethodID, call_static, void, Services, initializeSavedProperties, byte_array_void_signature, (JVMCIObject serializedProperties)) \ 60 end_class \ 61 start_class(Architecture, jdk_vm_ci_code_Architecture) \ 62 object_field(Architecture, wordKind, "Ljdk/vm/ci/meta/PlatformKind;") \ 63 end_class \ 64 start_class(TargetDescription, jdk_vm_ci_code_TargetDescription) \ 65 object_field(TargetDescription, arch, "Ljdk/vm/ci/code/Architecture;") \ 66 end_class \ 67 start_class(HotSpotResolvedObjectTypeImpl, jdk_vm_ci_hotspot_HotSpotResolvedObjectTypeImpl) \ 68 long_field(HotSpotResolvedObjectTypeImpl, metadataPointer) \ 69 end_class \ 70 start_class(HotSpotResolvedPrimitiveType, jdk_vm_ci_hotspot_HotSpotResolvedPrimitiveType) \ 71 object_field(HotSpotResolvedPrimitiveType, mirror, "Ljdk/vm/ci/hotspot/HotSpotObjectConstantImpl;") \ 72 object_field(HotSpotResolvedPrimitiveType, kind, "Ljdk/vm/ci/meta/JavaKind;") \ 73 static_objectarray_field(HotSpotResolvedPrimitiveType, primitives, "[Ljdk/vm/ci/hotspot/HotSpotResolvedPrimitiveType;") \ 74 end_class \ 75 start_class(HotSpotResolvedJavaFieldImpl, jdk_vm_ci_hotspot_HotSpotResolvedJavaFieldImpl) \ 76 object_field(HotSpotResolvedJavaFieldImpl, type, "Ljdk/vm/ci/meta/JavaType;") \ 77 object_field(HotSpotResolvedJavaFieldImpl, holder, "Ljdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;") \ 78 int_field(HotSpotResolvedJavaFieldImpl, offset) \ 79 int_field(HotSpotResolvedJavaFieldImpl, modifiers) \ 80 end_class \ 81 start_class(HotSpotResolvedJavaMethodImpl, jdk_vm_ci_hotspot_HotSpotResolvedJavaMethodImpl) \ 82 long_field(HotSpotResolvedJavaMethodImpl, metadataHandle) \ 83 end_class \ 84 start_class(InstalledCode, jdk_vm_ci_code_InstalledCode) \ 85 long_field(InstalledCode, address) \ 86 long_field(InstalledCode, entryPoint) \ 87 long_field(InstalledCode, version) \ 88 object_field(InstalledCode, name, "Ljava/lang/String;") \ 89 end_class \ 90 start_class(HotSpotInstalledCode, jdk_vm_ci_hotspot_HotSpotInstalledCode) \ 91 int_field(HotSpotInstalledCode, size) \ 92 long_field(HotSpotInstalledCode, codeStart) \ 93 int_field(HotSpotInstalledCode, codeSize) \ 94 end_class \ 95 start_class(HotSpotNmethod, jdk_vm_ci_hotspot_HotSpotNmethod) \ 96 boolean_field(HotSpotNmethod, isDefault) \ 97 long_field(HotSpotNmethod, compileIdSnapshot) \ 98 object_field(HotSpotNmethod, method, "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;") \ 99 jvmci_constructor(HotSpotNmethod, "(Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;Ljava/lang/String;ZJ)V") \ 100 end_class \ 101 start_class(HotSpotCompiledCode, jdk_vm_ci_hotspot_HotSpotCompiledCode) \ 102 object_field(HotSpotCompiledCode, name, "Ljava/lang/String;") \ 103 primarray_field(HotSpotCompiledCode, targetCode, "[B") \ 104 int_field(HotSpotCompiledCode, targetCodeSize) \ 105 objectarray_field(HotSpotCompiledCode, sites, "[Ljdk/vm/ci/code/site/Site;") \ 106 objectarray_field(HotSpotCompiledCode, assumptions, "[Ljdk/vm/ci/meta/Assumptions$Assumption;") \ 107 objectarray_field(HotSpotCompiledCode, methods, "[Ljdk/vm/ci/meta/ResolvedJavaMethod;") \ 108 objectarray_field(HotSpotCompiledCode, comments, "[Ljdk/vm/ci/hotspot/HotSpotCompiledCode$Comment;") \ 109 primarray_field(HotSpotCompiledCode, dataSection, "[B") \ 110 int_field(HotSpotCompiledCode, dataSectionAlignment) \ 111 objectarray_field(HotSpotCompiledCode, dataSectionPatches, "[Ljdk/vm/ci/code/site/DataPatch;") \ 112 boolean_field(HotSpotCompiledCode, isImmutablePIC) \ 113 int_field(HotSpotCompiledCode, totalFrameSize) \ 114 object_field(HotSpotCompiledCode, deoptRescueSlot, "Ljdk/vm/ci/code/StackSlot;") \ 115 end_class \ 116 start_class(HotSpotCompiledCode_Comment, jdk_vm_ci_hotspot_HotSpotCompiledCode_Comment) \ 117 object_field(HotSpotCompiledCode_Comment, text, "Ljava/lang/String;") \ 118 int_field(HotSpotCompiledCode_Comment, pcOffset) \ 119 end_class \ 120 start_class(HotSpotCompiledNmethod, jdk_vm_ci_hotspot_HotSpotCompiledNmethod) \ 121 object_field(HotSpotCompiledNmethod, method, "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;") \ 122 object_field(HotSpotCompiledNmethod, installationFailureMessage, "Ljava/lang/String;") \ 123 int_field(HotSpotCompiledNmethod, entryBCI) \ 124 int_field(HotSpotCompiledNmethod, id) \ 125 long_field(HotSpotCompiledNmethod, compileState) \ 126 boolean_field(HotSpotCompiledNmethod, hasUnsafeAccess) \ 127 end_class \ 128 start_class(HotSpotForeignCallTarget, jdk_vm_ci_hotspot_HotSpotForeignCallTarget) \ 129 long_field(HotSpotForeignCallTarget, address) \ 130 end_class \ 131 start_class(VMField, jdk_vm_ci_hotspot_VMField) \ 132 object_field(VMField, name, "Ljava/lang/String;") \ 133 object_field(VMField, type, "Ljava/lang/String;") \ 134 long_field(VMField, offset) \ 135 long_field(VMField, address) \ 136 object_field(VMField, value, "Ljava/lang/Object;") \ 137 jvmci_constructor(VMField, "(Ljava/lang/String;Ljava/lang/String;JJLjava/lang/Object;)V") \ 138 end_class \ 139 start_class(VMFlag, jdk_vm_ci_hotspot_VMFlag) \ 140 object_field(VMFlag, name, "Ljava/lang/String;") \ 141 object_field(VMFlag, type, "Ljava/lang/String;") \ 142 object_field(VMFlag, value, "Ljava/lang/Object;") \ 143 jvmci_constructor(VMFlag, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V") \ 144 end_class \ 145 start_class(VMIntrinsicMethod, jdk_vm_ci_hotspot_VMIntrinsicMethod) \ 146 object_field(VMIntrinsicMethod, declaringClass, "Ljava/lang/String;") \ 147 object_field(VMIntrinsicMethod, name, "Ljava/lang/String;") \ 148 object_field(VMIntrinsicMethod, descriptor, "Ljava/lang/String;") \ 149 int_field(VMIntrinsicMethod, id) \ 150 jvmci_constructor(VMIntrinsicMethod, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V") \ 151 end_class \ 152 start_class(Assumptions_NoFinalizableSubclass, jdk_vm_ci_meta_Assumptions_NoFinalizableSubclass) \ 153 object_field(Assumptions_NoFinalizableSubclass, receiverType, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 154 end_class \ 155 start_class(Assumptions_ConcreteSubtype, jdk_vm_ci_meta_Assumptions_ConcreteSubtype) \ 156 object_field(Assumptions_ConcreteSubtype, context, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 157 object_field(Assumptions_ConcreteSubtype, subtype, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 158 end_class \ 159 start_class(Assumptions_LeafType, jdk_vm_ci_meta_Assumptions_LeafType) \ 160 object_field(Assumptions_LeafType, context, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 161 end_class \ 162 start_class(Assumptions_ConcreteMethod, jdk_vm_ci_meta_Assumptions_ConcreteMethod) \ 163 object_field(Assumptions_ConcreteMethod, method, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \ 164 object_field(Assumptions_ConcreteMethod, context, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 165 object_field(Assumptions_ConcreteMethod, impl, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \ 166 end_class \ 167 start_class(Assumptions_CallSiteTargetValue, jdk_vm_ci_meta_Assumptions_CallSiteTargetValue) \ 168 object_field(Assumptions_CallSiteTargetValue, callSite, "Ljdk/vm/ci/meta/JavaConstant;") \ 169 object_field(Assumptions_CallSiteTargetValue, methodHandle, "Ljdk/vm/ci/meta/JavaConstant;") \ 170 end_class \ 171 start_class(site_Site, jdk_vm_ci_code_site_Site) \ 172 int_field(site_Site, pcOffset) \ 173 end_class \ 174 start_class(site_Call, jdk_vm_ci_code_site_Call) \ 175 object_field(site_Call, target, "Ljdk/vm/ci/meta/InvokeTarget;") \ 176 end_class \ 177 start_class(site_DataPatch, jdk_vm_ci_code_site_DataPatch) \ 178 object_field(site_DataPatch, reference, "Ljdk/vm/ci/code/site/Reference;") \ 179 end_class \ 180 start_class(site_ConstantReference, jdk_vm_ci_code_site_ConstantReference) \ 181 object_field(site_ConstantReference, constant, "Ljdk/vm/ci/meta/VMConstant;") \ 182 end_class \ 183 start_class(site_DataSectionReference, jdk_vm_ci_code_site_DataSectionReference) \ 184 int_field(site_DataSectionReference, offset) \ 185 end_class \ 186 start_class(site_InfopointReason, jdk_vm_ci_code_site_InfopointReason) \ 187 static_object_field(site_InfopointReason, SAFEPOINT, "Ljdk/vm/ci/code/site/InfopointReason;") \ 188 static_object_field(site_InfopointReason, CALL, "Ljdk/vm/ci/code/site/InfopointReason;") \ 189 static_object_field(site_InfopointReason, IMPLICIT_EXCEPTION, "Ljdk/vm/ci/code/site/InfopointReason;") \ 190 end_class \ 191 start_class(site_Infopoint, jdk_vm_ci_code_site_Infopoint) \ 192 object_field(site_Infopoint, debugInfo, "Ljdk/vm/ci/code/DebugInfo;") \ 193 object_field(site_Infopoint, reason, "Ljdk/vm/ci/code/site/InfopointReason;") \ 194 end_class \ 195 start_class(site_ExceptionHandler, jdk_vm_ci_code_site_ExceptionHandler) \ 196 int_field(site_ExceptionHandler, handlerPos) \ 197 end_class \ 198 start_class(site_Mark, jdk_vm_ci_code_site_Mark) \ 199 object_field(site_Mark, id, "Ljava/lang/Object;") \ 200 end_class \ 201 start_class(HotSpotCompilationRequestResult, jdk_vm_ci_hotspot_HotSpotCompilationRequestResult) \ 202 object_field(HotSpotCompilationRequestResult, failureMessage, "Ljava/lang/String;") \ 203 boolean_field(HotSpotCompilationRequestResult, retry) \ 204 int_field(HotSpotCompilationRequestResult, inlinedBytecodes) \ 205 end_class \ 206 start_class(DebugInfo, jdk_vm_ci_code_DebugInfo) \ 207 object_field(DebugInfo, bytecodePosition, "Ljdk/vm/ci/code/BytecodePosition;") \ 208 object_field(DebugInfo, referenceMap, "Ljdk/vm/ci/code/ReferenceMap;") \ 209 object_field(DebugInfo, calleeSaveInfo, "Ljdk/vm/ci/code/RegisterSaveLayout;") \ 210 objectarray_field(DebugInfo, virtualObjectMapping, "[Ljdk/vm/ci/code/VirtualObject;") \ 211 end_class \ 212 start_class(HotSpotReferenceMap, jdk_vm_ci_hotspot_HotSpotReferenceMap) \ 213 objectarray_field(HotSpotReferenceMap, objects, "[Ljdk/vm/ci/code/Location;") \ 214 objectarray_field(HotSpotReferenceMap, derivedBase, "[Ljdk/vm/ci/code/Location;") \ 215 primarray_field(HotSpotReferenceMap, sizeInBytes, "[I") \ 216 int_field(HotSpotReferenceMap, maxRegisterSize) \ 217 end_class \ 218 start_class(RegisterSaveLayout, jdk_vm_ci_code_RegisterSaveLayout) \ 219 objectarray_field(RegisterSaveLayout, registers, "[Ljdk/vm/ci/code/Register;") \ 220 primarray_field(RegisterSaveLayout, slots, "[I") \ 221 end_class \ 222 start_class(BytecodeFrame, jdk_vm_ci_code_BytecodeFrame) \ 223 objectarray_field(BytecodeFrame, values, "[Ljdk/vm/ci/meta/JavaValue;") \ 224 objectarray_field(BytecodeFrame, slotKinds, "[Ljdk/vm/ci/meta/JavaKind;") \ 225 int_field(BytecodeFrame, numLocals) \ 226 int_field(BytecodeFrame, numStack) \ 227 int_field(BytecodeFrame, numLocks) \ 228 boolean_field(BytecodeFrame, rethrowException) \ 229 boolean_field(BytecodeFrame, duringCall) \ 230 static_int_field(BytecodeFrame, UNKNOWN_BCI) \ 231 static_int_field(BytecodeFrame, UNWIND_BCI) \ 232 static_int_field(BytecodeFrame, BEFORE_BCI) \ 233 static_int_field(BytecodeFrame, AFTER_BCI) \ 234 static_int_field(BytecodeFrame, AFTER_EXCEPTION_BCI) \ 235 static_int_field(BytecodeFrame, INVALID_FRAMESTATE_BCI) \ 236 end_class \ 237 start_class(BytecodePosition, jdk_vm_ci_code_BytecodePosition) \ 238 object_field(BytecodePosition, caller, "Ljdk/vm/ci/code/BytecodePosition;") \ 239 object_field(BytecodePosition, method, "Ljdk/vm/ci/meta/ResolvedJavaMethod;") \ 240 int_field(BytecodePosition, bci) \ 241 end_class \ 242 start_class(JavaConstant, jdk_vm_ci_meta_JavaConstant) \ 243 static_object_field(JavaConstant, NULL_POINTER, "Ljdk/vm/ci/meta/JavaConstant;") \ 244 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, JavaConstant, forFloat, forFloat_signature, (JVMCIObject kind, jlong value, JVMCI_TRAPS)) \ 245 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, JavaConstant, forDouble, forDouble_signature, (JVMCIObject kind, jlong value, JVMCI_TRAPS)) \ 246 end_class \ 247 start_class(ResolvedJavaMethod, jdk_vm_ci_meta_ResolvedJavaMethod) \ 248 end_class \ 249 start_class(PrimitiveConstant, jdk_vm_ci_meta_PrimitiveConstant) \ 250 object_field(PrimitiveConstant, kind, "Ljdk/vm/ci/meta/JavaKind;") \ 251 long_field(PrimitiveConstant, primitive) \ 252 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, PrimitiveConstant, forTypeChar, forTypeChar_signature, (JVMCIObject kind, jlong value, JVMCI_TRAPS)) \ 253 end_class \ 254 start_class(RawConstant, jdk_vm_ci_meta_RawConstant) \ 255 end_class \ 256 start_class(NullConstant, jdk_vm_ci_meta_NullConstant) \ 257 end_class \ 258 start_class(HotSpotCompressedNullConstant, jdk_vm_ci_hotspot_HotSpotCompressedNullConstant) \ 259 end_class \ 260 start_class(HotSpotObjectConstantImpl, jdk_vm_ci_hotspot_HotSpotObjectConstantImpl) \ 261 boolean_field(HotSpotObjectConstantImpl, compressed) \ 262 end_class \ 263 start_class(DirectHotSpotObjectConstantImpl, jdk_vm_ci_hotspot_DirectHotSpotObjectConstantImpl) \ 264 object_field(DirectHotSpotObjectConstantImpl, object, "Ljava/lang/Object;") \ 265 jvmci_constructor(DirectHotSpotObjectConstantImpl, "(Ljava/lang/Object;Z)V") \ 266 end_class \ 267 start_class(IndirectHotSpotObjectConstantImpl, jdk_vm_ci_hotspot_IndirectHotSpotObjectConstantImpl) \ 268 long_field(IndirectHotSpotObjectConstantImpl, objectHandle) \ 269 jvmci_constructor(IndirectHotSpotObjectConstantImpl, "(JZZ)V") \ 270 end_class \ 271 start_class(HotSpotMetaspaceConstantImpl, jdk_vm_ci_hotspot_HotSpotMetaspaceConstantImpl) \ 272 object_field(HotSpotMetaspaceConstantImpl, metaspaceObject, "Ljdk/vm/ci/hotspot/MetaspaceObject;") \ 273 boolean_field(HotSpotMetaspaceConstantImpl, compressed) \ 274 end_class \ 275 start_class(HotSpotSentinelConstant, jdk_vm_ci_hotspot_HotSpotSentinelConstant) \ 276 end_class \ 277 start_class(JavaKind, jdk_vm_ci_meta_JavaKind) \ 278 char_field(JavaKind, typeChar) \ 279 static_object_field(JavaKind, Boolean, "Ljdk/vm/ci/meta/JavaKind;") \ 280 static_object_field(JavaKind, Byte, "Ljdk/vm/ci/meta/JavaKind;") \ 281 static_object_field(JavaKind, Char, "Ljdk/vm/ci/meta/JavaKind;") \ 282 static_object_field(JavaKind, Short, "Ljdk/vm/ci/meta/JavaKind;") \ 283 static_object_field(JavaKind, Int, "Ljdk/vm/ci/meta/JavaKind;") \ 284 static_object_field(JavaKind, Long, "Ljdk/vm/ci/meta/JavaKind;") \ 285 end_class \ 286 start_class(ValueKind, jdk_vm_ci_meta_ValueKind) \ 287 object_field(ValueKind, platformKind, "Ljdk/vm/ci/meta/PlatformKind;") \ 288 end_class \ 289 start_class(Value, jdk_vm_ci_meta_Value) \ 290 object_field(Value, valueKind, "Ljdk/vm/ci/meta/ValueKind;") \ 291 static_object_field(Value, ILLEGAL, "Ljdk/vm/ci/meta/AllocatableValue;") \ 292 end_class \ 293 start_class(RegisterValue, jdk_vm_ci_code_RegisterValue) \ 294 object_field(RegisterValue, reg, "Ljdk/vm/ci/code/Register;") \ 295 end_class \ 296 start_class(code_Location, jdk_vm_ci_code_Location) \ 297 object_field(code_Location, reg, "Ljdk/vm/ci/code/Register;") \ 298 int_field(code_Location, offset) \ 299 end_class \ 300 start_class(code_Register, jdk_vm_ci_code_Register) \ 301 int_field(code_Register, number) \ 302 int_field(code_Register, encoding) \ 303 end_class \ 304 start_class(StackSlot, jdk_vm_ci_code_StackSlot) \ 305 int_field(StackSlot, offset) \ 306 boolean_field(StackSlot, addFrameSize) \ 307 end_class \ 308 start_class(VirtualObject, jdk_vm_ci_code_VirtualObject) \ 309 int_field(VirtualObject, id) \ 310 object_field(VirtualObject, type, "Ljdk/vm/ci/meta/ResolvedJavaType;") \ 311 objectarray_field(VirtualObject, values, "[Ljdk/vm/ci/meta/JavaValue;") \ 312 objectarray_field(VirtualObject, slotKinds, "[Ljdk/vm/ci/meta/JavaKind;") \ 313 end_class \ 314 start_class(StackLockValue, jdk_vm_ci_code_StackLockValue) \ 315 object_field(StackLockValue, owner, "Ljdk/vm/ci/meta/JavaValue;") \ 316 object_field(StackLockValue, slot, "Ljdk/vm/ci/meta/AllocatableValue;") \ 317 boolean_field(StackLockValue, eliminated) \ 318 end_class \ 319 start_class(HotSpotStackFrameReference, jdk_vm_ci_hotspot_HotSpotStackFrameReference) \ 320 object_field(HotSpotStackFrameReference, compilerToVM, "Ljdk/vm/ci/hotspot/CompilerToVM;") \ 321 boolean_field(HotSpotStackFrameReference, objectsMaterialized) \ 322 long_field(HotSpotStackFrameReference, stackPointer) \ 323 int_field(HotSpotStackFrameReference, frameNumber) \ 324 int_field(HotSpotStackFrameReference, bci) \ 325 object_field(HotSpotStackFrameReference, method, "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethod;") \ 326 objectarray_field(HotSpotStackFrameReference, locals, "[Ljava/lang/Object;") \ 327 primarray_field(HotSpotStackFrameReference, localIsVirtual, "[Z") \ 328 end_class \ 329 start_class(HotSpotMetaData, jdk_vm_ci_hotspot_HotSpotMetaData) \ 330 primarray_field(HotSpotMetaData, pcDescBytes, "[B") \ 331 primarray_field(HotSpotMetaData, scopesDescBytes, "[B") \ 332 primarray_field(HotSpotMetaData, relocBytes, "[B") \ 333 primarray_field(HotSpotMetaData, exceptionBytes, "[B") \ 334 primarray_field(HotSpotMetaData, oopMaps, "[B") \ 335 object_field(HotSpotMetaData, metadata, "[Ljava/lang/Object;") \ 336 end_class \ 337 start_class(HotSpotConstantPool, jdk_vm_ci_hotspot_HotSpotConstantPool) \ 338 long_field(HotSpotConstantPool, metadataHandle) \ 339 end_class \ 340 start_class(HotSpotJVMCIRuntime, jdk_vm_ci_hotspot_HotSpotJVMCIRuntime) \ 341 int_field(HotSpotJVMCIRuntime, compilationLevelAdjustment) \ 342 jvmci_method(CallNonvirtualObjectMethod, GetMethodID, call_special, JVMCIObject, HotSpotJVMCIRuntime, compileMethod, compileMethod_signature, (JVMCIObject runtime, JVMCIObject method, int entry_bci, jlong env, int id)) \ 343 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, HotSpotJVMCIRuntime, encodeThrowable, encodeThrowable_signature, (JVMCIObject throwable)) \ 344 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, HotSpotJVMCIRuntime, decodeThrowable, decodeThrowable_signature, (JVMCIObject encodedThrowable)) \ 345 jvmci_method(CallNonvirtualIntMethod, GetMethodID, call_special, int, HotSpotJVMCIRuntime, adjustCompilationLevel, adjustCompilationLevel_signature, (JVMCIObject runtime, JVMCIObject declaringClass, JVMCIObject name, JVMCIObject signature, bool is_osr, int level)) \ 346 jvmci_method(CallNonvirtualVoidMethod, GetMethodID, call_special, void, HotSpotJVMCIRuntime, bootstrapFinished, void_method_signature, (JVMCIObject runtime, JVMCI_TRAPS)) \ 347 jvmci_method(CallNonvirtualVoidMethod, GetMethodID, call_special, void, HotSpotJVMCIRuntime, shutdown, void_method_signature, (JVMCIObject runtime)) \ 348 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, HotSpotJVMCIRuntime, runtime, runtime_signature, (JVMCI_TRAPS)) \ 349 jvmci_method(CallObjectMethod, GetMethodID, call_virtual, JVMCIObject, HotSpotJVMCIRuntime, getCompiler, getCompiler_signature, (JVMCIObject runtime, JVMCI_TRAPS)) \ 350 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, HotSpotJVMCIRuntime, callToString, callToString_signature, (JVMCIObject object, JVMCI_TRAPS)) \ 351 end_class \ 352 start_class(JVMCIError, jdk_vm_ci_common_JVMCIError) \ 353 jvmci_constructor(JVMCIError, "(Ljava/lang/String;)V") \ 354 end_class \ 355 start_class(InspectedFrameVisitor, jdk_vm_ci_code_stack_InspectedFrameVisitor) \ 356 end_class \ 357 start_class(JVMCI, jdk_vm_ci_runtime_JVMCI) \ 358 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, JVMCI, getRuntime, getRuntime_signature, (JVMCI_TRAPS)) \ 359 jvmci_method(CallStaticObjectMethod, GetStaticMethodID, call_static, JVMCIObject, JVMCI, initializeRuntime, initializeRuntime_signature, (JVMCI_TRAPS)) \ 360 end_class \ 361 start_class(Object, java_lang_Object) \ 362 end_class \ 363 start_class(String, java_lang_String) \ 364 end_class \ 365 start_class(Class, java_lang_Class) \ 366 jvmci_method(CallObjectMethod, GetMethodID, call_virtual, JVMCIObject, Class, getName, void_string_signature, (JVMCI_TRAPS)) \ 367 end_class \ 368 start_class(ArrayIndexOutOfBoundsException, java_lang_ArrayIndexOutOfBoundsException) \ 369 jvmci_constructor(ArrayIndexOutOfBoundsException, "(Ljava/lang/String;)V") \ 370 end_class \ 371 start_class(IllegalStateException, java_lang_IllegalStateException) \ 372 jvmci_constructor(IllegalStateException, "(Ljava/lang/String;)V") \ 373 end_class \ 374 start_class(NullPointerException, java_lang_NullPointerException) \ 375 jvmci_constructor(NullPointerException, "(Ljava/lang/String;)V") \ 376 end_class \ 377 start_class(IllegalArgumentException, java_lang_IllegalArgumentException) \ 378 jvmci_constructor(IllegalArgumentException, "(Ljava/lang/String;)V") \ 379 end_class \ 380 start_class(InternalError, java_lang_InternalError) \ 381 jvmci_constructor(InternalError, "(Ljava/lang/String;)V") \ 382 end_class \ 383 start_class(InvalidInstalledCodeException, jdk_vm_ci_code_InvalidInstalledCodeException) \ 384 jvmci_constructor(InvalidInstalledCodeException, "(Ljava/lang/String;)V") \ 385 end_class \ 386 start_class(UnsatisfiedLinkError, java_lang_UnsatisfiedLinkError) \ 387 jvmci_constructor(UnsatisfiedLinkError, "(Ljava/lang/String;)V") \ 388 end_class \ 389 start_class(StackTraceElement, java_lang_StackTraceElement) \ 390 object_field(StackTraceElement, declaringClass, "Ljava/lang/String;") \ 391 object_field(StackTraceElement, methodName, "Ljava/lang/String;") \ 392 object_field(StackTraceElement, fileName, "Ljava/lang/String;") \ 393 int_field(StackTraceElement, lineNumber) \ 394 jvmci_constructor(StackTraceElement, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V") \ 395 end_class \ 396 start_class(Throwable, java_lang_Throwable) \ 397 object_field(Throwable, detailMessage, "Ljava/lang/String;") \ 398 end_class \ 399 /* end*/ 400 401 class JVMCICompiler; 402 class JVMCIEnv; 403 404 class JVMCIArray; 405 class JVMCIPrimitiveArray; 406 class JVMCIObjectArray; 407 408 class JVMCIObject { 409 410 private: 411 jobject _object; 412 bool _is_hotspot; 413 414 public: 415 JVMCIObject(): _object(NULL), _is_hotspot(false) {} 416 JVMCIObject(jobject o, bool is_hotspot): _object(o), _is_hotspot(is_hotspot) { } 417 418 static JVMCIObject create(jobject o, bool is_hotspot) { JVMCIObject r(o, is_hotspot); return r; } 419 jobject as_jobject() { return _object; } 420 jobject as_jweak() { return (jweak) _object; } 421 jstring as_jstring() { return (jstring) _object; } 422 bool is_hotspot() { return _is_hotspot; } 423 424 bool is_null() const { return _object == NULL; } 425 bool is_non_null() const { return _object != NULL; } 426 427 operator JVMCIArray(); 428 operator JVMCIPrimitiveArray(); 429 operator JVMCIObjectArray(); 430 }; 431 432 class JVMCIArray : public JVMCIObject { 433 public: 434 JVMCIArray() {} 435 JVMCIArray(jobject o, bool is_hotspot): JVMCIObject(o, is_hotspot) {} 436 jarray as_jobject() { return (jarray) JVMCIObject::as_jobject(); } 437 }; 438 439 class JVMCIObjectArray : public JVMCIArray { 440 public: 441 JVMCIObjectArray() {} 442 JVMCIObjectArray(void* v): JVMCIArray() { assert(v == NULL, "must be NULL"); } 443 JVMCIObjectArray(jobject o, bool is_hotspot): JVMCIArray(o, is_hotspot) {} 444 445 jobjectArray as_jobject() { return (jobjectArray) JVMCIArray::as_jobject(); } 446 }; 447 448 class JVMCIPrimitiveArray : public JVMCIArray { 449 public: 450 JVMCIPrimitiveArray() {} 451 JVMCIPrimitiveArray(void* v): JVMCIArray() { assert(v == NULL, "must be NULL"); } 452 JVMCIPrimitiveArray(jobject o, bool is_hotspot): JVMCIArray(o, is_hotspot) {} 453 454 jbooleanArray as_jbooleanArray() { return (jbooleanArray) as_jobject(); } 455 jbyteArray as_jbyteArray() { return (jbyteArray) as_jobject(); } 456 jcharArray as_jcharArray() { return (jcharArray) as_jobject(); } 457 jshortArray as_jshortArray() { return (jshortArray) as_jobject(); } 458 jintArray as_jintArray() { return (jintArray) as_jobject(); } 459 jfloatArray as_jfloatArray() { return (jfloatArray) as_jobject(); } 460 jlongArray as_jlongArray() { return (jlongArray) as_jobject(); } 461 jdoubleArray as_jdoubleArray() { return (jdoubleArray) as_jobject(); } 462 }; 463 464 inline JVMCIObject::operator JVMCIArray() { return JVMCIArray(_object, _is_hotspot); } 465 inline JVMCIObject::operator JVMCIPrimitiveArray() { return JVMCIPrimitiveArray(_object, _is_hotspot); } 466 inline JVMCIObject::operator JVMCIObjectArray() { return JVMCIObjectArray(_object, _is_hotspot); } 467 468 #define START_CLASS(simpleClassName, fullClassName) \ 469 class simpleClassName { \ 470 friend class JVMCIEnv; \ 471 static void initialize(JVMCI_TRAPS); \ 472 static bool is_instance(JVMCIEnv* jvmciEnv, JVMCIObject object); \ 473 474 #define END_CLASS }; 475 476 #define EMPTY_CAST 477 #define CHAR_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jchar) 478 #define INT_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jint) 479 #define BOOLEAN_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jboolean) 480 #define LONG_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jlong) 481 #define FLOAT_FIELD(simpleClassName, name) FIELD(simpleClassName, name, jfloat) 482 483 #define OBJECT_FIELD(simpleClassName, name, signature) OOPISH_FIELD(simpleClassName, name, JVMCIObject, oop) 484 #define OBJECTARRAY_FIELD(simpleClassName, name, signature) OOPISH_FIELD(simpleClassName, name, JVMCIObjectArray, objArrayOop) 485 #define PRIMARRAY_FIELD(simpleClassName, name, signature) OOPISH_FIELD(simpleClassName, name, JVMCIPrimitiveArray, typeArrayOop) 486 487 #define STATIC_INT_FIELD(simpleClassName, name) STATIC_FIELD(simpleClassName, name, jint) 488 #define STATIC_BOOLEAN_FIELD(simpleClassName, name) STATIC_FIELD(simpleClassName, name, jboolean) 489 #define STATIC_OBJECT_FIELD(simpleClassName, name, signature) STATIC_OOPISH_FIELD(simpleClassName, name, JVMCIObject, oop) 490 #define STATIC_OBJECTARRAY_FIELD(simpleClassName, name, signature) STATIC_OOPISH_FIELD(simpleClassName, name, JVMCIObjectArray, objArrayOop) 491 492 #define HS_START_CLASS(simpleClassName, fullClassName) \ 493 START_CLASS(simpleClassName, fullClassName) \ 494 friend class HotSpotJVMCI; \ 495 private: \ 496 static void check(oop obj, const char* field_name, int offset); \ 497 static InstanceKlass* _klass; \ 498 public: \ 499 static InstanceKlass* klass() { assert(_klass != NULL, "uninit"); return _klass; } \ 500 static Symbol* symbol() { return vmSymbols::fullClassName(); } 501 502 #define FIELD(simpleClassName, name, type) \ 503 private: \ 504 static int _##name##_offset; \ 505 public: \ 506 static type get_ ## name(JVMCIEnv* env, JVMCIObject obj) { return name(env, resolve(obj)); } \ 507 static void set_ ## name(JVMCIEnv* env, JVMCIObject obj, type x) { set_ ## name(env, resolve(obj), x); } \ 508 static type name(JVMCIEnv* env, oop obj); \ 509 static void set_ ## name(JVMCIEnv* env, oop obj, type x); 510 511 #define OOPISH_FIELD(simpleClassName, name, type, hstype) \ 512 private: \ 513 static int _##name##_offset; \ 514 public: \ 515 static type get_ ## name(JVMCIEnv* env, JVMCIObject obj) { return (type) wrap(name(env, resolve(obj))); } \ 516 static void set_ ## name(JVMCIEnv* env, JVMCIObject obj, type x) { set_ ## name(env, resolve(obj), (hstype) resolve(x)); } \ 517 static hstype name(JVMCIEnv* env, oop obj); \ 518 static void set_ ## name(JVMCIEnv* env, oop obj, hstype x); 519 520 #define STATIC_FIELD(simpleClassName, name, type) \ 521 private: \ 522 static int _##name##_offset; \ 523 public: \ 524 static type get_ ## name(JVMCIEnv* env); \ 525 static void set_ ## name(JVMCIEnv* env, type x); 526 527 #define STATIC_OOPISH_FIELD(simpleClassName, name, type, hstype) \ 528 private: \ 529 static int _##name##_offset; \ 530 public: \ 531 static type get_ ## name(JVMCIEnv* env) { return (type) wrap(name(env)); } \ 532 static void set_ ## name(JVMCIEnv* env, type x) { set_ ## name(env, (hstype) resolve(x)); } \ 533 static hstype name(JVMCIEnv* env); \ 534 static void set_ ## name(JVMCIEnv* env, hstype hstype); 535 536 #define METHOD(jniCallType, jniGetMethod, hsCallType, returnType, simpleClassName, methodName, signatureSymbolName, args) 537 #define CONSTRUCTOR(className, signature) 538 539 /** 540 * VM internal interface to Java classes, methods and objects. For example: 541 * 542 * class HotSpotJVMCI { 543 * ... 544 * class Architecture { 545 * static void initialize(JVMCIEnv* env); 546 * static bool is_instance(JVMCIEnv* env, JVMCIObject object); 547 * private: 548 * static void check(oop obj, const char *field_name, int offset); 549 * public: 550 * static InstanceKlass *klass() { ... } 551 * static Symbol *symbol() { return vmSymbols::jdk_vm_ci_code_Architecture(); } 552 * private: 553 * static int _wordKind_offset; 554 * public: 555 * static JVMCIObject get_wordKind(JVMCIEnv *env, JVMCIObject obj) { ... } 556 * static void set_wordKind(JVMCIEnv *env, JVMCIObject obj, JVMCIObject x) { ... } 557 * static oop wordKind(JVMCIEnv *env, oop obj); 558 * static void set_wordKind(JVMCIEnv *env, oop obj, oop x); 559 * } 560 * ... 561 * }; 562 */ 563 class HotSpotJVMCI { 564 friend class JVMCIEnv; 565 566 public: 567 568 static oop resolve(JVMCIObject obj) { return JNIHandles::resolve(obj.as_jobject()); } 569 570 static arrayOop resolve(JVMCIArray obj) { return (objArrayOop) JNIHandles::resolve(obj.as_jobject()); } 571 static objArrayOop resolve(JVMCIObjectArray obj) { return (objArrayOop) JNIHandles::resolve(obj.as_jobject()); } 572 static typeArrayOop resolve(JVMCIPrimitiveArray obj) { return (typeArrayOop) JNIHandles::resolve(obj.as_jobject()); } 573 574 static JVMCIObject wrap(jobject obj) { return JVMCIObject(obj, true); } 575 static JVMCIObject wrap(oop obj) { assert(Thread::current()->is_Java_thread(), "must be"); return JVMCIObject(JNIHandles::make_local(obj), true); } 576 577 static inline Method* asMethod(JVMCIEnv* env, oop jvmci_method) { 578 return *(Method**) HotSpotResolvedJavaMethodImpl::metadataHandle(env, jvmci_method); 579 } 580 static inline ConstantPool* asConstantPool(JVMCIEnv* env, oop jvmci_constant_pool) { 581 return *(ConstantPool**) HotSpotConstantPool::metadataHandle(env, jvmci_constant_pool); 582 } 583 static inline Klass* asKlass(JVMCIEnv* env, oop jvmci_type) { 584 return (Klass*) HotSpotResolvedObjectTypeImpl::metadataPointer(env, jvmci_type); 585 } 586 587 static void compute_offsets(TRAPS); 588 static void compute_offset(int &dest_offset, Klass* klass, const char* name, const char* signature, bool static_field, TRAPS); 589 590 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) 591 }; 592 593 #undef HS_START_CLASS 594 595 #define JNI_START_CLASS(simpleClassName, fullClassName) \ 596 START_CLASS(simpleClassName, fullClassName) \ 597 friend class JNIJVMCI; \ 598 private: \ 599 static void check(JVMCIEnv* jvmciEnv, JVMCIObject obj, const char* field_name, jfieldID offset); \ 600 static jclass _class; \ 601 public: \ 602 static jclass clazz() { assert(_class != NULL, #fullClassName " uninitialized"); return _class; } \ 603 static jclass fullClassName ##_class() { assert(_class != NULL, "uninit"); return _class; } 604 605 #undef METHOD 606 #undef CONSTRUCTOR 607 #undef FIELD 608 #undef OOPISH_FIELD 609 #undef STATIC_FIELD 610 #undef STATIC_OOPISH_FIELD 611 612 #define FIELD(simpleClassName, name, type) \ 613 private: \ 614 static jfieldID _##name##_field_id; \ 615 public: \ 616 static type get_ ## name(JVMCIEnv* jvmciEnv, JVMCIObject obj); \ 617 static void set_ ## name(JVMCIEnv* jvmciEnv, JVMCIObject obj, type x); 618 619 #define OOPISH_FIELD(simpleClassName, name, type, hstype) \ 620 FIELD(simpleClassName, name, type) 621 622 #define STATIC_FIELD(simpleClassName, name, type) \ 623 private: \ 624 static jfieldID _##name##_field_id; \ 625 public: \ 626 static type get_ ## name(JVMCIEnv* jvmciEnv); \ 627 static void set_ ## name(JVMCIEnv* jvmciEnv, type x); 628 629 #define STATIC_OOPISH_FIELD(simpleClassName, name, type, hstype) \ 630 STATIC_FIELD(simpleClassName, name, type) 631 632 #define METHOD(jniCallType, jniGetMethod, hsCallType, returnType, className, methodName, signatureSymbolName, args) \ 633 public: \ 634 static jmethodID methodName##_method() { return _##methodName##_method; } \ 635 private: \ 636 static jmethodID _##methodName##_method; 637 638 #define CONSTRUCTOR(className, signature) \ 639 public: \ 640 static jmethodID constructor() { return _constructor; } \ 641 private: \ 642 static jmethodID _constructor; 643 644 /** 645 * JNI based interface to Java classes, methods and objects. For example: 646 * 647 * class JNIJVMCI { 648 * ... 649 * class Architecture { 650 * static void initialize(JVMCIEnv* env); 651 * static bool is_instance(JVMCIEnv* env, JVMCIObject object); 652 * private: 653 * static void check(oop obj, const char *field_name, int offset); 654 * static jclass _class; 655 * public: 656 * static jclass clazz() { return _class; } 657 * static jclass jdk_vm_ci_code_Architecture_class() { return _class; } 658 * private: 659 * static jfieldID _wordKind_field_id; 660 * public: 661 * static JVMCIObject get_wordKind(JVMCIEnv *env, JVMCIObject obj) { ... } 662 * static void set_wordKind(JVMCIEnv *env, JVMCIObject obj, JVMCIObject x) { ... } 663 * } 664 * ... 665 * }; 666 */ 667 class JNIJVMCI { 668 friend class JVMCIEnv; 669 670 static jclass _byte_array; 671 static jclass _box_classes[T_CONFLICT+1]; 672 static jfieldID _box_fields[T_CONFLICT+1]; 673 static jmethodID _box_constructors[T_CONFLICT+1]; 674 static jmethodID _Class_getName_method; 675 676 static jmethodID _HotSpotResolvedJavaMethodImpl_fromMetaspace_method; 677 static jmethodID _HotSpotConstantPool_fromMetaspace_method; 678 static jmethodID _HotSpotResolvedObjectTypeImpl_fromMetaspace_method; 679 static jmethodID _HotSpotResolvedPrimitiveType_fromMetaspace_method; 680 681 public: 682 static jmethodID Class_getName_method() { return _Class_getName_method; } 683 684 static jclass byte_array() { assert(_byte_array != NULL, "uninit"); return _byte_array; } 685 686 static jclass box_class(BasicType type) { assert(_box_classes[type]!= NULL, "uninit"); return _box_classes[type]; } 687 static jfieldID box_field(BasicType type) { assert(_box_fields[type]!= NULL, "uninit"); return _box_fields[type]; } 688 static jmethodID box_constructor(BasicType type) { assert(_box_constructors[type]!= NULL, "uninit"); return _box_constructors[type]; } 689 690 static jmethodID HotSpotResolvedJavaMethodImpl_fromMetaspace_method() { assert(_HotSpotResolvedJavaMethodImpl_fromMetaspace_method != NULL, "uninit"); return _HotSpotResolvedJavaMethodImpl_fromMetaspace_method; } 691 static jmethodID HotSpotConstantPool_fromMetaspace_method() { assert(_HotSpotConstantPool_fromMetaspace_method != NULL, "uninit"); return _HotSpotConstantPool_fromMetaspace_method; } 692 static jmethodID HotSpotResolvedObjectTypeImpl_fromMetaspace_method() { assert(_HotSpotResolvedObjectTypeImpl_fromMetaspace_method != NULL, "uninit"); return _HotSpotResolvedObjectTypeImpl_fromMetaspace_method; } 693 static jmethodID HotSpotResolvedPrimitiveType_fromMetaspace_method() { assert(_HotSpotResolvedPrimitiveType_fromMetaspace_method != NULL, "uninit"); return _HotSpotResolvedPrimitiveType_fromMetaspace_method; } 694 695 static void initialize_ids(JNIEnv* env); 696 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); 697 698 static jobject resolve_handle(JVMCIObject obj) { return obj.as_jobject(); } 699 static JVMCIObject wrap(jobject obj) { return JVMCIObject(obj, false); } 700 701 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) 702 }; 703 704 #undef JNI_START_CLASS 705 #undef START_CLASS 706 #undef END_CLASS 707 #undef METHOD 708 #undef CONSTRUCTOR 709 #undef FIELD 710 #undef CHAR_FIELD 711 #undef INT_FIELD 712 #undef BOOLEAN_FIELD 713 #undef LONG_FIELD 714 #undef FLOAT_FIELD 715 #undef OBJECT_FIELD 716 #undef PRIMARRAY_FIELD 717 #undef OBJECTARRAY_FIELD 718 #undef FIELD 719 #undef OOPISH_FIELD 720 #undef STATIC_FIELD 721 #undef STATIC_OOPISH_FIELD 722 #undef STATIC_FIELD 723 #undef STATIC_OBJECT_FIELD 724 #undef STATIC_OBJECTARRAY_FIELD 725 #undef STATIC_INT_FIELD 726 #undef STATIC_BOOLEAN_FIELD 727 #undef STATIC_PRIMITIVE_FIELD 728 #undef EMPTY_CAST 729 730 #endif // SHARE_JVMCI_JVMCIJAVACLASSES_HPP |