ddbug_parser 0.3.0

Unified debug information parser
Documentation
use crate::location::Register;
use crate::Address;

/// A CFI directive and the function offset it applies to.
///
/// Address::none() is used for directives that apply to the whole function.
pub type Cfi = (Address, CfiDirective);

/// A CFI directive.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CfiDirective {
    /// .cfi_startproc
    StartProc,

    /// .cfi_endproc
    EndProc,

    /// .cfi_personality <address>
    Personality(Address),

    /// .cfi_lsda <address>
    // TODO: encoding?
    Lsda(Address),

    /// .cfi_signal_frame
    SignalFrame,

    /// .cfi_return_column <register>
    ReturnColumn(Register),

    /// .cfi_def_cfa <register>, <offset>
    DefCfa(Register, i64),

    /// .cfi_def_cfa_register <register>
    DefCfaRegister(Register),

    /// .cfi_def_cfa_offset <offset>
    DefCfaOffset(i64),

    /// .cfi_offset <register>, <offset>
    Offset(Register, i64),

    /// .cfi_val_offset <register>, <offset>
    ValOffset(Register, i64),

    /// .cfi_register <register1>, <register2>
    Register(Register, Register),

    /// .cfi_restore <register>
    Restore(Register),

    /// .cfi_undefined <register>
    Undefined(Register),

    /// .cfi_same_value <register>
    SameValue(Register),

    /// .cfi_remember_state
    RememberState,

    /// .cfi_restore_state
    RestoreState,

    /// An unsupported instruction.
    Other,
}