aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjimingham <jingham@apple.com>2024-02-13 11:06:32 -0800
committerGitHub <noreply@github.com>2024-02-13 11:06:32 -0800
commita04c6366b156f508cdf84a32ef4484b53a6dabee (patch)
tree3b417d6c469f0792304b456e54541d57bbcaa3c4
parentfc0e9c8315564288f9079a633892abadace534cf (diff)
downloadllvm-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.
-rw-r--r--lldb/include/lldb/Target/Thread.h7
-rw-r--r--lldb/source/Expression/DWARFExpression.cpp7
2 files changed, 10 insertions, 4 deletions
diff --git a/lldb/include/lldb/Target/Thread.h b/lldb/include/lldb/Target/Thread.h
index e423dd4..30863ad 100644
--- a/lldb/include/lldb/Target/Thread.h
+++ b/lldb/include/lldb/Target/Thread.h
@@ -390,6 +390,13 @@ public:
/// and having the thread call the SystemRuntime again.
virtual bool ThreadHasQueueInformation() const { return false; }
+ /// GetStackFrameCount can be expensive. Stacks can get very deep, and they
+ /// require memory reads for each frame. So only use GetStackFrameCount when
+ /// you need to know the depth of the stack. When iterating over frames, its
+ /// better to generate the frames one by one with GetFrameAtIndex, and when
+ /// that returns NULL, you are at the end of the stack. That way your loop
+ /// will only do the work it needs to, without forcing lldb to realize
+ /// StackFrames you weren't going to look at.
virtual uint32_t GetStackFrameCount() {
return GetStackFrameList()->GetNumFrames();
}
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;