//! Definitions of various DWARF-related constants.

use libc::c_uint;

/// Helper macro to let us redeclare gimli's constants as our own constants
/// with a different type, with less risk of copy-paste errors.
macro_rules! declare_constant {
    (
        $name:ident : $type:ty
    ) => {
        #[allow(non_upper_case_globals)]
        pub(crate) const $name: $type = ::gimli::constants::$name.0 as $type;

        // Assert that as-cast probably hasn't changed the value.
        const _: () = assert!($name as i128 == ::gimli::constants::$name.0 as i128);
    };
}

declare_constant!(DW_TAG_const_type: c_uint);

// DWARF languages.
declare_constant!(DW_LANG_Rust: c_uint);

// DWARF attribute type encodings.
declare_constant!(DW_ATE_boolean: c_uint);
declare_constant!(DW_ATE_float: c_uint);
declare_constant!(DW_ATE_signed: c_uint);
declare_constant!(DW_ATE_unsigned: c_uint);
declare_constant!(DW_ATE_UTF: c_uint);

// DWARF expression operators.
declare_constant!(DW_OP_deref: u64);
declare_constant!(DW_OP_plus_uconst: u64);
/// Defined by LLVM in `llvm/include/llvm/BinaryFormat/Dwarf.h`.
/// Double-checked by a static assertion in `RustWrapper.cpp`.
#[allow(non_upper_case_globals)]
pub(crate) const DW_OP_LLVM_fragment: u64 = 0x1000;
#[allow(non_upper_case_globals)]
pub(crate) const DW_OP_constu: u64 = 0x10;
#[allow(non_upper_case_globals)]
pub(crate) const DW_OP_minus: u64 = 0x1c;
#[allow(non_upper_case_globals)]
pub(crate) const DW_OP_mul: u64 = 0x1e;
#[allow(non_upper_case_globals)]
pub(crate) const DW_OP_bregx: u64 = 0x92;
// It describes the actual value of a source variable which might not exist in registers or in memory.
#[allow(non_upper_case_globals)]
pub(crate) const DW_OP_stack_value: u64 = 0x9f;
