Use line numbers relative to function in mir opt tests
This adds a new option, `-Zmir-pretty-relative-line-numbers`, that is then used in compiletest for the mir-opt tests.
This commit is contained in:
parent
2643b16468
commit
7cf7ead0bc
6 changed files with 44 additions and 6 deletions
|
@ -670,6 +670,7 @@ fn test_unstable_options_tracking_hash() {
|
||||||
untracked!(ls, true);
|
untracked!(ls, true);
|
||||||
untracked!(macro_backtrace, true);
|
untracked!(macro_backtrace, true);
|
||||||
untracked!(meta_stats, true);
|
untracked!(meta_stats, true);
|
||||||
|
untracked!(mir_pretty_relative_line_numbers, true);
|
||||||
untracked!(nll_facts, true);
|
untracked!(nll_facts, true);
|
||||||
untracked!(no_analysis, true);
|
untracked!(no_analysis, true);
|
||||||
untracked!(no_interleave_lints, true);
|
untracked!(no_interleave_lints, true);
|
||||||
|
|
|
@ -360,7 +360,7 @@ where
|
||||||
"{:A$} // {}{}",
|
"{:A$} // {}{}",
|
||||||
indented_body,
|
indented_body,
|
||||||
if tcx.sess.verbose() { format!("{:?}: ", current_location) } else { String::new() },
|
if tcx.sess.verbose() { format!("{:?}: ", current_location) } else { String::new() },
|
||||||
comment(tcx, statement.source_info),
|
comment(tcx, statement.source_info, body.span),
|
||||||
A = ALIGN,
|
A = ALIGN,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
@ -381,7 +381,7 @@ where
|
||||||
"{:A$} // {}{}",
|
"{:A$} // {}{}",
|
||||||
indented_terminator,
|
indented_terminator,
|
||||||
if tcx.sess.verbose() { format!("{:?}: ", current_location) } else { String::new() },
|
if tcx.sess.verbose() { format!("{:?}: ", current_location) } else { String::new() },
|
||||||
comment(tcx, data.terminator().source_info),
|
comment(tcx, data.terminator().source_info, body.span),
|
||||||
A = ALIGN,
|
A = ALIGN,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
@ -518,8 +518,14 @@ impl<'tcx> Visitor<'tcx> for ExtraComments<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn comment(tcx: TyCtxt<'_>, SourceInfo { span, scope }: SourceInfo) -> String {
|
fn comment(tcx: TyCtxt<'_>, SourceInfo { span, scope }: SourceInfo, function_span: Span) -> String {
|
||||||
format!("scope {} at {}", scope.index(), tcx.sess.source_map().span_to_embeddable_string(span))
|
let location = if tcx.sess.opts.unstable_opts.mir_pretty_relative_line_numbers {
|
||||||
|
tcx.sess.source_map().span_to_relative_line_string(span, function_span)
|
||||||
|
} else {
|
||||||
|
tcx.sess.source_map().span_to_embeddable_string(span)
|
||||||
|
};
|
||||||
|
|
||||||
|
format!("scope {} at {}", scope.index(), location,)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Prints local variables in a scope tree.
|
/// Prints local variables in a scope tree.
|
||||||
|
@ -550,7 +556,7 @@ fn write_scope_tree(
|
||||||
"{0:1$} // in {2}",
|
"{0:1$} // in {2}",
|
||||||
indented_debug_info,
|
indented_debug_info,
|
||||||
ALIGN,
|
ALIGN,
|
||||||
comment(tcx, var_debug_info.source_info),
|
comment(tcx, var_debug_info.source_info, body.span),
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -585,7 +591,7 @@ fn write_scope_tree(
|
||||||
indented_decl,
|
indented_decl,
|
||||||
ALIGN,
|
ALIGN,
|
||||||
local_name,
|
local_name,
|
||||||
comment(tcx, local_decl.source_info),
|
comment(tcx, local_decl.source_info, body.span),
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1379,6 +1379,8 @@ options! {
|
||||||
"use like `-Zmir-enable-passes=+DestProp,-InstCombine`. Forces the specified passes to be \
|
"use like `-Zmir-enable-passes=+DestProp,-InstCombine`. Forces the specified passes to be \
|
||||||
enabled, overriding all other checks. Passes that are not specified are enabled or \
|
enabled, overriding all other checks. Passes that are not specified are enabled or \
|
||||||
disabled by other flags as usual."),
|
disabled by other flags as usual."),
|
||||||
|
mir_pretty_relative_line_numbers: bool = (false, parse_bool, [UNTRACKED],
|
||||||
|
"use line numbers relative to the function in mir pretty printing"),
|
||||||
#[cfg_attr(not(bootstrap), rustc_lint_opt_deny_field_access("use `Session::mir_opt_level` instead of this field"))]
|
#[cfg_attr(not(bootstrap), rustc_lint_opt_deny_field_access("use `Session::mir_opt_level` instead of this field"))]
|
||||||
mir_opt_level: Option<usize> = (None, parse_opt_number, [TRACKED],
|
mir_opt_level: Option<usize> = (None, parse_opt_number, [TRACKED],
|
||||||
"MIR optimization level (0-4; default: 1 in non optimized builds and 2 in optimized builds)"),
|
"MIR optimization level (0-4; default: 1 in non optimized builds and 2 in optimized builds)"),
|
||||||
|
|
|
@ -463,6 +463,33 @@ impl SourceMap {
|
||||||
self.span_to_string(sp, FileNameDisplayPreference::Remapped)
|
self.span_to_string(sp, FileNameDisplayPreference::Remapped)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Format the span location suitable for pretty printing anotations with relative line numbers
|
||||||
|
pub fn span_to_relative_line_string(&self, sp: Span, relative_to: Span) -> String {
|
||||||
|
if self.files.borrow().source_files.is_empty() || sp.is_dummy() || relative_to.is_dummy() {
|
||||||
|
return "no-location".to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
let lo = self.lookup_char_pos(sp.lo());
|
||||||
|
let hi = self.lookup_char_pos(sp.hi());
|
||||||
|
let offset = self.lookup_char_pos(relative_to.lo());
|
||||||
|
|
||||||
|
if lo.file.name != offset.file.name {
|
||||||
|
return self.span_to_embeddable_string(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
let lo_line = lo.line.saturating_sub(offset.line);
|
||||||
|
let hi_line = hi.line.saturating_sub(offset.line);
|
||||||
|
|
||||||
|
format!(
|
||||||
|
"{}:+{}:{}: +{}:{}",
|
||||||
|
lo.file.name.display(FileNameDisplayPreference::Remapped),
|
||||||
|
lo_line,
|
||||||
|
lo.col.to_usize() + 1,
|
||||||
|
hi_line,
|
||||||
|
hi.col.to_usize() + 1,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/// Format the span location to be printed in diagnostics. Must not be emitted
|
/// Format the span location to be printed in diagnostics. Must not be emitted
|
||||||
/// to build artifacts as this may leak local file paths. Use span_to_embeddable_string
|
/// to build artifacts as this may leak local file paths. Use span_to_embeddable_string
|
||||||
/// for string suitable for embedding.
|
/// for string suitable for embedding.
|
||||||
|
|
|
@ -76,6 +76,7 @@
|
||||||
-Z meta-stats=val -- gather metadata statistics (default: no)
|
-Z meta-stats=val -- gather metadata statistics (default: no)
|
||||||
-Z mir-emit-retag=val -- emit Retagging MIR statements, interpreted e.g., by miri; implies -Zmir-opt-level=0 (default: no)
|
-Z mir-emit-retag=val -- emit Retagging MIR statements, interpreted e.g., by miri; implies -Zmir-opt-level=0 (default: no)
|
||||||
-Z mir-enable-passes=val -- use like `-Zmir-enable-passes=+DestProp,-InstCombine`. Forces the specified passes to be enabled, overriding all other checks. Passes that are not specified are enabled or disabled by other flags as usual.
|
-Z mir-enable-passes=val -- use like `-Zmir-enable-passes=+DestProp,-InstCombine`. Forces the specified passes to be enabled, overriding all other checks. Passes that are not specified are enabled or disabled by other flags as usual.
|
||||||
|
-Z mir-pretty-relative-line-numbers=val -- use line numbers relative to the function in mir pretty printing
|
||||||
-Z mir-opt-level=val -- MIR optimization level (0-4; default: 1 in non optimized builds and 2 in optimized builds)
|
-Z mir-opt-level=val -- MIR optimization level (0-4; default: 1 in non optimized builds and 2 in optimized builds)
|
||||||
-Z move-size-limit=val -- the size at which the `large_assignments` lint starts to be emitted
|
-Z move-size-limit=val -- the size at which the `large_assignments` lint starts to be emitted
|
||||||
-Z mutable-noalias=val -- emit noalias metadata for mutable references (default: yes)
|
-Z mutable-noalias=val -- emit noalias metadata for mutable references (default: yes)
|
||||||
|
|
|
@ -1960,6 +1960,7 @@ impl<'test> TestCx<'test> {
|
||||||
"-Zdump-mir=all",
|
"-Zdump-mir=all",
|
||||||
"-Zvalidate-mir",
|
"-Zvalidate-mir",
|
||||||
"-Zdump-mir-exclude-pass-number",
|
"-Zdump-mir-exclude-pass-number",
|
||||||
|
"-Zmir-pretty-relative-line-numbers=yes",
|
||||||
]);
|
]);
|
||||||
if let Some(pass) = &self.props.mir_unit_test {
|
if let Some(pass) = &self.props.mir_unit_test {
|
||||||
rustc.args(&["-Zmir-opt-level=0", &format!("-Zmir-enable-passes=+{}", pass)]);
|
rustc.args(&["-Zmir-opt-level=0", &format!("-Zmir-enable-passes=+{}", pass)]);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue