Author: olehougaard
Date: Tue Jan 13 06:38:12 2009
New Revision: 1067
Modified:
branches/bleeding_edge/src/assembler-arm-inl.h
branches/bleeding_edge/src/assembler-ia32-inl.h
branches/bleeding_edge/src/assembler.h
branches/bleeding_edge/src/serialize.cc
branches/bleeding_edge/test/cctest/test-serialize.cc
Log:
Avoiding the assumption that the pc pointer of RelocInfo points to the word
containing the target address. It wasn't true for ARM. (One step closer to
serialization on ARM).
Review URL: http://codereview.chromium.org/17376
Modified: branches/bleeding_edge/src/assembler-arm-inl.h
==============================================================================
--- branches/bleeding_edge/src/assembler-arm-inl.h (original)
+++ branches/bleeding_edge/src/assembler-arm-inl.h Tue Jan 13 06:38:12 2009
@@ -61,13 +61,19 @@
Address RelocInfo::target_address() {
- ASSERT(IsCodeTarget(rmode_));
+ ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
return Assembler::target_address_at(pc_);
}
+Address RelocInfo::target_address_address() {
+ ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
+ return
reinterpret_cast<Address>(Assembler::target_address_address_at(pc_));
+}
+
+
void RelocInfo::set_target_address(Address target) {
- ASSERT(IsCodeTarget(rmode_));
+ ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
Assembler::set_target_address_at(pc_, target);
}
@@ -92,7 +98,7 @@
Address* RelocInfo::target_reference_address() {
ASSERT(rmode_ == EXTERNAL_REFERENCE);
- return reinterpret_cast<Address*>(pc_);
+ return
reinterpret_cast<Address*>(Assembler::target_address_address_at(pc_));
}
Modified: branches/bleeding_edge/src/assembler-ia32-inl.h
==============================================================================
--- branches/bleeding_edge/src/assembler-ia32-inl.h (original)
+++ branches/bleeding_edge/src/assembler-ia32-inl.h Tue Jan 13 06:38:12 2009
@@ -70,6 +70,12 @@
}
+Address RelocInfo::target_address_address() {
+ ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
+ return reinterpret_cast<Address>(pc_);
+}
+
+
void RelocInfo::set_target_address(Address target) {
ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY);
Assembler::set_target_address_at(pc_, target);
Modified: branches/bleeding_edge/src/assembler.h
==============================================================================
--- branches/bleeding_edge/src/assembler.h (original)
+++ branches/bleeding_edge/src/assembler.h Tue Jan 13 06:38:12 2009
@@ -230,13 +230,18 @@
// Apply a relocation by delta bytes
INLINE(void apply(int delta));
- // Read/modify the code target in the branch/call instruction this
relocation
- // applies to; can only be called if IsCodeTarget(rmode_)
+ // Read/modify the code target in the branch/call instruction
+ // this relocation applies to;
+ // can only be called if IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY
INLINE(Address target_address());
INLINE(void set_target_address(Address target));
INLINE(Object* target_object());
INLINE(Object** target_object_address());
INLINE(void set_target_object(Object* target));
+
+ // Read the address of the word containing the target_address. Can only
+ // be called if IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY.
+ INLINE(Address target_address_address());
// Read/modify the reference in the instruction this relocation
// applies to; can only be called if rmode_ is external_reference
Modified: branches/bleeding_edge/src/serialize.cc
==============================================================================
--- branches/bleeding_edge/src/serialize.cc (original)
+++ branches/bleeding_edge/src/serialize.cc Tue Jan 13 06:38:12 2009
@@ -586,29 +586,33 @@
UNCLASSIFIED,
3,
"StackGuard::address_of_limit()");
- Add(ExternalReference::debug_break().address(),
+ Add(ExternalReference::address_of_regexp_stack_limit().address(),
UNCLASSIFIED,
4,
+ "RegExpStack::limit_address()");
+ Add(ExternalReference::debug_break().address(),
+ UNCLASSIFIED,
+ 5,
"Debug::Break()");
Add(ExternalReference::new_space_start().address(),
UNCLASSIFIED,
- 5,
+ 6,
"Heap::NewSpaceStart()");
Add(ExternalReference::heap_always_allocate_scope_depth().address(),
UNCLASSIFIED,
- 6,
+ 7,
"Heap::always_allocate_scope_depth()");
Add(ExternalReference::new_space_allocation_limit_address().address(),
UNCLASSIFIED,
- 7,
+ 8,
"Heap::NewSpaceAllocationLimitAddress()");
Add(ExternalReference::new_space_allocation_top_address().address(),
UNCLASSIFIED,
- 8,
+ 9,
"Heap::NewSpaceAllocationTopAddress()");
Add(ExternalReference::debug_step_in_fp_address().address(),
UNCLASSIFIED,
- 9,
+ 10,
"Debug::step_in_fp_addr()");
}
@@ -804,7 +808,7 @@
Address target = rinfo->target_address();
uint32_t encoding = reference_encoder_->Encode(target);
CHECK(target == NULL ? encoding == 0 : encoding != 0);
- offsets_.Add(reinterpret_cast<Address>(rinfo->pc()) - obj_address_);
+ offsets_.Add(rinfo->target_address_address() - obj_address_);
addresses_.Add(reinterpret_cast<Address>(encoding));
}
@@ -1269,7 +1273,7 @@
void Deserializer::VisitRuntimeEntry(RelocInfo* rinfo) {
- uint32_t* pc = reinterpret_cast<uint32_t*>(rinfo->pc());
+ uint32_t* pc =
reinterpret_cast<uint32_t*>(rinfo->target_address_address());
uint32_t encoding = *pc;
Address target = reference_decoder_->Decode(encoding);
rinfo->set_target_address(target);
Modified: branches/bleeding_edge/test/cctest/test-serialize.cc
==============================================================================
--- branches/bleeding_edge/test/cctest/test-serialize.cc (original)
+++ branches/bleeding_edge/test/cctest/test-serialize.cc Tue Jan 13
06:38:12 2009
@@ -109,9 +109,9 @@
ExternalReference::address_of_stack_guard_limit();
CHECK_EQ(make_code(UNCLASSIFIED, 3),
encoder.Encode(stack_guard_limit_address.address()));
- CHECK_EQ(make_code(UNCLASSIFIED, 4),
- encoder.Encode(ExternalReference::debug_break().address()));
CHECK_EQ(make_code(UNCLASSIFIED, 5),
+ encoder.Encode(ExternalReference::debug_break().address()));
+ CHECK_EQ(make_code(UNCLASSIFIED, 6),
encoder.Encode(ExternalReference::new_space_start().address()));
}
@@ -141,9 +141,9 @@
CHECK_EQ(ExternalReference::address_of_stack_guard_limit().address(),
decoder.Decode(make_code(UNCLASSIFIED, 3)));
CHECK_EQ(ExternalReference::debug_break().address(),
- decoder.Decode(make_code(UNCLASSIFIED, 4)));
- CHECK_EQ(ExternalReference::new_space_start().address(),
decoder.Decode(make_code(UNCLASSIFIED, 5)));
+ CHECK_EQ(ExternalReference::new_space_start().address(),
+ decoder.Decode(make_code(UNCLASSIFIED, 6)));
}
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---