diff options
| author | 2014-07-23 12:57:19 +0100 | |
|---|---|---|
| committer | 2014-07-23 13:25:02 +0100 | |
| commit | 397f2e42beadb77d98e550bd1b25b9b61237c943 (patch) | |
| tree | ee0e494787153e58adb72249adb616863a2cf3c4 | |
| parent | d83d1a7edf07c33336935faff918424b23247320 (diff) | |
Fix implicit stack overflow check on optimizing/x86.
They need to happen before changing ESP, and require a suspend point.
Change-Id: Id41aa9c99714f7ab8591367ea5cb9ca105b17ce8
| -rw-r--r-- | compiler/optimizing/code_generator_x86.cc | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index f1eb3726f0..251a2adf61 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -202,20 +202,21 @@ void CodeGeneratorX86::GenerateFrameEntry() { static const int kFakeReturnRegister = 8; core_spill_mask_ |= (1 << kFakeReturnRegister); + bool skip_overflow_check = IsLeafMethod() && !IsLargeFrame(GetFrameSize(), InstructionSet::kX86); + if (!skip_overflow_check && !kExplicitStackOverflowCheck) { + __ testl(EAX, Address(ESP, -static_cast<int32_t>(GetStackOverflowReservedBytes(kX86)))); + RecordPcInfo(0); + } + // The return PC has already been pushed on the stack. __ subl(ESP, Immediate(GetFrameSize() - kNumberOfPushedRegistersAtEntry * kX86WordSize)); - bool skip_overflow_check = IsLeafMethod() && !IsLargeFrame(GetFrameSize(), InstructionSet::kX86); - if (!skip_overflow_check) { - if (kExplicitStackOverflowCheck) { - SlowPathCode* slow_path = new (GetGraph()->GetArena()) StackOverflowCheckSlowPathX86(); - AddSlowPath(slow_path); + if (!skip_overflow_check && kExplicitStackOverflowCheck) { + SlowPathCode* slow_path = new (GetGraph()->GetArena()) StackOverflowCheckSlowPathX86(); + AddSlowPath(slow_path); - __ fs()->cmpl(ESP, Address::Absolute(Thread::StackEndOffset<kX86WordSize>())); - __ j(kLess, slow_path->GetEntryLabel()); - } else { - __ testl(EAX, Address(ESP, -static_cast<int32_t>(GetStackOverflowReservedBytes(kX86)))); - } + __ fs()->cmpl(ESP, Address::Absolute(Thread::StackEndOffset<kX86WordSize>())); + __ j(kLess, slow_path->GetEntryLabel()); } __ movl(Address(ESP, kCurrentMethodStackOffset), EAX); |