Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(326)

Side by Side Diff: src/arm64/simulator-arm64.cc

Issue 1314623002: Make Simulator respect C stack limits as well. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Architecture ports.wq Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdlib.h> 5 #include <stdlib.h>
6 #include <cmath> 6 #include <cmath>
7 #include <cstdarg> 7 #include <cstdarg>
8 8
9 #if V8_TARGET_ARCH_ARM64 9 #if V8_TARGET_ARCH_ARM64
10 10
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 CallArgument(direct_call), 215 CallArgument(direct_call),
216 CallArgument(return_address), 216 CallArgument(return_address),
217 CallArgument(isolate), 217 CallArgument(isolate),
218 CallArgument::End() 218 CallArgument::End()
219 }; 219 };
220 return CallInt64(entry, args); 220 return CallInt64(entry, args);
221 } 221 }
222 222
223 223
224 void Simulator::CheckPCSComplianceAndRun() { 224 void Simulator::CheckPCSComplianceAndRun() {
225 // Adjust JS-based stack limit to C-based stack limit.
226 isolate_->stack_guard()->AdjustStackLimitForSimulator();
227
225 #ifdef DEBUG 228 #ifdef DEBUG
226 CHECK_EQ(kNumberOfCalleeSavedRegisters, kCalleeSaved.Count()); 229 CHECK_EQ(kNumberOfCalleeSavedRegisters, kCalleeSaved.Count());
227 CHECK_EQ(kNumberOfCalleeSavedFPRegisters, kCalleeSavedFP.Count()); 230 CHECK_EQ(kNumberOfCalleeSavedFPRegisters, kCalleeSavedFP.Count());
228 231
229 int64_t saved_registers[kNumberOfCalleeSavedRegisters]; 232 int64_t saved_registers[kNumberOfCalleeSavedRegisters];
230 uint64_t saved_fpregisters[kNumberOfCalleeSavedFPRegisters]; 233 uint64_t saved_fpregisters[kNumberOfCalleeSavedFPRegisters];
231 234
232 CPURegList register_list = kCalleeSaved; 235 CPURegList register_list = kCalleeSaved;
233 CPURegList fpregister_list = kCalleeSavedFP; 236 CPURegList fpregister_list = kCalleeSavedFP;
234 237
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 intptr_t current_sp = sp(); 328 intptr_t current_sp = sp();
326 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp); 329 uintptr_t* stack_slot = reinterpret_cast<uintptr_t*>(current_sp);
327 uintptr_t address = *stack_slot; 330 uintptr_t address = *stack_slot;
328 DCHECK(sizeof(uintptr_t) < 2 * kXRegSize); 331 DCHECK(sizeof(uintptr_t) < 2 * kXRegSize);
329 set_sp(current_sp + 2 * kXRegSize); 332 set_sp(current_sp + 2 * kXRegSize);
330 return address; 333 return address;
331 } 334 }
332 335
333 336
334 // Returns the limit of the stack area to enable checking for stack overflows. 337 // Returns the limit of the stack area to enable checking for stack overflows.
335 uintptr_t Simulator::StackLimit() const { 338 uintptr_t Simulator::StackLimit(uintptr_t c_limit) const {
336 // Leave a safety margin of 1024 bytes to prevent overrunning the stack when 339 // The simulator uses a separate JS stack. If we have exhausted the C stack,
337 // pushing values. 340 // we also drop down the JS limit to reflect the exhaustion on the JS stack.
341 if (GetCurrentStackPosition() < c_limit) {
342 return reinterpret_cast<uintptr_t>(get_sp());
343 }
344
345 // Otherwise the limit is the JS stack. Leave a safety margin of 1024 bytes
346 // to prevent overrunning the stack when pushing values.
338 return stack_limit_ + 1024; 347 return stack_limit_ + 1024;
339 } 348 }
340 349
341 350
342 Simulator::Simulator(Decoder<DispatchingDecoderVisitor>* decoder, 351 Simulator::Simulator(Decoder<DispatchingDecoderVisitor>* decoder,
343 Isolate* isolate, FILE* stream) 352 Isolate* isolate, FILE* stream)
344 : decoder_(decoder), 353 : decoder_(decoder),
345 last_debugger_input_(NULL), 354 last_debugger_input_(NULL),
346 log_parameters_(NO_PARAM), 355 log_parameters_(NO_PARAM),
347 isolate_(isolate) { 356 isolate_(isolate) {
(...skipping 3480 matching lines...) Expand 10 before | Expand all | Expand 10 after
3828 delete[] format; 3837 delete[] format;
3829 } 3838 }
3830 3839
3831 3840
3832 #endif // USE_SIMULATOR 3841 #endif // USE_SIMULATOR
3833 3842
3834 } // namespace internal 3843 } // namespace internal
3835 } // namespace v8 3844 } // namespace v8
3836 3845
3837 #endif // V8_TARGET_ARCH_ARM64 3846 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« src/arm/simulator-arm.h ('K') | « src/arm64/simulator-arm64.h ('k') | src/execution.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698