Author: [email protected]
Date: Thu Jul 9 04:59:58 2009
New Revision: 2416
Modified:
branches/bleeding_edge/src/arm/assembler-arm.cc
branches/bleeding_edge/test/mjsunit/debug-backtrace.js
Log:
Get peep-hole optimizer working on ARM by not emitting
debug info at places where the debugger can't stop.
This fixes the ARM version after
http://codereview.chromium.org/14170
Reformat debug-backtrace.js test.
Review URL: http://codereview.chromium.org/155285
Modified: branches/bleeding_edge/src/arm/assembler-arm.cc
==============================================================================
--- branches/bleeding_edge/src/arm/assembler-arm.cc (original)
+++ branches/bleeding_edge/src/arm/assembler-arm.cc Thu Jul 9 04:59:58 2009
@@ -697,6 +697,7 @@
void Assembler::blx(int branch_offset) { // v5 and above
+ WriteRecordedPositions();
ASSERT((branch_offset & 1) == 0);
int h = ((branch_offset & 2) >> 1)*B24;
int imm24 = branch_offset >> 2;
@@ -706,12 +707,14 @@
void Assembler::blx(Register target, Condition cond) { // v5 and above
+ WriteRecordedPositions();
ASSERT(!target.is(pc));
emit(cond | B24 | B21 | 15*B16 | 15*B12 | 15*B8 | 3*B4 | target.code());
}
void Assembler::bx(Register target, Condition cond) { // v5 and above,
plus v4t
+ WriteRecordedPositions();
ASSERT(!target.is(pc)); // use of pc is actually allowed, but
discouraged
emit(cond | B24 | B21 | 15*B16 | 15*B12 | 15*B8 | B4 | target.code());
}
@@ -810,6 +813,9 @@
void Assembler::mov(Register dst, const Operand& src, SBit s, Condition
cond) {
+ if (dst.is(pc)) {
+ WriteRecordedPositions();
+ }
addrmod1(cond | 13*B21 | s, r0, dst, src);
}
@@ -937,6 +943,9 @@
// Load/Store instructions
void Assembler::ldr(Register dst, const MemOperand& src, Condition cond) {
+ if (dst.is(pc)) {
+ WriteRecordedPositions();
+ }
addrmod2(cond | B26 | L, dst, src);
// Eliminate pattern: push(r), pop(r)
@@ -1274,7 +1283,6 @@
if (pos == RelocInfo::kNoPosition) return;
ASSERT(pos >= 0);
current_position_ = pos;
- WriteRecordedPositions();
}
@@ -1282,7 +1290,6 @@
if (pos == RelocInfo::kNoPosition) return;
ASSERT(pos >= 0);
current_statement_position_ = pos;
- WriteRecordedPositions();
}
Modified: branches/bleeding_edge/test/mjsunit/debug-backtrace.js
==============================================================================
--- branches/bleeding_edge/test/mjsunit/debug-backtrace.js (original)
+++ branches/bleeding_edge/test/mjsunit/debug-backtrace.js Thu Jul 9
04:59:58 2009
@@ -76,167 +76,166 @@
function listener(event, exec_state, event_data, data) {
try {
- if (event == Debug.DebugEvent.Break)
- {
- // The expected backtrace is
- // 0: f
- // 1: m
- // 2: g
- // 3: [anonymous]
-
- var response;
- var backtrace;
- var frame;
- var source;
-
- // Get the debug command processor.
- var dcp = exec_state.debugCommandProcessor();
-
- // Get the backtrace.
- var json;
- json = '{"seq":0,"type":"request","command":"backtrace"}'
- var resp = dcp.processDebugJSONRequest(json);
- response = new ParsedResponse(resp);
- backtrace = response.body();
- assertEquals(0, backtrace.fromFrame);
- assertEquals(4, backtrace.toFrame);
- assertEquals(4, backtrace.totalFrames);
- var frames = backtrace.frames;
- assertEquals(4, frames.length);
- for (var i = 0; i < frames.length; i++) {
- assertEquals('frame', frames[i].type);
- }
- assertEquals(0, frames[0].index);
- assertEquals("f", response.lookup(frames[0].func.ref).name);
- assertEquals(1, frames[1].index);
- assertEquals("", response.lookup(frames[1].func.ref).name);
- assertEquals("m", response.lookup(frames[1].func.ref).inferredName);
- assertEquals(2, frames[2].index);
- assertEquals("g", response.lookup(frames[2].func.ref).name);
- assertEquals(3, frames[3].index);
- assertEquals("", response.lookup(frames[3].func.ref).name);
-
- // Get backtrace with two frames.
- json
=
'{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFrame":1,"toFrame":3}}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- backtrace = response.body();
- assertEquals(1, backtrace.fromFrame);
- assertEquals(3, backtrace.toFrame);
- assertEquals(4, backtrace.totalFrames);
- var frames = backtrace.frames;
- assertEquals(2, frames.length);
- for (var i = 0; i < frames.length; i++) {
- assertEquals('frame', frames[i].type);
- }
- assertEquals(1, frames[0].index);
- assertEquals("", response.lookup(frames[0].func.ref).name);
- assertEquals("m", response.lookup(frames[0].func.ref).inferredName);
- assertEquals(2, frames[1].index);
- assertEquals("g", response.lookup(frames[1].func.ref).name);
-
- // Get backtrace with bottom two frames.
- json
=
'{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFrame":0,"toFrame":2,
"bottom":true}}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- backtrace = response.body();
- assertEquals(2, backtrace.fromFrame);
- assertEquals(4, backtrace.toFrame);
- assertEquals(4, backtrace.totalFrames);
- var frames = backtrace.frames;
- assertEquals(2, frames.length);
- for (var i = 0; i < frames.length; i++) {
- assertEquals('frame', frames[i].type);
+ if (event == Debug.DebugEvent.Break) {
+ // The expected backtrace is
+ // 0: f
+ // 1: m
+ // 2: g
+ // 3: [anonymous]
+
+ var response;
+ var backtrace;
+ var frame;
+ var source;
+
+ // Get the debug command processor.
+ var dcp = exec_state.debugCommandProcessor();
+
+ // Get the backtrace.
+ var json;
+ json = '{"seq":0,"type":"request","command":"backtrace"}'
+ var resp = dcp.processDebugJSONRequest(json);
+ response = new ParsedResponse(resp);
+ backtrace = response.body();
+ assertEquals(0, backtrace.fromFrame);
+ assertEquals(4, backtrace.toFrame);
+ assertEquals(4, backtrace.totalFrames);
+ var frames = backtrace.frames;
+ assertEquals(4, frames.length);
+ for (var i = 0; i < frames.length; i++) {
+ assertEquals('frame', frames[i].type);
+ }
+ assertEquals(0, frames[0].index);
+ assertEquals("f", response.lookup(frames[0].func.ref).name);
+ assertEquals(1, frames[1].index);
+ assertEquals("", response.lookup(frames[1].func.ref).name);
+ assertEquals("m", response.lookup(frames[1].func.ref).inferredName);
+ assertEquals(2, frames[2].index);
+ assertEquals("g", response.lookup(frames[2].func.ref).name);
+ assertEquals(3, frames[3].index);
+ assertEquals("", response.lookup(frames[3].func.ref).name);
+
+ // Get backtrace with two frames.
+ json
=
'{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFrame":1,"toFrame":3}}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ backtrace = response.body();
+ assertEquals(1, backtrace.fromFrame);
+ assertEquals(3, backtrace.toFrame);
+ assertEquals(4, backtrace.totalFrames);
+ var frames = backtrace.frames;
+ assertEquals(2, frames.length);
+ for (var i = 0; i < frames.length; i++) {
+ assertEquals('frame', frames[i].type);
+ }
+ assertEquals(1, frames[0].index);
+ assertEquals("", response.lookup(frames[0].func.ref).name);
+ assertEquals("m", response.lookup(frames[0].func.ref).inferredName);
+ assertEquals(2, frames[1].index);
+ assertEquals("g", response.lookup(frames[1].func.ref).name);
+
+ // Get backtrace with bottom two frames.
+ json
=
'{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFrame":0,"toFrame":2,
"bottom":true}}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ backtrace = response.body();
+ assertEquals(2, backtrace.fromFrame);
+ assertEquals(4, backtrace.toFrame);
+ assertEquals(4, backtrace.totalFrames);
+ var frames = backtrace.frames;
+ assertEquals(2, frames.length);
+ for (var i = 0; i < frames.length; i++) {
+ assertEquals('frame', frames[i].type);
+ }
+ assertEquals(2, frames[0].index);
+ assertEquals("g", response.lookup(frames[0].func.ref).name);
+ assertEquals(3, frames[1].index);
+ assertEquals("", response.lookup(frames[1].func.ref).name);
+
+ // Get the individual frames.
+ json = '{"seq":0,"type":"request","command":"frame"}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ frame = response.body();
+ assertEquals(0, frame.index);
+ assertEquals("f", response.lookup(frame.func.ref).name);
+ assertTrue(frame.constructCall);
+ assertEquals(31, frame.line);
+ assertEquals(3, frame.column);
+ assertEquals(2, frame.arguments.length);
+ assertEquals('x', frame.arguments[0].name);
+ assertEquals('number',
response.lookup(frame.arguments[0].value.ref).type);
+ assertEquals(1, response.lookup(frame.arguments[0].value.ref).value);
+ assertEquals('y', frame.arguments[1].name);
+ assertEquals('undefined',
response.lookup(frame.arguments[1].value.ref).type);
+
+ json
= '{"seq":0,"type":"request","command":"frame","arguments":{"number":0}}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ frame = response.body();
+ assertEquals(0, frame.index);
+ assertEquals("f", response.lookup(frame.func.ref).name);
+ assertEquals(31, frame.line);
+ assertEquals(3, frame.column);
+ assertEquals(2, frame.arguments.length);
+ assertEquals('x', frame.arguments[0].name);
+ assertEquals('number',
response.lookup(frame.arguments[0].value.ref).type);
+ assertEquals(1, response.lookup(frame.arguments[0].value.ref).value);
+ assertEquals('y', frame.arguments[1].name);
+ assertEquals('undefined',
response.lookup(frame.arguments[1].value.ref).type);
+
+ json
= '{"seq":0,"type":"request","command":"frame","arguments":{"number":1}}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ frame = response.body();
+ assertEquals(1, frame.index);
+ assertEquals("", response.lookup(frame.func.ref).name);
+ assertEquals("m", response.lookup(frame.func.ref).inferredName);
+ assertFalse(frame.constructCall);
+ assertEquals(35, frame.line);
+ assertEquals(2, frame.column);
+ assertEquals(0, frame.arguments.length);
+
+ json
= '{"seq":0,"type":"request","command":"frame","arguments":{"number":3}}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ frame = response.body();
+ assertEquals(3, frame.index);
+ assertEquals("", response.lookup(frame.func.ref).name);
+
+ // Source slices for the individual frames (they all refer to this
script).
+ json = '{"seq":0,"type":"request","command":"source",' +
+ '"arguments":{"frame":0,"fromLine":30,"toLine":32}}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ source = response.body();
+ assertEquals("function f(x, y) {", source.source.substring(0, 18));
+ assertEquals(30, source.fromLine);
+ assertEquals(32, source.toLine);
+
+ json = '{"seq":0,"type":"request","command":"source",' +
+ '"arguments":{"frame":1,"fromLine":31,"toLine":32}}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ source = response.body();
+ assertEquals(" a=1;", source.source.substring(0, 6));
+ assertEquals(31, source.fromLine);
+ assertEquals(32, source.toLine);
+
+ json = '{"seq":0,"type":"request","command":"source",' +
+ '"arguments":{"frame":2,"fromLine":35,"toLine":36}}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ source = response.body();
+ assertEquals(" new f(1);", source.source.substring(0, 11));
+ assertEquals(35, source.fromLine);
+ assertEquals(36, source.toLine);
+
+ // Test line interval way beyond this script will result in an error.
+ json = '{"seq":0,"type":"request","command":"source",' +
+ '"arguments":{"frame":0,"fromLine":10000,"toLine":20000}}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ assertFalse(response.response().success);
+
+ // Test without arguments.
+ json = '{"seq":0,"type":"request","command":"source"}'
+ response = new ParsedResponse(dcp.processDebugJSONRequest(json));
+ source = response.body();
+ assertEquals(Debug.findScript(f).source, source.source);
+
+ listenerCalled = true;
}
- assertEquals(2, frames[0].index);
- assertEquals("g", response.lookup(frames[0].func.ref).name);
- assertEquals(3, frames[1].index);
- assertEquals("", response.lookup(frames[1].func.ref).name);
-
- // Get the individual frames.
- json = '{"seq":0,"type":"request","command":"frame"}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- frame = response.body();
- assertEquals(0, frame.index);
- assertEquals("f", response.lookup(frame.func.ref).name);
- assertTrue(frame.constructCall);
- assertEquals(31, frame.line);
- assertEquals(3, frame.column);
- assertEquals(2, frame.arguments.length);
- assertEquals('x', frame.arguments[0].name);
- assertEquals('number',
response.lookup(frame.arguments[0].value.ref).type);
- assertEquals(1, response.lookup(frame.arguments[0].value.ref).value);
- assertEquals('y', frame.arguments[1].name);
- assertEquals('undefined',
response.lookup(frame.arguments[1].value.ref).type);
-
- json
= '{"seq":0,"type":"request","command":"frame","arguments":{"number":0}}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- frame = response.body();
- assertEquals(0, frame.index);
- assertEquals("f", response.lookup(frame.func.ref).name);
- assertEquals(31, frame.line);
- assertEquals(3, frame.column);
- assertEquals(2, frame.arguments.length);
- assertEquals('x', frame.arguments[0].name);
- assertEquals('number',
response.lookup(frame.arguments[0].value.ref).type);
- assertEquals(1, response.lookup(frame.arguments[0].value.ref).value);
- assertEquals('y', frame.arguments[1].name);
- assertEquals('undefined',
response.lookup(frame.arguments[1].value.ref).type);
-
- json
= '{"seq":0,"type":"request","command":"frame","arguments":{"number":1}}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- frame = response.body();
- assertEquals(1, frame.index);
- assertEquals("", response.lookup(frame.func.ref).name);
- assertEquals("m", response.lookup(frame.func.ref).inferredName);
- assertFalse(frame.constructCall);
- assertEquals(35, frame.line);
- assertEquals(2, frame.column);
- assertEquals(0, frame.arguments.length);
-
- json
= '{"seq":0,"type":"request","command":"frame","arguments":{"number":3}}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- frame = response.body();
- assertEquals(3, frame.index);
- assertEquals("", response.lookup(frame.func.ref).name);
-
- // Source slices for the individual frames (they all refer to this
script).
- json = '{"seq":0,"type":"request","command":"source",' +
- '"arguments":{"frame":0,"fromLine":30,"toLine":32}}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- source = response.body();
- assertEquals("function f(x, y) {", source.source.substring(0, 18));
- assertEquals(30, source.fromLine);
- assertEquals(32, source.toLine);
-
- json = '{"seq":0,"type":"request","command":"source",' +
- '"arguments":{"frame":1,"fromLine":31,"toLine":32}}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- source = response.body();
- assertEquals(" a=1;", source.source.substring(0, 6));
- assertEquals(31, source.fromLine);
- assertEquals(32, source.toLine);
-
- json = '{"seq":0,"type":"request","command":"source",' +
- '"arguments":{"frame":2,"fromLine":35,"toLine":36}}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- source = response.body();
- assertEquals(" new f(1);", source.source.substring(0, 11));
- assertEquals(35, source.fromLine);
- assertEquals(36, source.toLine);
-
- // Test line interval way beyond this script will result in an error.
- json = '{"seq":0,"type":"request","command":"source",' +
- '"arguments":{"frame":0,"fromLine":10000,"toLine":20000}}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- assertFalse(response.response().success);
-
- // Test without arguments.
- json = '{"seq":0,"type":"request","command":"source"}'
- response = new ParsedResponse(dcp.processDebugJSONRequest(json));
- source = response.body();
- assertEquals(Debug.findScript(f).source, source.source);
-
- listenerCalled = true;
- }
} catch (e) {
exception = e
};
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---