@@ -3,21 +3,26 @@ use super::utils::DIB;
33use rustc_codegen_ssa:: mir:: debuginfo:: { DebugScope , FunctionDebugContext } ;
44use rustc_codegen_ssa:: traits:: * ;
55
6+ use crate :: abi:: FnAbi ;
67use crate :: common:: CodegenCx ;
78use crate :: llvm;
8- use crate :: llvm:: debuginfo:: { DIScope , DISubprogram } ;
9+ use crate :: llvm:: debuginfo:: { DILocation , DIScope } ;
910use rustc_middle:: mir:: { Body , SourceScope } ;
11+ use rustc_middle:: ty:: layout:: FnAbiExt ;
12+ use rustc_middle:: ty:: { self , Instance } ;
1013use rustc_session:: config:: DebugInfo ;
1114
1215use rustc_index:: bit_set:: BitSet ;
1316use rustc_index:: vec:: Idx ;
1417
1518/// Produces DIScope DIEs for each MIR Scope which has variables defined in it.
19+ // FIXME(eddyb) almost all of this should be in `rustc_codegen_ssa::mir::debuginfo`.
1620pub fn compute_mir_scopes (
17- cx : & CodegenCx < ' ll , ' _ > ,
18- mir : & Body < ' _ > ,
19- fn_metadata : & ' ll DISubprogram ,
20- debug_context : & mut FunctionDebugContext < & ' ll DIScope > ,
21+ cx : & CodegenCx < ' ll , ' tcx > ,
22+ instance : Instance < ' tcx > ,
23+ mir : & Body < ' tcx > ,
24+ fn_dbg_scope : & ' ll DIScope ,
25+ debug_context : & mut FunctionDebugContext < & ' ll DIScope , & ' ll DILocation > ,
2126) {
2227 // Find all the scopes with variables defined in them.
2328 let mut has_variables = BitSet :: new_empty ( mir. source_scopes . len ( ) ) ;
@@ -37,58 +42,82 @@ pub fn compute_mir_scopes(
3742 // Instantiate all scopes.
3843 for idx in 0 ..mir. source_scopes . len ( ) {
3944 let scope = SourceScope :: new ( idx) ;
40- make_mir_scope ( cx, & mir, fn_metadata , & has_variables, debug_context, scope) ;
45+ make_mir_scope ( cx, instance , & mir, fn_dbg_scope , & has_variables, debug_context, scope) ;
4146 }
4247}
4348
4449fn make_mir_scope (
45- cx : & CodegenCx < ' ll , ' _ > ,
46- mir : & Body < ' _ > ,
47- fn_metadata : & ' ll DISubprogram ,
50+ cx : & CodegenCx < ' ll , ' tcx > ,
51+ instance : Instance < ' tcx > ,
52+ mir : & Body < ' tcx > ,
53+ fn_dbg_scope : & ' ll DIScope ,
4854 has_variables : & BitSet < SourceScope > ,
49- debug_context : & mut FunctionDebugContext < & ' ll DISubprogram > ,
55+ debug_context : & mut FunctionDebugContext < & ' ll DIScope , & ' ll DILocation > ,
5056 scope : SourceScope ,
5157) {
52- if debug_context. scopes [ scope] . is_valid ( ) {
58+ if debug_context. scopes [ scope] . dbg_scope . is_some ( ) {
5359 return ;
5460 }
5561
5662 let scope_data = & mir. source_scopes [ scope] ;
5763 let parent_scope = if let Some ( parent) = scope_data. parent_scope {
58- make_mir_scope ( cx, mir, fn_metadata , has_variables, debug_context, parent) ;
64+ make_mir_scope ( cx, instance , mir, fn_dbg_scope , has_variables, debug_context, parent) ;
5965 debug_context. scopes [ parent]
6066 } else {
6167 // The root is the function itself.
6268 let loc = cx. lookup_debug_loc ( mir. span . lo ( ) ) ;
6369 debug_context. scopes [ scope] = DebugScope {
64- scope_metadata : Some ( fn_metadata) ,
70+ dbg_scope : Some ( fn_dbg_scope) ,
71+ inlined_at : None ,
6572 file_start_pos : loc. file . start_pos ,
6673 file_end_pos : loc. file . end_pos ,
6774 } ;
6875 return ;
6976 } ;
7077
71- if !has_variables. contains ( scope) {
72- // Do not create a DIScope if there are no variables
73- // defined in this MIR Scope , to avoid debuginfo bloat.
78+ if !has_variables. contains ( scope) && scope_data . inlined . is_none ( ) {
79+ // Do not create a DIScope if there are no variables defined in this
80+ // MIR `SourceScope`, and it's not `inlined` , to avoid debuginfo bloat.
7481 debug_context. scopes [ scope] = parent_scope;
7582 return ;
7683 }
7784
7885 let loc = cx. lookup_debug_loc ( scope_data. span . lo ( ) ) ;
79- let file_metadata = file_metadata ( cx, & loc. file , debug_context . defining_crate ) ;
86+ let file_metadata = file_metadata ( cx, & loc. file ) ;
8087
81- let scope_metadata = unsafe {
82- Some ( llvm:: LLVMRustDIBuilderCreateLexicalBlock (
83- DIB ( cx) ,
84- parent_scope. scope_metadata . unwrap ( ) ,
85- file_metadata,
86- loc. line . unwrap_or ( UNKNOWN_LINE_NUMBER ) ,
87- loc. col . unwrap_or ( UNKNOWN_COLUMN_NUMBER ) ,
88- ) )
88+ let dbg_scope = match scope_data. inlined {
89+ Some ( ( callee, _) ) => {
90+ // FIXME(eddyb) this would be `self.monomorphize(&callee)`
91+ // if this is moved to `rustc_codegen_ssa::mir::debuginfo`.
92+ let callee = cx. tcx . subst_and_normalize_erasing_regions (
93+ instance. substs ,
94+ ty:: ParamEnv :: reveal_all ( ) ,
95+ & callee,
96+ ) ;
97+ let callee_fn_abi = FnAbi :: of_instance ( cx, callee, & [ ] ) ;
98+ cx. dbg_scope_fn ( callee, & callee_fn_abi, None )
99+ }
100+ None => unsafe {
101+ llvm:: LLVMRustDIBuilderCreateLexicalBlock (
102+ DIB ( cx) ,
103+ parent_scope. dbg_scope . unwrap ( ) ,
104+ file_metadata,
105+ loc. line . unwrap_or ( UNKNOWN_LINE_NUMBER ) ,
106+ loc. col . unwrap_or ( UNKNOWN_COLUMN_NUMBER ) ,
107+ )
108+ } ,
89109 } ;
110+
111+ let inlined_at = scope_data. inlined . map ( |( _, callsite_span) | {
112+ // FIXME(eddyb) this doesn't account for the macro-related
113+ // `Span` fixups that `rustc_codegen_ssa::mir::debuginfo` does.
114+ let callsite_scope = parent_scope. adjust_dbg_scope_for_span ( cx, callsite_span) ;
115+ cx. dbg_loc ( callsite_scope, parent_scope. inlined_at , callsite_span)
116+ } ) ;
117+
90118 debug_context. scopes [ scope] = DebugScope {
91- scope_metadata,
119+ dbg_scope : Some ( dbg_scope) ,
120+ inlined_at : inlined_at. or ( parent_scope. inlined_at ) ,
92121 file_start_pos : loc. file . start_pos ,
93122 file_end_pos : loc. file . end_pos ,
94123 } ;
0 commit comments