diff options
author | Fedor Indutny <fedor.indutny@gmail.com> | 2014-03-13 20:45:44 +0400 |
---|---|---|
committer | Fedor Indutny <fedor.indutny@gmail.com> | 2014-03-13 20:56:54 +0400 |
commit | 1c7bf245dc2d520c005e01bcb56ecb3275971395 (patch) | |
tree | 34d8160c98bd8dd33757252d87a0f6586fea8213 /deps/v8/src/arm/assembler-arm-inl.h | |
parent | 93c3674ff7115fb2a3dbb5b4ffd22f4d5ed9a472 (diff) | |
download | node-new-1c7bf245dc2d520c005e01bcb56ecb3275971395.tar.gz |
deps: update v8 to 3.24.40
Diffstat (limited to 'deps/v8/src/arm/assembler-arm-inl.h')
-rw-r--r-- | deps/v8/src/arm/assembler-arm-inl.h | 83 |
1 files changed, 25 insertions, 58 deletions
diff --git a/deps/v8/src/arm/assembler-arm-inl.h b/deps/v8/src/arm/assembler-arm-inl.h index e3b39f407c..3399958ee3 100644 --- a/deps/v8/src/arm/assembler-arm-inl.h +++ b/deps/v8/src/arm/assembler-arm-inl.h @@ -57,6 +57,11 @@ int DwVfpRegister::NumRegisters() { } +int DwVfpRegister::NumReservedRegisters() { + return kNumReservedRegisters; +} + + int DwVfpRegister::NumAllocatableRegisters() { return NumRegisters() - kNumReservedRegisters; } @@ -104,7 +109,7 @@ Address RelocInfo::target_address_address() { ASSERT(IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_) || rmode_ == EMBEDDED_OBJECT || rmode_ == EXTERNAL_REFERENCE); - return reinterpret_cast<Address>(Assembler::target_pointer_address_at(pc_)); + return Assembler::target_pointer_address_at(pc_); } @@ -126,31 +131,21 @@ void RelocInfo::set_target_address(Address target, WriteBarrierMode mode) { Object* RelocInfo::target_object() { ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); - return reinterpret_cast<Object*>(Assembler::target_pointer_at(pc_)); + return reinterpret_cast<Object*>(Assembler::target_address_at(pc_)); } Handle<Object> RelocInfo::target_object_handle(Assembler* origin) { ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); return Handle<Object>(reinterpret_cast<Object**>( - Assembler::target_pointer_at(pc_))); -} - - -Object** RelocInfo::target_object_address() { - // Provide a "natural pointer" to the embedded object, - // which can be de-referenced during heap iteration. - ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); - reconstructed_obj_ptr_ = - reinterpret_cast<Object*>(Assembler::target_pointer_at(pc_)); - return &reconstructed_obj_ptr_; + Assembler::target_address_at(pc_))); } void RelocInfo::set_target_object(Object* target, WriteBarrierMode mode) { ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); ASSERT(!target->IsConsString()); - Assembler::set_target_pointer_at(pc_, reinterpret_cast<Address>(target)); + Assembler::set_target_address_at(pc_, reinterpret_cast<Address>(target)); if (mode == UPDATE_WRITE_BARRIER && host() != NULL && target->IsHeapObject()) { @@ -160,10 +155,9 @@ void RelocInfo::set_target_object(Object* target, WriteBarrierMode mode) { } -Address* RelocInfo::target_reference_address() { +Address RelocInfo::target_reference() { ASSERT(rmode_ == EXTERNAL_REFERENCE); - reconstructed_adr_ptr_ = Assembler::target_address_at(pc_); - return &reconstructed_adr_ptr_; + return Assembler::target_address_at(pc_); } @@ -269,6 +263,15 @@ Object** RelocInfo::call_object_address() { } +void RelocInfo::WipeOut() { + ASSERT(IsEmbeddedObject(rmode_) || + IsCodeTarget(rmode_) || + IsRuntimeEntry(rmode_) || + IsExternalReference(rmode_)); + Assembler::set_target_address_at(pc_, NULL); +} + + bool RelocInfo::IsPatchedReturnSequence() { Instr current_instr = Assembler::instr_at(pc_); Instr next_instr = Assembler::instr_at(pc_ + Assembler::kInstrSize); @@ -394,33 +397,12 @@ void Assembler::emit(Instr x) { Address Assembler::target_pointer_address_at(Address pc) { - Address target_pc = pc; - Instr instr = Memory::int32_at(target_pc); - // If we have a bx instruction, the instruction before the bx is - // what we need to patch. - static const int32_t kBxInstMask = 0x0ffffff0; - static const int32_t kBxInstPattern = 0x012fff10; - if ((instr & kBxInstMask) == kBxInstPattern) { - target_pc -= kInstrSize; - instr = Memory::int32_at(target_pc); - } - - // With a blx instruction, the instruction before is what needs to be patched. - if ((instr & kBlxRegMask) == kBlxRegPattern) { - target_pc -= kInstrSize; - instr = Memory::int32_at(target_pc); - } - - ASSERT(IsLdrPcImmediateOffset(instr)); - int offset = instr & 0xfff; // offset_12 is unsigned - if ((instr & (1 << 23)) == 0) offset = -offset; // U bit defines offset sign - // Verify that the constant pool comes after the instruction referencing it. - ASSERT(offset >= -4); - return target_pc + offset + 8; + Instr instr = Memory::int32_at(pc); + return pc + GetLdrRegisterImmediateOffset(instr) + kPcLoadDelta; } -Address Assembler::target_pointer_at(Address pc) { +Address Assembler::target_address_at(Address pc) { if (IsMovW(Memory::int32_at(pc))) { ASSERT(IsMovT(Memory::int32_at(pc + kInstrSize))); Instruction* instr = Instruction::At(pc); @@ -429,6 +411,7 @@ Address Assembler::target_pointer_at(Address pc) { (next_instr->ImmedMovwMovtValue() << 16) | instr->ImmedMovwMovtValue()); } + ASSERT(IsLdrPcImmediateOffset(Memory::int32_at(pc))); return Memory::Address_at(target_pointer_address_at(pc)); } @@ -474,19 +457,13 @@ void Assembler::deserialization_set_special_target_at( } -void Assembler::set_external_target_at(Address constant_pool_entry, - Address target) { - Memory::Address_at(constant_pool_entry) = target; -} - - static Instr EncodeMovwImmediate(uint32_t immediate) { ASSERT(immediate < 0x10000); return ((immediate & 0xf000) << 4) | (immediate & 0xfff); } -void Assembler::set_target_pointer_at(Address pc, Address target) { +void Assembler::set_target_address_at(Address pc, Address target) { if (IsMovW(Memory::int32_at(pc))) { ASSERT(IsMovT(Memory::int32_at(pc + kInstrSize))); uint32_t* instr_ptr = reinterpret_cast<uint32_t*>(pc); @@ -517,16 +494,6 @@ void Assembler::set_target_pointer_at(Address pc, Address target) { } -Address Assembler::target_address_at(Address pc) { - return target_pointer_at(pc); -} - - -void Assembler::set_target_address_at(Address pc, Address target) { - set_target_pointer_at(pc, target); -} - - } } // namespace v8::internal #endif // V8_ARM_ASSEMBLER_ARM_INL_H_ |