Commit 2ba27d22 authored by vegorov@chromium.org's avatar vegorov@chromium.org

Add RelocInfo::DEBUG_BREAK_SLOT to RelocInfo::kApplyMask on ia32/x64 to ensure...

Add RelocInfo::DEBUG_BREAK_SLOT to RelocInfo::kApplyMask on ia32/x64 to ensure that debug break slots get relocated correctly during compacting GC.

Review URL: http://codereview.chromium.org/3058048

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5178 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 1920692d
...@@ -158,7 +158,8 @@ void Displacement::init(Label* L, Type type) { ...@@ -158,7 +158,8 @@ void Displacement::init(Label* L, Type type) {
const int RelocInfo::kApplyMask = const int RelocInfo::kApplyMask =
RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY | 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() { bool RelocInfo::IsCodedSpecially() {
......
...@@ -2942,7 +2942,8 @@ bool Assembler::WriteRecordedPositions() { ...@@ -2942,7 +2942,8 @@ bool Assembler::WriteRecordedPositions() {
const int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask | const int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask |
1 << RelocInfo::INTERNAL_REFERENCE | 1 << RelocInfo::INTERNAL_REFERENCE |
1 << RelocInfo::JS_RETURN; 1 << RelocInfo::JS_RETURN |
1 << RelocInfo::DEBUG_BREAK_SLOT;
bool RelocInfo::IsCodedSpecially() { bool RelocInfo::IsCodedSpecially() {
......
...@@ -1244,7 +1244,9 @@ TEST(GCDuringBreakPointProcessing) { ...@@ -1244,7 +1244,9 @@ TEST(GCDuringBreakPointProcessing) {
// Call the function three times with different garbage collections in between // Call the function three times with different garbage collections in between
// and make sure that the break point survives. // 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; break_point_hit_count = 0;
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
...@@ -1258,15 +1260,14 @@ static void CallAndGC(v8::Local<v8::Object> recv, v8::Local<v8::Function> f) { ...@@ -1258,15 +1260,14 @@ static void CallAndGC(v8::Local<v8::Object> recv, v8::Local<v8::Function> f) {
CHECK_EQ(2 + i * 3, break_point_hit_count); CHECK_EQ(2 + i * 3, break_point_hit_count);
// Mark sweep (and perhaps compact) and call function. // Mark sweep (and perhaps compact) and call function.
Heap::CollectAllGarbage(false); Heap::CollectAllGarbage(force_compaction);
f->Call(recv, 0, NULL); f->Call(recv, 0, NULL);
CHECK_EQ(3 + i * 3, break_point_hit_count); CHECK_EQ(3 + i * 3, break_point_hit_count);
} }
} }
// Test that a break point can be set at a return store location. static void TestBreakPointSurviveGC(bool force_compaction) {
TEST(BreakPointSurviveGC) {
break_point_hit_count = 0; break_point_hit_count = 0;
v8::HandleScope scope; v8::HandleScope scope;
DebugLocalContext env; DebugLocalContext env;
...@@ -1278,28 +1279,35 @@ TEST(BreakPointSurviveGC) { ...@@ -1278,28 +1279,35 @@ TEST(BreakPointSurviveGC) {
// Test IC store break point with garbage collection. // Test IC store break point with garbage collection.
foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); foo = CompileFunction(&env, "function foo(){bar=0;}", "foo");
SetBreakPoint(foo, 0); SetBreakPoint(foo, 0);
CallAndGC(env->Global(), foo); CallAndGC(env->Global(), foo, force_compaction);
// Test IC load break point with garbage collection. // Test IC load break point with garbage collection.
foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo"); foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo");
SetBreakPoint(foo, 0); SetBreakPoint(foo, 0);
CallAndGC(env->Global(), foo); CallAndGC(env->Global(), foo, force_compaction);
// Test IC call break point with garbage collection. // Test IC call break point with garbage collection.
foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo");
SetBreakPoint(foo, 0); SetBreakPoint(foo, 0);
CallAndGC(env->Global(), foo); CallAndGC(env->Global(), foo, force_compaction);
// Test return break point with garbage collection. // Test return break point with garbage collection.
foo = CompileFunction(&env, "function foo(){}", "foo"); foo = CompileFunction(&env, "function foo(){}", "foo");
SetBreakPoint(foo, 0); SetBreakPoint(foo, 0);
CallAndGC(env->Global(), foo); CallAndGC(env->Global(), foo, force_compaction);
v8::Debug::SetDebugEventListener(NULL); v8::Debug::SetDebugEventListener(NULL);
CheckDebuggerUnloaded(); 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. // Test that break points can be set using the global Debug object.
TEST(BreakPointThroughJavaScript) { TEST(BreakPointThroughJavaScript) {
break_point_hit_count = 0; break_point_hit_count = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment