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 {...@@ -2306,15 +2306,19 @@ pub fn writeDbgLineHeader(self: *Dwarf, module: *Module) !void {
2306 // not including the initial length itself.2306 // not including the initial length itself.
2307 const after_init_len = di_buf.items.len + init_len_size;2307 const after_init_len = di_buf.items.len + init_len_size;
2308 const init_len = dbg_line_prg_end - after_init_len;2308 const init_len = dbg_line_prg_end - after_init_len;
2309 if (self.bin_file.tag == .macho) {2309
2310 mem.writeIntLittle(u32, di_buf.addManyAsArrayAssumeCapacity(4), @intCast(u32, init_len));2310 switch (self.bin_file.tag) {
2311 } else switch (self.ptr_width) {2311 .macho => {
2312 .p32 => {2312 mem.writeIntLittle(u32, di_buf.addManyAsArrayAssumeCapacity(4), @intCast(u32, init_len));
2313 mem.writeInt(u32, di_buf.addManyAsArrayAssumeCapacity(4), @intCast(u32, init_len), target_endian);
2314 },2313 },
2315 .p64 => {2314 else => switch (self.ptr_width) {
2316 di_buf.appendNTimesAssumeCapacity(0xff, 4);2315 .p32 => {
2317 mem.writeInt(u64, di_buf.addManyAsArrayAssumeCapacity(8), init_len, target_endian);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 },
2318 },2322 },
2319 }2323 }
23202324
...@@ -2325,7 +2329,12 @@ pub fn writeDbgLineHeader(self: *Dwarf, module: *Module) !void {...@@ -2325,7 +2329,12 @@ pub fn writeDbgLineHeader(self: *Dwarf, module: *Module) !void {
2325 // Therefore we rely on the NOP jump at the beginning of the Line Number Program for2329 // Therefore we rely on the NOP jump at the beginning of the Line Number Program for
2326 // padding rather than this field.2330 // padding rather than this field.
2327 const before_header_len = di_buf.items.len;2331 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
2329 const after_header_len = di_buf.items.len;2338 const after_header_len = di_buf.items.len;
23302339
2331 const opcode_base = DW.LNS.set_isa + 1;2340 const opcode_base = DW.LNS.set_isa + 1;
...@@ -2374,14 +2383,18 @@ pub fn writeDbgLineHeader(self: *Dwarf, module: *Module) !void {...@@ -2374,14 +2383,18 @@ pub fn writeDbgLineHeader(self: *Dwarf, module: *Module) !void {
2374 di_buf.appendAssumeCapacity(0); // file names sentinel2383 di_buf.appendAssumeCapacity(0); // file names sentinel
23752384
2376 const header_len = di_buf.items.len - after_header_len;2385 const header_len = di_buf.items.len - after_header_len;
2377 if (self.bin_file.tag == .macho) {2386
2378 mem.writeIntLittle(u32, di_buf.items[before_header_len..][0..4], @intCast(u32, header_len));2387 switch (self.bin_file.tag) {
2379 } else switch (self.ptr_width) {2388 .macho => {
2380 .p32 => {2389 mem.writeIntLittle(u32, di_buf.items[before_header_len..][0..4], @intCast(u32, header_len));
2381 mem.writeInt(u32, di_buf.items[before_header_len..][0..4], @intCast(u32, header_len), target_endian);
2382 },2390 },
2383 .p64 => {2391 else => switch (self.ptr_width) {
2384 mem.writeInt(u64, di_buf.items[before_header_len..][0..8], header_len, target_endian);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 },
2385 },2398 },
2386 }2399 }
23872400