hotspot/src/share/vm/runtime/vmStructs.cpp
changeset 33467 8d4741610aa9
parent 33465 6063f28a6efb
parent 33466 ca5ee1f94b60
child 33469 30f4811eded0
equal deleted inserted replaced
33465:6063f28a6efb 33467:8d4741610aa9
   245 // HotSpotTypeDataBase.java, which parses the type strings.
   245 // HotSpotTypeDataBase.java, which parses the type strings.
   246 
   246 
   247 #ifndef REG_COUNT
   247 #ifndef REG_COUNT
   248   #define REG_COUNT 0
   248   #define REG_COUNT 0
   249 #endif
   249 #endif
   250 // whole purpose of this function is to work around bug c++/27724 in gcc 4.1.1
       
   251 // with optimization turned on it doesn't affect produced code
       
   252 static inline uint64_t cast_uint64_t(size_t x)
       
   253 {
       
   254   return x;
       
   255 }
       
   256 
   250 
   257 #if INCLUDE_JVMTI
   251 #if INCLUDE_JVMTI
   258   #define JVMTI_STRUCTS(static_field) \
   252   #define JVMTI_STRUCTS(static_field) \
   259     static_field(JvmtiExport,                     _can_access_local_variables,                  bool)                                  \
   253     static_field(JvmtiExport,                     _can_access_local_variables,                  bool)                                  \
   260     static_field(JvmtiExport,                     _can_hotswap_or_post_breakpoint,              bool)                                  \
   254     static_field(JvmtiExport,                     _can_hotswap_or_post_breakpoint,              bool)                                  \
  2901 // VMStructEntry macros
  2895 // VMStructEntry macros
  2902 //
  2896 //
  2903 
  2897 
  2904 // This macro generates a VMStructEntry line for a nonstatic field
  2898 // This macro generates a VMStructEntry line for a nonstatic field
  2905 #define GENERATE_NONSTATIC_VM_STRUCT_ENTRY(typeName, fieldName, type)              \
  2899 #define GENERATE_NONSTATIC_VM_STRUCT_ENTRY(typeName, fieldName, type)              \
  2906  { QUOTE(typeName), QUOTE(fieldName), QUOTE(type), 0, cast_uint64_t(offset_of(typeName, fieldName)), NULL },
  2900  { QUOTE(typeName), QUOTE(fieldName), QUOTE(type), 0, offset_of(typeName, fieldName), NULL },
  2907 
  2901 
  2908 // This macro generates a VMStructEntry line for a static field
  2902 // This macro generates a VMStructEntry line for a static field
  2909 #define GENERATE_STATIC_VM_STRUCT_ENTRY(typeName, fieldName, type)                 \
  2903 #define GENERATE_STATIC_VM_STRUCT_ENTRY(typeName, fieldName, type)                 \
  2910  { QUOTE(typeName), QUOTE(fieldName), QUOTE(type), 1, 0, &typeName::fieldName },
  2904  { QUOTE(typeName), QUOTE(fieldName), QUOTE(type), 1, 0, &typeName::fieldName },
  2911 
  2905 
  2912 // This macro generates a VMStructEntry line for an unchecked
  2906 // This macro generates a VMStructEntry line for an unchecked
  2913 // nonstatic field, in which the size of the type is also specified.
  2907 // nonstatic field, in which the size of the type is also specified.
  2914 // The type string is given as NULL, indicating an "opaque" type.
  2908 // The type string is given as NULL, indicating an "opaque" type.
  2915 #define GENERATE_UNCHECKED_NONSTATIC_VM_STRUCT_ENTRY(typeName, fieldName, size)    \
  2909 #define GENERATE_UNCHECKED_NONSTATIC_VM_STRUCT_ENTRY(typeName, fieldName, size)    \
  2916   { QUOTE(typeName), QUOTE(fieldName), NULL, 0, cast_uint64_t(offset_of(typeName, fieldName)), NULL },
  2910   { QUOTE(typeName), QUOTE(fieldName), NULL, 0, offset_of(typeName, fieldName), NULL },
  2917 
  2911 
  2918 // This macro generates a VMStructEntry line for an unchecked
  2912 // This macro generates a VMStructEntry line for an unchecked
  2919 // static field, in which the size of the type is also specified.
  2913 // static field, in which the size of the type is also specified.
  2920 // The type string is given as NULL, indicating an "opaque" type.
  2914 // The type string is given as NULL, indicating an "opaque" type.
  2921 #define GENERATE_UNCHECKED_STATIC_VM_STRUCT_ENTRY(typeName, fieldName, size)       \
  2915 #define GENERATE_UNCHECKED_STATIC_VM_STRUCT_ENTRY(typeName, fieldName, size)       \
  3094 //--------------------------------------------------------------------------------
  3088 //--------------------------------------------------------------------------------
  3095 // VMLongConstantEntry macros
  3089 // VMLongConstantEntry macros
  3096 //
  3090 //
  3097 
  3091 
  3098 #define GENERATE_VM_LONG_CONSTANT_ENTRY(name) \
  3092 #define GENERATE_VM_LONG_CONSTANT_ENTRY(name) \
  3099   { QUOTE(name), cast_uint64_t(name) },
  3093   { QUOTE(name), name },
  3100 
  3094 
  3101 #define GENERATE_PREPROCESSOR_VM_LONG_CONSTANT_ENTRY(name, value) \
  3095 #define GENERATE_PREPROCESSOR_VM_LONG_CONSTANT_ENTRY(name, value) \
  3102   { name, cast_uint64_t(value) },
  3096   { name, value },
  3103 
  3097 
  3104 // This macro generates the sentinel value indicating the end of the list
  3098 // This macro generates the sentinel value indicating the end of the list
  3105 #define GENERATE_VM_LONG_CONSTANT_LAST_ENTRY() \
  3099 #define GENERATE_VM_LONG_CONSTANT_LAST_ENTRY() \
  3106  { NULL, 0 }
  3100  { NULL, 0 }
  3107 
  3101 
  3545 #endif
  3539 #endif
  3546 }
  3540 }
  3547 
  3541 
  3548 extern "C" {
  3542 extern "C" {
  3549 
  3543 
  3550 // see comments on cast_uint64_t at the top of this file
  3544 #define STRIDE(array) ((char*)&array[1] - (char*)&array[0])
  3551 #define ASSIGN_CONST_TO_64BIT_VAR(var, expr) \
  3545 
  3552     JNIEXPORT uint64_t var = cast_uint64_t(expr);
  3546 JNIEXPORT VMStructEntry* gHotSpotVMStructs = VMStructs::localHotSpotVMStructs;
  3553 #define ASSIGN_OFFSET_TO_64BIT_VAR(var, type, field)   \
  3547 JNIEXPORT uint64_t gHotSpotVMStructEntryTypeNameOffset = offset_of(VMStructEntry, typeName);
  3554   ASSIGN_CONST_TO_64BIT_VAR(var, offset_of(type, field))
  3548 JNIEXPORT uint64_t gHotSpotVMStructEntryFieldNameOffset = offset_of(VMStructEntry, fieldName);
  3555 #define ASSIGN_STRIDE_TO_64BIT_VAR(var, array) \
  3549 JNIEXPORT uint64_t gHotSpotVMStructEntryTypeStringOffset = offset_of(VMStructEntry, typeString);
  3556   ASSIGN_CONST_TO_64BIT_VAR(var, (char*)&array[1] - (char*)&array[0])
  3550 JNIEXPORT uint64_t gHotSpotVMStructEntryIsStaticOffset = offset_of(VMStructEntry, isStatic);
  3557 
  3551 JNIEXPORT uint64_t gHotSpotVMStructEntryOffsetOffset = offset_of(VMStructEntry, offset);
  3558 JNIEXPORT VMStructEntry* gHotSpotVMStructs                 = VMStructs::localHotSpotVMStructs;
  3552 JNIEXPORT uint64_t gHotSpotVMStructEntryAddressOffset = offset_of(VMStructEntry, address);
  3559 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMStructEntryTypeNameOffset,  VMStructEntry, typeName);
  3553 JNIEXPORT uint64_t gHotSpotVMStructEntryArrayStride = STRIDE(gHotSpotVMStructs);
  3560 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMStructEntryFieldNameOffset, VMStructEntry, fieldName);
  3554 
  3561 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMStructEntryTypeStringOffset, VMStructEntry, typeString);
  3555 JNIEXPORT VMTypeEntry* gHotSpotVMTypes = VMStructs::localHotSpotVMTypes;
  3562 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMStructEntryIsStaticOffset, VMStructEntry, isStatic);
  3556 JNIEXPORT uint64_t gHotSpotVMTypeEntryTypeNameOffset = offset_of(VMTypeEntry, typeName);
  3563 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMStructEntryOffsetOffset, VMStructEntry, offset);
  3557 JNIEXPORT uint64_t gHotSpotVMTypeEntrySuperclassNameOffset = offset_of(VMTypeEntry, superclassName);
  3564 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMStructEntryAddressOffset, VMStructEntry, address);
  3558 JNIEXPORT uint64_t gHotSpotVMTypeEntryIsOopTypeOffset = offset_of(VMTypeEntry, isOopType);
  3565 ASSIGN_STRIDE_TO_64BIT_VAR(gHotSpotVMStructEntryArrayStride, gHotSpotVMStructs);
  3559 JNIEXPORT uint64_t gHotSpotVMTypeEntryIsIntegerTypeOffset = offset_of(VMTypeEntry, isIntegerType);
  3566 JNIEXPORT VMTypeEntry*   gHotSpotVMTypes                   = VMStructs::localHotSpotVMTypes;
  3560 JNIEXPORT uint64_t gHotSpotVMTypeEntryIsUnsignedOffset = offset_of(VMTypeEntry, isUnsigned);
  3567 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMTypeEntryTypeNameOffset, VMTypeEntry, typeName);
  3561 JNIEXPORT uint64_t gHotSpotVMTypeEntrySizeOffset = offset_of(VMTypeEntry, size);
  3568 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMTypeEntrySuperclassNameOffset, VMTypeEntry, superclassName);
  3562 JNIEXPORT uint64_t gHotSpotVMTypeEntryArrayStride = STRIDE(gHotSpotVMTypes);
  3569 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMTypeEntryIsOopTypeOffset, VMTypeEntry, isOopType);
  3563 
  3570 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMTypeEntryIsIntegerTypeOffset, VMTypeEntry, isIntegerType);
  3564 JNIEXPORT VMIntConstantEntry* gHotSpotVMIntConstants = VMStructs::localHotSpotVMIntConstants;
  3571 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMTypeEntryIsUnsignedOffset, VMTypeEntry, isUnsigned);
  3565 JNIEXPORT uint64_t gHotSpotVMIntConstantEntryNameOffset = offset_of(VMIntConstantEntry, name);
  3572 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMTypeEntrySizeOffset, VMTypeEntry, size);
  3566 JNIEXPORT uint64_t gHotSpotVMIntConstantEntryValueOffset = offset_of(VMIntConstantEntry, value);
  3573 ASSIGN_STRIDE_TO_64BIT_VAR(gHotSpotVMTypeEntryArrayStride,gHotSpotVMTypes);
  3567 JNIEXPORT uint64_t gHotSpotVMIntConstantEntryArrayStride = STRIDE(gHotSpotVMIntConstants);
  3574 JNIEXPORT VMIntConstantEntry* gHotSpotVMIntConstants       = VMStructs::localHotSpotVMIntConstants;
  3568 
  3575 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMIntConstantEntryNameOffset, VMIntConstantEntry, name);
  3569 JNIEXPORT VMLongConstantEntry* gHotSpotVMLongConstants = VMStructs::localHotSpotVMLongConstants;
  3576 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMIntConstantEntryValueOffset, VMIntConstantEntry, value);
  3570 JNIEXPORT uint64_t gHotSpotVMLongConstantEntryNameOffset = offset_of(VMLongConstantEntry, name);
  3577 ASSIGN_STRIDE_TO_64BIT_VAR(gHotSpotVMIntConstantEntryArrayStride, gHotSpotVMIntConstants);
  3571 JNIEXPORT uint64_t gHotSpotVMLongConstantEntryValueOffset = offset_of(VMLongConstantEntry, value);
  3578 JNIEXPORT VMLongConstantEntry* gHotSpotVMLongConstants     = VMStructs::localHotSpotVMLongConstants;
  3572 JNIEXPORT uint64_t gHotSpotVMLongConstantEntryArrayStride = STRIDE(gHotSpotVMLongConstants);
  3579 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMLongConstantEntryNameOffset, VMLongConstantEntry, name);
       
  3580 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMLongConstantEntryValueOffset, VMLongConstantEntry, value);
       
  3581 ASSIGN_STRIDE_TO_64BIT_VAR(gHotSpotVMLongConstantEntryArrayStride, gHotSpotVMLongConstants);
       
  3582 
  3573 
  3583 JNIEXPORT VMAddressEntry* gHotSpotVMAddresses = VMStructs::localHotSpotVMAddresses;
  3574 JNIEXPORT VMAddressEntry* gHotSpotVMAddresses = VMStructs::localHotSpotVMAddresses;
  3584 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMAddressEntryNameOffset, VMAddressEntry, name);
  3575 JNIEXPORT uint64_t gHotSpotVMAddressEntryNameOffset = offset_of(VMAddressEntry, name);
  3585 ASSIGN_OFFSET_TO_64BIT_VAR(gHotSpotVMAddressEntryValueOffset, VMAddressEntry, value);
  3576 JNIEXPORT uint64_t gHotSpotVMAddressEntryValueOffset = offset_of(VMAddressEntry, value);
  3586 ASSIGN_STRIDE_TO_64BIT_VAR(gHotSpotVMAddressEntryArrayStride, gHotSpotVMAddresses);
  3577 JNIEXPORT uint64_t gHotSpotVMAddressEntryArrayStride = STRIDE(gHotSpotVMAddresses);
  3587 }
  3578 }
  3588 
  3579 
  3589 #ifdef ASSERT
  3580 #ifdef ASSERT
  3590 static int recursiveFindType(VMTypeEntry* origtypes, const char* typeName, bool isRecurse) {
  3581 static int recursiveFindType(VMTypeEntry* origtypes, const char* typeName, bool isRecurse) {
  3591   {
  3582   {