Thanks Siva, I'll revert the change. I have access to a linux machine but I haven't used it in a long time. Would it be easy to send me the binary (with debug info) for this test case so I can see what gcc emitted here and figure out how it went wrong? This test passes with clang on x86_64 darwin but there must be something in gcc's debug info that is confusing it.
Jason > On Jan 7, 2016, at 6:16 PM, Siva Chandra <sivachan...@google.com> wrote: > > This broke TestStepNoDebug, atleast on Linux when inferior is compiled > with GCC: > http://lab.llvm.org:8011/builders/lldb-x86_64-ubuntu-14.04-cmake/builds/10091 > > I am able to reproduce this on my machine. Let me know if you need any > help with anything. > > On Thu, Jan 7, 2016 at 4:06 PM, Jason Molenda via lldb-commits > <lldb-commits@lists.llvm.org> wrote: >> Author: jmolenda >> Date: Thu Jan 7 18:06:03 2016 >> New Revision: 257117 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=257117&view=rev >> Log: >> Performance improvement: Change lldb so that it puts a breakpoint >> on the first branch instruction after a function return (or the end >> of a source line), instead of a breakpoint on the return address, >> to skip an extra stop & start of the inferior process. >> >> I changed Process::AdvanceAddressToNextBranchInstruction to not >> take an optional InstructionList argument - no callers are providing >> a cached InstructionList today, and if this function was going to >> do that, the right thing to do would be to fill out / use a >> DisassemblerSP which is a disassembler with the InstructionList for >> this address range. >> >> >> http://reviews.llvm.org/D15708 >> <rdar://problem/23309838> >> >> >> Modified: >> lldb/trunk/include/lldb/Target/Process.h >> lldb/trunk/include/lldb/Target/Thread.h >> lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h >> lldb/trunk/source/Target/Process.cpp >> lldb/trunk/source/Target/Thread.cpp >> lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp >> lldb/trunk/source/Target/ThreadPlanStepOut.cpp >> lldb/trunk/source/Target/ThreadPlanStepOverRange.cpp >> >> Modified: lldb/trunk/include/lldb/Target/Process.h >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Process.h?rev=257117&r1=257116&r2=257117&view=diff >> ============================================================================== >> --- lldb/trunk/include/lldb/Target/Process.h (original) >> +++ lldb/trunk/include/lldb/Target/Process.h Thu Jan 7 18:06:03 2016 >> @@ -3149,6 +3149,34 @@ public: >> void >> ResetImageToken(size_t token); >> >> + //------------------------------------------------------------------ >> + /// Find the next branch instruction to set a breakpoint on >> + /// >> + /// When instruction stepping through a source line, instead of >> + /// stepping through each instruction, we can put a breakpoint on >> + /// the next branch instruction (within the range of instructions >> + /// we are stepping through) and continue the process to there, >> + /// yielding significant performance benefits over instruction >> + /// stepping. >> + /// >> + /// @param[in] default_stop_addr >> + /// The address of the instruction where lldb would put a >> + /// breakpoint normally. >> + /// >> + /// @param[in] range_bounds >> + /// The range which the breakpoint must be contained within. >> + /// Typically a source line. >> + /// >> + /// @return >> + /// The address of the next branch instruction, or the end of >> + /// the range provided in range_bounds. If there are any >> + /// problems with the disassembly or getting the instructions, >> + /// the original default_stop_addr will be returned. >> + //------------------------------------------------------------------ >> + Address >> + AdvanceAddressToNextBranchInstruction (Address default_stop_addr, >> + AddressRange range_bounds); >> + >> protected: >> void >> SetState (lldb::EventSP &event_sp); >> >> Modified: lldb/trunk/include/lldb/Target/Thread.h >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Thread.h?rev=257117&r1=257116&r2=257117&view=diff >> ============================================================================== >> --- lldb/trunk/include/lldb/Target/Thread.h (original) >> +++ lldb/trunk/include/lldb/Target/Thread.h Thu Jan 7 18:06:03 2016 >> @@ -888,6 +888,16 @@ public: >> /// @param[in] run_vote >> /// See standard meanings for the stop & run votes in ThreadPlan.h. >> /// >> + /// @param[in] continue_to_next_branch >> + /// Normally this will enqueue a plan that will put a breakpoint on >> the return address and continue >> + /// to there. If continue_to_next_branch is true, this is an >> operation not involving the user -- >> + /// e.g. stepping "next" in a source line and we instruction stepped >> into another function -- >> + /// so instead of putting a breakpoint on the return address, >> advance the breakpoint to the >> + /// end of the source line that is doing the call, or until the next >> flow control instruction. >> + /// If the return value from the function call is to be retrieved / >> displayed to the user, you must stop >> + /// on the return address. The return value may be stored in >> volatile registers which are overwritten >> + /// before the next branch instruction. >> + /// >> /// @return >> /// A shared pointer to the newly queued thread plan, or nullptr if >> the plan could not be queued. >> //------------------------------------------------------------------ >> @@ -898,7 +908,8 @@ public: >> bool stop_other_threads, >> Vote stop_vote, // = eVoteYes, >> Vote run_vote, // = >> eVoteNoOpinion); >> - uint32_t frame_idx); >> + uint32_t frame_idx, >> + bool continue_to_next_branch = >> false); >> >> //------------------------------------------------------------------ >> /// Gets the plan used to step through the code that steps from a >> function >> >> Modified: lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h?rev=257117&r1=257116&r2=257117&view=diff >> ============================================================================== >> --- lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h (original) >> +++ lldb/trunk/include/lldb/Target/ThreadPlanStepOut.h Thu Jan 7 18:06:03 >> 2016 >> @@ -31,7 +31,8 @@ public: >> Vote stop_vote, >> Vote run_vote, >> uint32_t frame_idx, >> - LazyBool step_out_avoids_code_without_debug_info); >> + LazyBool step_out_avoids_code_without_debug_info, >> + bool continue_to_next_branch = false); >> >> ~ThreadPlanStepOut() override; >> >> >> Modified: lldb/trunk/source/Target/Process.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=257117&r1=257116&r2=257117&view=diff >> ============================================================================== >> --- lldb/trunk/source/Target/Process.cpp (original) >> +++ lldb/trunk/source/Target/Process.cpp Thu Jan 7 18:06:03 2016 >> @@ -6515,3 +6515,65 @@ Process::ResetImageToken(size_t token) >> if (token < m_image_tokens.size()) >> m_image_tokens[token] = LLDB_INVALID_IMAGE_TOKEN; >> } >> + >> +Address >> +Process::AdvanceAddressToNextBranchInstruction (Address default_stop_addr, >> AddressRange range_bounds) >> +{ >> + Target &target = GetTarget(); >> + DisassemblerSP disassembler_sp; >> + InstructionList *insn_list = NULL; >> + >> + Address retval = default_stop_addr; >> + >> + if (target.GetUseFastStepping() == false) >> + return retval; >> + if (default_stop_addr.IsValid() == false) >> + return retval; >> + >> + ExecutionContext exe_ctx (this); >> + const char *plugin_name = nullptr; >> + const char *flavor = nullptr; >> + const bool prefer_file_cache = true; >> + disassembler_sp = >> Disassembler::DisassembleRange(target.GetArchitecture(), >> + plugin_name, >> + flavor, >> + exe_ctx, >> + range_bounds, >> + prefer_file_cache); >> + if (disassembler_sp.get()) >> + insn_list = &disassembler_sp->GetInstructionList(); >> + >> + if (insn_list == NULL) >> + { >> + return retval; >> + } >> + >> + size_t insn_offset = insn_list->GetIndexOfInstructionAtAddress >> (default_stop_addr); >> + if (insn_offset == UINT32_MAX) >> + { >> + return retval; >> + } >> + >> + uint32_t branch_index = insn_list->GetIndexOfNextBranchInstruction >> (insn_offset, target); >> + if (branch_index == UINT32_MAX) >> + { >> + return retval; >> + } >> + >> + if (branch_index > insn_offset) >> + { >> + Address next_branch_insn_address = insn_list->GetInstructionAtIndex >> (branch_index)->GetAddress(); >> + if (next_branch_insn_address.IsValid() && >> range_bounds.ContainsFileAddress (next_branch_insn_address)) >> + { >> + retval = next_branch_insn_address; >> + } >> + } >> + >> + if (disassembler_sp.get()) >> + { >> + // FIXME: The DisassemblerLLVMC has a reference cycle and won't go >> away if it has any active instructions. >> + disassembler_sp->GetInstructionList().Clear(); >> + } >> + >> + return retval; >> +} >> >> Modified: lldb/trunk/source/Target/Thread.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Thread.cpp?rev=257117&r1=257116&r2=257117&view=diff >> ============================================================================== >> --- lldb/trunk/source/Target/Thread.cpp (original) >> +++ lldb/trunk/source/Target/Thread.cpp Thu Jan 7 18:06:03 2016 >> @@ -1591,7 +1591,7 @@ Thread::QueueThreadPlanForStepOut(bool a >> Vote stop_vote, >> Vote run_vote, >> uint32_t frame_idx, >> - LazyBool >> step_out_avoids_code_withoug_debug_info) >> + LazyBool >> step_out_avoids_code_without_debug_info) >> { >> ThreadPlanSP thread_plan_sp (new ThreadPlanStepOut (*this, >> addr_context, >> @@ -1600,7 +1600,7 @@ Thread::QueueThreadPlanForStepOut(bool a >> stop_vote, >> run_vote, >> frame_idx, >> - >> step_out_avoids_code_withoug_debug_info)); >> + >> step_out_avoids_code_without_debug_info)); >> >> if (thread_plan_sp->ValidatePlan(nullptr)) >> { >> @@ -1620,7 +1620,8 @@ Thread::QueueThreadPlanForStepOutNoShoul >> bool stop_other_threads, >> Vote stop_vote, >> Vote run_vote, >> - uint32_t frame_idx) >> + uint32_t frame_idx, >> + bool continue_to_next_branch) >> { >> ThreadPlanSP thread_plan_sp(new ThreadPlanStepOut (*this, >> addr_context, >> @@ -1629,7 +1630,8 @@ Thread::QueueThreadPlanForStepOutNoShoul >> stop_vote, >> run_vote, >> frame_idx, >> - eLazyBoolNo)); >> + eLazyBoolNo, >> + >> continue_to_next_branch)); >> >> ThreadPlanStepOut *new_plan = static_cast<ThreadPlanStepOut >> *>(thread_plan_sp.get()); >> new_plan->ClearShouldStopHereCallbacks(); >> >> Modified: lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp?rev=257117&r1=257116&r2=257117&view=diff >> ============================================================================== >> --- lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp (original) >> +++ lldb/trunk/source/Target/ThreadPlanShouldStopHere.cpp Thu Jan 7 >> 18:06:03 2016 >> @@ -135,7 +135,8 @@ ThreadPlanShouldStopHere::DefaultStepFro >> >> stop_others, >> >> eVoteNo, >> >> eVoteNoOpinion, >> - >> frame_index); >> + >> frame_index, >> + >> true); >> return return_plan_sp; >> } >> >> >> Modified: lldb/trunk/source/Target/ThreadPlanStepOut.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanStepOut.cpp?rev=257117&r1=257116&r2=257117&view=diff >> ============================================================================== >> --- lldb/trunk/source/Target/ThreadPlanStepOut.cpp (original) >> +++ lldb/trunk/source/Target/ThreadPlanStepOut.cpp Thu Jan 7 18:06:03 2016 >> @@ -18,6 +18,7 @@ >> #include "lldb/Core/ValueObjectConstResult.h" >> #include "lldb/Symbol/Block.h" >> #include "lldb/Symbol/Function.h" >> +#include "lldb/Symbol/Symbol.h" >> #include "lldb/Symbol/Type.h" >> #include "lldb/Target/ABI.h" >> #include "lldb/Target/Process.h" >> @@ -44,7 +45,8 @@ ThreadPlanStepOut::ThreadPlanStepOut >> Vote stop_vote, >> Vote run_vote, >> uint32_t frame_idx, >> - LazyBool step_out_avoids_code_without_debug_info >> + LazyBool step_out_avoids_code_without_debug_info, >> + bool continue_to_next_branch >> ) : >> ThreadPlan (ThreadPlan::eKindStepOut, "Step out", thread, stop_vote, >> run_vote), >> ThreadPlanShouldStopHere (this), >> @@ -86,7 +88,8 @@ ThreadPlanStepOut::ThreadPlanStepOut >> >> eVoteNoOpinion, >> >> eVoteNoOpinion, >> >> frame_idx - 1, >> - >> eLazyBoolNo)); >> + >> eLazyBoolNo, >> + >> continue_to_next_branch)); >> static_cast<ThreadPlanStepOut >> *>(m_step_out_to_inline_plan_sp.get())->SetShouldStopHereCallbacks(nullptr, >> nullptr); >> m_step_out_to_inline_plan_sp->SetPrivate(true); >> } >> @@ -101,7 +104,35 @@ ThreadPlanStepOut::ThreadPlanStepOut >> // Find the return address and set a breakpoint there: >> // FIXME - can we do this more securely if we know first_insn? >> >> - m_return_addr = >> return_frame_sp->GetFrameCodeAddress().GetLoadAddress(&m_thread.GetProcess()->GetTarget()); >> + Address return_address (return_frame_sp->GetFrameCodeAddress()); >> + if (continue_to_next_branch) >> + { >> + SymbolContext return_address_sc; >> + AddressRange range; >> + Address return_address_decr_pc = return_address; >> + if (return_address_decr_pc.GetOffset() > 0) >> + return_address_decr_pc.Slide (-1); >> + >> + return_address_decr_pc.CalculateSymbolContext >> (&return_address_sc, lldb::eSymbolContextLineEntry | >> lldb::eSymbolContextFunction | lldb::eSymbolContextSymbol); >> + if (return_address_sc.line_entry.IsValid()) >> + { >> + range = >> return_address_sc.line_entry.GetSameLineContiguousAddressRange(); >> + } >> + else if (return_address_sc.function) >> + { >> + range = return_address_sc.function->GetAddressRange(); >> + } >> + else if (return_address_sc.symbol && >> return_address_sc.symbol->GetByteSizeIsValid()) >> + { >> + range.GetBaseAddress() = >> return_address_sc.symbol->GetAddress(); >> + range.SetByteSize (return_address_sc.symbol->GetByteSize()); >> + } >> + if (range.GetByteSize() > 0) >> + { >> + return_address = >> m_thread.GetProcess()->AdvanceAddressToNextBranchInstruction >> (return_address, range); >> + } >> + } >> + m_return_addr = >> return_address.GetLoadAddress(&m_thread.GetProcess()->GetTarget()); >> >> if (m_return_addr == LLDB_INVALID_ADDRESS) >> return; >> >> Modified: lldb/trunk/source/Target/ThreadPlanStepOverRange.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanStepOverRange.cpp?rev=257117&r1=257116&r2=257117&view=diff >> ============================================================================== >> --- lldb/trunk/source/Target/ThreadPlanStepOverRange.cpp (original) >> +++ lldb/trunk/source/Target/ThreadPlanStepOverRange.cpp Thu Jan 7 18:06:03 >> 2016 >> @@ -185,7 +185,8 @@ ThreadPlanStepOverRange::ShouldStop (Eve >> >> stop_others, >> >> eVoteNo, >> >> eVoteNoOpinion, >> - >> 0); >> + >> 0, >> + >> true); >> break; >> } >> else >> >> >> _______________________________________________ >> lldb-commits mailing list >> lldb-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits