//===-- UnwindPlan.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_SYMBOL_UNWINDPLAN_H #define LLDB_SYMBOL_UNWINDPLAN_H #include <map> #include <memory> #include <vector> #include "lldb/Core/AddressRange.h" #include "lldb/Utility/ConstString.h" #include "lldb/Utility/Stream.h" #include "lldb/lldb-private.h" namespace lldb_private { // The UnwindPlan object specifies how to unwind out of a function - where this // function saves the caller's register values before modifying them (for non- // volatile aka saved registers) and how to find this frame's Canonical Frame // Address (CFA) or Aligned Frame Address (AFA). // CFA is a DWARF's Canonical Frame Address. // Most commonly, registers are saved on the stack, offset some bytes from the // Canonical Frame Address, or CFA, which is the starting address of this // function's stack frame (the CFA is same as the eh_frame's CFA, whatever that // may be on a given architecture). The CFA address for the stack frame does // not change during the lifetime of the function. // AFA is an artificially introduced Aligned Frame Address. // It is used only for stack frames with realignment (e.g. when some of the // locals has an alignment requirement higher than the stack alignment right // after the function call). It is used to access register values saved on the // stack after the realignment (and so they are inaccessible through the CFA). // AFA usually equals the stack pointer value right after the realignment. // Internally, the UnwindPlan is structured as a vector of register locations // organized by code address in the function, showing which registers have been // saved at that point and where they are saved. It can be thought of as the // expanded table form of the DWARF CFI encoded information. // Other unwind information sources will be converted into UnwindPlans before // being added to a FuncUnwinders object. The unwind source may be an eh_frame // FDE, a DWARF debug_frame FDE, or assembly language based prologue analysis. // The UnwindPlan is the canonical form of this information that the unwinder // code will use when walking the stack. class UnwindPlan { … }; // class UnwindPlan } // namespace lldb_private #endif // LLDB_SYMBOL_UNWINDPLAN_H