src/share/vm/shark/sharkStack.cpp

Print this page
rev 3810 : [mq]: shark.patch


  58     PointerType::getUnqual(
  59       ArrayType::get(SharkType::intptr_type(), extended_frame_size())),
  60     "frame");
  61   int offset = 0;
  62 
  63   // Expression stack
  64   _stack_slots_offset = offset;
  65   offset += stack_words;
  66 
  67   // Monitors
  68   _monitors_slots_offset = offset;
  69   offset += monitor_words;
  70 
  71   // Temporary oop slot
  72   _oop_tmp_slot_offset = offset++;
  73 
  74   // Method pointer
  75   _method_slot_offset = offset++;
  76   if (setup_sp_and_method) {
  77     builder()->CreateStore(
  78       method, slot_addr(method_slot_offset(), SharkType::Method*_type()));
  79   }
  80 
  81   // Unextended SP
  82   builder()->CreateStore(stack_pointer, slot_addr(offset++));
  83 
  84   // PC
  85   _pc_slot_offset = offset++;
  86 
  87   // Frame header
  88   builder()->CreateStore(
  89     LLVMValue::intptr_constant(ZeroFrame::SHARK_FRAME), slot_addr(offset++));
  90   Value *fp = slot_addr(offset++);
  91 
  92   // Local variables
  93   _locals_slots_offset = offset;
  94   offset += locals_words;
  95 
  96   // Push the frame
  97   assert(offset == extended_frame_size(), "should do");
  98   builder()->CreateStore(CreateLoadFramePointer(), fp);


 146 
 147 Value* SharkStack::CreatePopFrame(int result_slots) {
 148   assert(result_slots >= 0 && result_slots <= 2, "should be");
 149   int locals_to_pop = max_locals() - result_slots;
 150 
 151   Value *fp = CreateLoadFramePointer();
 152   Value *sp = builder()->CreateAdd(
 153     fp,
 154     LLVMValue::intptr_constant((1 + locals_to_pop) * wordSize));
 155 
 156   CreateStoreStackPointer(sp);
 157   CreateStoreFramePointer(
 158     builder()->CreateLoad(
 159       builder()->CreateIntToPtr(
 160         fp, PointerType::getUnqual(SharkType::intptr_type()))));
 161 
 162   return sp;
 163 }
 164 
 165 Value* SharkStack::slot_addr(int         offset,
 166                              const Type* type,
 167                              const char* name) const {
 168   bool needs_cast = type && type != SharkType::intptr_type();
 169 
 170   Value* result = builder()->CreateStructGEP(
 171     _frame, offset, needs_cast ? "" : name);
 172 
 173   if (needs_cast) {
 174     result = builder()->CreateBitCast(
 175       result, PointerType::getUnqual(type), name);
 176   }
 177   return result;
 178 }
 179 
 180 // The bits that differentiate stacks with normal and native frames on top
 181 
 182 SharkStack* SharkStack::CreateBuildAndPushFrame(SharkFunction* function,
 183                                                 Value*         method) {
 184   return new SharkStackWithNormalFrame(function, method);
 185 }
 186 SharkStack* SharkStack::CreateBuildAndPushFrame(SharkNativeWrapper* wrapper,




  58     PointerType::getUnqual(
  59       ArrayType::get(SharkType::intptr_type(), extended_frame_size())),
  60     "frame");
  61   int offset = 0;
  62 
  63   // Expression stack
  64   _stack_slots_offset = offset;
  65   offset += stack_words;
  66 
  67   // Monitors
  68   _monitors_slots_offset = offset;
  69   offset += monitor_words;
  70 
  71   // Temporary oop slot
  72   _oop_tmp_slot_offset = offset++;
  73 
  74   // Method pointer
  75   _method_slot_offset = offset++;
  76   if (setup_sp_and_method) {
  77     builder()->CreateStore(
  78       method, slot_addr(method_slot_offset(), SharkType::Method_type()));
  79   }
  80 
  81   // Unextended SP
  82   builder()->CreateStore(stack_pointer, slot_addr(offset++));
  83 
  84   // PC
  85   _pc_slot_offset = offset++;
  86 
  87   // Frame header
  88   builder()->CreateStore(
  89     LLVMValue::intptr_constant(ZeroFrame::SHARK_FRAME), slot_addr(offset++));
  90   Value *fp = slot_addr(offset++);
  91 
  92   // Local variables
  93   _locals_slots_offset = offset;
  94   offset += locals_words;
  95 
  96   // Push the frame
  97   assert(offset == extended_frame_size(), "should do");
  98   builder()->CreateStore(CreateLoadFramePointer(), fp);


 146 
 147 Value* SharkStack::CreatePopFrame(int result_slots) {
 148   assert(result_slots >= 0 && result_slots <= 2, "should be");
 149   int locals_to_pop = max_locals() - result_slots;
 150 
 151   Value *fp = CreateLoadFramePointer();
 152   Value *sp = builder()->CreateAdd(
 153     fp,
 154     LLVMValue::intptr_constant((1 + locals_to_pop) * wordSize));
 155 
 156   CreateStoreStackPointer(sp);
 157   CreateStoreFramePointer(
 158     builder()->CreateLoad(
 159       builder()->CreateIntToPtr(
 160         fp, PointerType::getUnqual(SharkType::intptr_type()))));
 161 
 162   return sp;
 163 }
 164 
 165 Value* SharkStack::slot_addr(int         offset,
 166                              Type* type,
 167                              const char* name) const {
 168   bool needs_cast = type && type != SharkType::intptr_type();
 169 
 170   Value* result = builder()->CreateStructGEP(
 171     _frame, offset, needs_cast ? "" : name);
 172 
 173   if (needs_cast) {
 174     result = builder()->CreateBitCast(
 175       result, PointerType::getUnqual(type), name);
 176   }
 177   return result;
 178 }
 179 
 180 // The bits that differentiate stacks with normal and native frames on top
 181 
 182 SharkStack* SharkStack::CreateBuildAndPushFrame(SharkFunction* function,
 183                                                 Value*         method) {
 184   return new SharkStackWithNormalFrame(function, method);
 185 }
 186 SharkStack* SharkStack::CreateBuildAndPushFrame(SharkNativeWrapper* wrapper,