Commit 72b4657053

Jacob Young <jacobly0@users.noreply.github.com>
2023-05-13 09:42:20
Dwarf: fix overflow write byte_size
1 parent 904ffb4
Changed files (2)
src/link/Dwarf.zig
@@ -184,12 +184,14 @@ pub const DeclState = struct {
                 try dbg_info_buffer.append(@enumToInt(AbbrevKind.pad1));
             },
             .Bool => {
-                try dbg_info_buffer.appendSlice(&[_]u8{
-                    @enumToInt(AbbrevKind.base_type),
-                    DW.ATE.boolean, // DW.AT.encoding ,  DW.FORM.data1
-                    1, // DW.AT.byte_size,  DW.FORM.data1
-                    'b', 'o', 'o', 'l', 0, // DW.AT.name,  DW.FORM.string
-                });
+                try dbg_info_buffer.ensureUnusedCapacity(12);
+                dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.base_type));
+                // DW.AT.encoding, DW.FORM.data1
+                dbg_info_buffer.appendAssumeCapacity(DW.ATE.boolean);
+                // DW.AT.byte_size, DW.FORM.udata
+                try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
+                // DW.AT.name, DW.FORM.string
+                try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)});
             },
             .Int => {
                 const info = ty.intInfo(target);
@@ -200,9 +202,9 @@ pub const DeclState = struct {
                     .signed => DW.ATE.signed,
                     .unsigned => DW.ATE.unsigned,
                 });
-                // DW.AT.byte_size,  DW.FORM.data1
-                dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(target)));
-                // DW.AT.name,  DW.FORM.string
+                // DW.AT.byte_size, DW.FORM.udata
+                try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
+                // DW.AT.name, DW.FORM.string
                 try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)});
             },
             .Optional => {
@@ -211,9 +213,9 @@ pub const DeclState = struct {
                     dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.base_type));
                     // DW.AT.encoding, DW.FORM.data1
                     dbg_info_buffer.appendAssumeCapacity(DW.ATE.address);
-                    // DW.AT.byte_size,  DW.FORM.data1
-                    dbg_info_buffer.appendAssumeCapacity(@intCast(u8, ty.abiSize(target)));
-                    // DW.AT.name,  DW.FORM.string
+                    // DW.AT.byte_size, DW.FORM.udata
+                    try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
+                    // DW.AT.name, DW.FORM.string
                     try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)});
                 } else {
                     // Non-pointer optionals are structs: struct { .maybe = *, .val = * }
@@ -221,7 +223,7 @@ pub const DeclState = struct {
                     const payload_ty = ty.optionalChild(buf);
                     // DW.AT.structure_type
                     try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type));
-                    // DW.AT.byte_size, DW.FORM.sdata
+                    // DW.AT.byte_size, DW.FORM.udata
                     const abi_size = ty.abiSize(target);
                     try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
                     // DW.AT.name, DW.FORM.string
@@ -236,7 +238,7 @@ pub const DeclState = struct {
                     var index = dbg_info_buffer.items.len;
                     try dbg_info_buffer.resize(index + 4);
                     try self.addTypeRelocGlobal(atom_index, Type.bool, @intCast(u32, index));
-                    // DW.AT.data_member_location, DW.FORM.sdata
+                    // DW.AT.data_member_location, DW.FORM.udata
                     try dbg_info_buffer.ensureUnusedCapacity(6);
                     dbg_info_buffer.appendAssumeCapacity(0);
                     // DW.AT.member
@@ -248,7 +250,7 @@ pub const DeclState = struct {
                     index = dbg_info_buffer.items.len;
                     try dbg_info_buffer.resize(index + 4);
                     try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index));
-                    // DW.AT.data_member_location, DW.FORM.sdata
+                    // DW.AT.data_member_location, DW.FORM.udata
                     const offset = abi_size - payload_ty.abiSize(target);
                     try leb128.writeULEB128(dbg_info_buffer.writer(), offset);
                     // DW.AT.structure_type delimit children
@@ -263,8 +265,8 @@ pub const DeclState = struct {
                     // DW.AT.structure_type
                     try dbg_info_buffer.ensureUnusedCapacity(2);
                     dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.struct_type));
