LLVM 20.0.0git
|
A class that represents a location for the Call Frame Address (CFA) or a register. More...
#include "llvm/DebugInfo/DWARF/DWARFDebugFrame.h"
Public Types | |
enum | Location { Unspecified , Undefined , Same , CFAPlusOffset , RegPlusOffset , DWARFExpr , Constant } |
Public Member Functions | |
Location | getLocation () const |
uint32_t | getRegister () const |
int32_t | getOffset () const |
uint32_t | getAddressSpace () const |
int32_t | getConstant () const |
void | setRegister (uint32_t NewRegNum) |
Some opcodes will modify the CFA location's register only, so we need to be able to modify the CFA register when evaluating DWARF Call Frame Information opcodes. | |
void | setOffset (int32_t NewOffset) |
Some opcodes will modify the CFA location's offset only, so we need to be able to modify the CFA offset when evaluating DWARF Call Frame Information opcodes. | |
void | setConstant (int32_t Value) |
Some opcodes modify a constant value and we need to be able to update the constant value (DW_CFA_GNU_window_save which is also known as. | |
std::optional< DWARFExpression > | getDWARFExpressionBytes () const |
void | dump (raw_ostream &OS, DIDumpOptions DumpOpts) const |
Dump a location expression as text and use the register information if some is provided. | |
bool | operator== (const UnwindLocation &RHS) const |
Static Public Member Functions | |
static UnwindLocation | createUnspecified () |
Create a location whose rule is set to Unspecified. | |
static UnwindLocation | createUndefined () |
Create a location where the value is undefined and not available. | |
static UnwindLocation | createSame () |
Create a location where the value is known to be in the register itself. | |
static UnwindLocation | createIsCFAPlusOffset (int32_t Off) |
Create a location that is in (Deref == false) or at (Deref == true) the CFA plus an offset. | |
static UnwindLocation | createAtCFAPlusOffset (int32_t Off) |
static UnwindLocation | createIsRegisterPlusOffset (uint32_t Reg, int32_t Off, std::optional< uint32_t > AddrSpace=std::nullopt) |
Create a location where the saved value is in (Deref == false) or at (Deref == true) a regiser plus an offset and, optionally, in the specified address space (used mostly for the CFA). | |
static UnwindLocation | createAtRegisterPlusOffset (uint32_t Reg, int32_t Off, std::optional< uint32_t > AddrSpace=std::nullopt) |
static UnwindLocation | createIsDWARFExpression (DWARFExpression Expr) |
Create a location whose value is the result of evaluating a DWARF expression. | |
static UnwindLocation | createAtDWARFExpression (DWARFExpression Expr) |
static UnwindLocation | createIsConstant (int32_t Value) |
A class that represents a location for the Call Frame Address (CFA) or a register.
This is decoded from the DWARF Call Frame Information instructions and put into an UnwindRow.
Definition at line 36 of file DWARFDebugFrame.h.
Enumerator | |
---|---|
Unspecified | Not specified. |
Undefined | Register is not available and can't be recovered. |
Same | Register value is in the register, nothing needs to be done to unwind it: reg = reg. |
CFAPlusOffset | Register is in or at the CFA plus an offset: reg = CFA + offset reg = defef(CFA + offset) |
RegPlusOffset | Register or CFA is in or at a register plus offset, optionally in an address space: reg = reg + offset [in addrspace] reg = deref(reg + offset [in addrspace]) |
DWARFExpr | Register or CFA value is in or at a value found by evaluating a DWARF expression: reg = eval(dwarf_expr) reg = deref(eval(dwarf_expr)) |
Constant | Value is a constant value contained in "Offset": reg = Offset. |
Definition at line 38 of file DWARFDebugFrame.h.
|
static |
Definition at line 57 of file DWARFDebugFrame.cpp.
References CFAPlusOffset, and llvm::dwarf::InvalidRegisterNumber.
|
static |
Definition at line 77 of file DWARFDebugFrame.cpp.
|
static |
Definition at line 68 of file DWARFDebugFrame.cpp.
References RegPlusOffset.
|
static |
Create a location that is in (Deref == false) or at (Deref == true) the CFA plus an offset.
Most registers that are spilled onto the stack use this rule. The rule for the register will use this rule and specify a unique offset from the CFA with Deref set to true. This value will be relative to a CFA value which is typically defined using the register plus offset location.
Definition at line 53 of file DWARFDebugFrame.cpp.
References CFAPlusOffset, and llvm::dwarf::InvalidRegisterNumber.
|
static |
Definition at line 49 of file DWARFDebugFrame.cpp.
References Constant, and llvm::dwarf::InvalidRegisterNumber.
|
static |
Create a location whose value is the result of evaluating a DWARF expression.
This allows complex expressions to be evaluated in order to unwind a register or CFA value.
Definition at line 73 of file DWARFDebugFrame.cpp.
|
static |
Create a location where the saved value is in (Deref == false) or at (Deref == true) a regiser plus an offset and, optionally, in the specified address space (used mostly for the CFA).
The CFA is usually defined using this rule by using the stack pointer or frame pointer as the register, with an offset that accounts for all spilled registers and all local variables in a function, and Deref == false.
Definition at line 62 of file DWARFDebugFrame.cpp.
References RegPlusOffset.
|
static |
Create a location where the value is known to be in the register itself.
Definition at line 47 of file DWARFDebugFrame.cpp.
References Same.
|
static |
Create a location where the value is undefined and not available.
This can happen when a register is volatile and can't be recovered.
Definition at line 45 of file DWARFDebugFrame.cpp.
References Undefined.
|
static |
Create a location whose rule is set to Unspecified.
This means the register value might be in the same register but it wasn't specified in the unwind opcodes.
Definition at line 43 of file DWARFDebugFrame.cpp.
References Unspecified.
void UnwindLocation::dump | ( | raw_ostream & | OS, |
DIDumpOptions | DumpOpts | ||
) | const |
Dump a location expression as text and use the register information if some is provided.
OS | the stream to use for output. |
MRI | register information that helps emit register names insteead of raw register numbers. |
IsEH | true if the DWARF Call Frame Information is from .eh_frame instead of from .debug_frame. This is needed for register number conversion because some register numbers differ between the two sections for certain architectures like x86. |
Definition at line 81 of file DWARFDebugFrame.cpp.
References CFAPlusOffset, Constant, DWARFExpr, OS, printRegister(), RegPlusOffset, Same, Undefined, and Unspecified.
Referenced by llvm::dwarf::UnwindRow::dump(), and llvm::dwarf::operator<<().
|
inline |
Definition at line 134 of file DWARFDebugFrame.h.
References assert(), and RegPlusOffset.
|
inline |
Definition at line 138 of file DWARFDebugFrame.h.
|
inline |
Definition at line 152 of file DWARFDebugFrame.h.
|
inline |
Definition at line 131 of file DWARFDebugFrame.h.
|
inline |
Definition at line 133 of file DWARFDebugFrame.h.
|
inline |
Definition at line 132 of file DWARFDebugFrame.h.
bool UnwindLocation::operator== | ( | const UnwindLocation & | RHS | ) | const |
Definition at line 131 of file DWARFDebugFrame.cpp.
References CFAPlusOffset, Constant, DWARFExpr, RegPlusOffset, RHS, Same, Undefined, and Unspecified.
|
inline |
Some opcodes modify a constant value and we need to be able to update the constant value (DW_CFA_GNU_window_save which is also known as.
Definition at line 150 of file DWARFDebugFrame.h.
|
inline |
Some opcodes will modify the CFA location's offset only, so we need to be able to modify the CFA offset when evaluating DWARF Call Frame Information opcodes.
Definition at line 146 of file DWARFDebugFrame.h.
|
inline |
Some opcodes will modify the CFA location's register only, so we need to be able to modify the CFA register when evaluating DWARF Call Frame Information opcodes.
Definition at line 142 of file DWARFDebugFrame.h.