| ... | @@ -63,7 +63,6 @@ pub fn genSubprogramLookupByName( | ... | @@ -63,7 +63,6 @@ pub fn genSubprogramLookupByName( |
| 63 | | 63 | |
| 64 | while (try attr_it.next()) |attr| switch (attr.name) { | 64 | while (try attr_it.next()) |attr| switch (attr.name) { |
| 65 | dwarf.AT.name => if (attr.getString(self, compile_unit.cuh)) |str| { | 65 | dwarf.AT.name => if (attr.getString(self, compile_unit.cuh)) |str| { |
| 66 | log.warn("subprogram: {s}", .{str}); | | |
| 67 | name = str; | 66 | name = str; |
| 68 | }, | 67 | }, |
| 69 | dwarf.AT.low_pc => { | 68 | dwarf.AT.low_pc => { |
| ... | @@ -389,8 +388,11 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head | ... | @@ -389,8 +388,11 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head |
| 389 | const reader = creader.reader(); | 388 | const reader = creader.reader(); |
| 390 | | 389 | |
| 391 | switch (form) { | 390 | switch (form) { |
| 392 | dwarf.FORM.strp => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32), | 391 | dwarf.FORM.strp, |
| 393 | dwarf.FORM.sec_offset => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32), | 392 | dwarf.FORM.sec_offset, |
| | 393 | dwarf.FORM.ref_addr, |
| | 394 | => return if (cuh.is_64bit) @sizeOf(u64) else @sizeOf(u32), |
| | 395 | |
| 394 | dwarf.FORM.addr => return cuh.address_size, | 396 | dwarf.FORM.addr => return cuh.address_size, |
| 395 | dwarf.FORM.exprloc => { | 397 | dwarf.FORM.exprloc => { |
| 396 | const expr_len = try leb.readULEB128(u64, reader); | 398 | const expr_len = try leb.readULEB128(u64, reader); |
| ... | @@ -402,29 +404,53 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head | ... | @@ -402,29 +404,53 @@ fn findFormSize(self: DwarfInfo, form: u64, di_off: usize, cuh: CompileUnit.Head |
| 402 | }, | 404 | }, |
| 403 | dwarf.FORM.flag_present => return 0, | 405 | dwarf.FORM.flag_present => return 0, |
| 404 | | 406 | |
| 405 | dwarf.FORM.data1 => return @sizeOf(u8), | 407 | dwarf.FORM.data1, |
| 406 | dwarf.FORM.data2 => return @sizeOf(u16), | 408 | dwarf.FORM.ref1, |
| 407 | dwarf.FORM.data4 => return @sizeOf(u32), | 409 | dwarf.FORM.block1, |
| 408 | dwarf.FORM.data8 => return @sizeOf(u64), | 410 | dwarf.FORM.flag, |
| 409 | dwarf.FORM.udata => { | 411 | => return @sizeOf(u8), |
| | 412 | |
| | 413 | dwarf.FORM.data2, |
| | 414 | dwarf.FORM.ref2, |
| | 415 | dwarf.FORM.block2, |
| | 416 | => return @sizeOf(u16), |
| | 417 | |
| | 418 | dwarf.FORM.data4, |
| | 419 | dwarf.FORM.ref4, |
| | 420 | dwarf.FORM.block4, |
| | 421 | => return @sizeOf(u32), |
| | 422 | |
| | 423 | dwarf.FORM.data8, |
| | 424 | dwarf.FORM.ref8, |
| | 425 | dwarf.FORM.ref_sig8, |
| | 426 | => return @sizeOf(u64), |
| | 427 | |
| | 428 | dwarf.FORM.udata, |
| | 429 | dwarf.FORM.ref_udata, |
| | 430 | dwarf.FORM.block, |
| | 431 | => { |
| 410 | _ = try leb.readULEB128(u64, reader); | 432 | _ = try leb.readULEB128(u64, reader); |
| 411 | return math.cast(usize, creader.bytes_read) orelse error.Overflow; | 433 | return math.cast(usize, creader.bytes_read) orelse error.Overflow; |
| 412 | }, | 434 | }, |
| | 435 | |
| 413 | dwarf.FORM.sdata => { | 436 | dwarf.FORM.sdata => { |
| 414 | _ = try leb.readILEB128(i64, reader); | 437 | _ = try leb.readILEB128(i64, reader); |
| 415 | return math.cast(usize, creader.bytes_read) orelse error.Overflow; | 438 | return math.cast(usize, creader.bytes_read) orelse error.Overflow; |
| 416 | }, | 439 | }, |
| 417 | | 440 | |
| 418 | dwarf.FORM.ref1 => return @sizeOf(u8), | 441 | dwarf.FORM.string => { |
| 419 | dwarf.FORM.ref2 => return @sizeOf(u16), | 442 | var count: usize = 0; |
| 420 | dwarf.FORM.ref4 => return @sizeOf(u32), | 443 | while (true) : (count += 1) { |
| 421 | dwarf.FORM.ref8 => return @sizeOf(u64), | 444 | const byte = try reader.readByte(); |
| 422 | dwarf.FORM.ref_udata => { | 445 | if (byte == 0x0) break; |
| 423 | _ = try leb.readULEB128(u64, reader); | 446 | } |
| 424 | return math.cast(usize, creader.bytes_read) orelse error.Overflow; | 447 | return count; |
| 425 | }, | 448 | }, |
| 426 | | 449 | |
| 427 | else => return error.ToDo, | 450 | else => { |
| | 451 | log.err("unhandled DW_FORM_* value with identifier {x}", .{form}); |
| | 452 | return error.UnhandledDwFormValue; |
| | 453 | }, |
| 428 | } | 454 | } |
| 429 | } | 455 | } |
| 430 | | 456 | |