From 19badfdda59240769c7c4f6de119101b940659fd Mon Sep 17 00:00:00 2001 From: "danno@chromium.org" Date: Mon, 11 Mar 2013 14:09:21 +0000 Subject: [PATCH] Revert r13901 to reland with proper credit to external contributor. TBR=svenpanne@chromium.org Review URL: https://codereview.chromium.org/12638011 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13902 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/assembler-arm-inl.h | 13 ---------- src/assembler.h | 7 ----- src/ia32/assembler-ia32-inl.h | 25 +++++------------- src/ia32/assembler-ia32.cc | 23 +++++------------ src/mips/assembler-mips-inl.h | 13 ---------- src/objects.cc | 7 +---- src/spaces.h | 4 --- src/x64/assembler-x64-inl.h | 58 +++++++++++++++--------------------------- src/x64/assembler-x64.cc | 30 ---------------------- src/x64/assembler-x64.h | 5 ---- src/x64/lithium-codegen-x64.cc | 8 +++--- 11 files changed, 38 insertions(+), 155 deletions(-) diff --git a/src/arm/assembler-arm-inl.h b/src/arm/assembler-arm-inl.h index 85a523d..af29bb8 100644 --- a/src/arm/assembler-arm-inl.h +++ b/src/arm/assembler-arm-inl.h @@ -178,19 +178,6 @@ Address* RelocInfo::target_reference_address() { } -Address RelocInfo::target_runtime_entry(Assembler* origin) { - ASSERT(IsRuntimeEntry(rmode_)); - return target_address(); -} - - -void RelocInfo::set_target_runtime_entry(Address target, - WriteBarrierMode mode) { - ASSERT(IsRuntimeEntry(rmode_)); - if (target_address() != target) set_target_address(target, mode); -} - - Handle RelocInfo::target_cell_handle() { ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); Address address = Memory::Address_at(pc_); diff --git a/src/assembler.h b/src/assembler.h index f5ae611..0fee67a 100644 --- a/src/assembler.h +++ b/src/assembler.h @@ -316,9 +316,6 @@ class RelocInfo BASE_EMBEDDED { static inline bool IsEmbeddedObject(Mode mode) { return mode == EMBEDDED_OBJECT; } - static inline bool IsRuntimeEntry(Mode mode) { - return mode == RUNTIME_ENTRY; - } // Is the relocation mode affected by GC? static inline bool IsGCRelocMode(Mode mode) { return mode <= LAST_GCED_ENUM; @@ -382,10 +379,6 @@ class RelocInfo BASE_EMBEDDED { INLINE(Object** target_object_address()); INLINE(void set_target_object(Object* target, WriteBarrierMode mode = UPDATE_WRITE_BARRIER)); - INLINE(Address target_runtime_entry(Assembler* origin)); - INLINE(void set_target_runtime_entry(Address target, - WriteBarrierMode mode = - UPDATE_WRITE_BARRIER)); INLINE(JSGlobalPropertyCell* target_cell()); INLINE(Handle target_cell_handle()); INLINE(void set_target_cell(JSGlobalPropertyCell* cell, diff --git a/src/ia32/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h index fbe2f24..56d88b0 100644 --- a/src/ia32/assembler-ia32-inl.h +++ b/src/ia32/assembler-ia32-inl.h @@ -51,7 +51,7 @@ static const byte kCallOpcode = 0xE8; // The modes possibly affected by apply must be in kApplyMask. void RelocInfo::apply(intptr_t delta) { - if (IsRuntimeEntry(rmode_) || IsCodeTarget(rmode_)) { + if (rmode_ == RUNTIME_ENTRY || IsCodeTarget(rmode_)) { int32_t* p = reinterpret_cast(pc_); *p -= delta; // Relocate entry. CPU::FlushICache(p, sizeof(uint32_t)); @@ -83,13 +83,13 @@ void RelocInfo::apply(intptr_t delta) { Address RelocInfo::target_address() { - ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); + ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); return Assembler::target_address_at(pc_); } Address RelocInfo::target_address_address() { - ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) + ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY || rmode_ == EMBEDDED_OBJECT || rmode_ == EXTERNAL_REFERENCE); return reinterpret_cast
(pc_); @@ -103,7 +103,7 @@ int RelocInfo::target_address_size() { void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { Assembler::set_target_address_at(pc_, target); - ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); + ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); if (mode == UPDATE_WRITE_BARRIER && host() != NULL && IsCodeTarget(rmode_)) { Object* target_code = Code::GetCodeFromTargetAddress(target); host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( @@ -149,19 +149,6 @@ Address* RelocInfo::target_reference_address() { } -Address RelocInfo::target_runtime_entry(Assembler* origin) { - ASSERT(IsRuntimeEntry(rmode_)); - return reinterpret_cast
(*reinterpret_cast(pc_)); -} - - -void RelocInfo::set_target_runtime_entry(Address target, - WriteBarrierMode mode) { - ASSERT(IsRuntimeEntry(rmode_)); - if (target_address() != target) set_target_address(target, mode); -} - - Handle RelocInfo::target_cell_handle() { ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); Address address = Memory::Address_at(pc_); @@ -275,7 +262,7 @@ void RelocInfo::Visit(ObjectVisitor* visitor) { Isolate::Current()->debug()->has_break_points()) { visitor->VisitDebugTarget(this); #endif - } else if (IsRuntimeEntry(mode)) { + } else if (mode == RelocInfo::RUNTIME_ENTRY) { visitor->VisitRuntimeEntry(this); } } @@ -304,7 +291,7 @@ void RelocInfo::Visit(Heap* heap) { IsPatchedDebugBreakSlotSequence()))) { StaticVisitor::VisitDebugTarget(heap, this); #endif - } else if (IsRuntimeEntry(mode)) { + } else if (mode == RelocInfo::RUNTIME_ENTRY) { StaticVisitor::VisitRuntimeEntry(this); } } diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc index b48906e..d926316 100644 --- a/src/ia32/assembler-ia32.cc +++ b/src/ia32/assembler-ia32.cc @@ -1425,11 +1425,7 @@ void Assembler::call(byte* entry, RelocInfo::Mode rmode) { EnsureSpace ensure_space(this); ASSERT(!RelocInfo::IsCodeTarget(rmode)); EMIT(0xE8); - if (RelocInfo::IsRuntimeEntry(rmode)) { - emit(reinterpret_cast(entry), rmode); - } else { - emit(entry - (pc_ + sizeof(int32_t)), rmode); - } + emit(entry - (pc_ + sizeof(int32_t)), rmode); } @@ -1494,11 +1490,7 @@ void Assembler::jmp(byte* entry, RelocInfo::Mode rmode) { EnsureSpace ensure_space(this); ASSERT(!RelocInfo::IsCodeTarget(rmode)); EMIT(0xE9); - if (RelocInfo::IsRuntimeEntry(rmode)) { - emit(reinterpret_cast(entry), rmode); - } else { - emit(entry - (pc_ + sizeof(int32_t)), rmode); - } + emit(entry - (pc_ + sizeof(int32_t)), rmode); } @@ -1555,11 +1547,7 @@ void Assembler::j(Condition cc, byte* entry, RelocInfo::Mode rmode) { // 0000 1111 1000 tttn #32-bit disp. EMIT(0x0F); EMIT(0x80 | cc); - if (RelocInfo::IsRuntimeEntry(rmode)) { - emit(reinterpret_cast(entry), rmode); - } else { - emit(entry - (pc_ + sizeof(int32_t)), rmode); - } + emit(entry - (pc_ + sizeof(int32_t)), rmode); } @@ -2576,7 +2564,10 @@ void Assembler::GrowBuffer() { // Relocate runtime entries. for (RelocIterator it(desc); !it.done(); it.next()) { RelocInfo::Mode rmode = it.rinfo()->rmode(); - if (rmode == RelocInfo::INTERNAL_REFERENCE) { + if (rmode == RelocInfo::RUNTIME_ENTRY) { + int32_t* p = reinterpret_cast(it.rinfo()->pc()); + *p -= pc_delta; // relocate entry + } else if (rmode == RelocInfo::INTERNAL_REFERENCE) { int32_t* p = reinterpret_cast(it.rinfo()->pc()); if (*p != 0) { // 0 means uninitialized. *p += pc_delta; diff --git a/src/mips/assembler-mips-inl.h b/src/mips/assembler-mips-inl.h index 1dad815..0499d36 100644 --- a/src/mips/assembler-mips-inl.h +++ b/src/mips/assembler-mips-inl.h @@ -231,19 +231,6 @@ Address* RelocInfo::target_reference_address() { } -Address RelocInfo::target_runtime_entry(Assembler* origin) { - ASSERT(IsRuntimeEntry(rmode_)); - return target_address(); -} - - -void RelocInfo::set_target_runtime_entry(Address target, - WriteBarrierMode mode) { - ASSERT(IsRuntimeEntry(rmode_)); - if (target_address() != target) set_target_address(target, mode); -} - - Handle RelocInfo::target_cell_handle() { ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); Address address = Memory::Address_at(pc_); diff --git a/src/objects.cc b/src/objects.cc index 72d0dad..fe36002 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -8793,10 +8793,8 @@ void Code::CopyFrom(const CodeDesc& desc) { int mode_mask = RelocInfo::kCodeTargetMask | RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | RelocInfo::ModeMask(RelocInfo::GLOBAL_PROPERTY_CELL) | - RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) | RelocInfo::kApplyMask; - // Needed to find target_object and runtime_entry on X64 - Assembler* origin = desc.origin; + Assembler* origin = desc.origin; // Needed to find target_object on X64. for (RelocIterator it(this, mode_mask); !it.done(); it.next()) { RelocInfo::Mode mode = it.rinfo()->rmode(); if (mode == RelocInfo::EMBEDDED_OBJECT) { @@ -8812,9 +8810,6 @@ void Code::CopyFrom(const CodeDesc& desc) { Code* code = Code::cast(*p); it.rinfo()->set_target_address(code->instruction_start(), SKIP_WRITE_BARRIER); - } else if (RelocInfo::IsRuntimeEntry(mode)) { - Address p = it.rinfo()->target_runtime_entry(origin); - it.rinfo()->set_target_runtime_entry(p, SKIP_WRITE_BARRIER); } else { it.rinfo()->apply(delta); } diff --git a/src/spaces.h b/src/spaces.h index 6847b31..8365312 100644 --- a/src/spaces.h +++ b/src/spaces.h @@ -894,10 +894,6 @@ class CodeRange { void TearDown(); bool exists() { return this != NULL && code_range_ != NULL; } - Address start() { - if (this == NULL || code_range_ == NULL) return NULL; - return static_cast
(code_range_->address()); - } bool contains(Address address) { if (this == NULL || code_range_ == NULL) return false; Address start = static_cast
(code_range_->address()); diff --git a/src/x64/assembler-x64-inl.h b/src/x64/assembler-x64-inl.h index 91bc528..67acbf0 100644 --- a/src/x64/assembler-x64-inl.h +++ b/src/x64/assembler-x64-inl.h @@ -86,14 +86,6 @@ void Assembler::emit_code_target(Handle target, } -void Assembler::emit_runtime_entry(Address entry, RelocInfo::Mode rmode) { - ASSERT(RelocInfo::IsRuntimeEntry(rmode)); - ASSERT(isolate()->code_range()->exists()); - RecordRelocInfo(rmode); - emitl(static_cast(entry - isolate()->code_range()->start())); -} - - void Assembler::emit_rex_64(Register reg, Register rm_reg) { emit(0x48 | reg.high_bit() << 2 | rm_reg.high_bit()); } @@ -216,12 +208,6 @@ Handle Assembler::code_target_object_handle_at(Address pc) { return code_targets_[Memory::int32_at(pc)]; } - -Address Assembler::runtime_entry_at(Address pc) { - ASSERT(isolate()->code_range()->exists()); - return Memory::int32_at(pc) + isolate()->code_range()->start(); -} - // ----------------------------------------------------------------------------- // Implementation of RelocInfo @@ -231,7 +217,7 @@ void RelocInfo::apply(intptr_t delta) { // absolute code pointer inside code object moves with the code object. Memory::Address_at(pc_) += static_cast(delta); CPU::FlushICache(pc_, sizeof(Address)); - } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) { + } else if (IsCodeTarget(rmode_)) { Memory::int32_at(pc_) -= static_cast(delta); CPU::FlushICache(pc_, sizeof(int32_t)); } else if (rmode_ == CODE_AGE_SEQUENCE) { @@ -245,13 +231,17 @@ void RelocInfo::apply(intptr_t delta) { Address RelocInfo::target_address() { - ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); - return Assembler::target_address_at(pc_); + ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); + if (IsCodeTarget(rmode_)) { + return Assembler::target_address_at(pc_); + } else { + return Memory::Address_at(pc_); + } } Address RelocInfo::target_address_address() { - ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) + ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY || rmode_ == EMBEDDED_OBJECT || rmode_ == EXTERNAL_REFERENCE); return reinterpret_cast
(pc_); @@ -268,12 +258,17 @@ int RelocInfo::target_address_size() { void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { - ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)); - Assembler::set_target_address_at(pc_, target); - if (mode == UPDATE_WRITE_BARRIER && host() != NULL && IsCodeTarget(rmode_)) { + ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); + if (IsCodeTarget(rmode_)) { + Assembler::set_target_address_at(pc_, target); Object* target_code = Code::GetCodeFromTargetAddress(target); - host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( - host(), this, HeapObject::cast(target_code)); + if (mode == UPDATE_WRITE_BARRIER && host() != NULL) { + host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( + host(), this, HeapObject::cast(target_code)); + } + } else { + Memory::Address_at(pc_) = target; + CPU::FlushICache(pc_, sizeof(Address)); } } @@ -319,19 +314,6 @@ void RelocInfo::set_target_object(Object* target, WriteBarrierMode mode) { } -Address RelocInfo::target_runtime_entry(Assembler* origin) { - ASSERT(IsRuntimeEntry(rmode_)); - return origin->runtime_entry_at(pc_); -} - - -void RelocInfo::set_target_runtime_entry(Address target, - WriteBarrierMode mode) { - ASSERT(IsRuntimeEntry(rmode_)); - if (target_address() != target) set_target_address(target, mode); -} - - Handle RelocInfo::target_cell_handle() { ASSERT(rmode_ == RelocInfo::GLOBAL_PROPERTY_CELL); Address address = Memory::Address_at(pc_); @@ -461,7 +443,7 @@ void RelocInfo::Visit(ObjectVisitor* visitor) { Isolate::Current()->debug()->has_break_points()) { visitor->VisitDebugTarget(this); #endif - } else if (RelocInfo::IsRuntimeEntry(mode)) { + } else if (mode == RelocInfo::RUNTIME_ENTRY) { visitor->VisitRuntimeEntry(this); } } @@ -490,7 +472,7 @@ void RelocInfo::Visit(Heap* heap) { IsPatchedDebugBreakSlotSequence()))) { StaticVisitor::VisitDebugTarget(heap, this); #endif - } else if (RelocInfo::IsRuntimeEntry(mode)) { + } else if (mode == RelocInfo::RUNTIME_ENTRY) { StaticVisitor::VisitRuntimeEntry(this); } } diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc index 57d40f7..97b9075 100644 --- a/src/x64/assembler-x64.cc +++ b/src/x64/assembler-x64.cc @@ -841,16 +841,6 @@ void Assembler::call(Label* L) { } -void Assembler::call(Address entry, RelocInfo::Mode rmode) { - ASSERT(RelocInfo::IsRuntimeEntry(rmode)); - positions_recorder()->WriteRecordedPositions(); - EnsureSpace ensure_space(this); - // 1110 1000 #32-bit disp. - emit(0xE8); - emit_runtime_entry(entry, rmode); -} - - void Assembler::call(Handle target, RelocInfo::Mode rmode, TypeFeedbackId ast_id) { @@ -1257,16 +1247,6 @@ void Assembler::j(Condition cc, Label* L, Label::Distance distance) { } -void Assembler::j(Condition cc, Address entry, RelocInfo::Mode rmode) { - ASSERT(RelocInfo::IsRuntimeEntry(rmode)); - EnsureSpace ensure_space(this); - ASSERT(is_uint4(cc)); - emit(0x0F); - emit(0x80 | cc); - emit_runtime_entry(entry, rmode); -} - - void Assembler::j(Condition cc, Handle target, RelocInfo::Mode rmode) { @@ -1329,15 +1309,6 @@ void Assembler::jmp(Handle target, RelocInfo::Mode rmode) { } -void Assembler::jmp(Address entry, RelocInfo::Mode rmode) { - ASSERT(RelocInfo::IsRuntimeEntry(rmode)); - EnsureSpace ensure_space(this); - ASSERT(RelocInfo::IsRuntimeEntry(rmode)); - emit(0xE9); - emit_runtime_entry(entry, rmode); -} - - void Assembler::jmp(Register target) { EnsureSpace ensure_space(this); // Opcode FF/4 r64. @@ -3078,7 +3049,6 @@ void Assembler::RecordComment(const char* msg, bool force) { const int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask | - 1 << RelocInfo::RUNTIME_ENTRY | 1 << RelocInfo::INTERNAL_REFERENCE | 1 << RelocInfo::CODE_AGE_SEQUENCE; diff --git a/src/x64/assembler-x64.h b/src/x64/assembler-x64.h index 49a57e6..03e742d 100644 --- a/src/x64/assembler-x64.h +++ b/src/x64/assembler-x64.h @@ -561,7 +561,6 @@ class Assembler : public AssemblerBase { } inline Handle code_target_object_handle_at(Address pc); - inline Address runtime_entry_at(Address pc); // Number of bytes taken up by the branch target in the code. static const int kSpecialTargetSize = 4; // Use 32-bit displacement. // Distance between the address of the code target in the call instruction @@ -1181,7 +1180,6 @@ class Assembler : public AssemblerBase { // Calls // Call near relative 32-bit displacement, relative to next instruction. void call(Label* L); - void call(Address entry, RelocInfo::Mode rmode); void call(Handle target, RelocInfo::Mode rmode = RelocInfo::CODE_TARGET, TypeFeedbackId ast_id = TypeFeedbackId::None()); @@ -1203,7 +1201,6 @@ class Assembler : public AssemblerBase { // Use a 32-bit signed displacement. // Unconditional jump to L void jmp(Label* L, Label::Distance distance = Label::kFar); - void jmp(Address entry, RelocInfo::Mode rmode); void jmp(Handle target, RelocInfo::Mode rmode); // Jump near absolute indirect (r64) @@ -1216,7 +1213,6 @@ class Assembler : public AssemblerBase { void j(Condition cc, Label* L, Label::Distance distance = Label::kFar); - void j(Condition cc, Address entry, RelocInfo::Mode rmode); void j(Condition cc, Handle target, RelocInfo::Mode rmode); // Floating-point operations @@ -1434,7 +1430,6 @@ class Assembler : public AssemblerBase { inline void emit_code_target(Handle target, RelocInfo::Mode rmode, TypeFeedbackId ast_id = TypeFeedbackId::None()); - inline void emit_runtime_entry(Address entry, RelocInfo::Mode rmode); void emit(Immediate x) { emitl(x.value_); } // Emits a REX prefix that encodes a 64-bit operand size and diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 81976a6..5d06c60 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -353,9 +353,9 @@ bool LCodeGen::GenerateJumpTable() { } } else { if (is_lazy_deopt) { - __ call(entry, RelocInfo::RUNTIME_ENTRY); + __ Call(entry, RelocInfo::RUNTIME_ENTRY); } else { - __ jmp(entry, RelocInfo::RUNTIME_ENTRY); + __ Jump(entry, RelocInfo::RUNTIME_ENTRY); } } } @@ -754,9 +754,9 @@ void LCodeGen::DeoptimizeIf(Condition cc, LEnvironment* environment) { bool needs_lazy_deopt = info()->IsStub(); if (cc == no_condition && frame_is_built_) { if (needs_lazy_deopt) { - __ call(entry, RelocInfo::RUNTIME_ENTRY); + __ Call(entry, RelocInfo::RUNTIME_ENTRY); } else { - __ jmp(entry, RelocInfo::RUNTIME_ENTRY); + __ Jump(entry, RelocInfo::RUNTIME_ENTRY); } } else { // We often have several deopts to the same entry, reuse the last -- 2.7.4