comparison src/share/vm/c1x/c1x_Compiler.cpp @ 1941:79d04223b8a5

Added caching for resolved types and resolved fields. This is crucial, because the local load elimination will lead to wrong results, if field equality (of two RiField objects with the same object and the same RiType) is not given. The caching makes sure that the default equals implementation is sufficient.
author Thomas Wuerthinger <wuerthinger@ssw.jku.at>
date Tue, 28 Dec 2010 18:33:26 +0100
parents 48bbaead8b6c
children 00bc9eaf0e24
comparison
equal deleted inserted replaced
1940:e92a9a73324e 1941:79d04223b8a5
115 KlassHandle klass = (klassOop) type->get_oop(); 115 KlassHandle klass = (klassOop) type->get_oop();
116 Handle name = VmIds::toString<Handle>(klass->name(), THREAD); 116 Handle name = VmIds::toString<Handle>(klass->name(), THREAD);
117 return createHotSpotTypeResolved(klass, name, CHECK_NULL); 117 return createHotSpotTypeResolved(klass, name, CHECK_NULL);
118 } else { 118 } else {
119 symbolOop name = ((ciKlass *) type)->name()->get_symbolOop(); 119 symbolOop name = ((ciKlass *) type)->name()->get_symbolOop();
120 return VMExits::createRiTypeUnresolved(VmIds::toString<Handle>(name, THREAD), VmIds::add<klassOop>(accessor()), THREAD); 120 return VMExits::createRiTypeUnresolved(VmIds::toString<Handle>(name, THREAD), THREAD);
121 } 121 }
122 } 122 }
123 123
124 oop C1XCompiler::get_RiField(ciField *field, ciInstanceKlass* accessor_klass, KlassHandle accessor, Bytecodes::Code byteCode, TRAPS) { 124 oop C1XCompiler::get_RiField(ciField *field, ciInstanceKlass* accessor_klass, KlassHandle accessor, Bytecodes::Code byteCode, TRAPS) {
125 bool will_link = field->will_link_from_vm(accessor_klass, byteCode); 125 bool will_link = field->will_link_from_vm(accessor_klass, byteCode);
131 // TODO: implement caching 131 // TODO: implement caching
132 return VMExits::createRiField(field_holder, field_name, field_type, offset, THREAD); 132 return VMExits::createRiField(field_holder, field_name, field_type, offset, THREAD);
133 } 133 }
134 134
135 oop C1XCompiler::createHotSpotTypeResolved(KlassHandle klass, Handle name, TRAPS) { 135 oop C1XCompiler::createHotSpotTypeResolved(KlassHandle klass, Handle name, TRAPS) {
136 if (klass->c1x_mirror() != NULL) {
137 return klass->c1x_mirror();
138 }
139
136 instanceKlass::cast(HotSpotTypeResolved::klass())->initialize(CHECK_NULL); 140 instanceKlass::cast(HotSpotTypeResolved::klass())->initialize(CHECK_NULL);
137 oop obj = instanceKlass::cast(HotSpotTypeResolved::klass())->allocate_instance(CHECK_NULL); 141 oop obj = instanceKlass::cast(HotSpotTypeResolved::klass())->allocate_instance(CHECK_NULL);
138 142
139 HotSpotTypeResolved::set_vmId(obj, VmIds::add(klass, VmIds::CLASS));
140 HotSpotTypeResolved::set_javaMirror(obj, klass->java_mirror()); 143 HotSpotTypeResolved::set_javaMirror(obj, klass->java_mirror());
141 HotSpotTypeResolved::set_name(obj, name()); 144 HotSpotTypeResolved::set_name(obj, name());
142 HotSpotTypeResolved::set_accessFlags(obj, klass->access_flags().as_int()); 145 HotSpotTypeResolved::set_accessFlags(obj, klass->access_flags().as_int());
143 HotSpotTypeResolved::set_isInterface(obj, klass->is_interface()); 146 HotSpotTypeResolved::set_isInterface(obj, klass->is_interface());
144 HotSpotTypeResolved::set_isInstanceClass(obj, klass->oop_is_instance()); 147 HotSpotTypeResolved::set_isInstanceClass(obj, klass->oop_is_instance());
155 } 158 }
156 159
157 // TODO replace these with correct values 160 // TODO replace these with correct values
158 HotSpotTypeResolved::set_hasSubclass(obj, false); 161 HotSpotTypeResolved::set_hasSubclass(obj, false);
159 HotSpotTypeResolved::set_hasFinalizableSubclass(obj, false); 162 HotSpotTypeResolved::set_hasFinalizableSubclass(obj, false);
163
164 klass->set_c1x_mirror(obj);
160 165
161 return obj; 166 return obj;
162 } 167 }
163 168
164 BasicType C1XCompiler::kindToBasicType(jchar ch) { 169 BasicType C1XCompiler::kindToBasicType(jchar ch) {