comparison src/share/vm/graal/graalCodeInstaller.cpp @ 4174:79c91d220d73

Use callee save area to model the saved rbp register. Remove various hacks that added the saved area size in native code.
author Christian Wimmer <Christian.Wimmer@Oracle.com>
date Thu, 29 Dec 2011 16:07:35 -0800
parents 4177ddd2d1d1
children 319860ae697a
comparison
equal deleted inserted replaced
4173:15b9402dc018 4174:79c91d220d73
66 return (word & (1LL << (i % MapWordBits))) != 0; 66 return (word & (1LL << (i % MapWordBits))) != 0;
67 } 67 }
68 } 68 }
69 69
70 // creates a hotspot oop map out of the byte arrays provided by CiDebugInfo 70 // creates a hotspot oop map out of the byte arrays provided by CiDebugInfo
71 static OopMap* create_oop_map(jint frame_size, jint parameter_count, oop debug_info) { 71 static OopMap* create_oop_map(jint total_frame_size, jint parameter_count, oop debug_info) {
72 OopMap* map = new OopMap(frame_size, parameter_count); 72 OopMap* map = new OopMap(total_frame_size, parameter_count);
73 oop register_map = (oop) CiDebugInfo::registerRefMap(debug_info); 73 oop register_map = (oop) CiDebugInfo::registerRefMap(debug_info);
74 oop frame_map = (oop) CiDebugInfo::frameRefMap(debug_info); 74 oop frame_map = (oop) CiDebugInfo::frameRefMap(debug_info);
75 75
76 if (register_map != NULL) { 76 if (register_map != NULL) {
77 assert(GraalBitMap::size(register_map) == (unsigned) NUM_CPU_REGS, "unexpected register_map length"); 77 assert(GraalBitMap::size(register_map) == (unsigned) NUM_CPU_REGS, "unexpected register_map length");
85 map->set_value(reg); 85 map->set_value(reg);
86 } 86 }
87 } 87 }
88 } 88 }
89 89
90 if (frame_size > 0) { 90 for (jint i = 0; i < GraalBitMap::size(frame_map); i++) {
91 assert(GraalBitMap::size(frame_map) == frame_size / HeapWordSize, "unexpected frame_map length"); 91 bool is_oop = is_bit_set(frame_map, i);
92 92 // hotspot stack slots are 4 bytes
93 for (jint i = 0; i < frame_size / HeapWordSize; i++) { 93 VMReg reg = VMRegImpl::stack2reg(i * 2);
94 bool is_oop = is_bit_set(frame_map, i); 94 if (is_oop) {
95 // hotspot stack slots are 4 bytes 95 map->set_oop(reg);
96 VMReg reg = VMRegImpl::stack2reg(i * 2); 96 } else {
97 if (is_oop) { 97 map->set_value(reg);
98 map->set_oop(reg); 98 }
99 } else {
100 map->set_value(reg);
101 }
102 }
103 } else {
104 assert(frame_map == NULL || GraalBitMap::size(frame_map) == 0, "cannot have frame_map for frames with size 0");
105 } 99 }
106 100
107 return map; 101 return map;
108 } 102 }
109 103
110 // TODO: finish this - graal doesn't provide any scope values at the moment 104 // TODO: finish this - graal doesn't provide any scope values at the moment
111 static ScopeValue* get_hotspot_value(oop value, int frame_size, GrowableArray<ScopeValue*>* objects, ScopeValue* &second) { 105 static ScopeValue* get_hotspot_value(oop value, int total_frame_size, GrowableArray<ScopeValue*>* objects, ScopeValue* &second) {
112 second = NULL; 106 second = NULL;
113 if (value == CiValue::IllegalValue()) { 107 if (value == CiValue::IllegalValue()) {
114 return new LocationValue(Location::new_stk_loc(Location::invalid, 0)); 108 return new LocationValue(Location::new_stk_loc(Location::invalid, 0));
115 } 109 }
116 110
156 jint index = CiStackSlot::index(value); 150 jint index = CiStackSlot::index(value);
157 ScopeValue* value; 151 ScopeValue* value;
158 if (index >= 0) { 152 if (index >= 0) {
159 value = new LocationValue(Location::new_stk_loc(locationType, index * HeapWordSize)); 153 value = new LocationValue(Location::new_stk_loc(locationType, index * HeapWordSize));
160 } else { 154 } else {
161 value = new LocationValue(Location::new_stk_loc(locationType, -(index * HeapWordSize) + frame_size)); 155 value = new LocationValue(Location::new_stk_loc(locationType, -((index + 1) * HeapWordSize) + total_frame_size));
162 } 156 }
163 if (type == T_DOUBLE || type == T_LONG) { 157 if (type == T_DOUBLE || type == T_LONG) {
164 second = value; 158 second = value;
165 } 159 }
166 return value; 160 return value;
202 ((oop*) values->base(T_OBJECT))[i]; 196 ((oop*) values->base(T_OBJECT))[i];
203 } 197 }
204 198
205 for (jint i = 0; i < values->length(); i++) { 199 for (jint i = 0; i < values->length(); i++) {
206 ScopeValue* cur_second = NULL; 200 ScopeValue* cur_second = NULL;
207 ScopeValue* value = get_hotspot_value(((oop*) values->base(T_OBJECT))[i], frame_size, objects, cur_second); 201 ScopeValue* value = get_hotspot_value(((oop*) values->base(T_OBJECT))[i], total_frame_size, objects, cur_second);
208 202
209 if (cur_second != NULL) { 203 if (cur_second != NULL) {
210 sv->field_values()->append(cur_second); 204 sv->field_values()->append(cur_second);
211 } 205 }
212 sv->field_values()->append(value); 206 sv->field_values()->append(value);
219 } 213 }
220 ShouldNotReachHere(); 214 ShouldNotReachHere();
221 return NULL; 215 return NULL;
222 } 216 }
223 217
224 static MonitorValue* get_monitor_value(oop value, int frame_size, GrowableArray<ScopeValue*>* objects) { 218 static MonitorValue* get_monitor_value(oop value, int total_frame_size, GrowableArray<ScopeValue*>* objects) {
225 guarantee(value->is_a(CiMonitorValue::klass()), "Monitors must be of type CiMonitorValue"); 219 guarantee(value->is_a(CiMonitorValue::klass()), "Monitors must be of type CiMonitorValue");
226 220
227 ScopeValue* second = NULL; 221 ScopeValue* second = NULL;
228 ScopeValue* owner_value = get_hotspot_value(CiMonitorValue::owner(value), frame_size, objects, second); 222 ScopeValue* owner_value = get_hotspot_value(CiMonitorValue::owner(value), total_frame_size, objects, second);
229 assert(second == NULL, "monitor cannot occupy two stack slots"); 223 assert(second == NULL, "monitor cannot occupy two stack slots");
230 224
231 ScopeValue* lock_data_value = get_hotspot_value(CiMonitorValue::lockData(value), frame_size, objects, second); 225 ScopeValue* lock_data_value = get_hotspot_value(CiMonitorValue::lockData(value), total_frame_size, objects, second);
232 assert(second == NULL, "monitor cannot occupy two stack slots"); 226 assert(second == lock_data_value, "monitor is LONG value that occupies two stack slots");
233 assert(lock_data_value->is_location(), "invalid monitor location"); 227 assert(lock_data_value->is_location(), "invalid monitor location");
234 Location lock_data_loc = ((LocationValue*)lock_data_value)->location(); 228 Location lock_data_loc = ((LocationValue*)lock_data_value)->location();
235 229
236 bool eliminated = false; 230 bool eliminated = false;
237 if (CiMonitorValue::eliminated(value)) { 231 if (CiMonitorValue::eliminated(value)) {
279 initialize_fields(JNIHandles::resolve(target_method_obj)); 273 initialize_fields(JNIHandles::resolve(target_method_obj));
280 initialize_buffer(buffer); 274 initialize_buffer(buffer);
281 process_exception_handlers(); 275 process_exception_handlers();
282 } 276 }
283 277
284 int stack_slots = (_frame_size / HeapWordSize) + 2; // conversion to words, need to add two slots for ret address and frame pointer 278 int stack_slots = _total_frame_size / HeapWordSize; // conversion to words
285 methodHandle method = getMethodFromHotSpotMethod(HotSpotTargetMethod::method(JNIHandles::resolve(target_method_obj))); 279 methodHandle method = getMethodFromHotSpotMethod(HotSpotTargetMethod::method(JNIHandles::resolve(target_method_obj)));
286 { 280 {
287 nm = GraalEnv::register_method(method, -1, &_offsets, _custom_stack_area_offset, &buffer, stack_slots, _debug_recorder->_oopmaps, &_exception_handler_table, 281 nm = GraalEnv::register_method(method, -1, &_offsets, _custom_stack_area_offset, &buffer, stack_slots, _debug_recorder->_oopmaps, &_exception_handler_table,
288 &_implicit_exception_table, GraalCompiler::instance(), _debug_recorder, _dependencies, NULL, -1, true, false, install_code); 282 &_implicit_exception_table, GraalCompiler::instance(), _debug_recorder, _dependencies, NULL, -1, true, false, install_code);
289 } 283 }
321 _sites = (arrayOop) HotSpotTargetMethod::sites(target_method); 315 _sites = (arrayOop) HotSpotTargetMethod::sites(target_method);
322 _exception_handlers = (arrayOop) HotSpotTargetMethod::exceptionHandlers(target_method); 316 _exception_handlers = (arrayOop) HotSpotTargetMethod::exceptionHandlers(target_method);
323 317
324 _code = (arrayOop) CiTargetMethod::targetCode(_citarget_method); 318 _code = (arrayOop) CiTargetMethod::targetCode(_citarget_method);
325 _code_size = CiTargetMethod::targetCodeSize(_citarget_method); 319 _code_size = CiTargetMethod::targetCodeSize(_citarget_method);
326 _frame_size = CiTargetMethod::frameSize(_citarget_method); 320 // The frame size we get from the target method does not include the return address, so add one word for it here.
321 _total_frame_size = CiTargetMethod::frameSize(_citarget_method) + HeapWordSize;
327 _custom_stack_area_offset = CiTargetMethod::customStackAreaOffset(_citarget_method); 322 _custom_stack_area_offset = CiTargetMethod::customStackAreaOffset(_citarget_method);
328 323
329 324
330 // (very) conservative estimate: each site needs a constant section entry 325 // (very) conservative estimate: each site needs a constant section entry
331 _constants_size = _sites->length() * (BytesPerLong*2); 326 _constants_size = _sites->length() * (BytesPerLong*2);
509 for (jint i = 0; i < values->length(); i++) { 504 for (jint i = 0; i < values->length(); i++) {
510 ScopeValue* second = NULL; 505 ScopeValue* second = NULL;
511 oop value = ((oop*) values->base(T_OBJECT))[i]; 506 oop value = ((oop*) values->base(T_OBJECT))[i];
512 507
513 if (i < local_count) { 508 if (i < local_count) {
514 ScopeValue* first = get_hotspot_value(value, _frame_size, objects, second); 509 ScopeValue* first = get_hotspot_value(value, _total_frame_size, objects, second);
515 if (second != NULL) { 510 if (second != NULL) {
516 locals->append(second); 511 locals->append(second);
517 } 512 }
518 locals->append(first); 513 locals->append(first);
519 } else if (i < local_count + expression_count) { 514 } else if (i < local_count + expression_count) {
520 ScopeValue* first = get_hotspot_value(value, _frame_size, objects, second); 515 ScopeValue* first = get_hotspot_value(value, _total_frame_size, objects, second);
521 if (second != NULL) { 516 if (second != NULL) {
522 expressions->append(second); 517 expressions->append(second);
523 } 518 }
524 expressions->append(first); 519 expressions->append(first);
525 } else { 520 } else {
526 monitors->append(get_monitor_value(value, _frame_size, objects)); 521 monitors->append(get_monitor_value(value, _total_frame_size, objects));
527 } 522 }
528 if (second != NULL) { 523 if (second != NULL) {
529 i++; 524 i++;
530 assert(i < values->length(), "double-slot value not followed by CiValue.IllegalValue"); 525 assert(i < values->length(), "double-slot value not followed by CiValue.IllegalValue");
531 assert(((oop*) values->base(T_OBJECT))[i] == CiValue::IllegalValue(), "double-slot value not followed by CiValue.IllegalValue"); 526 assert(((oop*) values->base(T_OBJECT))[i] == CiValue::IllegalValue(), "double-slot value not followed by CiValue.IllegalValue");
553 oop debug_info = CiTargetMethod_Safepoint::debugInfo(site); 548 oop debug_info = CiTargetMethod_Safepoint::debugInfo(site);
554 assert(debug_info != NULL, "debug info expected"); 549 assert(debug_info != NULL, "debug info expected");
555 550
556 // address instruction = _instructions->start() + pc_offset; 551 // address instruction = _instructions->start() + pc_offset;
557 // jint next_pc_offset = Assembler::locate_next_instruction(instruction) - _instructions->start(); 552 // jint next_pc_offset = Assembler::locate_next_instruction(instruction) - _instructions->start();
558 _debug_recorder->add_safepoint(pc_offset, create_oop_map(_frame_size, _parameter_count, debug_info)); 553 _debug_recorder->add_safepoint(pc_offset, create_oop_map(_total_frame_size, _parameter_count, debug_info));
559 554
560 oop code_pos = CiDebugInfo::codePos(debug_info); 555 oop code_pos = CiDebugInfo::codePos(debug_info);
561 record_scope(pc_offset, code_pos, new GrowableArray<ScopeValue*>()); 556 record_scope(pc_offset, code_pos, new GrowableArray<ScopeValue*>());
562 557
563 _debug_recorder->end_safepoint(pc_offset); 558 _debug_recorder->end_safepoint(pc_offset);
664 659
665 return; 660 return;
666 } 661 }
667 662
668 if (debug_info != NULL) { 663 if (debug_info != NULL) {
669 _debug_recorder->add_safepoint(next_pc_offset, create_oop_map(_frame_size, _parameter_count, debug_info)); 664 _debug_recorder->add_safepoint(next_pc_offset, create_oop_map(_total_frame_size, _parameter_count, debug_info));
670 oop code_pos = CiDebugInfo::codePos(debug_info); 665 oop code_pos = CiDebugInfo::codePos(debug_info);
671 record_scope(next_pc_offset, code_pos, new GrowableArray<ScopeValue*>()); 666 record_scope(next_pc_offset, code_pos, new GrowableArray<ScopeValue*>());
672 } 667 }
673 668
674 if (runtime_call != NULL) { 669 if (runtime_call != NULL) {