diff options
author | jimingham <jingham@apple.com> | 2024-02-13 11:06:32 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-13 11:06:32 -0800 |
commit | a04c6366b156f508cdf84a32ef4484b53a6dabee (patch) | |
tree | 3b417d6c469f0792304b456e54541d57bbcaa3c4 /lldb/source | |
parent | fc0e9c8315564288f9079a633892abadace534cf (diff) | |
download | llvm-a04c6366b156f508cdf84a32ef4484b53a6dabee.zip llvm-a04c6366b156f508cdf84a32ef4484b53a6dabee.tar.gz llvm-a04c6366b156f508cdf84a32ef4484b53a6dabee.tar.bz2 |
Don't count all the frames just to skip the current inlined ones. (#80918)
The algorithm to find the DW_OP_entry_value requires you to find the
nearest non-inlined frame. It did that by counting the number of stack
frames so that it could use that as a loop stopper.
That is unnecessary and inefficient. Unnecessary because GetFrameAtIndex
will return a null frame when you step past the oldest frame, so you
already have the "got to the end" signal without counting all the stack
frames.
And counting all the stack frames can be expensive.
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/Expression/DWARFExpression.cpp | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp index fe4928d..c061fd1 100644 --- a/lldb/source/Expression/DWARFExpression.cpp +++ b/lldb/source/Expression/DWARFExpression.cpp @@ -608,11 +608,10 @@ static bool Evaluate_DW_OP_entry_value(std::vector<Value> &stack, StackFrameSP parent_frame = nullptr; addr_t return_pc = LLDB_INVALID_ADDRESS; uint32_t current_frame_idx = current_frame->GetFrameIndex(); - uint32_t num_frames = thread->GetStackFrameCount(); - for (uint32_t parent_frame_idx = current_frame_idx + 1; - parent_frame_idx < num_frames; ++parent_frame_idx) { + + for (uint32_t parent_frame_idx = current_frame_idx + 1;;parent_frame_idx++) { parent_frame = thread->GetStackFrameAtIndex(parent_frame_idx); - // Require a valid sequence of frames. + // If this is null, we're at the end of the stack. if (!parent_frame) break; |