| ... | @@ -257,13 +257,21 @@ pub const Attribute = struct { | ... | @@ -257,13 +257,21 @@ pub const Attribute = struct { |
| 257 | } | 257 | } |
| 258 | | 258 | |
| 259 | pub fn getString(self: Attribute, ctx: DwarfInfo, cuh: CompileUnit.Header) ?[]const u8 { | 259 | pub fn getString(self: Attribute, ctx: DwarfInfo, cuh: CompileUnit.Header) ?[]const u8 { |
| 260 | if (self.form != dwarf.FORM.strp) return null; | | |
| 261 | const debug_info = self.getDebugInfo(ctx); | 260 | const debug_info = self.getDebugInfo(ctx); |
| 262 | const off = if (cuh.is_64bit) | 261 | |
| 263 | mem.readIntLittle(u64, debug_info[0..8]) | 262 | switch (self.form) { |
| 264 | else | 263 | dwarf.FORM.string => { |
| 265 | mem.readIntLittle(u32, debug_info[0..4]); | 264 | return mem.sliceTo(@ptrCast([*:0]const u8, debug_info.ptr), 0); |
| 266 | return ctx.getString(off); | 265 | }, |
| | 266 | dwarf.FORM.strp => { |
| | 267 | const off = if (cuh.is_64bit) |
| | 268 | mem.readIntLittle(u64, debug_info[0..8]) |
| | 269 | else |
| | 270 | mem.readIntLittle(u32, debug_info[0..4]); |
| | 271 | return ctx.getString(off); |
| | 272 | }, |
| | 273 | else => return null, |
| | 274 | } |
| 267 | } | 275 | } |
| 268 | | 276 | |
| 269 | pub fn getConstant(self: Attribute, ctx: DwarfInfo) !?i128 { | 277 | pub fn getConstant(self: Attribute, ctx: DwarfInfo) !?i128 { |
| ... | @@ -394,6 +402,26 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head | ... | @@ -394,6 +402,26 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head |
| 394 | => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32), | 402 | => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32), |
| 395 | | 403 | |
| 396 | dwarf.FORM.addr => return cuh.address_size, | 404 | dwarf.FORM.addr => return cuh.address_size, |
| | 405 | |
| | 406 | dwarf.FORM.block1, |
| | 407 | dwarf.FORM.block2, |
| | 408 | dwarf.FORM.block4, |
| | 409 | dwarf.FORM.block, |
| | 410 | => { |
| | 411 | const len: u64 = switch (form) { |
| | 412 | dwarf.FORM.block1 => try reader.readIntLittle(u8), |
| | 413 | dwarf.FORM.block2 => try reader.readIntLittle(u16), |
| | 414 | dwarf.FORM.block4 => try reader.readIntLittle(u32), |
| | 415 | dwarf.FORM.block => try leb.readULEB128(u64, reader), |
| | 416 | else => unreachable, |
| | 417 | }; |
| | 418 | var i: u64 = 0; |
| | 419 | while (i < len) : (i += 1) { |
| | 420 | _ = try reader.readByte(); |
| | 421 | } |
| | 422 | return math.cast(usize, creader.bytes_read) orelse error.Overflow; |
| | 423 | }, |
| | 424 | |
| 397 | dwarf.FORM.exprloc => { | 425 | dwarf.FORM.exprloc => { |
| 398 | const expr_len = try leb.readULEB128(u64, reader); | 426 | const expr_len = try leb.readULEB128(u64, reader); |
| 399 | var i: u64 = 0; | 427 | var i: u64 = 0; |
| ... | @@ -406,18 +434,15 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head | ... | @@ -406,18 +434,15 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head |
| 406 | | 434 | |
| 407 | dwarf.FORM.data1, | 435 | dwarf.FORM.data1, |
| 408 | dwarf.FORM.ref1, | 436 | dwarf.FORM.ref1, |
| 409 | dwarf.FORM.block1, | | |
| 410 | dwarf.FORM.flag, | 437 | dwarf.FORM.flag, |
| 411 | => return @sizeOf(u8), | 438 | => return @sizeOf(u8), |
| 412 | | 439 | |
| 413 | dwarf.FORM.data2, | 440 | dwarf.FORM.data2, |
| 414 | dwarf.FORM.ref2, | 441 | dwarf.FORM.ref2, |
| 415 | dwarf.FORM.block2, | | |
| 416 | => return @sizeOf(u16), | 442 | => return @sizeOf(u16), |
| 417 | | 443 | |
| 418 | dwarf.FORM.data4, | 444 | dwarf.FORM.data4, |
| 419 | dwarf.FORM.ref4, | 445 | dwarf.FORM.ref4, |
| 420 | dwarf.FORM.block4, | | |
| 421 | => return @sizeOf(u32), | 446 | => return @sizeOf(u32), |
| 422 | | 447 | |
| 423 | dwarf.FORM.data8, | 448 | dwarf.FORM.data8, |
| ... | @@ -427,7 +452,6 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head | ... | @@ -427,7 +452,6 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head |
| 427 | | 452 | |
| 428 | dwarf.FORM.udata, | 453 | dwarf.FORM.udata, |
| 429 | dwarf.FORM.ref_udata, | 454 | dwarf.FORM.ref_udata, |
| 430 | dwarf.FORM.block, | | |
| 431 | => { | 455 | => { |
| 432 | _ = try leb.readULEB128(u64, reader); | 456 | _ = try leb.readULEB128(u64, reader); |
| 433 | return math.cast(usize, creader.bytes_read) orelse error.Overflow; | 457 | return math.cast(usize, creader.bytes_read) orelse error.Overflow; |
| ... | @@ -440,8 +464,9 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head | ... | @@ -440,8 +464,9 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head |
| 440 | | 464 | |
| 441 | dwarf.FORM.string => { | 465 | dwarf.FORM.string => { |
| 442 | var count: usize = 0; | 466 | var count: usize = 0; |
| 443 | while (true) : (count += 1) { | 467 | while (true) { |
| 444 | const byte = try reader.readByte(); | 468 | const byte = try reader.readByte(); |
| | 469 | count += 1; |
| 445 | if (byte == 0x0) break; | 470 | if (byte == 0x0) break; |
| 446 | } | 471 | } |
| 447 | return count; | 472 | return count; |