@@ -9,7 +9,7 @@ use rustc_middle::mir::{Body, SourceScope};
99use rustc_middle:: ty:: layout:: { FnAbiOf , HasTypingEnv } ;
1010use rustc_middle:: ty:: { self , Instance } ;
1111use rustc_session:: config:: DebugInfo ;
12- use rustc_span:: { BytePos , hygiene} ;
12+ use rustc_span:: { BytePos , DUMMY_SP , hygiene} ;
1313
1414use super :: metadata:: file_metadata;
1515use super :: utils:: DIB ;
@@ -85,23 +85,15 @@ fn make_mir_scope<'ll, 'tcx>(
8585 discriminators,
8686 parent,
8787 ) ;
88- if let Some ( parent_scope) = debug_context. scopes [ parent] {
89- parent_scope
90- } else {
91- // If the parent scope could not be represented then no children
92- // can be either.
93- debug_context. scopes [ scope] = None ;
94- instantiated. insert ( scope) ;
95- return ;
96- }
88+ debug_context. scopes [ parent]
9789 } else {
9890 // The root is the function itself.
9991 let file = cx. sess ( ) . source_map ( ) . lookup_source_file ( mir. span . lo ( ) ) ;
100- debug_context. scopes [ scope] = Some ( DebugScope {
92+ debug_context. scopes [ scope] = DebugScope {
10193 file_start_pos : file. start_pos ,
10294 file_end_pos : file. end_position ( ) ,
103- ..debug_context. scopes [ scope] . unwrap ( )
104- } ) ;
95+ ..debug_context. scopes [ scope]
96+ } ;
10597 instantiated. insert ( scope) ;
10698 return ;
10799 } ;
@@ -112,7 +104,7 @@ fn make_mir_scope<'ll, 'tcx>(
112104 {
113105 // Do not create a DIScope if there are no variables defined in this
114106 // MIR `SourceScope`, and it's not `inlined`, to avoid debuginfo bloat.
115- debug_context. scopes [ scope] = Some ( parent_scope) ;
107+ debug_context. scopes [ scope] = parent_scope;
116108 instantiated. insert ( scope) ;
117109 return ;
118110 }
@@ -145,14 +137,7 @@ fn make_mir_scope<'ll, 'tcx>(
145137 } ,
146138 } ;
147139
148- let mut debug_scope = Some ( DebugScope {
149- dbg_scope,
150- inlined_at : parent_scope. inlined_at ,
151- file_start_pos : loc. file . start_pos ,
152- file_end_pos : loc. file . end_position ( ) ,
153- } ) ;
154-
155- if let Some ( ( _, callsite_span) ) = scope_data. inlined {
140+ let inlined_at = scope_data. inlined . map ( |( _, callsite_span) | {
156141 let callsite_span = hygiene:: walk_chain_collapsed ( callsite_span, mir. span ) ;
157142 let callsite_scope = parent_scope. adjust_dbg_scope_for_span ( cx, callsite_span) ;
158143 let loc = cx. dbg_loc ( callsite_scope, parent_scope. inlined_at , callsite_span) ;
@@ -175,29 +160,29 @@ fn make_mir_scope<'ll, 'tcx>(
175160 // Note further that we can't key this hashtable on the span itself,
176161 // because these spans could have distinct SyntaxContexts. We have
177162 // to key on exactly what we're giving to LLVM.
178- let inlined_at = match discriminators. entry ( callsite_span. lo ( ) ) {
163+ match discriminators. entry ( callsite_span. lo ( ) ) {
179164 Entry :: Occupied ( mut o) => {
180165 * o. get_mut ( ) += 1 ;
166+ // NB: We have to emit *something* here or we'll fail LLVM IR verification
167+ // in at least some circumstances (see issue #135322) so if the required
168+ // discriminant cannot be encoded fall back to the dummy location.
181169 unsafe { llvm:: LLVMRustDILocationCloneWithBaseDiscriminator ( loc, * o. get ( ) ) }
170+ . unwrap_or_else ( || {
171+ cx. dbg_loc ( callsite_scope, parent_scope. inlined_at , DUMMY_SP )
172+ } )
182173 }
183174 Entry :: Vacant ( v) => {
184175 v. insert ( 0 ) ;
185- Some ( loc)
186- }
187- } ;
188- match inlined_at {
189- Some ( inlined_at) => {
190- debug_scope. as_mut ( ) . unwrap ( ) . inlined_at = Some ( inlined_at) ;
191- }
192- None => {
193- // LLVM has a maximum discriminator that it can encode (currently
194- // it uses 12 bits for 4096 possible values). If we exceed that
195- // there is little we can do but drop the debug info.
196- debug_scope = None ;
176+ loc
197177 }
198178 }
199- }
179+ } ) ;
200180
201- debug_context. scopes [ scope] = debug_scope;
181+ debug_context. scopes [ scope] = DebugScope {
182+ dbg_scope,
183+ inlined_at : inlined_at. or ( parent_scope. inlined_at ) ,
184+ file_start_pos : loc. file . start_pos ,
185+ file_end_pos : loc. file . end_position ( ) ,
186+ } ;
202187 instantiated. insert ( scope) ;
203188}
0 commit comments