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
-~----------~----~----~----~------~----~------~--~---

Reply via email to