Mercurial > hg > truffle
comparison src/share/vm/runtime/deoptimization.cpp @ 1253:f70b0d9ab095
6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
Summary: Mark in PcDesc call sites which return oop and save the result oop across objects reallocation during deoptimization.
Reviewed-by: never
author | kvn |
---|---|
date | Tue, 09 Feb 2010 01:31:13 -0800 |
parents | 87684f1a88b5 |
children | e3a4305c6bc3 |
comparison
equal
deleted
inserted
replaced
1252:f516d5d7a019 | 1253:f70b0d9ab095 |
---|---|
143 // relock objects if synchronization on them was eliminated. | 143 // relock objects if synchronization on them was eliminated. |
144 if (DoEscapeAnalysis) { | 144 if (DoEscapeAnalysis) { |
145 if (EliminateAllocations) { | 145 if (EliminateAllocations) { |
146 assert (chunk->at(0)->scope() != NULL,"expect only compiled java frames"); | 146 assert (chunk->at(0)->scope() != NULL,"expect only compiled java frames"); |
147 GrowableArray<ScopeValue*>* objects = chunk->at(0)->scope()->objects(); | 147 GrowableArray<ScopeValue*>* objects = chunk->at(0)->scope()->objects(); |
148 | |
149 // The flag return_oop() indicates call sites which return oop | |
150 // in compiled code. Such sites include java method calls, | |
151 // runtime calls (for example, used to allocate new objects/arrays | |
152 // on slow code path) and any other calls generated in compiled code. | |
153 // It is not guaranteed that we can get such information here only | |
154 // by analyzing bytecode in deoptimized frames. This is why this flag | |
155 // is set during method compilation (see Compile::Process_OopMap_Node()). | |
156 bool save_oop_result = chunk->at(0)->scope()->return_oop(); | |
157 Handle return_value; | |
158 if (save_oop_result) { | |
159 // Reallocation may trigger GC. If deoptimization happened on return from | |
160 // call which returns oop we need to save it since it is not in oopmap. | |
161 oop result = deoptee.saved_oop_result(&map); | |
162 assert(result == NULL || result->is_oop(), "must be oop"); | |
163 return_value = Handle(thread, result); | |
164 assert(Universe::heap()->is_in_or_null(result), "must be heap pointer"); | |
165 if (TraceDeoptimization) { | |
166 tty->print_cr("SAVED OOP RESULT " INTPTR_FORMAT " in thread " INTPTR_FORMAT, result, thread); | |
167 } | |
168 } | |
148 bool reallocated = false; | 169 bool reallocated = false; |
149 if (objects != NULL) { | 170 if (objects != NULL) { |
150 JRT_BLOCK | 171 JRT_BLOCK |
151 reallocated = realloc_objects(thread, &deoptee, objects, THREAD); | 172 reallocated = realloc_objects(thread, &deoptee, objects, THREAD); |
152 JRT_END | 173 JRT_END |
156 #ifndef PRODUCT | 177 #ifndef PRODUCT |
157 if (TraceDeoptimization) { | 178 if (TraceDeoptimization) { |
158 ttyLocker ttyl; | 179 ttyLocker ttyl; |
159 tty->print_cr("REALLOC OBJECTS in thread " INTPTR_FORMAT, thread); | 180 tty->print_cr("REALLOC OBJECTS in thread " INTPTR_FORMAT, thread); |
160 print_objects(objects); | 181 print_objects(objects); |
161 } | 182 } |
162 #endif | 183 #endif |
184 } | |
185 if (save_oop_result) { | |
186 // Restore result. | |
187 deoptee.set_saved_oop_result(&map, return_value()); | |
163 } | 188 } |
164 } | 189 } |
165 if (EliminateLocks) { | 190 if (EliminateLocks) { |
166 #ifndef PRODUCT | 191 #ifndef PRODUCT |
167 bool first = true; | 192 bool first = true; |