Author: jingham
Date: Thu Nov 12 16:32:09 2015
New Revision: 252963

URL: http://llvm.org/viewvc/llvm-project?rev=252963&view=rev
Log:
Another little stepping optimization: if any of the source step commands are 
running through a range 
of addresses, and the range has no branches, instead of running to the last 
instruction and
single-stepping over that, run to the first instruction after the end of the 
range.  If there
are no branches in the current range, then the bytes right after it have to be 
in the current
function, and have to be instructions not data in code, so this is safe.  And 
it cuts down one
extra stepi per source range step.

Incidentally, this also works around a bug in the llvm Intel assembler where it 
treats the "rep" 
prefix as a separate instruction from the repeated instruction.  If that were 
at the end of a
line range, then we would put a trap in place of the repeated instruction, 
which is undefined
behavior.  Current processors just ignore the repetition in this case, which 
changes program behavior.
Since there would never be a line range break after the rep prefix, always 
doing the range stepping 
to the beginning of the new range avoids this problem.

<rdar://problem/23461686>

Modified:
    lldb/trunk/source/Target/ThreadPlanStepRange.cpp

Modified: lldb/trunk/source/Target/ThreadPlanStepRange.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanStepRange.cpp?rev=252963&r1=252962&r2=252963&view=diff
==============================================================================
--- lldb/trunk/source/Target/ThreadPlanStepRange.cpp (original)
+++ lldb/trunk/source/Target/ThreadPlanStepRange.cpp Thu Nov 12 16:32:09 2015
@@ -390,12 +390,19 @@ ThreadPlanStepRange::SetNextBranchBreakp
         if (branch_index == UINT32_MAX)
         {
             branch_index = instructions->GetSize() - 1;
+            InstructionSP last_inst = 
instructions->GetInstructionAtIndex(branch_index);
+            size_t last_inst_size = last_inst->GetOpcode().GetByteSize();
+            run_to_address = last_inst->GetAddress();
+            run_to_address.Slide(last_inst_size);
+        }
+        else if (branch_index - pc_index > 1)
+        {
+            run_to_address = 
instructions->GetInstructionAtIndex(branch_index)->GetAddress();
         }
         
-        if (branch_index - pc_index > 1)
+        if (run_to_address.IsValid())
         {
             const bool is_internal = true;
-            run_to_address = 
instructions->GetInstructionAtIndex(branch_index)->GetAddress();
             m_next_branch_bp_sp = GetTarget().CreateBreakpoint(run_to_address, 
is_internal, false);
             if (m_next_branch_bp_sp)
             {


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to