Chromium Code Reviews| Index: src/ia32/assembler-ia32-inl.h |
| diff --git a/src/ia32/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h |
| index 0b47748d6b464556c0383d5ac6d2ca1bb3e3d672..e09703fbd820daf4afce44d877ff71a94fabfcb0 100644 |
| --- a/src/ia32/assembler-ia32-inl.h |
| +++ b/src/ia32/assembler-ia32-inl.h |
| @@ -45,6 +45,7 @@ |
| namespace v8 { |
| namespace internal { |
| +static const byte kCallOpcode = 0xE8; |
| // The modes possibly affected by apply must be in kApplyMask. |
| void RelocInfo::apply(intptr_t delta) { |
| @@ -52,6 +53,12 @@ void RelocInfo::apply(intptr_t delta) { |
| int32_t* p = reinterpret_cast<int32_t*>(pc_); |
| *p -= delta; // Relocate entry. |
| CPU::FlushICache(p, sizeof(uint32_t)); |
| + } else if (rmode_ == CODE_AGE_SEQUENCE) { |
| + if (*pc_ == kCallOpcode) { |
| + int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1); |
| + *p -= delta; // Relocate entry. |
| + CPU::FlushICache(p, sizeof(uint32_t)); |
| + } |
| } else if (rmode_ == JS_RETURN && IsPatchedReturnSequence()) { |
| // Special handling of js_return when a break point is set (call |
| // instruction has been inserted). |
| @@ -169,6 +176,21 @@ void RelocInfo::set_target_cell(JSGlobalPropertyCell* cell, |
| } |
| +Code* RelocInfo::code_age_stub() { |
|
Michael Starzinger
2012/09/21 09:43:19
ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
danno
2012/10/25 10:07:23
Done.
|
| + if (*pc_ == kCallOpcode) { |
| + return Code::GetCodeFromTargetAddress( |
| + Assembler::target_address_at(pc_ + 1)); |
| + } else { |
| + return NULL; |
| + } |
| +} |
| + |
| + |
| +void RelocInfo::set_code_age_stub(Code* stub) { |
|
Michael Starzinger
2012/09/21 09:43:19
ASSERT(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
danno
2012/10/25 10:07:23
Done.
|
| + Assembler::set_target_address_at(pc_ + 1, stub->instruction_start()); |
| +} |
| + |
| + |
| Address RelocInfo::call_address() { |
| ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || |
| (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); |
| @@ -206,7 +228,7 @@ Object** RelocInfo::call_object_address() { |
| bool RelocInfo::IsPatchedReturnSequence() { |
| - return *pc_ == 0xE8; |
| + return *pc_ == kCallOpcode; |
| } |
| @@ -227,7 +249,9 @@ void RelocInfo::Visit(ObjectVisitor* visitor) { |
| } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { |
| visitor->VisitExternalReference(this); |
| CPU::FlushICache(pc_, sizeof(Address)); |
| -#ifdef ENABLE_DEBUGGER_SUPPORT |
| + } else if (RelocInfo::IsCodeAgeSequence(mode)) { |
| + visitor->VisitCodeAgeSequence(this); |
| + #ifdef ENABLE_DEBUGGER_SUPPORT |
| // TODO(isolates): Get a cached isolate below. |
| } else if (((RelocInfo::IsJSReturn(mode) && |
| IsPatchedReturnSequence()) || |
| @@ -255,6 +279,8 @@ void RelocInfo::Visit(Heap* heap) { |
| } else if (mode == RelocInfo::EXTERNAL_REFERENCE) { |
| StaticVisitor::VisitExternalReference(this); |
| CPU::FlushICache(pc_, sizeof(Address)); |
| + } else if (RelocInfo::IsCodeAgeSequence(mode)) { |
| + StaticVisitor::VisitCodeAgeSequence(heap, this); |
| #ifdef ENABLE_DEBUGGER_SUPPORT |
| } else if (heap->isolate()->debug()->has_break_points() && |
| ((RelocInfo::IsJSReturn(mode) && |