authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-13 03:42:20-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-15 03:07:51-04:00
log72b4657053f94222c735b7c51c380649ce23c30e
treef240b01ccac04f00addf7eb7746b03e9fc33aa0e
parent904ffb41de9caa3f8f99806518d719beef832b7c

Dwarf: fix overflow write byte_size


2 files changed, 47 insertions(+), 48 deletions(-)

src/link/Dwarf.zig+47-47
......@@ -184,12 +184,14 @@ pub const DeclState = struct {
184184 try dbg_info_buffer.append(@enumToInt(AbbrevKind.pad1));
185185 },
186186 .Bool => {
187 try dbg_info_buffer.appendSlice(&[_]u8{
188 @enumToInt(AbbrevKind.base_type),
189 DW.ATE.boolean, // DW.AT.encoding , DW.FORM.data1
190 1, // DW.AT.byte_size, DW.FORM.data1
191 'b', 'o', 'o', 'l', 0, // DW.AT.name, DW.FORM.string
192 });
187 try dbg_info_buffer.ensureUnusedCapacity(12);
188 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.base_type));
189 // DW.AT.encoding, DW.FORM.data1
190 dbg_info_buffer.appendAssumeCapacity(DW.ATE.boolean);
191 // DW.AT.byte_size, DW.FORM.udata
192 try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
193 // DW.AT.name, DW.FORM.string
194 try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)});
193195 },
194196 .Int => {
195197 const info = ty.intInfo(target);
......@@ -200,9 +202,9 @@ pub const DeclState = struct {
200202 .signed => DW.ATE.signed,
201203 .unsigned => DW.ATE.unsigned,
202204 });
203 // DW.AT.byte_size, DW.FORM.data1
204 dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(target)));
205 // DW.AT.name, DW.FORM.string
205 // DW.AT.byte_size, DW.FORM.udata
206 try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
207 // DW.AT.name, DW.FORM.string
206208 try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)});
207209 },
208210 .Optional => {
......@@ -211,9 +213,9 @@ pub const DeclState = struct {
211213 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.base_type));
212214 // DW.AT.encoding, DW.FORM.data1
213215 dbg_info_buffer.appendAssumeCapacity(DW.ATE.address);
214 // DW.AT.byte_size, DW.FORM.data1
215 dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(target)));
216 // DW.AT.name, DW.FORM.string
216 // DW.AT.byte_size, DW.FORM.udata
217 try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
218 // DW.AT.name, DW.FORM.string
217219 try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)});
218220 } else {
219221 // Non-pointer optionals are structs: struct { .maybe = *, .val = * }
......@@ -221,7 +223,7 @@ pub const DeclState = struct {
221223 const payload_ty = ty.optionalChild(buf);
222224 // DW.AT.structure_type
223225 try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type));
224 // DW.AT.byte_size, DW.FORM.sdata
226 // DW.AT.byte_size, DW.FORM.udata
225227 const abi_size = ty.abiSize(target);
226228 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
227229 // DW.AT.name, DW.FORM.string
......@@ -236,7 +238,7 @@ pub const DeclState = struct {
236238 var index = dbg_info_buffer.items.len;
237239 try dbg_info_buffer.resize(index + 4);
238240 try self.addTypeRelocGlobal(atom_index, Type.bool, @intCast(u32, index));
239 // DW.AT.data_member_location, DW.FORM.sdata
241 // DW.AT.data_member_location, DW.FORM.udata
240242 try dbg_info_buffer.ensureUnusedCapacity(6);
241243 dbg_info_buffer.appendAssumeCapacity(0);
242244 // DW.AT.member
......@@ -248,7 +250,7 @@ pub const DeclState = struct {
248250 index = dbg_info_buffer.items.len;
249251 try dbg_info_buffer.resize(index + 4);
250252 try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index));
251 // DW.AT.data_member_location, DW.FORM.sdata
253 // DW.AT.data_member_location, DW.FORM.udata
252254 const offset = abi_size - payload_ty.abiSize(target);
253255 try leb128.writeULEB128(dbg_info_buffer.writer(), offset);
254256 // DW.AT.structure_type delimit children
......@@ -263,8 +265,8 @@ pub const DeclState = struct {
263265 // DW.AT.structure_type
264266 try dbg_info_buffer.ensureUnusedCapacity(2);
265267 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_type));
266 // DW.AT.byte_size, DW.FORM.sdata
267 dbg_info_buffer.appendAssumeCapacity(ptr_bytes * 2);
268 // DW.AT.byte_size, DW.FORM.udata
269 try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
268270 // DW.AT.name, DW.FORM.string
269271 try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)});
270272 // DW.AT.member
......@@ -279,7 +281,7 @@ pub const DeclState = struct {
279281 var buf = try arena.create(Type.SlicePtrFieldTypeBuffer);
280282 const ptr_ty = ty.slicePtrFieldType(buf);
281283 try self.addTypeRelocGlobal(atom_index, ptr_ty, @intCast(u32, index));
282 // DW.AT.data_member_location, DW.FORM.sdata
284 // DW.AT.data_member_location, DW.FORM.udata
283285 try dbg_info_buffer.ensureUnusedCapacity(6);
284286 dbg_info_buffer.appendAssumeCapacity(0);
285287 // DW.AT.member
......@@ -291,7 +293,7 @@ pub const DeclState = struct {
291293 index = dbg_info_buffer.items.len;
292294 try dbg_info_buffer.resize(index + 4);
293295 try self.addTypeRelocGlobal(atom_index, Type.usize, @intCast(u32, index));
294 // DW.AT.data_member_location, DW.FORM.sdata
296 // DW.AT.data_member_location, DW.FORM.udata
295297 try dbg_info_buffer.ensureUnusedCapacity(2);
296298 dbg_info_buffer.appendAssumeCapacity(ptr_bytes);
297299 // DW.AT.structure_type delimit children
......@@ -329,9 +331,8 @@ pub const DeclState = struct {
329331 .Struct => blk: {
330332 // DW.AT.structure_type
331333 try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type));
332 // DW.AT.byte_size, DW.FORM.sdata
333 const abi_size = ty.abiSize(target);
334 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
334 // DW.AT.byte_size, DW.FORM.udata
335 try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
335336
336337 switch (ty.tag()) {
337338 .tuple, .anon_struct => {
......@@ -348,7 +349,7 @@ pub const DeclState = struct {
348349 var index = dbg_info_buffer.items.len;
349350 try dbg_info_buffer.resize(index + 4);
350351 try self.addTypeRelocGlobal(atom_index, field, @intCast(u32, index));
351 // DW.AT.data_member_location, DW.FORM.sdata
352 // DW.AT.data_member_location, DW.FORM.udata
352353 const field_off = ty.structFieldOffset(field_index, target);
353354 try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
354355 }
......@@ -380,7 +381,7 @@ pub const DeclState = struct {
380381 var index = dbg_info_buffer.items.len;
381382 try dbg_info_buffer.resize(index + 4);
382383 try self.addTypeRelocGlobal(atom_index, field.ty, @intCast(u32, index));
383 // DW.AT.data_member_location, DW.FORM.sdata
384 // DW.AT.data_member_location, DW.FORM.udata
384385 const field_off = ty.structFieldOffset(field_index, target);
385386 try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
386387 }
......@@ -393,9 +394,8 @@ pub const DeclState = struct {
393394 .Enum => {
394395 // DW.AT.enumeration_type
395396 try dbg_info_buffer.append(@enumToInt(AbbrevKind.enum_type));
396 // DW.AT.byte_size, DW.FORM.sdata
397 const abi_size = ty.abiSize(target);
398 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
397 // DW.AT.byte_size, DW.FORM.udata
398 try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
399399 // DW.AT.name, DW.FORM.string
400400 const enum_name = try ty.nameAllocArena(arena, module);
401401 try dbg_info_buffer.ensureUnusedCapacity(enum_name.len + 1);
......@@ -446,7 +446,7 @@ pub const DeclState = struct {
446446 if (is_tagged) {
447447 // DW.AT.structure_type
448448 try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type));
449 // DW.AT.byte_size, DW.FORM.sdata
449 // DW.AT.byte_size, DW.FORM.udata
450450 try leb128.writeULEB128(dbg_info_buffer.writer(), layout.abi_size);
451451 // DW.AT.name, DW.FORM.string
452452 try dbg_info_buffer.ensureUnusedCapacity(union_name.len + 1);
......@@ -463,13 +463,13 @@ pub const DeclState = struct {
463463 const inner_union_index = dbg_info_buffer.items.len;
464464 try dbg_info_buffer.resize(inner_union_index + 4);
465465 try self.addTypeRelocLocal(atom_index, @intCast(u32, inner_union_index), 5);
466 // DW.AT.data_member_location, DW.FORM.sdata
466 // DW.AT.data_member_location, DW.FORM.udata
467467 try leb128.writeULEB128(dbg_info_buffer.writer(), payload_offset);
468468 }
469469
470470 // DW.AT.union_type
471471 try dbg_info_buffer.append(@enumToInt(AbbrevKind.union_type));
472 // DW.AT.byte_size, DW.FORM.sdata,
472 // DW.AT.byte_size, DW.FORM.udata,
473473 try leb128.writeULEB128(dbg_info_buffer.writer(), layout.payload_size);
474474 // DW.AT.name, DW.FORM.string
475475 if (is_tagged) {
......@@ -490,7 +490,7 @@ pub const DeclState = struct {
490490 const index = dbg_info_buffer.items.len;
491491 try dbg_info_buffer.resize(index + 4);
492492 try self.addTypeRelocGlobal(atom_index, field.ty, @intCast(u32, index));
493 // DW.AT.data_member_location, DW.FORM.sdata
493 // DW.AT.data_member_location, DW.FORM.udata
494494 try dbg_info_buffer.append(0);
495495 }
496496 // DW.AT.union_type delimit children
......@@ -507,7 +507,7 @@ pub const DeclState = struct {
507507 const index = dbg_info_buffer.items.len;
508508 try dbg_info_buffer.resize(index + 4);
509509 try self.addTypeRelocGlobal(atom_index, union_obj.tag_ty, @intCast(u32, index));
510 // DW.AT.data_member_location, DW.FORM.sdata
510 // DW.AT.data_member_location, DW.FORM.udata
511511 try leb128.writeULEB128(dbg_info_buffer.writer(), tag_offset);
512512
513513 // DW.AT.structure_type delimit children
......@@ -534,7 +534,7 @@ pub const DeclState = struct {
534534
535535 // DW.AT.structure_type
536536 try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type));
537 // DW.AT.byte_size, DW.FORM.sdata
537 // DW.AT.byte_size, DW.FORM.udata
538538 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
539539 // DW.AT.name, DW.FORM.string
540540 const name = try ty.nameAllocArena(arena, module);
......@@ -551,7 +551,7 @@ pub const DeclState = struct {
551551 const index = dbg_info_buffer.items.len;
552552 try dbg_info_buffer.resize(index + 4);
553553 try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index));
554 // DW.AT.data_member_location, DW.FORM.sdata
554 // DW.AT.data_member_location, DW.FORM.udata
555555 try leb128.writeULEB128(dbg_info_buffer.writer(), payload_off);
556556 }
557557
......@@ -566,7 +566,7 @@ pub const DeclState = struct {
566566 const index = dbg_info_buffer.items.len;
567567 try dbg_info_buffer.resize(index + 4);
568568 try self.addTypeRelocGlobal(atom_index, error_ty, @intCast(u32, index));
569 // DW.AT.data_member_location, DW.FORM.sdata
569 // DW.AT.data_member_location, DW.FORM.udata
570570 try leb128.writeULEB128(dbg_info_buffer.writer(), error_off);
571571 }
572572
......@@ -647,8 +647,8 @@ pub const DeclState = struct {
647647
648648 try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
649649 const index = dbg_info.items.len;
650 try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4
651 try self.addTypeRelocGlobal(atom_index, ty, @intCast(u32, index)); // DW.AT.type, DW.FORM.ref4
650 try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4
651 try self.addTypeRelocGlobal(atom_index, ty, @intCast(u32, index)); // DW.AT.type, DW.FORM.ref4
652652 dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
653653 }
654654
......@@ -790,7 +790,7 @@ pub const DeclState = struct {
790790
791791 try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
792792 const index = dbg_info.items.len;
793 try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4
793 try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4
794794 try self.addTypeRelocGlobal(atom_index, child_ty, @intCast(u32, index));
795795 dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
796796 }
......@@ -993,13 +993,13 @@ pub fn initDeclState(self: *Dwarf, mod: *Module, decl_index: Module.Decl.Index)
993993 // "relocations" and have to be in this fixed place so that functions can be
994994 // moved in virtual address space.
995995 assert(dbg_info_low_pc_reloc_index == dbg_info_buffer.items.len);
996 dbg_info_buffer.items.len += ptr_width_bytes; // DW.AT.low_pc, DW.FORM.addr
996 dbg_info_buffer.items.len += ptr_width_bytes; // DW.AT.low_pc, DW.FORM.addr
997997 assert(self.getRelocDbgInfoSubprogramHighPC() == dbg_info_buffer.items.len);
998 dbg_info_buffer.items.len += 4; // DW.AT.high_pc, DW.FORM.data4
998 dbg_info_buffer.items.len += 4; // DW.AT.high_pc, DW.FORM.data4
999999 //
10001000 if (fn_ret_has_bits) {
10011001 try decl_state.addTypeRelocGlobal(di_atom_index, fn_ret_type, @intCast(u32, dbg_info_buffer.items.len));
1002 dbg_info_buffer.items.len += 4; // DW.AT.type, DW.FORM.ref4
1002 dbg_info_buffer.items.len += 4; // DW.AT.type, DW.FORM.ref4
10031003 }
10041004
10051005 dbg_info_buffer.appendSliceAssumeCapacity(decl_name_with_null); // DW.AT.name, DW.FORM.string
......@@ -1619,7 +1619,7 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void {
16191619 DW.AT.encoding,
16201620 DW.FORM.data1,
16211621 DW.AT.byte_size,
1622 DW.FORM.data1,
1622 DW.FORM.udata,
16231623 DW.AT.name,
16241624 DW.FORM.string,
16251625 0,
......@@ -1635,7 +1635,7 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void {
16351635 DW.TAG.structure_type,
16361636 DW.CHILDREN.yes, // header
16371637 DW.AT.byte_size,
1638 DW.FORM.sdata,
1638 DW.FORM.udata,
16391639 DW.AT.name,
16401640 DW.FORM.string,
16411641 0,
......@@ -1648,14 +1648,14 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void {
16481648 DW.AT.type,
16491649 DW.FORM.ref4,
16501650 DW.AT.data_member_location,
1651 DW.FORM.sdata,
1651 DW.FORM.udata,
16521652 0,
16531653 0, // table sentinel
16541654 @enumToInt(AbbrevKind.enum_type),
16551655 DW.TAG.enumeration_type,
16561656 DW.CHILDREN.yes, // header
16571657 DW.AT.byte_size,
1658 DW.FORM.sdata,
1658 DW.FORM.udata,
16591659 DW.AT.name,
16601660 DW.FORM.string,
16611661 0,
......@@ -1673,7 +1673,7 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void {
16731673 DW.TAG.union_type,
16741674 DW.CHILDREN.yes, // header
16751675 DW.AT.byte_size,
1676 DW.FORM.sdata,
1676 DW.FORM.udata,
16771677 DW.AT.name,
16781678 DW.FORM.string,
16791679 0,
......@@ -2628,7 +2628,7 @@ fn addDbgInfoErrorSet(
26282628
26292629 // DW.AT.enumeration_type
26302630 try dbg_info_buffer.append(@enumToInt(AbbrevKind.enum_type));
2631 // DW.AT.byte_size, DW.FORM.sdata
2631 // DW.AT.byte_size, DW.FORM.udata
26322632 const abi_size = Type.anyerror.abiSize(target);
26332633 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
26342634 // DW.AT.name, DW.FORM.string
test/behavior/int_comparison_elision.zig-1
......@@ -15,7 +15,6 @@ test "int comparison elision" {
1515
1616 // TODO: support int types > 128 bits wide in other backends
1717 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
18 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1918 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2019 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2120