Commit graph

227 commits

Author SHA1 Message Date
León Orell Valerian Liehr
3053ced813
Rollup merge of #119444 - compiler-errors:closure-or-coroutine, r=oli-obk
Rename `TyCtxt::is_closure` to `TyCtxt::is_closure_or_coroutine`

This function has always been used to test whether the def-id was a closure **or** coroutine: https://github.com/rust-lang/rust/pull/118311/files#diff-69ebec59f7d38331dd1be84ede7957977dcaa39e30ed2869b04aa8c99b2079ccR552 -- the name is just confusing because it disagrees with other fns named `is_closure`, like `Ty::is_closure`.

So let's rename it.
2024-01-03 16:08:26 +01:00
Michael Goulet
07adee7072 is_coroutine -> is_coroutine_or_closure 2023-12-30 15:24:15 +00:00
Zalathar
3f67118ae7 coverage: Make coverage_counters a local variable
This avoids the awkwardness of having to create it in the pass's constructor,
and then mutate it later to actually create the counters.
2023-12-30 22:36:11 +11:00
Zalathar
e1a2babc06 coverage: Prepare mappings separately from injecting statements
These two tasks historically needed to be interleaved, but after various recent
changes (including #116046 and #116917) they can now be fully separated.
2023-12-30 22:34:15 +11:00
Zalathar
8529b63e2b coverage: Avoid a possible query stability hazard in CoverageCounters
The iteration order of this hashmap can potentially affect the relative
creation order of MIR blocks.
2023-12-29 12:33:52 +11:00
Michael Goulet
fcb42b42d6 Remove movability from TyKind::Coroutine 2023-12-28 16:35:01 +00:00
Zalathar
be6b059169 coverage: Unexpand spans with find_ancestor_inside_same_ctxt 2023-12-27 23:49:31 +11:00
Zalathar
cf6dc7adb3 coverage: Check for async fn explicitly, without needing a heuristic
The old code used a heuristic to detect async functions and adjust their
coverage spans to produce better output. But there's no need to resort to a
heuristic when we can just check whether the current function is actually an
`async fn`.
2023-12-20 18:48:04 +11:00
Zalathar
2a0290a802 coverage: Pass around &ExtractedHirInfo instead of individual fields
This reduces the risk of mixing up `fn_source_span` and `body_span`, and makes
it easier to pass along additional fields as needed.
2023-12-20 18:48:04 +11:00
Zalathar
dfa6441354 coverage: Skip instrumenting a function if no spans were extracted 2023-12-16 11:10:10 +11:00
Zalathar
684b9ea408 coverage: Check that the function signature span precedes the body
This will normally be true, but in cases where it's not true we're better off
not making any assumptions about the signature.
2023-12-15 10:59:32 +11:00
Zalathar
3b610c764d coverage: Compare span source files without involving Lrc<SourceFile>
If we want to know whether two byte positions are in the same file, we don't
need to clone and compare `Lrc<SourceFile>`; we can just get their indices and
compare those instead.
2023-12-15 10:59:32 +11:00
Zalathar
7de2156bfd coverage: Inline and simplify fn_sig_and_body 2023-12-15 10:59:32 +11:00
Zalathar
e2f449bcc9 coverage: Use LocalDefId in extract_hir_info 2023-12-15 10:59:32 +11:00
Zalathar
b9955fb340 coverage: Extract helper for getting HIR info for coverage 2023-12-15 10:59:32 +11:00
Zalathar
bf424c28d2 coverage: Don't bother storing the source file in Instrumentor
We can just as easily look it up again from the source map and body span when
needed.
2023-12-15 10:59:32 +11:00
Zalathar
3d5d5b7ef8 coverage: Extract is_eligible_for_coverage 2023-12-15 10:59:32 +11:00
Zalathar
315c0cf358 coverage: Simplify parts of InstrumentCoverage::run_pass
Changes in this patch:
  - Extract local variable `def_id`
  - Check `is_fn_like` without retrieving HIR
  - Inline some locals that are used once and aren't needed for clarity
2023-12-15 10:59:32 +11:00
Zalathar
87cffb2377 coverage: Assert that the instrumentor never sees promoted MIR 2023-12-15 10:59:32 +11:00
zetanumbers
24f009c5e5 Move some methods from tcx.hir() to tcx
Renamings:
- find -> opt_hir_node
- get -> hir_node
- find_by_def_id -> opt_hir_node_by_def_id
- get_by_def_id -> hir_node_by_def_id

Fix rebase changes using removed methods

Use `tcx.hir_node_by_def_id()` whenever possible in compiler

Fix clippy errors

Fix compiler

Apply suggestions from code review

Co-authored-by: Vadim Petrochenkov <vadim.petrochenkov@gmail.com>

Add FIXME for `tcx.hir()` returned type about its removal

Simplify with with `tcx.hir_node_by_def_id`
2023-12-12 06:40:29 -08:00
surechen
40ae34194c remove redundant imports
detects redundant imports that can be eliminated.

for #117772 :

In order to facilitate review and modification, split the checking code and
removing redundant imports code into two PR.
2023-12-10 10:56:22 +08:00
Jubilee
feb879394a
Rollup merge of #118666 - Zalathar:body-closure, r=cjgillot
coverage: Simplify the heuristic for ignoring `async fn` return spans

The code for extracting coverage spans from MIR has a special heuristic for dealing with `async fn`, so that the function's closing brace does not have a confusing double count.

The code implementing that heuristic is currently mixed in with the code for flushing remaining spans after the main refinement loop, making the refinement code harder to understand.

We can solve that by hoisting the heuristic to an earlier stage, after the spans have been extracted and sorted but before they have been processed by the refinement loop.

The coverage tests verify that the heuristic is still effective, so coverage mappings/reports for `async fn` have not changed.

---

This PR also has the side-effect of fixing the `None some_prev` panic that started appearing after #118525.

The old code assumed that `prev` would always be present after the refinement loop. That was only true if the list of collected spans was non-empty, but prior to #118525 that didn't seem to come up in practice. After that change, the list of collected spans could be empty in some specific circumstances, leading to panics.

The new code uses an `if let` to inspect `prev`, which correctly does nothing if there is no span present.
2023-12-09 00:48:10 -08:00
Zalathar
cec814202a coverage: Add #[track_caller] to the span generator's unwrap methods
This should make it easier to investigate unwrap failures in bug reports.
2023-12-08 22:49:12 +11:00
Zalathar
e0cd8057c8 coverage: Simplify the heuristic for ignoring async fn return spans 2023-12-08 22:49:11 +11:00
Zalathar
44b47aa976 coverage: Add CoverageKind::SpanMarker for including extra spans in MIR
There are cases where coverage instrumentation wants to show a span for some
syntax element, but there is no MIR node that naturally carries that span, so
the instrumentor can't see it.

MIR building can now use this new kind of coverage statement to deliberately
include those spans in MIR, attached to a dummy statement that has no other
effect.
2023-12-08 22:40:49 +11:00
Matthias Krüger
f7c892e323
Rollup merge of #118695 - Zalathar:push-refined, r=davidtwco
coverage: Merge refined spans in a separate final pass

Pulling this merge step out of `push_refined_span` and into a separate pass lets us push directly to `refined_spans` instead of calling a helper method.

Because the compiler can now see partial borrows of `refined_spans`, we can remove some extra code that was jumping through hoops to satisfy the borrow checker.

---

``@rustbot`` label +A-code-coverage
2023-12-08 06:44:43 +01:00
Zalathar
9a4321518c coverage: Simplify code that pushes to refined_spans 2023-12-07 17:41:04 +11:00
Zalathar
9089d28780 coverage: Inline push_refined_span 2023-12-07 17:41:01 +11:00
Zalathar
ec0110be09 coverage: Merge refined spans in a separate final pass
This makes `push_refined_span` trivial, which will let us inline it and benefit
from partial borrows of `refined_spans`.
2023-12-07 17:31:49 +11:00
Zalathar
47e6e5ee67 coverage: Avoid unnecessary macros in unit tests
These macros don't provide enough value to justify their complexity, when they
can just as easily be functions instead.
2023-12-07 11:12:48 +11:00
Zalathar
242bff3cda coverage: Be more strict about what counts as a "visible macro" 2023-12-05 21:21:05 +11:00
Zalathar
ff3af59f2b coverage: Clean up maybe_push_macro_name_span 2023-12-05 21:21:05 +11:00
Zalathar
eb2d4cb541 coverage: Skip spans that can't be un-expanded back to the function body
When we extract coverage spans from MIR, we try to "un-expand" them back to
spans that are inside the function's body span.

In cases where that doesn't succeed, the current code just swaps in the entire
body span instead. But that tends to result in coverage spans that are
completely unrelated to the control flow of the affected code, so it's better
to just discard those spans.
2023-12-03 12:35:33 +11:00
Zalathar
3163bc8700 coverage: Assert that bcb0 starts with bb0 and has no in-edges
This explains why we don't have to worry about bcb0 having multiple in-edges.
2023-11-25 12:29:21 +11:00
Zalathar
3b9d7037c9 coverage: Eliminate BcbBranch
`BcbBranch` represented an out-edge of a coverage graph node, but would
silently refer to a node instead in cases where that node only had one in-edge.

Instead we now refer to a graph edge as a `(from_bcb, to_bcb)` pair, or
sometimes as just one of those nodes when the other node is implied by the
surrounding context. The case of sole in-edges is handled by special code added
directly to `get_or_make_edge_counter_operand`.
2023-11-25 12:29:20 +11:00
Zalathar
276a32994e coverage: Extract CoverageGraph::bcb_has_multiple_in_edges
This was previously a helper method in `MakeBcbCounters`, but putting it in the
graph lets us call it from `BcbBranch`, and gives us a more fine-grained
borrow.
2023-11-25 12:29:20 +11:00
Zalathar
a1e2c10b1f coverage: Simplify building coverage expressions based on sums
In some cases we need to prepare a coverage expression that is the sum of an
arbitrary number of other terms. This patch simplifies the code paths that
build those sums.

This causes some churn in the mappings, because the previous code was building
its sums in a somewhat idiosyncratic order.
2023-11-25 12:29:20 +11:00
Zalathar
31113c5f56 coverage: Use BcbCounter to build coverage expressions
This means that we no longer have to manage the distinction between
`BcbCounter` and `CovTerm` when preparing expressions.
2023-11-25 12:29:20 +11:00
Zalathar
df23279e1e coverage: Push down creation of a visited node's counter
Now that this code path unconditionally calls `make_branch_counters`, we might
as well make that method responsible for creating the node's counter as well,
since it needs the resulting term anyway.
2023-11-25 12:29:20 +11:00
Zalathar
0a17f0697a coverage: Push down and inline bcb_needs_branch_counters
This lets us avoid creating two copies of the node's branch list.
2023-11-25 12:29:20 +11:00
Zalathar
2cadd31c04 coverage: Rename parameter branching_bcb to from_bcb 2023-11-25 12:29:20 +11:00
Nicholas Nethercote
7060fc8327 Replace no_ord_impl with orderable.
Similar to the previous commit, this replaces `newtype_index`'s opt-out
`no_ord_impl` attribute with the opt-in `orderable` attribute.
2023-11-22 18:38:17 +11:00
Nilstrieb
21a870515b Fix clippy::needless_borrow in the compiler
`x clippy compiler -Aclippy::all -Wclippy::needless_borrow --fix`.

Then I had to remove a few unnecessary parens and muts that were exposed
now.
2023-11-21 20:13:40 +01:00
Mark Rousskov
917f6540ed Re-format code with new rustfmt 2023-11-15 21:45:48 -05:00
Zalathar
ed8298b825 coverage: Avoid creating malformed macro name spans
This method is trying to detect macro invocations, so that it can split a span
into two parts just after the `!` of the invocation.

Under some circumstances (probably involving nested macros), it gets confused
and produces a span that is larger than the original span, and possibly extends
outside its enclosing function and even into an adjacent file.

In extreme cases, that can result in malformed coverage mappings that cause
`llvm-cov` to fail. For now, we at least want to detect these egregious cases
and avoid them, so that coverage reports can still be produced.
2023-11-12 18:33:11 +11:00
Zalathar
6d956a228b coverage: Replace impossible coverage::Error with assertions
Historically, these errors existed so that the coverage debug code could dump
additional information before reporting a compiler bug. That debug code was
removed by #115962, so we can now simplify these methods by making them panic
when they detect a bug.
2023-10-31 22:20:30 +11:00
Zalathar
8ef67d0f01 coverage: Promote some debug-only checks to always run
These checks should be cheap, so there's little reason for them to be
debug-only.
2023-10-31 22:19:51 +11:00
Zalathar
10c4734c79 coverage: Use a tracing span to group the parts of a sum-up expression 2023-10-30 12:46:43 +11:00
Zalathar
2f1be08473 coverage: Inline the "recursive" worker methods for assigning counters
Now that we don't manually pass around indent levels, there's no need for these
worker methods to exist separately from their main callers.
2023-10-30 12:46:43 +11:00
Zalathar
6d69eb1f2e coverage: Replace manual debug indents with nested tracing spans 2023-10-30 12:46:43 +11:00