object read_data()
{
DwarfBinaryReader reader = dwarf.DebugInfoReader;
switch (form) {
case DwarfForm.flag:
data_size = 1;
return reader.PeekByte (offset) != 0;
case DwarfForm.ref1:
case DwarfForm.data1:
data_size = 1;
return (long) reader.PeekByte (offset);
case DwarfForm.ref2:
case DwarfForm.data2:
data_size = 2;
return (long) reader.PeekInt16 (offset);
case DwarfForm.ref4:
case DwarfForm.data4:
data_size = 4;
return (long) reader.PeekInt32 (offset);
case DwarfForm.ref8:
case DwarfForm.data8:
data_size = 8;
return (long) reader.PeekInt64 (offset);
case DwarfForm.addr:
data_size = dwarf.AddressSize;
return (long) reader.PeekAddress (offset);
case DwarfForm.cstring: {
string retval = reader.PeekString (offset);
data_size = retval.Length + 1;
return retval;
}
case DwarfForm.block1:
data_size = reader.PeekByte (offset) + 1;
return reader.PeekBuffer (offset + 1, data_size - 1);
case DwarfForm.block2:
data_size = reader.PeekInt16 (offset) + 2;
return reader.PeekBuffer (offset + 2, data_size - 2);
case DwarfForm.block4:
data_size = reader.PeekInt32 (offset) + 4;
return reader.PeekBuffer (offset + 4, data_size - 4);
case DwarfForm.block: {
int size;
data_size = reader.PeekLeb128 (offset, out size);
return reader.PeekBuffer (offset + size, data_size);
}
case DwarfForm.strp: {
if (dwarf.DebugStrReader == null)
throw new DwarfException (
dwarf.bfd, "Got DW_FORM_strp, but " +
"'.debug_str' section is missing.");
long str_offset = reader.PeekOffset (offset, out data_size);
return dwarf.DebugStrReader.PeekString (str_offset);
}
case DwarfForm.ref_udata:
case DwarfForm.udata:
case DwarfForm.sdata:
return (long) reader.PeekLeb128 (offset, out data_size);
case DwarfForm.ref_addr:
return (long) reader.PeekOffset (offset, out data_size);
default:
throw new DwarfException (
dwarf.bfd, "Unknown DW_FORM: 0x{0:x}",
(int) form);
}
}