LLVM
8.0.1
|
Base class containing the logic for constructing DWARF expressions independently of whether they are emitted into a DIE or into a .debug_loc entry. More...
#include "CodeGen/AsmPrinter/DwarfExpression.h"
Classes | |
struct | Register |
Holds information about all subregisters comprising a register location. More... | |
Public Member Functions | |
DwarfExpression (unsigned DwarfVersion) | |
void | finalize () |
This needs to be called last to commit any pending changes. More... | |
void | addSignedConstant (int64_t Value) |
Emit a signed constant. More... | |
void | addUnsignedConstant (uint64_t Value) |
Emit an unsigned constant. More... | |
void | addUnsignedConstant (const APInt &Value) |
Emit an unsigned constant. More... | |
bool | isMemoryLocation () const |
bool | isUnknownLocation () const |
void | setMemoryLocationKind () |
Lock this down to become a memory location description. More... | |
bool | addMachineRegExpression (const TargetRegisterInfo &TRI, DIExpressionCursor &Expr, unsigned MachineReg, unsigned FragmentOffsetInBits=0) |
Emit a machine register location. More... | |
void | addExpression (DIExpressionCursor &&Expr, unsigned FragmentOffsetInBits=0) |
Emit all remaining operations in the DIExpressionCursor. More... | |
void | addFragmentOffset (const DIExpression *Expr) |
If applicable, emit an empty DW_OP_piece / DW_OP_bit_piece to advance to the fragment described by Expr . More... | |
Protected Types | |
enum | { Unknown = 0, Register, Memory, Implicit } |
The kind of location description being produced. More... | |
Protected Member Functions | |
void | setSubRegisterPiece (unsigned SizeInBits, unsigned OffsetInBits) |
Push a DW_OP_piece / DW_OP_bit_piece for emitting later, if one is needed to represent a subregister. More... | |
void | maskSubRegister () |
Add masking operations to stencil out a subregister. More... | |
virtual void | emitOp (uint8_t Op, const char *Comment=nullptr)=0 |
Output a dwarf operand and an optional assembler comment. More... | |
virtual void | emitSigned (int64_t Value)=0 |
Emit a raw signed value. More... | |
virtual void | emitUnsigned (uint64_t Value)=0 |
Emit a raw unsigned value. More... | |
void | emitConstu (uint64_t Value) |
Emit a normalized unsigned constant. More... | |
virtual bool | isFrameRegister (const TargetRegisterInfo &TRI, unsigned MachineReg)=0 |
Return whether the given machine register is the frame register in the current function. More... | |
void | addReg (int DwarfReg, const char *Comment=nullptr) |
Emit a DW_OP_reg operation. More... | |
void | addBReg (int DwarfReg, int Offset) |
Emit a DW_OP_breg operation. More... | |
void | addFBReg (int Offset) |
Emit DW_OP_fbreg <Offset>. More... | |
bool | addMachineReg (const TargetRegisterInfo &TRI, unsigned MachineReg, unsigned MaxSize=~1U) |
Emit a partial DWARF register operation. More... | |
void | addOpPiece (unsigned SizeInBits, unsigned OffsetInBits=0) |
Emit a DW_OP_piece or DW_OP_bit_piece operation for a variable fragment. More... | |
void | addShr (unsigned ShiftBy) |
Emit a shift-right dwarf operation. More... | |
void | addAnd (unsigned Mask) |
Emit a bitwise and dwarf operation. More... | |
void | addStackValue () |
Emit a DW_OP_stack_value, if supported. More... | |
~DwarfExpression ()=default | |
Protected Attributes | |
SmallVector< Register, 2 > | DwarfRegs |
The register location, if any. More... | |
uint64_t | OffsetInBits = 0 |
Current Fragment Offset in Bits. More... | |
unsigned | DwarfVersion |
unsigned | SubRegisterSizeInBits = 0 |
Sometimes we need to add a DW_OP_bit_piece to describe a subregister. More... | |
unsigned | SubRegisterOffsetInBits = 0 |
enum llvm::DwarfExpression:: { ... } | LocationKind = Unknown |
The kind of location description being produced. More... | |
Base class containing the logic for constructing DWARF expressions independently of whether they are emitted into a DIE or into a .debug_loc entry.
Definition at line 99 of file DwarfExpression.h.
|
protected |
The kind of location description being produced.
Enumerator | |
---|---|
Unknown | |
Register | |
Memory | |
Implicit |
Definition at line 120 of file DwarfExpression.h.
|
protecteddefault |
|
inline |
Definition at line 203 of file DwarfExpression.h.
References finalize.
|
protected |
Emit a bitwise and dwarf operation.
Definition at line 93 of file DwarfExpression.cpp.
References emitConstu(), and emitOp().
Referenced by maskSubRegister().
|
protected |
Emit a DW_OP_breg operation.
Definition at line 54 of file DwarfExpression.cpp.
References assert(), emitOp(), emitSigned(), emitUnsigned(), and LocationKind.
Referenced by addMachineRegExpression().
void DwarfExpression::addExpression | ( | DIExpressionCursor && | Expr, |
unsigned | FragmentOffsetInBits = 0 |
||
) |
Emit all remaining operations in the DIExpressionCursor.
FragmentOffsetInBits | If this is one fragment out of multiple locations, this is the offset of the fragment inside the entire variable. |
Definition at line 314 of file DwarfExpression.cpp.
References addOpPiece(), addStackValue(), assert(), llvm::dwarf::DW_OP_LLVM_fragment, emitConstu(), emitOp(), emitUnsigned(), Implicit, isMemoryLocation(), llvm_unreachable, LocationKind, maskSubRegister(), Memory, N, OffsetInBits, setSubRegisterPiece(), SubRegisterOffsetInBits, SubRegisterSizeInBits, and Unknown.
Referenced by llvm::DwarfCompileUnit::addAddress(), llvm::DwarfCompileUnit::addComplexAddress(), llvm::DwarfCompileUnit::constructLabelDIE(), and emitDebugLocValue().
|
protected |
Emit DW_OP_fbreg <Offset>.
Definition at line 66 of file DwarfExpression.cpp.
References emitOp(), and emitSigned().
Referenced by addMachineRegExpression().
void DwarfExpression::addFragmentOffset | ( | const DIExpression * | Expr | ) |
If applicable, emit an empty DW_OP_piece / DW_OP_bit_piece to advance to the fragment described by Expr
.
Definition at line 429 of file DwarfExpression.cpp.
References addOpPiece(), assert(), llvm::DIExpression::getFragmentInfo(), llvm::DIExpression::isFragment(), and OffsetInBits.
Referenced by llvm::DwarfCompileUnit::addComplexAddress(), llvm::DwarfCompileUnit::constructLabelDIE(), and emitDebugLocValue().
|
protected |
Emit a partial DWARF register operation.
MachineReg | The register number. |
MaxSize | If the register must be composed from sub-registers this is an upper bound for how many bits the emitted DW_OP_piece may cover. |
If size and offset is zero an operation for the entire register is emitted: Some targets do not provide a DWARF register number for every register. If this is the case, this function will attempt to emit a DWARF register by emitting a fragment of a super-register or by piecing together multiple subregisters that alias the register.
Definition at line 98 of file DwarfExpression.cpp.
References DwarfRegs, llvm::MCRegisterInfo::getDwarfRegNum(), llvm::TargetRegisterInfo::getMinimalPhysRegClass(), llvm::TargetRegisterInfo::getRegSizeInBits(), llvm::MCRegisterInfo::getSubRegIdxOffset(), llvm::MCRegisterInfo::getSubRegIdxSize(), llvm::MCRegisterInfo::getSubRegIndex(), isFrameRegister(), llvm::TargetRegisterInfo::isPhysicalRegister(), llvm::MCRegisterInfo::DiffListIterator::isValid(), Reg, llvm::SmallBitVector::set(), setSubRegisterPiece(), Size, and llvm::SmallBitVector::test().
Referenced by addMachineRegExpression().
bool DwarfExpression::addMachineRegExpression | ( | const TargetRegisterInfo & | TRI, |
DIExpressionCursor & | Expr, | ||
unsigned | MachineReg, | ||
unsigned | FragmentOffsetInBits = 0 |
||
) |
Emit a machine register location.
As an optimization this may also consume the prefix of a DwarfExpression if a more efficient representation for combining the register location and the first operation exists.
FragmentOffsetInBits | If this is one fragment out of a fragmented location, this is the offset of the fragment inside the entire variable. |
Definition at line 219 of file DwarfExpression.cpp.
References addBReg(), addFBReg(), addMachineReg(), addOpPiece(), addReg(), llvm::any_of(), assert(), llvm::DIExpressionCursor::consume(), llvm::dwarf::DW_OP_LLVM_fragment, DwarfRegs, DwarfVersion, llvm::DIExpression::ExprOperand::getArg(), llvm::DIExpressionCursor::getFragmentInfo(), llvm::DIExpression::ExprOperand::getOp(), isFrameRegister(), LocationKind, N, llvm::DIExpressionCursor::peek(), llvm::DIExpressionCursor::peekNext(), Reg, SubRegisterSizeInBits, llvm::DIExpressionCursor::take(), and Unknown.
Referenced by llvm::DwarfCompileUnit::addAddress(), llvm::DwarfCompileUnit::addComplexAddress(), llvm::DwarfCompileUnit::constructLabelDIE(), and emitDebugLocValue().
Emit a DW_OP_piece or DW_OP_bit_piece operation for a variable fragment.
OffsetInBits | This is an optional offset into the location that is at the top of the DWARF stack. |
Definition at line 71 of file DwarfExpression.cpp.
References emitOp(), and emitUnsigned().
Referenced by addExpression(), addFragmentOffset(), addMachineRegExpression(), addUnsignedConstant(), and finalize().
Emit a DW_OP_reg operation.
Note that this is only legal inside a DWARF register location description.
Definition at line 41 of file DwarfExpression.cpp.
References assert(), emitOp(), emitUnsigned(), LocationKind, Register, and Unknown.
Referenced by addMachineRegExpression().
|
protected |
Emit a shift-right dwarf operation.
Definition at line 88 of file DwarfExpression.cpp.
References emitConstu(), and emitOp().
Referenced by maskSubRegister().
void DwarfExpression::addSignedConstant | ( | int64_t | Value | ) |
Emit a signed constant.
Definition at line 186 of file DwarfExpression.cpp.
References assert(), emitOp(), emitSigned(), Implicit, LocationKind, and Unknown.
Referenced by emitDebugLocValue().
|
protected |
Emit a DW_OP_stack_value, if supported.
The proper way to describe a constant value is DW_OP_constu <const>, DW_OP_stack_value. Unfortunately, DW_OP_stack_value was not available until DWARF 4, so we will continue to generate DW_OP_constu <const> for DWARF 2 and DWARF 3. Technically, this is incorrect since DW_OP_const <const> actually describes a value at a constant address, not a constant value. However, in the past there was no better way to describe a constant value, so the producers and consumers started to rely on heuristics to disambiguate the value vs. location status of the expression. See PR21176 for more details.
Definition at line 181 of file DwarfExpression.cpp.
References DwarfVersion, and emitOp().
Referenced by addExpression(), and addUnsignedConstant().
void DwarfExpression::addUnsignedConstant | ( | uint64_t | Value | ) |
Emit an unsigned constant.
Definition at line 193 of file DwarfExpression.cpp.
References assert(), emitConstu(), Implicit, LocationKind, and Unknown.
Referenced by addUnsignedConstant(), llvm::DwarfCompileUnit::constructLabelDIE(), and emitDebugLocValue().
Emit an unsigned constant.
Definition at line 199 of file DwarfExpression.cpp.
References addOpPiece(), addStackValue(), addUnsignedConstant(), assert(), llvm::Data, llvm::APInt::getBitWidth(), llvm::APInt::getRawData(), Implicit, LocationKind, Size, and Unknown.
|
protected |
Emit a normalized unsigned constant.
Definition at line 27 of file DwarfExpression.cpp.
References emitOp(), emitUnsigned(), and llvm::max().
Referenced by addAnd(), addExpression(), addShr(), and addUnsignedConstant().
|
protectedpure virtual |
Output a dwarf operand and an optional assembler comment.
Referenced by addAnd(), addBReg(), addExpression(), addFBReg(), addOpPiece(), addReg(), addShr(), addSignedConstant(), addStackValue(), and emitConstu().
|
protectedpure virtual |
Emit a raw signed value.
Referenced by addBReg(), addFBReg(), and addSignedConstant().
|
protectedpure virtual |
Emit a raw unsigned value.
Referenced by addBReg(), addExpression(), addOpPiece(), addReg(), and emitConstu().
void DwarfExpression::finalize | ( | ) |
This needs to be called last to commit any pending changes.
Definition at line 418 of file DwarfExpression.cpp.
References addOpPiece(), assert(), DwarfRegs, SubRegisterOffsetInBits, and SubRegisterSizeInBits.
Referenced by llvm::DIEDwarfExpression::finalize().
|
protectedpure virtual |
Return whether the given machine register is the frame register in the current function.
Referenced by addMachineReg(), and addMachineRegExpression().
|
inline |
Definition at line 217 of file DwarfExpression.h.
Referenced by addExpression().
|
inline |
Definition at line 218 of file DwarfExpression.h.
References llvm::Unknown.
|
protected |
Add masking operations to stencil out a subregister.
add masking operations to stencil out a subregister.
Definition at line 410 of file DwarfExpression.cpp.
References addAnd(), addShr(), assert(), llvm::BitmaskEnumDetail::Mask(), SubRegisterOffsetInBits, and SubRegisterSizeInBits.
Referenced by addExpression().
|
inline |
Lock this down to become a memory location description.
Definition at line 221 of file DwarfExpression.h.
References assert(), and llvm::Unknown.
Referenced by llvm::DwarfCompileUnit::addAddress(), llvm::DwarfCompileUnit::addComplexAddress(), llvm::DwarfCompileUnit::constructLabelDIE(), and emitDebugLocValue().
|
inlineprotected |
Push a DW_OP_piece / DW_OP_bit_piece for emitting later, if one is needed to represent a subregister.
Definition at line 124 of file DwarfExpression.h.
References llvm::BitmaskEnumDetail::Mask(), and TRI.
Referenced by addExpression(), and addMachineReg().
|
protected |
The register location, if any.
Definition at line 109 of file DwarfExpression.h.
Referenced by addMachineReg(), addMachineRegExpression(), and finalize().
|
protected |
Definition at line 113 of file DwarfExpression.h.
Referenced by addMachineRegExpression(), and addStackValue().
enum { ... } llvm::DwarfExpression::LocationKind |
The kind of location description being produced.
Referenced by addBReg(), addExpression(), addMachineRegExpression(), addReg(), addSignedConstant(), and addUnsignedConstant().
|
protected |
Current Fragment Offset in Bits.
Definition at line 112 of file DwarfExpression.h.
Referenced by addExpression(), and addFragmentOffset().
|
protected |
Definition at line 117 of file DwarfExpression.h.
Referenced by addExpression(), finalize(), and maskSubRegister().
|
protected |
Sometimes we need to add a DW_OP_bit_piece to describe a subregister.
Definition at line 116 of file DwarfExpression.h.
Referenced by addExpression(), addMachineRegExpression(), finalize(), and maskSubRegister().