Revision: 5185
Author: [email protected]
Date: Thu Aug 5 08:01:05 2010
Log: Landing r5180 and r5178 from bleeding_edge to 2.2 branch.
Fix handling of DEBUG_BREAK_SLOT and JS_RETURN relocations across platforms:
- on ia32 add DEBUG_BREAK_SLOT to RelocInfo::kApplyMask
- on x64 remove JS_RETURN from RelocInfo::kApply mask and incorrect code
for JS_RETURN and DEBUG_BREAK_SLOT from RelocInfo::apply.
Review URL: http://codereview.chromium.org/3064041
http://code.google.com/p/v8/source/detail?r=5185
Modified:
/branches/2.2/src/arm/assembler-arm-inl.h
/branches/2.2/src/assembler.h
/branches/2.2/src/ia32/assembler-ia32-inl.h
/branches/2.2/src/ia32/assembler-ia32.cc
/branches/2.2/src/version.cc
/branches/2.2/src/x64/assembler-x64-inl.h
/branches/2.2/src/x64/assembler-x64.cc
/branches/2.2/test/cctest/test-debug.cc
=======================================
--- /branches/2.2/src/arm/assembler-arm-inl.h Wed Jun 23 02:06:43 2010
+++ /branches/2.2/src/arm/assembler-arm-inl.h Thu Aug 5 08:01:05 2010
@@ -120,9 +120,8 @@
void RelocInfo::set_call_address(Address target) {
- ASSERT(IsPatchedReturnSequence());
- // The 2 instructions offset assumes patched return sequence.
- ASSERT(IsJSReturn(rmode()));
+ ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
+ (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
Memory::Address_at(pc_ + 2 * Assembler::kInstrSize) = target;
}
@@ -132,16 +131,15 @@
}
-Object** RelocInfo::call_object_address() {
- ASSERT(IsPatchedReturnSequence());
- // The 2 instructions offset assumes patched return sequence.
- ASSERT(IsJSReturn(rmode()));
- return reinterpret_cast<Object**>(pc_ + 2 * Assembler::kInstrSize);
+void RelocInfo::set_call_object(Object* target) {
+ *call_object_address() = target;
}
-void RelocInfo::set_call_object(Object* target) {
- *call_object_address() = target;
+Object** RelocInfo::call_object_address() {
+ ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
+ (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
+ return reinterpret_cast<Object**>(pc_ + 2 * Assembler::kInstrSize);
}
=======================================
--- /branches/2.2/src/assembler.h Wed Jun 9 02:38:56 2010
+++ /branches/2.2/src/assembler.h Thu Aug 5 08:01:05 2010
@@ -232,8 +232,8 @@
INLINE(Address call_address());
INLINE(void set_call_address(Address target));
INLINE(Object* call_object());
- INLINE(Object** call_object_address());
INLINE(void set_call_object(Object* target));
+ INLINE(Object** call_object_address());
inline void Visit(ObjectVisitor* v);
=======================================
--- /branches/2.2/src/ia32/assembler-ia32-inl.h Wed Jun 23 02:06:43 2010
+++ /branches/2.2/src/ia32/assembler-ia32-inl.h Thu Aug 5 08:01:05 2010
@@ -121,32 +121,33 @@
Address RelocInfo::call_address() {
- ASSERT(IsPatchedReturnSequence());
+ ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
+ (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
return Assembler::target_address_at(pc_ + 1);
}
void RelocInfo::set_call_address(Address target) {
- ASSERT(IsPatchedReturnSequence());
+ ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
+ (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
Assembler::set_target_address_at(pc_ + 1, target);
}
Object* RelocInfo::call_object() {
- ASSERT(IsPatchedReturnSequence());
return *call_object_address();
}
-Object** RelocInfo::call_object_address() {
- ASSERT(IsPatchedReturnSequence());
- return reinterpret_cast<Object**>(pc_ + 1);
+void RelocInfo::set_call_object(Object* target) {
+ *call_object_address() = target;
}
-void RelocInfo::set_call_object(Object* target) {
- ASSERT(IsPatchedReturnSequence());
- *call_object_address() = target;
+Object** RelocInfo::call_object_address() {
+ ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
+ (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
+ return reinterpret_cast<Object**>(pc_ + 1);
}
=======================================
--- /branches/2.2/src/ia32/assembler-ia32.cc Tue Jul 13 13:58:03 2010
+++ /branches/2.2/src/ia32/assembler-ia32.cc Thu Aug 5 08:01:05 2010
@@ -158,7 +158,8 @@
const int RelocInfo::kApplyMask =
RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY |
- 1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE;
+ 1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE |
+ 1 << RelocInfo::DEBUG_BREAK_SLOT;
bool RelocInfo::IsCodedSpecially() {
=======================================
--- /branches/2.2/src/version.cc Fri Jul 30 03:18:18 2010
+++ /branches/2.2/src/version.cc Thu Aug 5 08:01:05 2010
@@ -35,7 +35,7 @@
#define MAJOR_VERSION 2
#define MINOR_VERSION 2
#define BUILD_NUMBER 24
-#define PATCH_LEVEL 8
+#define PATCH_LEVEL 9
#define CANDIDATE_VERSION false
// Define SONAME to have the SCons build the put a specific SONAME into the
=======================================
--- /branches/2.2/src/x64/assembler-x64-inl.h Wed Jun 23 02:06:43 2010
+++ /branches/2.2/src/x64/assembler-x64-inl.h Thu Aug 5 08:01:05 2010
@@ -201,14 +201,6 @@
Memory::Address_at(pc_) += static_cast<int32_t>(delta);
} else if (IsCodeTarget(rmode_)) {
Memory::int32_at(pc_) -= static_cast<int32_t>(delta);
- } else if (rmode_ == JS_RETURN && IsPatchedReturnSequence()) {
- // Special handling of js_return when a break point is set (call
- // instruction has been inserted).
- Memory::int32_at(pc_ + 1) -= static_cast<int32_t>(delta); // relocate
entry
- } else if (rmode_ == DEBUG_BREAK_SLOT &&
IsPatchedDebugBreakSlotSequence()) {
- // Special handling of debug break slot when a break point is set (call
- // instruction has been inserted).
- Memory::int32_at(pc_ + 1) -= static_cast<int32_t>(delta); // relocate
entry
}
}
@@ -303,33 +295,34 @@
Address RelocInfo::call_address() {
- ASSERT(IsPatchedReturnSequence());
+ ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
+ (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
return Memory::Address_at(
pc_ + Assembler::kRealPatchReturnSequenceAddressOffset);
}
void RelocInfo::set_call_address(Address target) {
- ASSERT(IsPatchedReturnSequence());
+ ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
+ (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
Memory::Address_at(pc_ +
Assembler::kRealPatchReturnSequenceAddressOffset) =
target;
}
Object* RelocInfo::call_object() {
- ASSERT(IsPatchedReturnSequence());
return *call_object_address();
}
void RelocInfo::set_call_object(Object* target) {
- ASSERT(IsPatchedReturnSequence());
*call_object_address() = target;
}
Object** RelocInfo::call_object_address() {
- ASSERT(IsPatchedReturnSequence());
+ ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
+ (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
return reinterpret_cast<Object**>(
pc_ + Assembler::kPatchReturnSequenceAddressOffset);
}
=======================================
--- /branches/2.2/src/x64/assembler-x64.cc Tue Jul 27 23:55:53 2010
+++ /branches/2.2/src/x64/assembler-x64.cc Thu Aug 5 08:01:05 2010
@@ -2945,8 +2945,7 @@
const int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask |
- 1 << RelocInfo::INTERNAL_REFERENCE |
- 1 << RelocInfo::JS_RETURN;
+ 1 << RelocInfo::INTERNAL_REFERENCE;
bool RelocInfo::IsCodedSpecially() {
=======================================
--- /branches/2.2/test/cctest/test-debug.cc Wed Jul 14 02:01:13 2010
+++ /branches/2.2/test/cctest/test-debug.cc Thu Aug 5 08:01:05 2010
@@ -1244,7 +1244,9 @@
// Call the function three times with different garbage collections in
between
// and make sure that the break point survives.
-static void CallAndGC(v8::Local<v8::Object> recv, v8::Local<v8::Function>
f) {
+static void CallAndGC(v8::Local<v8::Object> recv,
+ v8::Local<v8::Function> f,
+ bool force_compaction) {
break_point_hit_count = 0;
for (int i = 0; i < 3; i++) {
@@ -1258,15 +1260,14 @@
CHECK_EQ(2 + i * 3, break_point_hit_count);
// Mark sweep (and perhaps compact) and call function.
- Heap::CollectAllGarbage(false);
+ Heap::CollectAllGarbage(force_compaction);
f->Call(recv, 0, NULL);
CHECK_EQ(3 + i * 3, break_point_hit_count);
}
}
-// Test that a break point can be set at a return store location.
-TEST(BreakPointSurviveGC) {
+static void TestBreakPointSurviveGC(bool force_compaction) {
break_point_hit_count = 0;
v8::HandleScope scope;
DebugLocalContext env;
@@ -1276,28 +1277,63 @@
v8::Local<v8::Function> foo;
// Test IC store break point with garbage collection.
- foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
- SetBreakPoint(foo, 0);
- CallAndGC(env->Global(), foo);
+ {
+ v8::Local<v8::Function> bar =
+ CompileFunction(&env, "function foo(){}", "foo");
+ foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
+ SetBreakPoint(foo, 0);
+ }
+ CallAndGC(env->Global(), foo, force_compaction);
// Test IC load break point with garbage collection.
- foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo");
- SetBreakPoint(foo, 0);
- CallAndGC(env->Global(), foo);
+ {
+ v8::Local<v8::Function> bar =
+ CompileFunction(&env, "function foo(){}", "foo");
+ foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo");
+ SetBreakPoint(foo, 0);
+ }
+ CallAndGC(env->Global(), foo, force_compaction);
// Test IC call break point with garbage collection.
- foo = CompileFunction(&env, "function bar(){};function
foo(){bar();}", "foo");
- SetBreakPoint(foo, 0);
- CallAndGC(env->Global(), foo);
+ {
+ v8::Local<v8::Function> bar =
+ CompileFunction(&env, "function foo(){}", "foo");
+ foo = CompileFunction(&env,
+ "function bar(){};function foo(){bar();}",
+ "foo");
+ SetBreakPoint(foo, 0);
+ }
+ CallAndGC(env->Global(), foo, force_compaction);
// Test return break point with garbage collection.
- foo = CompileFunction(&env, "function foo(){}", "foo");
- SetBreakPoint(foo, 0);
- CallAndGC(env->Global(), foo);
+ {
+ v8::Local<v8::Function> bar =
+ CompileFunction(&env, "function foo(){}", "foo");
+ foo = CompileFunction(&env, "function foo(){}", "foo");
+ SetBreakPoint(foo, 0);
+ }
+ CallAndGC(env->Global(), foo, force_compaction);
+
+ // Test non IC break point with garbage collection.
+ {
+ v8::Local<v8::Function> bar =
+ CompileFunction(&env, "function foo(){}", "foo");
+ foo = CompileFunction(&env, "function foo(){var bar=0;}", "foo");
+ SetBreakPoint(foo, 0);
+ }
+ CallAndGC(env->Global(), foo, force_compaction);
+
v8::Debug::SetDebugEventListener(NULL);
CheckDebuggerUnloaded();
}
+
+
+// Test that a break point can be set at a return store location.
+TEST(BreakPointSurviveGC) {
+ TestBreakPointSurviveGC(false);
+ TestBreakPointSurviveGC(true);
+}
// Test that break points can be set using the global Debug object.
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev