1
Fork 0

rustc_codegen_llvm: expose DILocation to rustc_codegen_ssa.

This commit is contained in:
Eduard-Mihai Burtescu 2020-02-10 22:52:30 +02:00
parent 88d874de63
commit 737499593d
9 changed files with 133 additions and 163 deletions

View file

@ -56,6 +56,7 @@ impl BackendTypes for Builder<'_, 'll, 'tcx> {
type Funclet = <CodegenCx<'ll, 'tcx> as BackendTypes>::Funclet; type Funclet = <CodegenCx<'ll, 'tcx> as BackendTypes>::Funclet;
type DIScope = <CodegenCx<'ll, 'tcx> as BackendTypes>::DIScope; type DIScope = <CodegenCx<'ll, 'tcx> as BackendTypes>::DIScope;
type DILocation = <CodegenCx<'ll, 'tcx> as BackendTypes>::DILocation;
type DIVariable = <CodegenCx<'ll, 'tcx> as BackendTypes>::DIVariable; type DIVariable = <CodegenCx<'ll, 'tcx> as BackendTypes>::DIVariable;
} }

View file

@ -88,6 +88,7 @@ impl BackendTypes for CodegenCx<'ll, 'tcx> {
type Funclet = Funclet<'ll>; type Funclet = Funclet<'ll>;
type DIScope = &'ll llvm::debuginfo::DIScope; type DIScope = &'ll llvm::debuginfo::DIScope;
type DILocation = &'ll llvm::debuginfo::DILocation;
type DIVariable = &'ll llvm::debuginfo::DIVariable; type DIVariable = &'ll llvm::debuginfo::DIVariable;
} }

View file

@ -49,7 +49,7 @@ fn make_mir_scope(
debug_context: &mut FunctionDebugContext<&'ll DIScope>, debug_context: &mut FunctionDebugContext<&'ll DIScope>,
scope: SourceScope, scope: SourceScope,
) { ) {
if debug_context.scopes[scope].is_valid() { if debug_context.scopes[scope].dbg_scope.is_some() {
return; return;
} }
@ -61,7 +61,7 @@ fn make_mir_scope(
// The root is the function itself. // The root is the function itself.
let loc = cx.lookup_debug_loc(mir.span.lo()); let loc = cx.lookup_debug_loc(mir.span.lo());
debug_context.scopes[scope] = DebugScope { debug_context.scopes[scope] = DebugScope {
scope_metadata: Some(fn_dbg_scope), dbg_scope: Some(fn_dbg_scope),
file_start_pos: loc.file.start_pos, file_start_pos: loc.file.start_pos,
file_end_pos: loc.file.end_pos, file_end_pos: loc.file.end_pos,
}; };
@ -78,17 +78,17 @@ fn make_mir_scope(
let loc = cx.lookup_debug_loc(scope_data.span.lo()); let loc = cx.lookup_debug_loc(scope_data.span.lo());
let file_metadata = file_metadata(cx, &loc.file); let file_metadata = file_metadata(cx, &loc.file);
let scope_metadata = unsafe { let dbg_scope = unsafe {
Some(llvm::LLVMRustDIBuilderCreateLexicalBlock( Some(llvm::LLVMRustDIBuilderCreateLexicalBlock(
DIB(cx), DIB(cx),
parent_scope.scope_metadata.unwrap(), parent_scope.dbg_scope.unwrap(),
file_metadata, file_metadata,
loc.line.unwrap_or(UNKNOWN_LINE_NUMBER), loc.line.unwrap_or(UNKNOWN_LINE_NUMBER),
loc.col.unwrap_or(UNKNOWN_COLUMN_NUMBER), loc.col.unwrap_or(UNKNOWN_COLUMN_NUMBER),
)) ))
}; };
debug_context.scopes[scope] = DebugScope { debug_context.scopes[scope] = DebugScope {
scope_metadata, dbg_scope,
file_start_pos: loc.file.start_pos, file_start_pos: loc.file.start_pos,
file_end_pos: loc.file.end_pos, file_end_pos: loc.file.end_pos,
}; };

View file

@ -3,7 +3,8 @@ mod doc;
use rustc_codegen_ssa::mir::debuginfo::VariableKind::*; use rustc_codegen_ssa::mir::debuginfo::VariableKind::*;
use self::metadata::{file_metadata, type_metadata, TypeMap, UNKNOWN_LINE_NUMBER}; use self::metadata::{file_metadata, type_metadata, TypeMap};
use self::metadata::{UNKNOWN_COLUMN_NUMBER, UNKNOWN_LINE_NUMBER};
use self::namespace::mangled_name_of_instance; use self::namespace::mangled_name_of_instance;
use self::type_names::compute_debuginfo_type_name; use self::type_names::compute_debuginfo_type_name;
use self::utils::{create_DIArray, is_node_local_to_unit, DIB}; use self::utils::{create_DIArray, is_node_local_to_unit, DIB};
@ -13,7 +14,8 @@ use crate::builder::Builder;
use crate::common::CodegenCx; use crate::common::CodegenCx;
use crate::llvm; use crate::llvm;
use crate::llvm::debuginfo::{ use crate::llvm::debuginfo::{
DIArray, DIBuilder, DIFile, DIFlags, DILexicalBlock, DISPFlags, DIScope, DIType, DIVariable, DIArray, DIBuilder, DIFile, DIFlags, DILexicalBlock, DILocation, DISPFlags, DIScope, DIType,
DIVariable,
}; };
use crate::value::Value; use crate::value::Value;
@ -21,6 +23,7 @@ use rustc_codegen_ssa::debuginfo::type_names;
use rustc_codegen_ssa::mir::debuginfo::{DebugScope, FunctionDebugContext, VariableKind}; use rustc_codegen_ssa::mir::debuginfo::{DebugScope, FunctionDebugContext, VariableKind};
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_data_structures::sync::Lrc;
use rustc_hir::def_id::{DefId, DefIdMap, LOCAL_CRATE}; use rustc_hir::def_id::{DefId, DefIdMap, LOCAL_CRATE};
use rustc_index::vec::IndexVec; use rustc_index::vec::IndexVec;
use rustc_middle::mir; use rustc_middle::mir;
@ -29,7 +32,7 @@ use rustc_middle::ty::subst::{GenericArgKind, SubstsRef};
use rustc_middle::ty::{self, Instance, ParamEnv, Ty, TypeFoldable}; use rustc_middle::ty::{self, Instance, ParamEnv, Ty, TypeFoldable};
use rustc_session::config::{self, DebugInfo}; use rustc_session::config::{self, DebugInfo};
use rustc_span::symbol::Symbol; use rustc_span::symbol::Symbol;
use rustc_span::{self, BytePos, Span}; use rustc_span::{self, BytePos, Pos, SourceFile, SourceFileAndLine, Span};
use rustc_target::abi::{LayoutOf, Primitive, Size}; use rustc_target::abi::{LayoutOf, Primitive, Size};
use libc::c_uint; use libc::c_uint;
@ -41,7 +44,6 @@ mod create_scope_map;
pub mod gdb; pub mod gdb;
pub mod metadata; pub mod metadata;
mod namespace; mod namespace;
mod source_loc;
mod utils; mod utils;
pub use self::create_scope_map::compute_mir_scopes; pub use self::create_scope_map::compute_mir_scopes;
@ -141,14 +143,11 @@ impl DebugInfoBuilderMethods for Builder<'a, 'll, 'tcx> {
fn dbg_var_addr( fn dbg_var_addr(
&mut self, &mut self,
dbg_var: &'ll DIVariable, dbg_var: &'ll DIVariable,
scope_metadata: &'ll DIScope, dbg_loc: &'ll DILocation,
variable_alloca: Self::Value, variable_alloca: Self::Value,
direct_offset: Size, direct_offset: Size,
indirect_offsets: &[Size], indirect_offsets: &[Size],
span: Span,
) { ) {
let cx = self.cx();
// Convert the direct and indirect offsets to address ops. // Convert the direct and indirect offsets to address ops.
// FIXME(eddyb) use `const`s instead of getting the values via FFI, // FIXME(eddyb) use `const`s instead of getting the values via FFI,
// the values should match the ones in the DWARF standard anyway. // the values should match the ones in the DWARF standard anyway.
@ -168,14 +167,10 @@ impl DebugInfoBuilderMethods for Builder<'a, 'll, 'tcx> {
} }
} }
// FIXME(eddyb) maybe this information could be extracted from `dbg_var`,
// to avoid having to pass it down in both places?
// NB: `var` doesn't seem to know about the column, so that's a limitation.
let dbg_loc = cx.create_debug_loc(scope_metadata, span);
unsafe { unsafe {
// FIXME(eddyb) replace `llvm.dbg.declare` with `llvm.dbg.addr`. // FIXME(eddyb) replace `llvm.dbg.declare` with `llvm.dbg.addr`.
llvm::LLVMRustDIBuilderInsertDeclareAtEnd( llvm::LLVMRustDIBuilderInsertDeclareAtEnd(
DIB(cx), DIB(self.cx()),
variable_alloca, variable_alloca,
dbg_var, dbg_var,
addr_ops.as_ptr(), addr_ops.as_ptr(),
@ -186,16 +181,13 @@ impl DebugInfoBuilderMethods for Builder<'a, 'll, 'tcx> {
} }
} }
fn set_source_location(&mut self, scope: &'ll DIScope, span: Span) { fn set_dbg_loc(&mut self, dbg_loc: &'ll DILocation) {
debug!("set_source_location: {}", self.sess().source_map().span_to_string(span));
let dbg_loc = self.cx().create_debug_loc(scope, span);
unsafe { unsafe {
let dbg_loc_as_llval = llvm::LLVMRustMetadataAsValue(self.cx().llcx, dbg_loc); let dbg_loc_as_llval = llvm::LLVMRustMetadataAsValue(self.cx().llcx, dbg_loc);
llvm::LLVMSetCurrentDebugLocation(self.llbuilder, dbg_loc_as_llval); llvm::LLVMSetCurrentDebugLocation(self.llbuilder, dbg_loc_as_llval);
} }
} }
fn insert_reference_to_gdb_debug_scripts_section_global(&mut self) { fn insert_reference_to_gdb_debug_scripts_section_global(&mut self) {
gdb::insert_reference_to_gdb_debug_scripts_section_global(self) gdb::insert_reference_to_gdb_debug_scripts_section_global(self)
} }
@ -224,6 +216,49 @@ impl DebugInfoBuilderMethods for Builder<'a, 'll, 'tcx> {
} }
} }
/// A source code location used to generate debug information.
// FIXME(eddyb) rename this to better indicate it's a duplicate of
// `rustc_span::Loc` rather than `DILocation`, perhaps by making
// `lookup_char_pos` return the right information instead.
pub struct DebugLoc {
/// Information about the original source file.
pub file: Lrc<SourceFile>,
/// The (1-based) line number.
pub line: Option<u32>,
/// The (1-based) column number.
pub col: Option<u32>,
}
impl CodegenCx<'ll, '_> {
/// Looks up debug source information about a `BytePos`.
// FIXME(eddyb) rename this to better indicate it's a duplicate of
// `lookup_char_pos` rather than `dbg_loc`, perhaps by making
// `lookup_char_pos` return the right information instead.
pub fn lookup_debug_loc(&self, pos: BytePos) -> DebugLoc {
let (file, line, col) = match self.sess().source_map().lookup_line(pos) {
Ok(SourceFileAndLine { sf: file, line }) => {
let line_pos = file.line_begin_pos(pos);
// Use 1-based indexing.
let line = (line + 1) as u32;
let col = (pos - line_pos).to_u32() + 1;
(file, Some(line), Some(col))
}
Err(file) => (file, None, None),
};
// For MSVC, omit the column number.
// Otherwise, emit it. This mimics clang behaviour.
// See discussion in https://github.com/rust-lang/rust/issues/42921
if self.sess().target.options.is_like_msvc {
DebugLoc { file, line, col: None }
} else {
DebugLoc { file, line, col }
}
}
}
impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> { impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
fn create_function_debug_context( fn create_function_debug_context(
&self, &self,
@ -237,12 +272,9 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
} }
// Initialize fn debug context (including scopes). // Initialize fn debug context (including scopes).
// FIXME(eddyb) figure out a way to not need `Option` for `scope_metadata`. // FIXME(eddyb) figure out a way to not need `Option` for `dbg_scope`.
let empty_scope = DebugScope { let empty_scope =
scope_metadata: None, DebugScope { dbg_scope: None, file_start_pos: BytePos(0), file_end_pos: BytePos(0) };
file_start_pos: BytePos(0),
file_end_pos: BytePos(0),
};
let mut fn_debug_context = let mut fn_debug_context =
FunctionDebugContext { scopes: IndexVec::from_elem(empty_scope, &mir.source_scopes) }; FunctionDebugContext { scopes: IndexVec::from_elem(empty_scope, &mir.source_scopes) };
@ -505,6 +537,20 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
} }
} }
fn dbg_loc(&self, scope: &'ll DIScope, span: Span) -> &'ll DILocation {
let DebugLoc { line, col, .. } = self.lookup_debug_loc(span.lo());
unsafe {
llvm::LLVMRustDIBuilderCreateDebugLocation(
utils::debug_context(self).llcontext,
line.unwrap_or(UNKNOWN_LINE_NUMBER),
col.unwrap_or(UNKNOWN_COLUMN_NUMBER),
scope,
None,
)
}
}
fn create_vtable_metadata(&self, ty: Ty<'tcx>, vtable: Self::Value) { fn create_vtable_metadata(&self, ty: Ty<'tcx>, vtable: Self::Value) {
metadata::create_vtable_metadata(self, ty, vtable) metadata::create_vtable_metadata(self, ty, vtable)
} }

