Reviewers: Benedikt Meurer,
Description:
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...
Please review this at https://codereview.chromium.org/46583006/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+16, -18 lines):
M src/arm/assembler-arm-inl.h
M src/assembler.h
M src/assembler.cc
M src/disassembler.cc
M src/ia32/assembler-ia32-inl.h
M src/mips/assembler-mips-inl.h
M src/objects.cc
M src/serialize.cc
M src/x64/assembler-x64-inl.h
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..7b246ac7cc10a5fa5e25af3ff0eb9e4323d1ce32
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_);
}
Index: src/assembler.cc
diff --git a/src/assembler.cc b/src/assembler.cc
index
9ed43601c551256c9a9d595fc71ebc496e83f9f2..0e05c2c7c7ce6f0fecacf1fff129686822394ce9
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()),
Index: src/assembler.h
diff --git a/src/assembler.h b/src/assembler.h
index
f0b7fed9096896d77d6f797b4c45df701aad5bad..cf5396ae7d3920b4c0c4c0561f6a1249e1ab0fa8
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
Index: src/disassembler.cc
diff --git a/src/disassembler.cc b/src/disassembler.cc
index
d7898ddcd9adf426e6ea36053aed9842538337f6..69737ed89f8b6bbf0649dc61ba16285cf6a2f9f4
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:");
Index: src/ia32/assembler-ia32-inl.h
diff --git a/src/ia32/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h
index
05cc23a71d952cb4e4727d2237c2780c06faa0d5..509658e15590fd36938bcee895cb7ea6eccd0ccd
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<Address*>(pc_);
+ return Memory::Address_at(pc_);
}
Index: src/mips/assembler-mips-inl.h
diff --git a/src/mips/assembler-mips-inl.h b/src/mips/assembler-mips-inl.h
index
de91051ed025b00d23b29c4d75cae8042423068b..d095037b5140c97467a95296e15f7d6bbe159686
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_);
}
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
f7c89175da75c2fb7916015a34adf9954b565eef..459a5a90c3339aa6b1160dc1f879e929556074b9
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);
}
Index: src/serialize.cc
diff --git a/src/serialize.cc b/src/serialize.cc
index
7ed36665e2fa3ea7c917f552626788cc4d4da54f..f350ce5fda9488496f424a7ce6ec65e9ad35b87d
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();
}
Index: src/x64/assembler-x64-inl.h
diff --git a/src/x64/assembler-x64-inl.h b/src/x64/assembler-x64-inl.h
index
afac886c730e12fb6b26fe0b9746144987ecc933..1f47c89ce7091a5271b9557f0a72c673bf86e0ea
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<Address*>(pc_);
+ return Memory::Address_at(pc_);
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.