authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-06 17:20:05+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-08 18:08:25+02:00
logf74b21f0bd6919d4388b65e9cb88009da0a67859
tree29d6115351fe0f1eab22e905da6486f51a99f189
parent134c217a5bea8a7ac524d689e6d0ed34d12b4cef
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Elf2: fix targetLoad()/targetStore() to work with underaligned pointers


1 files changed, 10 insertions(+), 6 deletions(-)

src/link/Elf2.zig+10-6
......@@ -4108,27 +4108,31 @@ fn targetEndian(elf: *const Elf) std.lang.Endian {
41084108 };
41094109}
41104110fn targetLoad(elf: *const Elf, ptr: anytype) @typeInfo(@TypeOf(ptr)).pointer.child {
4111 const Child = @typeInfo(@TypeOf(ptr)).pointer.child;
4111 const pointer_ty = @typeInfo(@TypeOf(ptr)).pointer;
4112 const Child = pointer_ty.child;
4113 const alignment = pointer_ty.attrs.@"align" orelse @alignOf(Child);
41124114 return switch (@typeInfo(Child)) {
41134115 else => @compileError(@typeName(Child)),
41144116 .int => std.mem.toNative(Child, ptr.*, elf.targetEndian()),
4115 .@"enum" => |@"enum"| @enumFromInt(elf.targetLoad(@as(*@"enum".tag_type, @ptrCast(ptr)))),
4117 .@"enum" => |@"enum"| @enumFromInt(elf.targetLoad(@as(*align(alignment) @"enum".tag_type, @ptrCast(ptr)))),
41164118 .@"struct" => |@"struct"| @bitCast(
4117 elf.targetLoad(@as(*@"struct".backing_integer.?, @ptrCast(ptr))),
4119 elf.targetLoad(@as(*align(alignment) @"struct".backing_integer.?, @ptrCast(ptr))),
41184120 ),
41194121 };
41204122}
41214123fn targetStore(elf: *const Elf, ptr: anytype, val: @typeInfo(@TypeOf(ptr)).pointer.child) void {
4122 const Child = @typeInfo(@TypeOf(ptr)).pointer.child;
4124 const pointer_ty = @typeInfo(@TypeOf(ptr)).pointer;
4125 const Child = pointer_ty.child;
4126 const alignment = pointer_ty.attrs.@"align" orelse @alignOf(Child);
41234127 return switch (@typeInfo(Child)) {
41244128 else => @compileError(@typeName(Child)),
41254129 .int => ptr.* = std.mem.nativeTo(Child, val, elf.targetEndian()),
41264130 .@"enum" => |@"enum"| elf.targetStore(
4127 @as(*@"enum".tag_type, @ptrCast(ptr)),
4131 @as(*align(alignment) @"enum".tag_type, @ptrCast(ptr)),
41284132 @intFromEnum(val),
41294133 ),
41304134 .@"struct" => |@"struct"| elf.targetStore(
4131 @as(*@"struct".backing_integer.?, @ptrCast(ptr)),
4135 @as(*align(alignment) @"struct".backing_integer.?, @ptrCast(ptr)),
41324136 @bitCast(val),
41334137 ),
41344138 };