| Index: src/arm/assembler-arm-inl.h
|
| diff --git a/src/arm/assembler-arm-inl.h b/src/arm/assembler-arm-inl.h
|
| index e3b39f407cb37a31d60e79cb5470a383cacad223..f93a9a6003b8ab7db2105692fc084e92f5c96bdb 100644
|
| --- a/src/arm/assembler-arm-inl.h
|
| +++ b/src/arm/assembler-arm-inl.h
|
| @@ -104,7 +104,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 +126,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 +150,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 +258,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 +392,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 +406,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));
|
| }
|
|
|
| @@ -486,7 +464,7 @@ static Instr EncodeMovwImmediate(uint32_t immediate) {
|
| }
|
|
|
|
|
| -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 +495,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_
|
|
|