27#define ENUM_TO_CSTR(e) \
44 return "<unknown CFIProgram::OperandType>";
52 "operand index %" PRIu32
" is not valid",
55 uint64_t Operand =
Ops[OperandIdx];
61 "op[%" PRIu32
"] has type %s which has no value",
70 "op[%" PRIu32
"] has OperandType OT_Offset which produces a signed "
71 "result, call getOperandAsSigned instead",
81 const uint64_t CodeAlignmentFactor = CFIP.
codeAlign();
82 if (CodeAlignmentFactor == 0)
85 "op[%" PRIu32
"] has type OT_FactoredCodeOffset but code alignment "
88 return Operand * CodeAlignmentFactor;
99 "operand index %" PRIu32
" is not valid",
102 uint64_t Operand =
Ops[OperandIdx];
108 "op[%" PRIu32
"] has type %s which has no value",
117 "op[%" PRIu32
"] has OperandType %s which produces an unsigned result, "
118 "call getOperandAsUnsigned instead",
122 return (int64_t)Operand;
126 const int64_t DataAlignmentFactor = CFIP.
dataAlign();
127 if (DataAlignmentFactor == 0)
129 "op[%" PRIu32
"] has type %s but data "
132 return int64_t(Operand) * DataAlignmentFactor;
136 const int64_t CodeAlignmentFactor = CFIP.
codeAlign();
137 if (CodeAlignmentFactor == 0)
139 "op[%" PRIu32
"] has type %s but code "
142 return int64_t(Operand) * CodeAlignmentFactor;
146 const int64_t DataAlignmentFactor = CFIP.
dataAlign();
147 if (DataAlignmentFactor == 0)
150 "] has type OT_UnsignedFactDataOffset but data "
153 return Operand * DataAlignmentFactor;
161 static constexpr auto Table = [] {
162 std::array<OperandType[MaxOperands], DW_CFA_restore + 1> OpTypes{};
164#define DECLARE_OP3(OP, OPTYPE0, OPTYPE1, OPTYPE2) \
166 OpTypes[OP][0] = OPTYPE0; \
167 OpTypes[OP][1] = OPTYPE1; \
168 OpTypes[OP][2] = OPTYPE2; \
170#define DECLARE_OP2(OP, OPTYPE0, OPTYPE1) \
171 DECLARE_OP3(OP, OPTYPE0, OPTYPE1, OT_None)
172#define DECLARE_OP1(OP, OPTYPE0) DECLARE_OP2(OP, OPTYPE0, OT_None)
173#define DECLARE_OP0(OP) DECLARE_OP1(OP, OT_None)
207 DECLARE_OP0(DW_CFA_AARCH64_negate_ra_state_with_pc);
#define DECLARE_OP3(OP, OPTYPE0, OPTYPE1, OPTYPE2)
#define DECLARE_OP2(OP, OPTYPE0, OPTYPE1)
#define DECLARE_OP1(OP, OPTYPE0)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Tagged union holding either a T or a Error.
Represent a constant reference to a string, i.e.
The instances of the Type class are immutable: once they are created, they are never changed.
OperandType
Types of operands to CFI instructions In DWARF, this type is implicitly tied to a CFI instruction opc...
@ OT_SignedFactCodeOffset
@ OT_SignedFactDataOffset
@ OT_UnsignedFactDataOffset
uint64_t codeAlign() const
static constexpr size_t MaxOperands
static LLVM_ABI ArrayRef< OperandType[MaxOperands]> getOperandTypes()
Retrieve the array describing the types of operands according to the enum above.
CFIProgram(uint64_t CodeAlignmentFactor, int64_t DataAlignmentFactor, Triple::ArchType Arch)
int64_t dataAlign() const
static LLVM_ABI const char * operandTypeString(OperandType OT)
Get the OperandType as a "const char *".
LLVM_ABI StringRef callFrameString(unsigned Opcode) const
Get a DWARF CFI call frame string for the given DW_CFA opcode.
LLVM_ABI StringRef CallFrameString(unsigned Encoding, Triple::ArchType Arch)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Calculates the starting offsets for various sections within the .debug_names section.
This is an optimization pass for GlobalISel generic memory operations.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI Expected< uint64_t > getOperandAsUnsigned(const CFIProgram &CFIP, uint32_t OperandIdx) const
LLVM_ABI Expected< int64_t > getOperandAsSigned(const CFIProgram &CFIP, uint32_t OperandIdx) const