use syntax_pos::{BytePos, Span}; use rustc::hir::def_id::CrateNum; use std::cell::Cell; pub enum FunctionDebugContext { RegularContext(FunctionDebugContextData), DebugInfoDisabled, FunctionWithoutDebugInfo, } impl FunctionDebugContext { pub fn get_ref<'a>(&'a self, span: Span) -> &'a FunctionDebugContextData { match *self { FunctionDebugContext::RegularContext(ref data) => data, FunctionDebugContext::DebugInfoDisabled => { span_bug!( span, "debuginfo: Error trying to access FunctionDebugContext \ although debug info is disabled!", ); } FunctionDebugContext::FunctionWithoutDebugInfo => { span_bug!( span, "debuginfo: Error trying to access FunctionDebugContext \ for function that should be ignored by debug info!", ); } } } } /// Enables emitting source locations for the given functions. /// /// Since we don't want source locations to be emitted for the function prelude, /// they are disabled when beginning to codegen a new function. This functions /// switches source location emitting on and must therefore be called before the /// first real statement/expression of the function is codegened. pub fn start_emitting_source_locations(dbg_context: &FunctionDebugContext) { match *dbg_context { FunctionDebugContext::RegularContext(ref data) => { data.source_locations_enabled.set(true) }, _ => { /* safe to ignore */ } } } pub struct FunctionDebugContextData { pub fn_metadata: D, pub source_locations_enabled: Cell, pub defining_crate: CrateNum, } pub enum VariableAccess<'a, V> { // The llptr given is an alloca containing the variable's value DirectVariable { alloca: V }, // The llptr given is an alloca containing the start of some pointer chain // leading to the variable's content. IndirectVariable { alloca: V, address_operations: &'a [i64] } } pub enum VariableKind { ArgumentVariable(usize /*index*/), LocalVariable, } #[derive(Clone, Copy, Debug)] pub struct MirDebugScope { pub scope_metadata: Option, // Start and end offsets of the file to which this DIScope belongs. // These are used to quickly determine whether some span refers to the same file. pub file_start_pos: BytePos, pub file_end_pos: BytePos, } impl MirDebugScope { pub fn is_valid(&self) -> bool { !self.scope_metadata.is_none() } }