87 std::vector<std::pair<UnwindLocation, RegisterLocations>> States;
89 switch (Inst.Opcode) {
90 case dwarf::DW_CFA_set_loc: {
101 if (*NewAddress <= Row.getAddress())
104 "%s with adrress 0x%" PRIx64
" which must be greater than the "
105 "current row address 0x%" PRIx64,
109 Row.setAddress(*NewAddress);
113 case dwarf::DW_CFA_advance_loc:
114 case dwarf::DW_CFA_advance_loc1:
115 case dwarf::DW_CFA_advance_loc2:
116 case dwarf::DW_CFA_advance_loc4: {
126 return Offset.takeError();
127 Row.slideAddress(*
Offset);
131 case dwarf::DW_CFA_restore:
132 case dwarf::DW_CFA_restore_extended: {
137 if (InitialLocs ==
nullptr)
144 if (std::optional<UnwindLocation> O =
146 Row.getRegisterLocations().setRegisterLocation(*RegNum, *O);
148 Row.getRegisterLocations().removeRegisterLocation(*RegNum);
152 case dwarf::DW_CFA_offset:
153 case dwarf::DW_CFA_offset_extended:
154 case dwarf::DW_CFA_offset_extended_sf: {
160 return Offset.takeError();
161 Row.getRegisterLocations().setRegisterLocation(
166 case dwarf::DW_CFA_nop:
169 case dwarf::DW_CFA_remember_state:
171 std::make_pair(Row.getCFAValue(), Row.getRegisterLocations()));
174 case dwarf::DW_CFA_restore_state:
177 "DW_CFA_restore_state without a matching "
178 "previous DW_CFA_remember_state");
179 Row.getCFAValue() = States.back().first;
180 Row.getRegisterLocations() = States.back().second;
184 case dwarf::DW_CFA_GNU_window_save:
195 constexpr uint32_t AArch64DWARFPAuthRaState = 34;
196 auto LRLoc = Row.getRegisterLocations().getRegisterLocation(
197 AArch64DWARFPAuthRaState);
201 LRLoc->setConstant(LRLoc->getConstant() ^ 1);
202 Row.getRegisterLocations().setRegisterLocation(
203 AArch64DWARFPAuthRaState, *LRLoc);
207 "%s encountered when existing rule for this register is not "
212 Row.getRegisterLocations().setRegisterLocation(
221 for (
uint32_t RegNum = 16; RegNum < 32; ++RegNum) {
222 Row.getRegisterLocations().setRegisterLocation(
230 "DW_CFA opcode %#x is not supported for architecture %s",
238 case dwarf::DW_CFA_AARCH64_negate_ra_state_with_pc: {
239 constexpr uint32_t AArch64DWARFPAuthRaState = 34;
240 auto LRLoc = Row.getRegisterLocations().getRegisterLocation(
241 AArch64DWARFPAuthRaState);
245 LRLoc->setConstant(LRLoc->getConstant() ^ 0x3);
249 "%s encountered when existing rule for this register is not "
254 Row.getRegisterLocations().setRegisterLocation(
260 case dwarf::DW_CFA_AARCH64_set_ra_state: {
261 constexpr uint32_t AArch64DWARFPAuthRaState = 34;
265 Row.getRegisterLocations().setRegisterLocation(
266 AArch64DWARFPAuthRaState,
271 case dwarf::DW_CFA_undefined: {
275 Row.getRegisterLocations().setRegisterLocation(
280 case dwarf::DW_CFA_same_value: {
284 Row.getRegisterLocations().setRegisterLocation(
289 case dwarf::DW_CFA_GNU_args_size:
292 case dwarf::DW_CFA_register: {
299 Row.getRegisterLocations().setRegisterLocation(
304 case dwarf::DW_CFA_val_offset:
305 case dwarf::DW_CFA_val_offset_sf: {
311 return Offset.takeError();
312 Row.getRegisterLocations().setRegisterLocation(
317 case dwarf::DW_CFA_expression: {
321 Row.getRegisterLocations().setRegisterLocation(
326 case dwarf::DW_CFA_val_expression: {
330 Row.getRegisterLocations().setRegisterLocation(
335 case dwarf::DW_CFA_def_cfa_register: {
343 Row.getCFAValue().setRegister(*RegNum);
347 case dwarf::DW_CFA_def_cfa_offset:
348 case dwarf::DW_CFA_def_cfa_offset_sf: {
351 return Offset.takeError();
355 "%s found when CFA rule was not RegPlusOffset",
358 Row.getCFAValue().setOffset(*
Offset);
362 case dwarf::DW_CFA_def_cfa:
363 case dwarf::DW_CFA_def_cfa_sf: {
369 return Offset.takeError();
375 case dwarf::DW_CFA_LLVM_def_aspace_cfa:
376 case dwarf::DW_CFA_LLVM_def_aspace_cfa_sf: {
382 return Offset.takeError();
384 Inst.getOperandAsUnsigned(CFIP, 2);
388 *RegNum, *
Offset, *CFAAddrSpace);
392 case dwarf::DW_CFA_def_cfa_expression: