6216
6217 //----------------------------inline_reference_get----------------------------
6218 // public T java.lang.ref.Reference.get();
6219 bool LibraryCallKit::inline_reference_get() {
6220 const int referent_offset = java_lang_ref_Reference::referent_offset;
6221 guarantee(referent_offset > 0, "should have already been set");
6222
6223 // Get the argument:
6224 Node* reference_obj = null_check_receiver();
6225 if (stopped()) return true;
6226
6227 Node* adr = basic_plus_adr(reference_obj, reference_obj, referent_offset);
6228
6229 ciInstanceKlass* klass = env()->Object_klass();
6230 const TypeOopPtr* object_type = TypeOopPtr::make_from_klass(klass);
6231
6232 Node* no_ctrl = NULL;
6233 Node* result = make_load(no_ctrl, adr, object_type, T_OBJECT, MemNode::unordered);
6234
6235 // Use the pre-barrier to record the value in the referent field
6236 pre_barrier(false /* do_load */,
6237 control(),
6238 NULL /* obj */, NULL /* adr */, max_juint /* alias_idx */, NULL /* val */, NULL /* val_type */,
6239 result /* pre_val */,
6240 T_OBJECT);
6241
6242 // Add memory barrier to prevent commoning reads from this field
6243 // across safepoint since GC can change its value.
6244 insert_mem_bar(Op_MemBarCPUOrder);
6245
6246 set_result(result);
6247 return true;
6248 }
6249
6250
6251 Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString,
6252 bool is_exact=true, bool is_static=false,
6253 ciInstanceKlass * fromKls=NULL) {
6254 if (fromKls == NULL) {
6255 const TypeInstPtr* tinst = _gvn.type(fromObj)->isa_instptr();
6256 assert(tinst != NULL, "obj is null");
6257 assert(tinst->klass()->is_loaded(), "obj is not loaded");
6258 assert(!is_exact || tinst->klass_is_exact(), "klass not exact");
6259 fromKls = tinst->klass()->as_instance_klass();
6260 } else {
|
6216
6217 //----------------------------inline_reference_get----------------------------
6218 // public T java.lang.ref.Reference.get();
6219 bool LibraryCallKit::inline_reference_get() {
6220 const int referent_offset = java_lang_ref_Reference::referent_offset;
6221 guarantee(referent_offset > 0, "should have already been set");
6222
6223 // Get the argument:
6224 Node* reference_obj = null_check_receiver();
6225 if (stopped()) return true;
6226
6227 Node* adr = basic_plus_adr(reference_obj, reference_obj, referent_offset);
6228
6229 ciInstanceKlass* klass = env()->Object_klass();
6230 const TypeOopPtr* object_type = TypeOopPtr::make_from_klass(klass);
6231
6232 Node* no_ctrl = NULL;
6233 Node* result = make_load(no_ctrl, adr, object_type, T_OBJECT, MemNode::unordered);
6234
6235 // Use the pre-barrier to record the value in the referent field
6236 keep_alive_barrier(control(), result);
6237
6238 // Add memory barrier to prevent commoning reads from this field
6239 // across safepoint since GC can change its value.
6240 insert_mem_bar(Op_MemBarCPUOrder);
6241
6242 set_result(result);
6243 return true;
6244 }
6245
6246
6247 Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString,
6248 bool is_exact=true, bool is_static=false,
6249 ciInstanceKlass * fromKls=NULL) {
6250 if (fromKls == NULL) {
6251 const TypeInstPtr* tinst = _gvn.type(fromObj)->isa_instptr();
6252 assert(tinst != NULL, "obj is null");
6253 assert(tinst->klass()->is_loaded(), "obj is not loaded");
6254 assert(!is_exact || tinst->klass_is_exact(), "klass not exact");
6255 fromKls = tinst->klass()->as_instance_klass();
6256 } else {
|