View file

@ -1,61 +0,0 @@
use super::metadata::{UNKNOWN_COLUMN_NUMBER, UNKNOWN_LINE_NUMBER};
use super::utils::debug_context;
use crate::common::CodegenCx;
use crate::llvm;
use crate::llvm::debuginfo::{DILocation, DIScope};
use rustc_codegen_ssa::traits::*;
use rustc_data_structures::sync::Lrc;
use rustc_span::{BytePos, Pos, SourceFile, SourceFileAndLine, Span};
/// A source code location used to generate debug information.
pub struct DebugLoc {
/// Information about the original source file.
pub file: Lrc<SourceFile>,
/// The (1-based) line number.
pub line: Option<u32>,
/// The (1-based) column number.
pub col: Option<u32>,
}
impl CodegenCx<'ll, '_> {
/// Looks up debug source information about a `BytePos`.
pub fn lookup_debug_loc(&self, pos: BytePos) -> DebugLoc {
let (file, line, col) = match self.sess().source_map().lookup_line(pos) {
Ok(SourceFileAndLine { sf: file, line }) => {
let line_pos = file.line_begin_pos(pos);
// Use 1-based indexing.
let line = (line + 1) as u32;
let col = (pos - line_pos).to_u32() + 1;
(file, Some(line), Some(col))
}
Err(file) => (file, None, None),
};
// For MSVC, omit the column number.
// Otherwise, emit it. This mimics clang behaviour.
// See discussion in https://github.com/rust-lang/rust/issues/42921
if self.sess().target.options.is_like_msvc {
DebugLoc { file, line, col: None }
} else {
DebugLoc { file, line, col }
}
}
pub fn create_debug_loc(&self, scope: &'ll DIScope, span: Span) -> &'ll DILocation {
let DebugLoc { line, col, .. } = self.lookup_debug_loc(span.lo());
unsafe {
llvm::LLVMRustDIBuilderCreateDebugLocation(
debug_context(self).llcontext,
line.unwrap_or(UNKNOWN_LINE_NUMBER),
col.unwrap_or(UNKNOWN_COLUMN_NUMBER),
scope,
None,
)
}
}
}

View file

@ -37,71 +37,58 @@ pub struct PerLocalVarDebugInfo<'tcx, D> {
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
pub struct DebugScope<D> { pub struct DebugScope<D> {
pub scope_metadata: Option<D>, // FIXME(eddyb) this should never be `None`, after initialization.
pub dbg_scope: Option<D>,
// Start and end offsets of the file to which this DIScope belongs. // 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. // These are used to quickly determine whether some span refers to the same file.
pub file_start_pos: BytePos, pub file_start_pos: BytePos,
pub file_end_pos: BytePos, pub file_end_pos: BytePos,
} }
impl<D> DebugScope<D> {
pub fn is_valid(&self) -> bool {
self.scope_metadata.is_some()
}
}
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
pub fn set_debug_loc(&self, bx: &mut Bx, source_info: mir::SourceInfo) { pub fn set_debug_loc(&self, bx: &mut Bx, source_info: mir::SourceInfo) {
let (scope, span) = self.debug_loc(source_info); bx.set_span(source_info.span);
bx.set_span(span); if let Some(dbg_loc) = self.dbg_loc(source_info) {
if let Some(scope) = scope { bx.set_dbg_loc(dbg_loc);
bx.set_source_location(scope, span);
} }
} }
pub fn debug_loc(&self, source_info: mir::SourceInfo) -> (Option<Bx::DIScope>, Span) { fn dbg_loc(&self, source_info: mir::SourceInfo) -> Option<Bx::DILocation> {
// Bail out if debug info emission is not enabled. let (scope, span) = self.dbg_scope_and_span(source_info)?;
match self.debug_context { Some(self.cx.dbg_loc(scope, span))
None => return (None, source_info.span),
Some(_) => {}
} }
fn dbg_scope_and_span(&self, source_info: mir::SourceInfo) -> Option<(Bx::DIScope, Span)> {
// Bail out if debug info emission is not enabled.
let debug_context = self.debug_context.as_ref()?;
let scope = &debug_context.scopes[source_info.scope];
// In order to have a good line stepping behavior in debugger, we overwrite debug // In order to have a good line stepping behavior in debugger, we overwrite debug
// locations of macro expansions with that of the outermost expansion site // locations of macro expansions with that of the outermost expansion site
// (unless the crate is being compiled with `-Z debug-macros`). // (unless the crate is being compiled with `-Z debug-macros`).
if !source_info.span.from_expansion() || self.cx.sess().opts.debugging_opts.debug_macros { let mut span = source_info.span;
let scope = self.scope_metadata_for_loc(source_info.scope, source_info.span.lo()); if span.from_expansion() && !self.cx.sess().opts.debugging_opts.debug_macros {
(scope, source_info.span)
} else {
// Walk up the macro expansion chain until we reach a non-expanded span. // Walk up the macro expansion chain until we reach a non-expanded span.
// We also stop at the function body level because no line stepping can occur // We also stop at the function body level because no line stepping can occur
// at the level above that. // at the level above that.
let span = rustc_span::hygiene::walk_chain(source_info.span, self.mir.span.ctxt());
let scope = self.scope_metadata_for_loc(source_info.scope, span.lo());
// Use span of the outermost expansion site, while keeping the original lexical scope. // Use span of the outermost expansion site, while keeping the original lexical scope.
(scope, span) span = rustc_span::hygiene::walk_chain(span, self.mir.span.ctxt());
}
} }
// FIXME(eddyb) this should never be `None`.
let mut dbg_scope = scope.dbg_scope?;
// DILocations inherit source file name from the parent DIScope. Due to macro expansions // DILocations inherit source file name from the parent DIScope. Due to macro expansions
// it may so happen that the current span belongs to a different file than the DIScope // it may so happen that the current span belongs to a different file than the DIScope
// corresponding to span's containing source scope. If so, we need to create a DIScope // corresponding to span's containing source scope. If so, we need to create a DIScope
// "extension" into that file. // "extension" into that file.
fn scope_metadata_for_loc( let pos = span.lo();
&self, if pos < scope.file_start_pos || pos >= scope.file_end_pos {
scope_id: mir::SourceScope,
pos: BytePos,
) -> Option<Bx::DIScope> {
let debug_context = self.debug_context.as_ref()?;
let scope_metadata = debug_context.scopes[scope_id].scope_metadata?;
if pos < debug_context.scopes[scope_id].file_start_pos
|| pos >= debug_context.scopes[scope_id].file_end_pos
{
let sm = self.cx.sess().source_map(); let sm = self.cx.sess().source_map();
Some(self.cx.extend_scope_to_file(scope_metadata, &sm.lookup_char_pos(pos).file)) dbg_scope = self.cx.extend_scope_to_file(dbg_scope, &sm.lookup_char_pos(pos).file);
} else {
Some(scope_metadata)
} }
Some((dbg_scope, span))
} }
/// Apply debuginfo and/or name, after creating the `alloca` for a local, /// Apply debuginfo and/or name, after creating the `alloca` for a local,
@ -142,17 +129,16 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
} else { } else {
let name = kw::Invalid; let name = kw::Invalid;
let decl = &self.mir.local_decls[local]; let decl = &self.mir.local_decls[local];
let (scope, span) = if full_debug_info { let dbg_var = if full_debug_info {
self.debug_loc(decl.source_info) self.dbg_scope_and_span(decl.source_info).map(|(scope, span)| {
} else {
(None, decl.source_info.span)
};
let dbg_var = scope.map(|scope| {
// FIXME(eddyb) is this `+ 1` needed at all? // FIXME(eddyb) is this `+ 1` needed at all?
let kind = VariableKind::ArgumentVariable(arg_index + 1); let kind = VariableKind::ArgumentVariable(arg_index + 1);
self.cx.create_dbg_var(name, self.monomorphize(&decl.ty), scope, kind, span) self.cx.create_dbg_var(name, self.monomorphize(&decl.ty), scope, kind, span)
}); })
} else {
None
};
Some(PerLocalVarDebugInfo { Some(PerLocalVarDebugInfo {
name, name,
@ -233,6 +219,15 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
let vars = vars.iter().copied().chain(fallback_var); let vars = vars.iter().copied().chain(fallback_var);
for var in vars { for var in vars {
let dbg_var = match var.dbg_var {
Some(dbg_var) => dbg_var,
None => continue,
};
let dbg_loc = match self.dbg_loc(var.source_info) {
Some(dbg_loc) => dbg_loc,
None => continue,
};
let mut layout = base.layout; let mut layout = base.layout;
let mut direct_offset = Size::ZERO; let mut direct_offset = Size::ZERO;
// FIXME(eddyb) use smallvec here. // FIXME(eddyb) use smallvec here.
@ -269,19 +264,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
} }
} }
let (scope, span) = self.debug_loc(var.source_info); bx.dbg_var_addr(dbg_var, dbg_loc, base.llval, direct_offset, &indirect_offsets);
if let Some(scope) = scope {
if let Some(dbg_var) = var.dbg_var {
bx.dbg_var_addr(
dbg_var,
scope,
base.llval,
direct_offset,
&indirect_offsets,
span,
);
}
}
} }
} }
@ -305,12 +288,9 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
let mut per_local = IndexVec::from_elem(vec![], &self.mir.local_decls); let mut per_local = IndexVec::from_elem(vec![], &self.mir.local_decls);
for var in &self.mir.var_debug_info { for var in &self.mir.var_debug_info {
let (scope, span) = if full_debug_info { let scope_and_span =
self.debug_loc(var.source_info) if full_debug_info { self.dbg_scope_and_span(var.source_info) } else { None };
} else { let dbg_var = scope_and_span.map(|(scope, span)| {
(None, var.source_info.span)
};
let dbg_var = scope.map(|scope| {
let place = var.place; let place = var.place;
let var_ty = self.monomorphized_place_ty(place.as_ref()); let var_ty = self.monomorphized_place_ty(place.as_ref());
let var_kind = if self.mir.local_kind(place.local) == mir::LocalKind::Arg let var_kind = if self.mir.local_kind(place.local) == mir::LocalKind::Arg

View file

@ -34,6 +34,7 @@ pub trait BackendTypes {
// FIXME(eddyb) find a common convention for all of the debuginfo-related // FIXME(eddyb) find a common convention for all of the debuginfo-related
// names (choose between `Dbg`, `Debug`, `DebugInfo`, `DI` etc.). // names (choose between `Dbg`, `Debug`, `DebugInfo`, `DI` etc.).
type DIScope: Copy; type DIScope: Copy;
type DILocation: Copy;
type DIVariable: Copy; type DIVariable: Copy;
} }

View file

@ -30,6 +30,8 @@ pub trait DebugInfoMethods<'tcx>: BackendTypes {
maybe_definition_llfn: Option<Self::Function>, maybe_definition_llfn: Option<Self::Function>,
) -> Self::DIScope; ) -> Self::DIScope;
fn dbg_loc(&self, scope: Self::DIScope, span: Span) -> Self::DILocation;
fn extend_scope_to_file( fn extend_scope_to_file(
&self, &self,
scope_metadata: Self::DIScope, scope_metadata: Self::DIScope,
@ -55,14 +57,13 @@ pub trait DebugInfoBuilderMethods: BackendTypes {
fn dbg_var_addr( fn dbg_var_addr(
&mut self, &mut self,
dbg_var: Self::DIVariable, dbg_var: Self::DIVariable,
scope_metadata: Self::DIScope, dbg_loc: Self::DILocation,
variable_alloca: Self::Value, variable_alloca: Self::Value,
direct_offset: Size, direct_offset: Size,
// NB: each offset implies a deref (i.e. they're steps in a pointer chain). // NB: each offset implies a deref (i.e. they're steps in a pointer chain).
indirect_offsets: &[Size], indirect_offsets: &[Size],
span: Span,
); );
fn set_source_location(&mut self, scope: Self::DIScope, span: Span); fn set_dbg_loc(&mut self, dbg_loc: Self::DILocation);
fn insert_reference_to_gdb_debug_scripts_section_global(&mut self); fn insert_reference_to_gdb_debug_scripts_section_global(&mut self);
fn set_var_name(&mut self, value: Self::Value, name: &str); fn set_var_name(&mut self, value: Self::Value, name: &str);
} }

View file

@ -95,6 +95,7 @@ pub trait HasCodegen<'tcx>:
Type = Self::Type, Type = Self::Type,
Funclet = Self::Funclet, Funclet = Self::Funclet,
DIScope = Self::DIScope, DIScope = Self::DIScope,
DILocation = Self::DILocation,
DIVariable = Self::DIVariable, DIVariable = Self::DIVariable,
>; >;
} }