| ... | @@ -460,7 +460,14 @@ pub const Instruction = union(enum) { | ... | @@ -460,7 +460,14 @@ pub const Instruction = union(enum) { |
| 460 | .def_cfa_expression => .{ .def_cfa_expr = try reader.takeLeb128(usize) }, | 460 | .def_cfa_expression => .{ .def_cfa_expr = try reader.takeLeb128(usize) }, |
| 461 | | 461 | |
| 462 | _ => switch (@backingInt(inst.low.extended)) { | 462 | _ => switch (@backingInt(inst.low.extended)) { |
| 463 | 0x1C...0x3F => return error.UnimplementedUserOpcode, | 463 | // For the moment, we just ignore these so that they don't cause unwinding to |
| | 464 | // fail; `SelfUnwinder` already unconditionally strips pointer authentication |
| | 465 | // codes. If this code is ever extended to be useful for remote/offline |
| | 466 | // unwinding, we will have to actually model the RA sign state properly. |
| | 467 | 0x2C => .nop, // DW_CFA_AARCH64_negate_ra_state_with_pc |
| | 468 | 0x2D => .nop, // DW_CFA_AARCH64_negate_ra_state |
| | 469 | |
| | 470 | 0x1C...0x2B, 0x2E...0x3F => return error.UnimplementedUserOpcode, |
| 464 | else => return error.InvalidOpcode, | 471 | else => return error.InvalidOpcode, |
| 465 | }, | 472 | }, |
| 466 | }, | 473 | }, |