Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2330)

Side by Side Diff: runtime/vm/stub_code_arm.cc

Issue 17846009: Better single stepping in VM debugger (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/isolate.cc ('k') | runtime/vm/stub_code_ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/code_generator.h" 9 #include "vm/code_generator.h"
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 1381 matching lines...) Expand 10 before | Expand all | Expand 10 after
1392 // Check that the IC data array has NumberOfArgumentsChecked() == num_args. 1392 // Check that the IC data array has NumberOfArgumentsChecked() == num_args.
1393 // 'num_args_tested' is stored as an untagged int. 1393 // 'num_args_tested' is stored as an untagged int.
1394 __ ldr(R6, FieldAddress(R5, ICData::num_args_tested_offset())); 1394 __ ldr(R6, FieldAddress(R5, ICData::num_args_tested_offset()));
1395 __ CompareImmediate(R6, num_args); 1395 __ CompareImmediate(R6, num_args);
1396 __ b(&ok, EQ); 1396 __ b(&ok, EQ);
1397 __ Stop("Incorrect stub for IC data"); 1397 __ Stop("Incorrect stub for IC data");
1398 __ Bind(&ok); 1398 __ Bind(&ok);
1399 } 1399 }
1400 #endif // DEBUG 1400 #endif // DEBUG
1401 1401
1402 // Check single stepping.
1403 Label not_stepping;
1404 __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
1405 __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
1406 __ CompareImmediate(R6, 0);
1407 __ b(&not_stepping, EQ);
1408 __ EnterStubFrame();
1409 __ Push(R5); // Preserve IC data.
1410 __ CallRuntime(kSingleStepHandlerRuntimeEntry);
1411 __ Pop(R5);
1412 __ LeaveStubFrame();
1413 __ Bind(&not_stepping);
1414
1402 // Load arguments descriptor into R4. 1415 // Load arguments descriptor into R4.
1403 __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset())); 1416 __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
1404 // Preserve return address, since LR is needed for subroutine call. 1417 // Preserve return address, since LR is needed for subroutine call.
1405 __ mov(R8, ShifterOperand(LR)); 1418 __ mov(R8, ShifterOperand(LR));
1406 // Loop that checks if there is an IC data match. 1419 // Loop that checks if there is an IC data match.
1407 Label loop, update, test, found, get_class_id_as_smi; 1420 Label loop, update, test, found, get_class_id_as_smi;
1408 // R5: IC data object (preserved). 1421 // R5: IC data object (preserved).
1409 __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset())); 1422 __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset()));
1410 // R6: ic_data_array with check entries: classes and target functions. 1423 // R6: ic_data_array with check entries: classes and target functions.
1411 __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag); 1424 __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag);
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1607 // Check that the IC data array has NumberOfArgumentsChecked() == 0. 1620 // Check that the IC data array has NumberOfArgumentsChecked() == 0.
1608 // 'num_args_tested' is stored as an untagged int. 1621 // 'num_args_tested' is stored as an untagged int.
1609 __ ldr(R6, FieldAddress(R5, ICData::num_args_tested_offset())); 1622 __ ldr(R6, FieldAddress(R5, ICData::num_args_tested_offset()));
1610 __ CompareImmediate(R6, 0); 1623 __ CompareImmediate(R6, 0);
1611 __ b(&ok, EQ); 1624 __ b(&ok, EQ);
1612 __ Stop("Incorrect IC data for unoptimized static call"); 1625 __ Stop("Incorrect IC data for unoptimized static call");
1613 __ Bind(&ok); 1626 __ Bind(&ok);
1614 } 1627 }
1615 #endif // DEBUG 1628 #endif // DEBUG
1616 1629
1630 // Check single stepping.
1631 Label not_stepping;
1632 __ ldr(R6, FieldAddress(CTX, Context::isolate_offset()));
1633 __ ldrb(R6, Address(R6, Isolate::single_step_offset()));
1634 __ CompareImmediate(R6, 0);
1635 __ b(&not_stepping, EQ);
1636 __ EnterStubFrame();
1637 __ Push(R5); // Preserve IC data.
1638 __ CallRuntime(kSingleStepHandlerRuntimeEntry);
1639 __ Pop(R5);
1640 __ LeaveStubFrame();
1641 __ Bind(&not_stepping);
1642
1617 // R5: IC data object (preserved). 1643 // R5: IC data object (preserved).
1618 __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset())); 1644 __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset()));
1619 // R6: ic_data_array with entries: target functions and count. 1645 // R6: ic_data_array with entries: target functions and count.
1620 __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag); 1646 __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag);
1621 // R6: points directly to the first ic data array element. 1647 // R6: points directly to the first ic data array element.
1622 const intptr_t target_offset = ICData::TargetIndexFor(0) * kWordSize; 1648 const intptr_t target_offset = ICData::TargetIndexFor(0) * kWordSize;
1623 const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize; 1649 const intptr_t count_offset = ICData::CountIndexFor(0) * kWordSize;
1624 1650
1625 // Increment count for this call. 1651 // Increment count for this call.
1626 Label increment_done; 1652 Label increment_done;
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
2043 } 2069 }
2044 2070
2045 2071
2046 // Called only from unoptimized code. All relevant registers have been saved. 2072 // Called only from unoptimized code. All relevant registers have been saved.
2047 // LR: return address. 2073 // LR: return address.
2048 // SP + 4: left operand. 2074 // SP + 4: left operand.
2049 // SP + 0: right operand. 2075 // SP + 0: right operand.
2050 // Return Zero condition flag set if equal. 2076 // Return Zero condition flag set if equal.
2051 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub( 2077 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
2052 Assembler* assembler) { 2078 Assembler* assembler) {
2079 // Check single stepping.
2080 Label not_stepping;
2081 __ ldr(R1, FieldAddress(CTX, Context::isolate_offset()));
2082 __ ldrb(R1, Address(R1, Isolate::single_step_offset()));
2083 __ CompareImmediate(R1, 0);
2084 __ b(&not_stepping, EQ);
2085 __ EnterStubFrame();
2086 __ CallRuntime(kSingleStepHandlerRuntimeEntry);
2087 __ LeaveStubFrame();
2088 __ Bind(&not_stepping);
2089
2053 const Register temp = R2; 2090 const Register temp = R2;
2054 const Register left = R1; 2091 const Register left = R1;
2055 const Register right = R0; 2092 const Register right = R0;
2056 __ ldr(left, Address(SP, 1 * kWordSize)); 2093 __ ldr(left, Address(SP, 1 * kWordSize));
2057 __ ldr(right, Address(SP, 0 * kWordSize)); 2094 __ ldr(right, Address(SP, 0 * kWordSize));
2058 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); 2095 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
2059 __ Ret(); 2096 __ Ret();
2060 } 2097 }
2061 2098
2062 2099
(...skipping 13 matching lines...) Expand all
2076 __ ldr(left, Address(SP, 4 * kWordSize)); 2113 __ ldr(left, Address(SP, 4 * kWordSize));
2077 __ ldr(right, Address(SP, 3 * kWordSize)); 2114 __ ldr(right, Address(SP, 3 * kWordSize));
2078 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); 2115 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
2079 __ PopList((1 << R0) | (1 << R1) | (1 << R2)); 2116 __ PopList((1 << R0) | (1 << R1) | (1 << R2));
2080 __ Ret(); 2117 __ Ret();
2081 } 2118 }
2082 2119
2083 } // namespace dart 2120 } // namespace dart
2084 2121
2085 #endif // defined TARGET_ARCH_ARM 2122 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/vm/isolate.cc ('k') | runtime/vm/stub_code_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698