Returns error.InvalidDebugInfo if the encoding is EH.PE.omit.
fn readEhPointer(r: *Reader, enc: EH.PE, addr_size_bytes: u8, ctx: EhPointerContext, endian: Endian) !u64
fn readEhPointer(r: *Reader, enc: EH.PE, addr_size_bytes: u8, ctx: EhPointerContext, endian: Endian) !u64 {
const offset = try readEhPointerAbs(r, enc.type, addr_size_bytes, endian);
if (enc.indirect) return bad(); // GCC extension; not supported
const base: u64 = switch (enc.rel) {
.abs, .aligned => 0,
.pcrel => ctx.pc_rel_base,
.textrel => ctx.text_rel_base orelse return bad(),
.datarel => ctx.data_rel_base orelse return bad(),
.funcrel => ctx.function_rel_base orelse return bad(),
_ => return bad(),
};
return switch (offset) {
.signed => |s| if (s >= 0)
try std.math.add(u64, base, @intCast(s))
else
try std.math.sub(u64, base, @intCast(-s)),
// absptr can actually contain signed values in some cases (aarch64 MachO)
.unsigned => |u| u +% base,
};
}