@@ -9,7 +9,7 @@ use rustc_middle::mir::{Body, SourceScope};
9
9
use rustc_middle:: ty:: layout:: { FnAbiOf , HasTypingEnv } ;
10
10
use rustc_middle:: ty:: { self , Instance } ;
11
11
use rustc_session:: config:: DebugInfo ;
12
- use rustc_span:: { BytePos , hygiene} ;
12
+ use rustc_span:: { BytePos , DUMMY_SP , hygiene} ;
13
13
14
14
use super :: metadata:: file_metadata;
15
15
use super :: utils:: DIB ;
@@ -85,23 +85,15 @@ fn make_mir_scope<'ll, 'tcx>(
85
85
discriminators,
86
86
parent,
87
87
) ;
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]
97
89
} else {
98
90
// The root is the function itself.
99
91
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 {
101
93
file_start_pos : file. start_pos ,
102
94
file_end_pos : file. end_position ( ) ,
103
- ..debug_context. scopes [ scope] . unwrap ( )
104
- } ) ;
95
+ ..debug_context. scopes [ scope]
96
+ } ;
105
97
instantiated. insert ( scope) ;
106
98
return ;
107
99
} ;
@@ -112,7 +104,7 @@ fn make_mir_scope<'ll, 'tcx>(
112
104
{
113
105
// Do not create a DIScope if there are no variables defined in this
114
106
// 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;
116
108
instantiated. insert ( scope) ;
117
109
return ;
118
110
}
@@ -145,14 +137,7 @@ fn make_mir_scope<'ll, 'tcx>(
145
137
} ,
146
138
} ;
147
139
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) | {
156
141
let callsite_span = hygiene:: walk_chain_collapsed ( callsite_span, mir. span ) ;
157
142
let callsite_scope = parent_scope. adjust_dbg_scope_for_span ( cx, callsite_span) ;
158
143
let loc = cx. dbg_loc ( callsite_scope, parent_scope. inlined_at , callsite_span) ;
@@ -175,29 +160,29 @@ fn make_mir_scope<'ll, 'tcx>(
175
160
// Note further that we can't key this hashtable on the span itself,
176
161
// because these spans could have distinct SyntaxContexts. We have
177
162
// 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 ( ) ) {
179
164
Entry :: Occupied ( mut o) => {
180
165
* 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.
181
169
unsafe { llvm:: LLVMRustDILocationCloneWithBaseDiscriminator ( loc, * o. get ( ) ) }
170
+ . unwrap_or_else ( || {
171
+ cx. dbg_loc ( callsite_scope, parent_scope. inlined_at , DUMMY_SP )
172
+ } )
182
173
}
183
174
Entry :: Vacant ( v) => {
184
175
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
197
177
}
198
178
}
199
- }
179
+ } ) ;
200
180
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
+ } ;
202
187
instantiated. insert ( scope) ;
203
188
}
0 commit comments