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
55 lines
1.6 KiB
C++
55 lines
1.6 KiB
C++
//===-- UnwindMacOSXFrameBackchain.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 lldb_UnwindMacOSXFrameBackchain_h_
|
|
#define lldb_UnwindMacOSXFrameBackchain_h_
|
|
|
|
#include <vector>
|
|
|
|
#include "lldb/Target/Unwind.h"
|
|
#include "lldb/lldb-private.h"
|
|
|
|
class UnwindMacOSXFrameBackchain : public lldb_private::Unwind {
|
|
public:
|
|
UnwindMacOSXFrameBackchain(lldb_private::Thread &thread);
|
|
|
|
~UnwindMacOSXFrameBackchain() override = default;
|
|
|
|
protected:
|
|
void DoClear() override { m_cursors.clear(); }
|
|
|
|
uint32_t DoGetFrameCount() override;
|
|
|
|
bool DoGetFrameInfoAtIndex(uint32_t frame_idx, lldb::addr_t &cfa,
|
|
lldb::addr_t &pc,
|
|
bool &behaves_like_zeroth_frame) override;
|
|
|
|
lldb::RegisterContextSP
|
|
DoCreateRegisterContextForFrame(lldb_private::StackFrame *frame) override;
|
|
|
|
friend class RegisterContextMacOSXFrameBackchain;
|
|
|
|
struct Cursor {
|
|
lldb::addr_t pc; // Program counter
|
|
lldb::addr_t fp; // Frame pointer for us with backchain
|
|
};
|
|
|
|
private:
|
|
std::vector<Cursor> m_cursors;
|
|
|
|
size_t GetStackFrameData_i386(const lldb_private::ExecutionContext &exe_ctx);
|
|
|
|
size_t
|
|
GetStackFrameData_x86_64(const lldb_private::ExecutionContext &exe_ctx);
|
|
|
|
// For UnwindMacOSXFrameBackchain only
|
|
DISALLOW_COPY_AND_ASSIGN(UnwindMacOSXFrameBackchain);
|
|
};
|
|
|
|
#endif // lldb_UnwindMacOSXFrameBackchain_h_
|