Commit 97f319d9 authored by erik.corry@gmail.com's avatar erik.corry@gmail.com

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2416 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b3e8f5ef
......@@ -697,6 +697,7 @@ void Assembler::bl(int branch_offset, Condition cond) {
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(int branch_offset) { // v5 and above
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::orr(Register dst, Register src1, const Operand& src2,
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 @@ void Assembler::msr(SRegisterFieldMask fields, const Operand& src,
// 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 @@ void Assembler::RecordPosition(int pos) {
if (pos == RelocInfo::kNoPosition) return;
ASSERT(pos >= 0);
current_position_ = pos;
WriteRecordedPositions();
}
......@@ -1282,7 +1290,6 @@ void Assembler::RecordStatementPosition(int pos) {
if (pos == RelocInfo::kNoPosition) return;
ASSERT(pos >= 0);
current_statement_position_ = pos;
WriteRecordedPositions();
}
......
......@@ -76,167 +76,166 @@ ParsedResponse.prototype.lookup = function(handle) {
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);
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(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;
}
} catch (e) {
exception = e
};
......
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