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 {
526526 .ErrorUnion => {
527527 const error_ty = ty.errorUnionSet();
528528 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);
530530 const error_align = Type.anyerror.abiAlignment(target);
531531 const abi_size = ty.abiSize(target);
532532 const payload_off = if (error_align >= payload_align) Type.anyerror.abiSize(target) else 0;
......@@ -540,31 +540,35 @@ pub const DeclState = struct {
540540 const name = try ty.nameAllocArena(arena, module);
541541 try dbg_info_buffer.writer().print("{s}\x00", .{name});
542542
543 // DW.AT.member
544 try dbg_info_buffer.ensureUnusedCapacity(7);
545 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_member));
546 // DW.AT.name, DW.FORM.string
547 dbg_info_buffer.appendSliceAssumeCapacity("value");
548 dbg_info_buffer.appendAssumeCapacity(0);
549 // DW.AT.type, DW.FORM.ref4
550 var index = dbg_info_buffer.items.len;
551 try dbg_info_buffer.resize(index + 4);
552 try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index));
553 // DW.AT.data_member_location, DW.FORM.sdata
554 try leb128.writeULEB128(dbg_info_buffer.writer(), payload_off);
543 if (!payload_ty.isNoReturn()) {
544 // DW.AT.member
545 try dbg_info_buffer.ensureUnusedCapacity(7);
546 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_member));
547 // DW.AT.name, DW.FORM.string
548 dbg_info_buffer.appendSliceAssumeCapacity("value");
549 dbg_info_buffer.appendAssumeCapacity(0);
550 // DW.AT.type, DW.FORM.ref4
551 const index = dbg_info_buffer.items.len;
552 try dbg_info_buffer.resize(index + 4);
553 try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index));
554 // DW.AT.data_member_location, DW.FORM.sdata
555 try leb128.writeULEB128(dbg_info_buffer.writer(), payload_off);
556 }
555557
556 // DW.AT.member
557 try dbg_info_buffer.ensureUnusedCapacity(5);
558 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_member));
559 // DW.AT.name, DW.FORM.string
560 dbg_info_buffer.appendSliceAssumeCapacity("err");
561 dbg_info_buffer.appendAssumeCapacity(0);
562 // DW.AT.type, DW.FORM.ref4
563 index = dbg_info_buffer.items.len;
564 try dbg_info_buffer.resize(index + 4);
565 try self.addTypeRelocGlobal(atom_index, error_ty, @intCast(u32, index));
566 // DW.AT.data_member_location, DW.FORM.sdata
567 try leb128.writeULEB128(dbg_info_buffer.writer(), error_off);
558 {
559 // DW.AT.member
560 try dbg_info_buffer.ensureUnusedCapacity(5);
561 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_member));
562 // DW.AT.name, DW.FORM.string
563 dbg_info_buffer.appendSliceAssumeCapacity("err");
564 dbg_info_buffer.appendAssumeCapacity(0);
565 // DW.AT.type, DW.FORM.ref4
566 const index = dbg_info_buffer.items.len;
567 try dbg_info_buffer.resize(index + 4);
568 try self.addTypeRelocGlobal(atom_index, error_ty, @intCast(u32, index));
569 // DW.AT.data_member_location, DW.FORM.sdata
570 try leb128.writeULEB128(dbg_info_buffer.writer(), error_off);
571 }
568572
569573 // DW.AT.structure_type delimit children
570574 try dbg_info_buffer.append(0);
test/behavior/error.zig-3
......@@ -757,7 +757,6 @@ test "error union of noreturn used with if" {
757757 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
758758 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
759759 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
760 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
761760 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
762761
763762 NoReturn.a = 64;
......@@ -772,7 +771,6 @@ test "error union of noreturn used with try" {
772771 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
773772 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
774773 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
775 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
776774 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
777775
778776 NoReturn.a = 64;
......@@ -784,7 +782,6 @@ test "error union of noreturn used with catch" {
784782 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
785783 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
786784 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
787 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
788785 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
789786
790787 NoReturn.a = 64;