authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-07 22:41:22+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-09 09:24:25+01:00
logbe2b85f670d5fd1d3a8b5cea60bfc8a7b5f2e1e0
tree4e25e5bdd51f9f34af33e275320f667db2461404
parent8e71a79e4b8252eba22465ebe7e305a2a348f438

dwarf: refactor object file format and ptr width switches in writeDbgLineHeader


1 files changed, 29 insertions(+), 16 deletions(-)

src/link/Dwarf.zig+29-16
......@@ -2306,15 +2306,19 @@ pub fn writeDbgLineHeader(self: *Dwarf, module: *Module) !void {
23062306 // not including the initial length itself.
23072307 const after_init_len = di_buf.items.len + init_len_size;
23082308 const init_len = dbg_line_prg_end - after_init_len;
2309 if (self.bin_file.tag == .macho) {
2310 mem.writeIntLittle(u32, di_buf.addManyAsArrayAssumeCapacity(4), @intCast(u32, init_len));
2311 } else switch (self.ptr_width) {
2312 .p32 => {
2313 mem.writeInt(u32, di_buf.addManyAsArrayAssumeCapacity(4), @intCast(u32, init_len), target_endian);
2309
2310 switch (self.bin_file.tag) {
2311 .macho => {
2312 mem.writeIntLittle(u32, di_buf.addManyAsArrayAssumeCapacity(4), @intCast(u32, init_len));
23142313 },
2315 .p64 => {
2316 di_buf.appendNTimesAssumeCapacity(0xff, 4);
2317 mem.writeInt(u64, di_buf.addManyAsArrayAssumeCapacity(8), init_len, target_endian);
2314 else => switch (self.ptr_width) {
2315 .p32 => {
2316 mem.writeInt(u32, di_buf.addManyAsArrayAssumeCapacity(4), @intCast(u32, init_len), target_endian);
2317 },
2318 .p64 => {
2319 di_buf.appendNTimesAssumeCapacity(0xff, 4);
2320 mem.writeInt(u64, di_buf.addManyAsArrayAssumeCapacity(8), init_len, target_endian);
2321 },
23182322 },
23192323 }
23202324
......@@ -2325,7 +2329,12 @@ pub fn writeDbgLineHeader(self: *Dwarf, module: *Module) !void {
23252329 // Therefore we rely on the NOP jump at the beginning of the Line Number Program for
23262330 // padding rather than this field.
23272331 const before_header_len = di_buf.items.len;
2328 di_buf.items.len += if (self.bin_file.tag == .macho) @sizeOf(u32) else ptr_width_bytes; // We will come back and write this.
2332
2333 di_buf.items.len += switch (self.bin_file.tag) { // We will come back and write this.
2334 .macho => @sizeOf(u32),
2335 else => ptr_width_bytes,
2336 };
2337
23292338 const after_header_len = di_buf.items.len;
23302339
23312340 const opcode_base = DW.LNS.set_isa + 1;
......@@ -2374,14 +2383,18 @@ pub fn writeDbgLineHeader(self: *Dwarf, module: *Module) !void {
23742383 di_buf.appendAssumeCapacity(0); // file names sentinel
23752384
23762385 const header_len = di_buf.items.len - after_header_len;
2377 if (self.bin_file.tag == .macho) {
2378 mem.writeIntLittle(u32, di_buf.items[before_header_len..][0..4], @intCast(u32, header_len));
2379 } else switch (self.ptr_width) {
2380 .p32 => {
2381 mem.writeInt(u32, di_buf.items[before_header_len..][0..4], @intCast(u32, header_len), target_endian);
2386
2387 switch (self.bin_file.tag) {
2388 .macho => {
2389 mem.writeIntLittle(u32, di_buf.items[before_header_len..][0..4], @intCast(u32, header_len));
23822390 },
2383 .p64 => {
2384 mem.writeInt(u64, di_buf.items[before_header_len..][0..8], header_len, target_endian);
2391 else => switch (self.ptr_width) {
2392 .p32 => {
2393 mem.writeInt(u32, di_buf.items[before_header_len..][0..4], @intCast(u32, header_len), target_endian);
2394 },
2395 .p64 => {
2396 mem.writeInt(u64, di_buf.items[before_header_len..][0..8], header_len, target_endian);
2397 },
23852398 },
23862399 }
23872400