authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-07 00:27:30-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-08 07:36:20-04:00
log1c53f0a6b0b1866663346c473da310203a317e90
tree644d65cce65e01c21f5dc6dec766e995f24a86b1
parent406c4035435657aaefe6f8e96642d0db326c7989

Dwarf: workaround crash


2 files changed, 29 insertions(+), 28 deletions(-)

src/link/Dwarf.zig+29-25
...@@ -526,7 +526,7 @@ pub const DeclState = struct {...@@ -526,7 +526,7 @@ pub const DeclState = struct {
526 .ErrorUnion => {526 .ErrorUnion => {
527 const error_ty = ty.errorUnionSet();527 const error_ty = ty.errorUnionSet();
528 const payload_ty = ty.errorUnionPayload();528 const payload_ty = ty.errorUnionPayload();
529 const payload_align = payload_ty.abiAlignment(target);529 const payload_align = if (payload_ty.isNoReturn()) 0 else payload_ty.abiAlignment(target);
530 const error_align = Type.anyerror.abiAlignment(target);530 const error_align = Type.anyerror.abiAlignment(target);
531 const abi_size = ty.abiSize(target);531 const abi_size = ty.abiSize(target);
532 const payload_off = if (error_align >= payload_align) Type.anyerror.abiSize(target) else 0;532 const payload_off = if (error_align >= payload_align) Type.anyerror.abiSize(target) else 0;
...@@ -540,31 +540,35 @@ pub const DeclState = struct {...@@ -540,31 +540,35 @@ pub const DeclState = struct {
540 const name = try ty.nameAllocArena(arena, module);540 const name = try ty.nameAllocArena(arena, module);
541 try dbg_info_buffer.writer().print("{s}\x00", .{name});541 try dbg_info_buffer.writer().print("{s}\x00", .{name});
542542
543 // DW.AT.member543 if (!payload_ty.isNoReturn()) {
544 try dbg_info_buffer.ensureUnusedCapacity(7);544 // DW.AT.member
545 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_member));545 try dbg_info_buffer.ensureUnusedCapacity(7);
546 // DW.AT.name, DW.FORM.string546 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_member));
547 dbg_info_buffer.appendSliceAssumeCapacity("value");547 // DW.AT.name, DW.FORM.string
548 dbg_info_buffer.appendAssumeCapacity(0);548 dbg_info_buffer.appendSliceAssumeCapacity("value");
549 // DW.AT.type, DW.FORM.ref4549 dbg_info_buffer.appendAssumeCapacity(0);
550 var index = dbg_info_buffer.items.len;550 // DW.AT.type, DW.FORM.ref4
551 try dbg_info_buffer.resize(index + 4);551 const index = dbg_info_buffer.items.len;
552 try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index));552 try dbg_info_buffer.resize(index + 4);
553 // DW.AT.data_member_location, DW.FORM.sdata553 try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index));
554 try leb128.writeULEB128(dbg_info_buffer.writer(), payload_off);554 // DW.AT.data_member_location, DW.FORM.sdata
555 try leb128.writeULEB128(dbg_info_buffer.writer(), payload_off);
556 }
555557
556 // DW.AT.member558 {
557 try dbg_info_buffer.ensureUnusedCapacity(5);559 // DW.AT.member
558 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_member));560 try dbg_info_buffer.ensureUnusedCapacity(5);
559 // DW.AT.name, DW.FORM.string561 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_member));
560 dbg_info_buffer.appendSliceAssumeCapacity("err");562 // DW.AT.name, DW.FORM.string
561 dbg_info_buffer.appendAssumeCapacity(0);563 dbg_info_buffer.appendSliceAssumeCapacity("err");
562 // DW.AT.type, DW.FORM.ref4564 dbg_info_buffer.appendAssumeCapacity(0);
563 index = dbg_info_buffer.items.len;565 // DW.AT.type, DW.FORM.ref4
564 try dbg_info_buffer.resize(index + 4);566 const index = dbg_info_buffer.items.len;
565 try self.addTypeRelocGlobal(atom_index, error_ty, @intCast(u32, index));567 try dbg_info_buffer.resize(index + 4);
566 // DW.AT.data_member_location, DW.FORM.sdata568 try self.addTypeRelocGlobal(atom_index, error_ty, @intCast(u32, index));
567 try leb128.writeULEB128(dbg_info_buffer.writer(), error_off);569 // DW.AT.data_member_location, DW.FORM.sdata
570 try leb128.writeULEB128(dbg_info_buffer.writer(), error_off);
571 }
568572
569 // DW.AT.structure_type delimit children573 // DW.AT.structure_type delimit children
570 try dbg_info_buffer.append(0);574 try dbg_info_buffer.append(0);
test/behavior/error.zig-3
...@@ -757,7 +757,6 @@ test "error union of noreturn used with if" {...@@ -757,7 +757,6 @@ test "error union of noreturn used with if" {
757 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO757 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
758 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO758 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
759 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO759 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
760 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
761 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO760 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
762761
763 NoReturn.a = 64;762 NoReturn.a = 64;
...@@ -772,7 +771,6 @@ test "error union of noreturn used with try" {...@@ -772,7 +771,6 @@ test "error union of noreturn used with try" {
772 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO771 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
773 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO772 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
774 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO773 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
775 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
776 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO774 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
777775
778 NoReturn.a = 64;776 NoReturn.a = 64;
...@@ -784,7 +782,6 @@ test "error union of noreturn used with catch" {...@@ -784,7 +782,6 @@ test "error union of noreturn used with catch" {
784 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO782 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
785 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO783 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
786 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO784 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
787 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
788 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO785 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
789786
790 NoReturn.a = 64;787 NoReturn.a = 64;