From d1de1f9808cc0a5a7e3460109ee38c33336d6b43 Mon Sep 17 00:00:00 2001 From: "svenpanne@chromium.org" Date: Tue, 5 Nov 2013 09:22:35 +0000 Subject: [PATCH] Refactored EXTERNAL_REFERENCE handling. Previously, the result of target_reference_address() could only be read, writing to it would have had an architecture-dependent effect, e.g. writing into the code on ia32, a no-op on arm, etc. This refactoring-only CL turns this into a simple getter, making it impossible to use incorrectly. More to come... R=bmeurer@chromium.org Review URL: https://codereview.chromium.org/46583006 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17467 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/assembler-arm-inl.h | 5 ++--- src/assembler.cc | 4 ++-- src/assembler.h | 2 +- src/disassembler.cc | 2 +- src/ia32/assembler-ia32-inl.h | 4 ++-- src/mips/assembler-mips-inl.h | 5 ++--- src/objects.cc | 4 ++-- src/serialize.cc | 4 ++-- src/x64/assembler-x64-inl.h | 4 ++-- 9 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/arm/assembler-arm-inl.h b/src/arm/assembler-arm-inl.h index e3b39f4..7b246ac 100644 --- a/src/arm/assembler-arm-inl.h +++ b/src/arm/assembler-arm-inl.h @@ -160,10 +160,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_); } diff --git a/src/assembler.cc b/src/assembler.cc index 9ed4360..0e05c2c 100644 --- a/src/assembler.cc +++ b/src/assembler.cc @@ -819,8 +819,8 @@ void RelocInfo::Print(Isolate* isolate, FILE* out) { } else if (rmode_ == EXTERNAL_REFERENCE) { ExternalReferenceEncoder ref_encoder(isolate); PrintF(out, " (%s) (%p)", - ref_encoder.NameOfAddress(*target_reference_address()), - *target_reference_address()); + ref_encoder.NameOfAddress(target_reference()), + target_reference()); } else if (IsCodeTarget(rmode_)) { Code* code = Code::GetCodeFromTargetAddress(target_address()); PrintF(out, " (%s) (%p)", Code::Kind2String(code->kind()), diff --git a/src/assembler.h b/src/assembler.h index f0b7fed..cf5396a 100644 --- a/src/assembler.h +++ b/src/assembler.h @@ -425,7 +425,7 @@ class RelocInfo BASE_EMBEDDED { // Read/modify the reference in the instruction this relocation // applies to; can only be called if rmode_ is external_reference - INLINE(Address* target_reference_address()); + INLINE(Address target_reference()); // Read/modify the address of a call instruction. This is used to relocate // the break points where straight-line code is patched with a call diff --git a/src/disassembler.cc b/src/disassembler.cc index d7898dd..69737ed 100644 --- a/src/disassembler.cc +++ b/src/disassembler.cc @@ -227,7 +227,7 @@ static int DecodeIt(Isolate* isolate, out.AddFormatted(" ;; object: %s", *obj_name); } else if (rmode == RelocInfo::EXTERNAL_REFERENCE) { const char* reference_name = - ref_encoder.NameOfAddress(*relocinfo.target_reference_address()); + ref_encoder.NameOfAddress(relocinfo.target_reference()); out.AddFormatted(" ;; external reference (%s)", reference_name); } else if (RelocInfo::IsCodeTarget(rmode)) { out.AddFormatted(" ;; code:"); diff --git a/src/ia32/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h index 05cc23a..509658e 100644 --- a/src/ia32/assembler-ia32-inl.h +++ b/src/ia32/assembler-ia32-inl.h @@ -145,9 +145,9 @@ void RelocInfo::set_target_object(Object* target, WriteBarrierMode mode) { } -Address* RelocInfo::target_reference_address() { +Address RelocInfo::target_reference() { ASSERT(rmode_ == RelocInfo::EXTERNAL_REFERENCE); - return reinterpret_cast(pc_); + return Memory::Address_at(pc_); } diff --git a/src/mips/assembler-mips-inl.h b/src/mips/assembler-mips-inl.h index de91051..d095037 100644 --- a/src/mips/assembler-mips-inl.h +++ b/src/mips/assembler-mips-inl.h @@ -213,10 +213,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_); } diff --git a/src/objects.cc b/src/objects.cc index 454a1e8..84683ea 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -10322,8 +10322,8 @@ void ObjectVisitor::VisitEmbeddedPointer(RelocInfo* rinfo) { void ObjectVisitor::VisitExternalReference(RelocInfo* rinfo) { - Address* p = rinfo->target_reference_address(); - VisitExternalReference(p); + Address p = rinfo->target_reference(); + VisitExternalReference(&p); } diff --git a/src/serialize.cc b/src/serialize.cc index 7ed3666..f350ce5 100644 --- a/src/serialize.cc +++ b/src/serialize.cc @@ -1694,12 +1694,12 @@ void Serializer::ObjectSerializer::VisitExternalReference(RelocInfo* rinfo) { Address references_start = rinfo->target_address_address(); int skip = OutputRawData(references_start, kCanReturnSkipInsteadOfSkipping); - Address* current = rinfo->target_reference_address(); + Address current = rinfo->target_reference(); int representation = rinfo->IsCodedSpecially() ? kFromCode + kStartOfObject : kPlain + kStartOfObject; sink_->Put(kExternalReference + representation, "ExternalRef"); sink_->PutInt(skip, "SkipB4ExternalRef"); - int reference_id = serializer_->EncodeExternalReference(*current); + int reference_id = serializer_->EncodeExternalReference(current); sink_->PutInt(reference_id, "reference id"); bytes_processed_so_far_ += rinfo->target_address_size(); } diff --git a/src/x64/assembler-x64-inl.h b/src/x64/assembler-x64-inl.h index afac886..1f47c89 100644 --- a/src/x64/assembler-x64-inl.h +++ b/src/x64/assembler-x64-inl.h @@ -309,9 +309,9 @@ Object** RelocInfo::target_object_address() { } -Address* RelocInfo::target_reference_address() { +Address RelocInfo::target_reference() { ASSERT(rmode_ == RelocInfo::EXTERNAL_REFERENCE); - return reinterpret_cast(pc_); + return Memory::Address_at(pc_); } -- 2.7.4