Mercurial > hg > graal-compiler
comparison src/cpu/x86/vm/templateTable_x86_64.cpp @ 1047:beb8f45ee9f0
6889740: G1: OpenDS fails with "unhandled exception in compiled code"
Summary: Incorrect code was being generated for the store operation in the null case of the aastore bytecode template. The bad code was generated by the store_heap_oop routine which takes a Register as its second argument. Passing NULL_WORD (0) as the second argument causes the value to be converted to Register(0), which is rax. Thus the generated store was "mov (dst), $rax" instead of "mov (dst), $0x0". Changed calls to store_heap_oop that pass NULL_WORD as the second argument to a new routine store_heap_oop_null.
Reviewed-by: kvn, twisti
author | johnc |
---|---|
date | Thu, 29 Oct 2009 09:42:26 -0700 |
parents | bd02caa94611 |
children | 85f13cdfbc1d |
comparison
equal
deleted
inserted
replaced
1046:72a6752ac432 | 1047:beb8f45ee9f0 |
---|---|
137 } else { | 137 } else { |
138 __ leaq(rdx, obj); | 138 __ leaq(rdx, obj); |
139 } | 139 } |
140 __ g1_write_barrier_pre(rdx, r8, rbx, val != noreg); | 140 __ g1_write_barrier_pre(rdx, r8, rbx, val != noreg); |
141 if (val == noreg) { | 141 if (val == noreg) { |
142 __ store_heap_oop(Address(rdx, 0), NULL_WORD); | 142 __ store_heap_oop_null(Address(rdx, 0)); |
143 } else { | 143 } else { |
144 __ store_heap_oop(Address(rdx, 0), val); | 144 __ store_heap_oop(Address(rdx, 0), val); |
145 __ g1_write_barrier_post(rdx, val, r8, rbx); | 145 __ g1_write_barrier_post(rdx, val, r8, rbx); |
146 } | 146 } |
147 | 147 |
150 #endif // SERIALGC | 150 #endif // SERIALGC |
151 case BarrierSet::CardTableModRef: | 151 case BarrierSet::CardTableModRef: |
152 case BarrierSet::CardTableExtension: | 152 case BarrierSet::CardTableExtension: |
153 { | 153 { |
154 if (val == noreg) { | 154 if (val == noreg) { |
155 __ store_heap_oop(obj, NULL_WORD); | 155 __ store_heap_oop_null(obj); |
156 } else { | 156 } else { |
157 __ store_heap_oop(obj, val); | 157 __ store_heap_oop(obj, val); |
158 // flatten object address if needed | 158 // flatten object address if needed |
159 if (!precise || (obj.index() == noreg && obj.disp() == 0)) { | 159 if (!precise || (obj.index() == noreg && obj.disp() == 0)) { |
160 __ store_check(obj.base()); | 160 __ store_check(obj.base()); |
166 } | 166 } |
167 break; | 167 break; |
168 case BarrierSet::ModRef: | 168 case BarrierSet::ModRef: |
169 case BarrierSet::Other: | 169 case BarrierSet::Other: |
170 if (val == noreg) { | 170 if (val == noreg) { |
171 __ store_heap_oop(obj, NULL_WORD); | 171 __ store_heap_oop_null(obj); |
172 } else { | 172 } else { |
173 __ store_heap_oop(obj, val); | 173 __ store_heap_oop(obj, val); |
174 } | 174 } |
175 break; | 175 break; |
176 default : | 176 default : |