Mercurial > hg > truffle
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) { |