-                    // DW.AT.byte_size, DW.FORM.sdata
-                    dbg_info_buffer.appendAssumeCapacity(ptr_bytes * 2);
+                    // DW.AT.byte_size, DW.FORM.udata
+                    try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
                     // DW.AT.name, DW.FORM.string
                     try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)});
                     // DW.AT.member
@@ -279,7 +281,7 @@ pub const DeclState = struct {
                     var buf = try arena.create(Type.SlicePtrFieldTypeBuffer);
                     const ptr_ty = ty.slicePtrFieldType(buf);
                     try self.addTypeRelocGlobal(atom_index, ptr_ty, @intCast(u32, index));
-                    // DW.AT.data_member_location, DW.FORM.sdata
+                    // DW.AT.data_member_location, DW.FORM.udata
                     try dbg_info_buffer.ensureUnusedCapacity(6);
                     dbg_info_buffer.appendAssumeCapacity(0);
                     // DW.AT.member
@@ -291,7 +293,7 @@ pub const DeclState = struct {
                     index = dbg_info_buffer.items.len;
                     try dbg_info_buffer.resize(index + 4);
                     try self.addTypeRelocGlobal(atom_index, Type.usize, @intCast(u32, index));
-                    // DW.AT.data_member_location, DW.FORM.sdata
+                    // DW.AT.data_member_location, DW.FORM.udata
                     try dbg_info_buffer.ensureUnusedCapacity(2);
                     dbg_info_buffer.appendAssumeCapacity(ptr_bytes);
                     // DW.AT.structure_type delimit children
@@ -329,9 +331,8 @@ pub const DeclState = struct {
             .Struct => blk: {
                 // DW.AT.structure_type
                 try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type));
-                // DW.AT.byte_size, DW.FORM.sdata
-                const abi_size = ty.abiSize(target);
-                try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
+                // DW.AT.byte_size, DW.FORM.udata
+                try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
 
                 switch (ty.tag()) {
                     .tuple, .anon_struct => {
@@ -348,7 +349,7 @@ pub const DeclState = struct {
                             var index = dbg_info_buffer.items.len;
                             try dbg_info_buffer.resize(index + 4);
                             try self.addTypeRelocGlobal(atom_index, field, @intCast(u32, index));
-                            // DW.AT.data_member_location, DW.FORM.sdata
+                            // DW.AT.data_member_location, DW.FORM.udata
                             const field_off = ty.structFieldOffset(field_index, target);
                             try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
                         }
@@ -380,7 +381,7 @@ pub const DeclState = struct {
                             var index = dbg_info_buffer.items.len;
                             try dbg_info_buffer.resize(index + 4);
                             try self.addTypeRelocGlobal(atom_index, field.ty, @intCast(u32, index));
-                            // DW.AT.data_member_location, DW.FORM.sdata
+                            // DW.AT.data_member_location, DW.FORM.udata
                             const field_off = ty.structFieldOffset(field_index, target);
                             try leb128.writeULEB128(dbg_info_buffer.writer(), field_off);
                         }
@@ -393,9 +394,8 @@ pub const DeclState = struct {
             .Enum => {
                 // DW.AT.enumeration_type
                 try dbg_info_buffer.append(@enumToInt(AbbrevKind.enum_type));
-                // DW.AT.byte_size, DW.FORM.sdata
-                const abi_size = ty.abiSize(target);
-                try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
+                // DW.AT.byte_size, DW.FORM.udata
+                try leb128.writeULEB128(dbg_info_buffer.writer(), ty.abiSize(target));
                 // DW.AT.name, DW.FORM.string
                 const enum_name = try ty.nameAllocArena(arena, module);
                 try dbg_info_buffer.ensureUnusedCapacity(enum_name.len + 1);
@@ -446,7 +446,7 @@ pub const DeclState = struct {
                 if (is_tagged) {
                     // DW.AT.structure_type
                     try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type));
-                    // DW.AT.byte_size, DW.FORM.sdata
+                    // DW.AT.byte_size, DW.FORM.udata
                     try leb128.writeULEB128(dbg_info_buffer.writer(), layout.abi_size);
                     // DW.AT.name, DW.FORM.string
                     try dbg_info_buffer.ensureUnusedCapacity(union_name.len + 1);
@@ -463,13 +463,13 @@ pub const DeclState = struct {
                     const inner_union_index = dbg_info_buffer.items.len;
                     try dbg_info_buffer.resize(inner_union_index + 4);
                     try self.addTypeRelocLocal(atom_index, @intCast(u32, inner_union_index), 5);
-                    // DW.AT.data_member_location, DW.FORM.sdata
+                    // DW.AT.data_member_location, DW.FORM.udata
                     try leb128.writeULEB128(dbg_info_buffer.writer(), payload_offset);
                 }
 
                 // DW.AT.union_type
                 try dbg_info_buffer.append(@enumToInt(AbbrevKind.union_type));
-                // DW.AT.byte_size, DW.FORM.sdata,
+                // DW.AT.byte_size, DW.FORM.udata,
                 try leb128.writeULEB128(dbg_info_buffer.writer(), layout.payload_size);
                 // DW.AT.name, DW.FORM.string
                 if (is_tagged) {
@@ -490,7 +490,7 @@ pub const DeclState = struct {
                     const index = dbg_info_buffer.items.len;
                     try dbg_info_buffer.resize(index + 4);
                     try self.addTypeRelocGlobal(atom_index, field.ty, @intCast(u32, index));
-                    // DW.AT.data_member_location, DW.FORM.sdata
+                    // DW.AT.data_member_location, DW.FORM.udata
                     try dbg_info_buffer.append(0);
                 }
                 // DW.AT.union_type delimit children
@@ -507,7 +507,7 @@ pub const DeclState = struct {
                     const index = dbg_info_buffer.items.len;
                     try dbg_info_buffer.resize(index + 4);
                     try self.addTypeRelocGlobal(atom_index, union_obj.tag_ty, @intCast(u32, index));
-                    // DW.AT.data_member_location, DW.FORM.sdata
+                    // DW.AT.data_member_location, DW.FORM.udata
                     try leb128.writeULEB128(dbg_info_buffer.writer(), tag_offset);
 
                     // DW.AT.structure_type delimit children
@@ -534,7 +534,7 @@ pub const DeclState = struct {
 
                 // DW.AT.structure_type
                 try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_type));
-                // DW.AT.byte_size, DW.FORM.sdata
+                // DW.AT.byte_size, DW.FORM.udata
                 try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
                 // DW.AT.name, DW.FORM.string
                 const name = try ty.nameAllocArena(arena, module);
@@ -551,7 +551,7 @@ pub const DeclState = struct {
                     const index = dbg_info_buffer.items.len;
                     try dbg_info_buffer.resize(index + 4);
                     try self.addTypeRelocGlobal(atom_index, payload_ty, @intCast(u32, index));
-                    // DW.AT.data_member_location, DW.FORM.sdata
+                    // DW.AT.data_member_location, DW.FORM.udata
                     try leb128.writeULEB128(dbg_info_buffer.writer(), payload_off);
                 }
 
@@ -566,7 +566,7 @@ pub const DeclState = struct {
                     const index = dbg_info_buffer.items.len;
                     try dbg_info_buffer.resize(index + 4);
                     try self.addTypeRelocGlobal(atom_index, error_ty, @intCast(u32, index));
-                    // DW.AT.data_member_location, DW.FORM.sdata
+                    // DW.AT.data_member_location, DW.FORM.udata
                     try leb128.writeULEB128(dbg_info_buffer.writer(), error_off);
                 }
 
@@ -647,8 +647,8 @@ pub const DeclState = struct {
 
         try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
         const index = dbg_info.items.len;
-        try dbg_info.resize(index + 4); // dw.at.type,  dw.form.ref4
-        try self.addTypeRelocGlobal(atom_index, ty, @intCast(u32, index)); // DW.AT.type,  DW.FORM.ref4
+        try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4
+        try self.addTypeRelocGlobal(atom_index, ty, @intCast(u32, index)); // DW.AT.type, DW.FORM.ref4
         dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
     }
 
@@ -790,7 +790,7 @@ pub const DeclState = struct {
 
         try dbg_info.ensureUnusedCapacity(5 + name_with_null.len);
         const index = dbg_info.items.len;
-        try dbg_info.resize(index + 4); // dw.at.type,  dw.form.ref4
+        try dbg_info.resize(index + 4); // dw.at.type, dw.form.ref4
         try self.addTypeRelocGlobal(atom_index, child_ty, @intCast(u32, index));
         dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
     }
@@ -993,13 +993,13 @@ pub fn initDeclState(self: *Dwarf, mod: *Module, decl_index: Module.Decl.Index)
             // "relocations" and have to be in this fixed place so that functions can be
             // moved in virtual address space.
             assert(dbg_info_low_pc_reloc_index == dbg_info_buffer.items.len);
-            dbg_info_buffer.items.len += ptr_width_bytes; // DW.AT.low_pc,  DW.FORM.addr
+            dbg_info_buffer.items.len += ptr_width_bytes; // DW.AT.low_pc, DW.FORM.addr
             assert(self.getRelocDbgInfoSubprogramHighPC() == dbg_info_buffer.items.len);
-            dbg_info_buffer.items.len += 4; // DW.AT.high_pc,  DW.FORM.data4
+            dbg_info_buffer.items.len += 4; // DW.AT.high_pc, DW.FORM.data4
             //
             if (fn_ret_has_bits) {
                 try decl_state.addTypeRelocGlobal(di_atom_index, fn_ret_type, @intCast(u32, dbg_info_buffer.items.len));
-                dbg_info_buffer.items.len += 4; // DW.AT.type,  DW.FORM.ref4
+                dbg_info_buffer.items.len += 4; // DW.AT.type, DW.FORM.ref4
             }
 
             dbg_info_buffer.appendSliceAssumeCapacity(decl_name_with_null); // DW.AT.name, DW.FORM.string
@@ -1619,7 +1619,7 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void {
         DW.AT.encoding,
         DW.FORM.data1,
         DW.AT.byte_size,
-        DW.FORM.data1,
+        DW.FORM.udata,
         DW.AT.name,
         DW.FORM.string,
         0,
@@ -1635,7 +1635,7 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void {
         DW.TAG.structure_type,
         DW.CHILDREN.yes, // header
         DW.AT.byte_size,
-        DW.FORM.sdata,
+        DW.FORM.udata,
         DW.AT.name,
         DW.FORM.string,
         0,
@@ -1648,14 +1648,14 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void {
         DW.AT.type,
         DW.FORM.ref4,
         DW.AT.data_member_location,
-        DW.FORM.sdata,
+        DW.FORM.udata,
         0,
         0, // table sentinel
         @enumToInt(AbbrevKind.enum_type),
         DW.TAG.enumeration_type,
         DW.CHILDREN.yes, // header
         DW.AT.byte_size,
-        DW.FORM.sdata,
+        DW.FORM.udata,
         DW.AT.name,
         DW.FORM.string,
         0,
@@ -1673,7 +1673,7 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void {
         DW.TAG.union_type,
         DW.CHILDREN.yes, // header
         DW.AT.byte_size,
-        DW.FORM.sdata,
+        DW.FORM.udata,
         DW.AT.name,
         DW.FORM.string,
         0,
@@ -2628,7 +2628,7 @@ fn addDbgInfoErrorSet(
 
     // DW.AT.enumeration_type
     try dbg_info_buffer.append(@enumToInt(AbbrevKind.enum_type));
-    // DW.AT.byte_size, DW.FORM.sdata
+    // DW.AT.byte_size, DW.FORM.udata
     const abi_size = Type.anyerror.abiSize(target);
     try leb128.writeULEB128(dbg_info_buffer.writer(), abi_size);
     // DW.AT.name, DW.FORM.string
test/behavior/int_comparison_elision.zig
@@ -15,7 +15,6 @@ test "int comparison elision" {
 
     // TODO: support int types > 128 bits wide in other backends
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
-    if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO