Summary: Update StackFrame::GetSymbolContext to mirror the logic in RegisterContextLLDB::InitializeNonZerothFrame that knows not to do the pc decrement when the given frame is a signal trap handler frame or the parent of one, because the pc may not follow a call in these frames. Accomplish this by adding a behaves_like_zeroth_frame field to lldb_private::StackFrame, set to true for the zeroth frame, for signal handler frames, and for parents of signal handler frames. Also add logic to propagate the signal handler flag from UnwindPlan to the FrameType on the RegisterContextLLDB it generates, and factor out a helper to resolve symbol and address range for an Address now that we need to invoke it in four places. Reviewers: jasonmolenda, clayborg, jfb Reviewed By: jasonmolenda Subscribers: labath, dexonsmith, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D64993 llvm-svn: 367691
43 lines
1.1 KiB
C++
43 lines
1.1 KiB
C++
//===-- HistoryUnwind.h -----------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef liblldb_HistoryUnwind_h_
|
|
#define liblldb_HistoryUnwind_h_
|
|
|
|
#include <vector>
|
|
|
|
#include "lldb/Target/Unwind.h"
|
|
#include "lldb/lldb-private.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
class HistoryUnwind : public lldb_private::Unwind {
|
|
public:
|
|
HistoryUnwind(Thread &thread, std::vector<lldb::addr_t> pcs);
|
|
|
|
~HistoryUnwind() override;
|
|
|
|
protected:
|
|
void DoClear() override;
|
|
|
|
lldb::RegisterContextSP
|
|
DoCreateRegisterContextForFrame(StackFrame *frame) override;
|
|
|
|
bool DoGetFrameInfoAtIndex(uint32_t frame_idx, lldb::addr_t &cfa,
|
|
lldb::addr_t &pc,
|
|
bool &behaves_like_zeroth_frame) override;
|
|
uint32_t DoGetFrameCount() override;
|
|
|
|
private:
|
|
std::vector<lldb::addr_t> m_pcs;
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // liblldb_HistoryUnwind_h_
|