When the required discriminator value exceeds LLVM's limits, drop the debug info for the function instead of panicking.
The maximum discriminator value LLVM can currently encode is 2^12. If macro use results in more than 2^12 calls to the same function attributed to the same callsite, and those calls are MIR-inlined, we will require more than the maximum discriminator value to completely represent the debug information. Once we reach that point drop the debug info instead.
This commit is contained in:
parent
1e4ebb0ccd
commit
f5b023bd9c
5 changed files with 4175 additions and 31 deletions
|
@ -20,7 +20,9 @@ use crate::traits::*;
|
|||
|
||||
pub struct FunctionDebugContext<'tcx, S, L> {
|
||||
/// Maps from source code to the corresponding debug info scope.
|
||||
pub scopes: IndexVec<mir::SourceScope, DebugScope<S, L>>,
|
||||
/// May be None if the backend is not capable of representing the scope for
|
||||
/// some reason.
|
||||
pub scopes: IndexVec<mir::SourceScope, Option<DebugScope<S, L>>>,
|
||||
|
||||
/// Maps from an inlined function to its debug info declaration.
|
||||
pub inlined_function_scopes: FxHashMap<Instance<'tcx>, S>,
|
||||
|
@ -231,7 +233,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
&self,
|
||||
source_info: mir::SourceInfo,
|
||||
) -> Option<(Bx::DIScope, Option<Bx::DILocation>, Span)> {
|
||||
let scope = &self.debug_context.as_ref()?.scopes[source_info.scope];
|
||||
let scope = &self.debug_context.as_ref()?.scopes[source_info.scope]?;
|
||||
let span = hygiene::walk_chain_collapsed(source_info.span, self.mir.span);
|
||||
Some((scope.adjust_dbg_scope_for_span(self.cx, span), scope.inlined_at, span))
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue