1074 }
1075
1076 void CodeInstaller::site_DataPatch(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
1077 Handle reference = site_DataPatch::reference(site);
1078 if (reference.is_null()) {
1079 THROW(vmSymbols::java_lang_NullPointerException());
1080 } else if (reference->is_a(site_ConstantReference::klass())) {
1081 Handle constant = site_ConstantReference::constant(reference);
1082 if (constant.is_null()) {
1083 THROW(vmSymbols::java_lang_NullPointerException());
1084 } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) {
1085 pd_patch_OopConstant(pc_offset, constant, CHECK);
1086 } else if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) {
1087 pd_patch_MetaspaceConstant(pc_offset, constant, CHECK);
1088 } else {
1089 JVMCI_ERROR("unknown constant type in data patch: %s", constant->klass()->signature_name());
1090 }
1091 } else if (reference->is_a(site_DataSectionReference::klass())) {
1092 int data_offset = site_DataSectionReference::offset(reference);
1093 if (0 <= data_offset && data_offset < _constants_size) {
1094 pd_patch_DataSectionReference(pc_offset, data_offset);
1095 } else {
1096 JVMCI_ERROR("data offset 0x%X points outside data section (size 0x%X)", data_offset, _constants_size);
1097 }
1098 } else {
1099 JVMCI_ERROR("unknown data patch type: %s", reference->klass()->signature_name());
1100 }
1101 }
1102
1103 void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
1104 Handle id_obj = site_Mark::id(site);
1105
1106 if (id_obj.not_null()) {
1107 if (!java_lang_boxing_object::is_instance(id_obj(), T_INT)) {
1108 JVMCI_ERROR("expected Integer id, got %s", id_obj->klass()->signature_name());
1109 }
1110 jint id = id_obj->int_field(java_lang_boxing_object::value_offset_in_bytes(T_INT));
1111
1112 address pc = _instructions->start() + pc_offset;
1113
1114 switch (id) {
|
1074 }
1075
1076 void CodeInstaller::site_DataPatch(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
1077 Handle reference = site_DataPatch::reference(site);
1078 if (reference.is_null()) {
1079 THROW(vmSymbols::java_lang_NullPointerException());
1080 } else if (reference->is_a(site_ConstantReference::klass())) {
1081 Handle constant = site_ConstantReference::constant(reference);
1082 if (constant.is_null()) {
1083 THROW(vmSymbols::java_lang_NullPointerException());
1084 } else if (constant->is_a(HotSpotObjectConstantImpl::klass())) {
1085 pd_patch_OopConstant(pc_offset, constant, CHECK);
1086 } else if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) {
1087 pd_patch_MetaspaceConstant(pc_offset, constant, CHECK);
1088 } else {
1089 JVMCI_ERROR("unknown constant type in data patch: %s", constant->klass()->signature_name());
1090 }
1091 } else if (reference->is_a(site_DataSectionReference::klass())) {
1092 int data_offset = site_DataSectionReference::offset(reference);
1093 if (0 <= data_offset && data_offset < _constants_size) {
1094 pd_patch_DataSectionReference(pc_offset, data_offset, CHECK);
1095 } else {
1096 JVMCI_ERROR("data offset 0x%X points outside data section (size 0x%X)", data_offset, _constants_size);
1097 }
1098 } else {
1099 JVMCI_ERROR("unknown data patch type: %s", reference->klass()->signature_name());
1100 }
1101 }
1102
1103 void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, Handle site, TRAPS) {
1104 Handle id_obj = site_Mark::id(site);
1105
1106 if (id_obj.not_null()) {
1107 if (!java_lang_boxing_object::is_instance(id_obj(), T_INT)) {
1108 JVMCI_ERROR("expected Integer id, got %s", id_obj->klass()->signature_name());
1109 }
1110 jint id = id_obj->int_field(java_lang_boxing_object::value_offset_in_bytes(T_INT));
1111
1112 address pc = _instructions->start() + pc_offset;
1113
1114 switch (id) {
|