diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2009-10-07 11:53:03 +0200 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2009-10-07 11:53:45 +0200 |
commit | 1f31a7dbfe792fa6eee8a9cdcdfd662aad5cde06 (patch) | |
tree | c83b724056517e4bf71f203b74ad1d832d0ca7f0 /deps/v8/src/x64/assembler-x64-inl.h | |
parent | 1a2762b78e496dac4cc9fd0fb4ffb1d4f036692b (diff) | |
download | node-1f31a7dbfe792fa6eee8a9cdcdfd662aad5cde06.tar.gz |
Upgrade v8 to 1.3.14
Diffstat (limited to 'deps/v8/src/x64/assembler-x64-inl.h')
-rw-r--r-- | deps/v8/src/x64/assembler-x64-inl.h | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/deps/v8/src/x64/assembler-x64-inl.h b/deps/v8/src/x64/assembler-x64-inl.h index f51a3ea88..899a17cd4 100644 --- a/deps/v8/src/x64/assembler-x64-inl.h +++ b/deps/v8/src/x64/assembler-x64-inl.h @@ -70,6 +70,20 @@ void Assembler::emitw(uint16_t x) { } +void Assembler::emit_code_target(Handle<Code> target, RelocInfo::Mode rmode) { + ASSERT(RelocInfo::IsCodeTarget(rmode)); + RecordRelocInfo(rmode); + int current = code_targets_.length(); + if (current > 0 && code_targets_.last().is_identical_to(target)) { + // Optimization if we keep jumping to the same code target. + emitl(current - 1); + } else { + code_targets_.Add(target); + emitl(current); + } +} + + void Assembler::emit_rex_64(Register reg, Register rm_reg) { emit(0x48 | reg.high_bit() << 2 | rm_reg.high_bit()); } @@ -162,15 +176,18 @@ void Assembler::emit_optional_rex_32(const Operand& op) { Address Assembler::target_address_at(Address pc) { - return Memory::Address_at(pc); + return Memory::int32_at(pc) + pc + 4; } void Assembler::set_target_address_at(Address pc, Address target) { - Memory::Address_at(pc) = target; - CPU::FlushICache(pc, sizeof(intptr_t)); + Memory::int32_at(pc) = target - pc - 4; + CPU::FlushICache(pc, sizeof(int32_t)); } +Handle<Object> Assembler::code_target_object_handle_at(Address pc) { + return code_targets_[Memory::int32_at(pc)]; +} // ----------------------------------------------------------------------------- // Implementation of RelocInfo @@ -179,15 +196,24 @@ void Assembler::set_target_address_at(Address pc, Address target) { void RelocInfo::apply(intptr_t delta) { if (IsInternalReference(rmode_)) { // absolute code pointer inside code object moves with the code object. - intptr_t* p = reinterpret_cast<intptr_t*>(pc_); - *p += delta; // relocate entry + Memory::Address_at(pc_) += delta; + } else if (IsCodeTarget(rmode_)) { + Memory::int32_at(pc_) -= delta; + } else if (rmode_ == JS_RETURN && IsCallInstruction()) { + // Special handling of js_return when a break point is set (call + // instruction has been inserted). + Memory::int32_at(pc_ + 1) -= delta; // relocate entry } } Address RelocInfo::target_address() { ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); - return Assembler::target_address_at(pc_); + if (IsCodeTarget(rmode_)) { + return Assembler::target_address_at(pc_); + } else { + return Memory::Address_at(pc_); + } } @@ -199,13 +225,27 @@ Address RelocInfo::target_address_address() { void RelocInfo::set_target_address(Address target) { ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); - Assembler::set_target_address_at(pc_, target); + if (IsCodeTarget(rmode_)) { + Assembler::set_target_address_at(pc_, target); + } else { + Memory::Address_at(pc_) = target; + } } Object* RelocInfo::target_object() { ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); - return *reinterpret_cast<Object**>(pc_); + return Memory::Object_at(pc_); +} + + +Handle<Object> RelocInfo::target_object_handle(Assembler *origin) { + ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); + if (rmode_ == EMBEDDED_OBJECT) { + return Memory::Object_Handle_at(pc_); + } else { + return origin->code_target_object_handle_at(pc_); + } } @@ -240,16 +280,15 @@ bool RelocInfo::IsCallInstruction() { Address RelocInfo::call_address() { ASSERT(IsCallInstruction()); - return Assembler::target_address_at( - pc_ + Assembler::kPatchReturnSequenceAddressOffset); + return Memory::Address_at( + pc_ + Assembler::kRealPatchReturnSequenceAddressOffset); } void RelocInfo::set_call_address(Address target) { ASSERT(IsCallInstruction()); - Assembler::set_target_address_at( - pc_ + Assembler::kPatchReturnSequenceAddressOffset, - target); + Memory::Address_at(pc_ + Assembler::kRealPatchReturnSequenceAddressOffset) = + target; } |