diff options
| author | bjorn3 <bjorn3@users.noreply.github.com> | 2019-03-30 15:45:09 +0100 |
|---|---|---|
| committer | bjorn3 <bjorn3@users.noreply.github.com> | 2019-04-20 13:21:40 +0200 |
| commit | d4e7b083ceae25f15f1639cb432d466656aecd77 (patch) | |
| tree | ac5726d882b1196c7ea01d6eeca0331ca643844b /src/librustc_codegen_ssa/debuginfo/mod.rs | |
| parent | dd4566f5118c20889ca778565ba14a065a368dc6 (diff) | |
| download | rust-d4e7b083ceae25f15f1639cb432d466656aecd77.tar.gz rust-d4e7b083ceae25f15f1639cb432d466656aecd77.zip | |
Move cg_llvm/debuginfo/type_names.rs to cg_ssa
Diffstat (limited to 'src/librustc_codegen_ssa/debuginfo/mod.rs')
| -rw-r--r-- | src/librustc_codegen_ssa/debuginfo/mod.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/librustc_codegen_ssa/debuginfo/mod.rs b/src/librustc_codegen_ssa/debuginfo/mod.rs new file mode 100644 index 00000000000..d60a2e0cb13 --- /dev/null +++ b/src/librustc_codegen_ssa/debuginfo/mod.rs @@ -0,0 +1,82 @@ +use syntax_pos::{BytePos, Span}; +use rustc::hir::def_id::CrateNum; + +pub mod type_names; + +pub enum FunctionDebugContext<D> { + RegularContext(FunctionDebugContextData<D>), + DebugInfoDisabled, + FunctionWithoutDebugInfo, +} + +impl<D> FunctionDebugContext<D> { + pub fn get_ref<'a>(&'a self, span: Span) -> &'a FunctionDebugContextData<D> { + 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<D>(dbg_context: &mut FunctionDebugContext<D>) { + match *dbg_context { + FunctionDebugContext::RegularContext(ref mut data) => { + data.source_locations_enabled = true; + }, + _ => { /* safe to ignore */ } + } +} + +pub struct FunctionDebugContextData<D> { + pub fn_metadata: D, + pub source_locations_enabled: bool, + 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<D> { + pub scope_metadata: Option<D>, + // 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<D> MirDebugScope<D> { + pub fn is_valid(&self) -> bool { + !self.scope_metadata.is_none() + } +} |
