public void Read(DwarfBinaryReader reader, long end_pos)
{
while (reader.Position < end_pos) {
byte first = reader.ReadByte ();
int opcode = first >> 6;
int low = first & 0x3f;
if (opcode == (int) DW_CFA.offset) {
int offset = reader.ReadLeb128 ();
offset *= cie.DataAlignment;
columns [low + 1].State = State.Offset;
columns [low + 1].Register = 0;
columns [low + 1].Offset = offset;
continue;
} else if (opcode == (int) DW_CFA.advance_loc) {
current_address += low;
if (current_address > address)
return;
continue;
} else if (opcode != 0) {
continue;
}
switch ((DW_CFA) low) {
case DW_CFA.nop:
break;
case DW_CFA.def_cfa:
columns [0].State = State.Register;
columns [0].Register = reader.ReadLeb128 ();
columns [0].Offset = reader.ReadLeb128 ();
break;
case DW_CFA.def_cfa_register:
columns [0].State = State.Register;
columns [0].Register = reader.ReadLeb128 ();
break;
case DW_CFA.def_cfa_offset:
columns [0].Offset = reader.ReadLeb128 ();
break;
case DW_CFA.gnu_args_size:
// Ignored.
reader.ReadLeb128 ();
break;
default:
break;
}
}
}