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,
|