Zalathar
5d15124c62
coverage: Reduce and clarify the context-mismatch test case
2026-05-15 22:06:32 +10:00
Zalathar
0418f9aa42
coverage: Add a test case for a previously-unknown span mismatch
2026-02-03 22:53:38 +11:00
Guillaume Gomez
1832bdfe64
Rollup merge of #147611 - stablize-remap-path-scope, r=davidtwco
...
Stabilize `-Zremap-path-scope`
# Stabilization report of `--remap-path-scope`
## Summary
RFC 3127 trim-paths aims to improve the current status of sanitizing paths emitted by the compiler via the `--remap-path-prefix=FROM=TO` command line flag, by offering a profile setting named `trim-paths` in Cargo to sanitize absolute paths introduced during compilation that may be embedded in the compiled binary executable or library.
As part of that RFC the compiler was asked to add the `--remap-path-scope` command-line flag to control the scoping of how paths get remapped in the resulting binary.
Tracking:
- https://github.com/rust-lang/rust/issues/111540
### What is stabilized
The rustc `--remap-path-scope` flag is being stabilized by this PR. It defines which scopes of paths should be remapped by `--remap-path-prefix`.
This flag accepts a comma-separated list of values and may be specified multiple times, in which case the scopes are aggregated together.
The valid scopes are:
- `macro` - apply remappings to the expansion of `std::file!()` macro. This is where paths in embedded panic messages come from
- `diagnostics` - apply remappings to printed compiler diagnostics
- `debuginfo` - apply remappings to debug informations
- `coverage` - apply remappings to coverage informations
- `object` - apply remappings to all paths in compiled executables or libraries, but not elsewhere. Currently an alias for `macro,coverage,debuginfo`.
- `all` (default) - an alias for all of the above, also equivalent to supplying only `--remap-path-prefix` without `--remap-path-scope`.
#### Example
```sh
# With `object` scope only the build outputs will be remapped, the diagnostics won't be remapped.
rustc --remap-path-prefix=$(PWD)=/remapped --remap-path-scope=object main.rs
```
### What isn't stabilized
None of the Cargo facility is being stabilized in this stabilization PR, only the `--remap-path-scope` flag in `rustc` is being stabilized.
## Design
### RFC history
- [RFC3127 - trim-paths](https://rust-lang.github.io/rfcs/3127-trim-paths.html )
### Answers to unresolved questions
> What questions were left unresolved by the RFC? How have they been answered? Link to any relevant lang decisions.
There are no unresolved questions regarding `--remap-path-scope`.
(The tracking issue list a bunch of unresolved questions but they are for `--remap-path-prefix` or the bigger picture `trim-paths` in Cargo and are not related the functionality provided by `--remap-path-scope`.)
### Post-RFC changes
The RFC described more scopes, in particularly regarding split debuginfo. Those scopes where removed after analysis by `michaelwoerister` of all the possible combinations in https://github.com/rust-lang/rust/issues/111540#issuecomment-1994010274 .
### Nightly extensions
There are no nightly extensions.
### Doors closed
We are committing to having to having a flag that control which paths are being remapped based on a "scope".
## Feedback
### Call for testing
> Has a "call for testing" been done? If so, what feedback was received?
No call for testing has been done per se but feedback has been received on both the rust-lang/rust and rust-lang/cargo tracking issue.
The feedback was mainly related to deficiencies in *our best-effort* `--remap-path-prefix` implementation, in particular regarding linkers added paths, which does not change anything for `--remap-path-scope`.
### Nightly use
> Do any known nightly users use this feature? Counting instances of `#![feature(FEATURE_NAME)]` on GitHub with grep might be informative.
Except for Cargo unstable `trim-paths` there doesn't appear any committed use [on GitHub](https://github.com/search?q=%22--remap-path-scope%22+NOT+path%3A%2F%5Esrc%5C%2Fcargo%5C%2Fcore%5C%2Fcompiler%5C%2F%2F+NOT+path%3A%2F%5Etext%5C%2F%2F+NOT+path%3A%2F%5Erust%5C%2Fsrc%5C%2Fdoc%5C%2Funstable-book%5C%2Fsrc%5C%2Fcompiler-flags%5C%2F%2F+NOT+path%3A%2F%5Esrc%5C%2Fdoc%5C%2Funstable-book%5C%2Fsrc%5C%2Fcompiler-flags%5C%2F%2F+NOT+path%3A%2F%5Ecollector%5C%2Fcompile-benchmarks%5C%2Fcargo-0%5C.87%5C.1%5C%2Fsrc%5C%2Fcargo%5C%2Fcore%5C%2Fcompiler%5C%2F%2F&type=code ).
## Implementation
### Major parts
- https://github.com/rust-lang/rust/blob/b3f8586fb1e4859678d6b231e780ff81801d2282/compiler/rustc_session/src/config.rs#L1373-L1384
- https://github.com/rust-lang/rust/blob/b3f8586fb1e4859678d6b231e780ff81801d2282/compiler/rustc_session/src/session.rs#L1526
- https://github.com/rust-lang/rust/blob/b3f8586fb1e4859678d6b231e780ff81801d2282/compiler/rustc_span/src/lib.rs#L352-L372
### Coverage
- [`tests/run-make/split-debuginfo/rmake.rs`](https://github.com/rust-lang/rust/blob/9725c4baacef19345e13f91b27e66e10ef5592ae/tests/run-make/split-debuginfo/rmake.rs#L7 )
- [`tests/ui/errors/remap-path-prefix.rs`](https://github.com/rust-lang/rust/blob/9725c4baacef19345e13f91b27e66e10ef5592ae/tests/ui/errors/remap-path-prefix.rs#L4 )
- [`tests/ui/errors/remap-path-prefix-macro.rs`](https://github.com/rust-lang/rust/blob/9725c4baacef19345e13f91b27e66e10ef5592ae/tests/ui/errors/remap-path-prefix-macro.rs#L1-L4 )
- [`tests/run-make/remap-path-prefix-dwarf/rmake.rs
`](https://github.com/rust-lang/rust/blob/9725c4baacef19345e13f91b27e66e10ef5592ae/tests/run-make/remap-path-prefix-dwarf/rmake.rs )
- [`tests/run-make/remap-path-prefix/rmake.rs`](https://github.com/rust-lang/rust/blob/9725c4baacef19345e13f91b27e66e10ef5592ae/tests/run-make/remap-path-prefix/rmake.rs )
- [`tests/ui/errors/remap-path-prefix-diagnostics.rs`](https://github.com/rust-lang/rust/blob/9725c4baacef19345e13f91b27e66e10ef5592ae/tests/ui/errors/remap-path-prefix-diagnostics.rs )
### Outstanding bugs
> What outstanding bugs involve this feature? List them. Should any block the stabilization? Discuss why or why not.
There are no outstanding bugs regarding `--remap-path-scope`.
### Outstanding FIXMEs
> What FIXMEs are still in the code for that feature and why is it OK to leave them there?
There are no FIXME regarding `--remap-path-scope` in it-self.
### Tool changes
> What changes must be made to our other tools to support this feature. Has this work been done? Link to any relevant PRs and issues.
- rustdoc (both JSON, HTML and doctest)
- `rustdoc` has support for `--remap-path-prefix`, it should probably also get support for `--remap-path-scope`, although rustdoc maybe want to adapt the scopes for it's use (replace `debuginfo` with `documentation` for example).
## History
> List issues and PRs that are important for understanding how we got here.
- https://github.com/rust-lang/rust/pull/115214
- https://github.com/rust-lang/rust/pull/122450
- https://github.com/rust-lang/rust/pull/139550
- https://github.com/rust-lang/rust/pull/140716
## Acknowledgments
> Summarize contributors to the feature by name for recognition and so that those people are notified about the stabilization. Does anyone who worked on this *not* think it should be stabilized right now? We'd like to hear about that if so.
- @cbeuw
- @michaelwoerister
- @weihanglo
- @Urgau
@rustbot labels +T-compiler +needs-fcp +F-trim-paths
r? @davidtwco
2026-01-20 14:36:30 +01:00
Zalathar
1f423a6e42
coverage: Add a test for macros that only contain other macros
2026-01-20 13:29:09 +11:00
Camille GILLOT
9415102fb4
Create place and value indices on-demand.
2025-12-14 16:33:24 +00:00
Camille GILLOT
3d83b9597d
Split Map::register.
2025-12-14 16:33:24 +00:00
Urgau
d0d8258886
Stabilize -Zremap-path-scope as --remap-path-scope
...
In the process also document that new `--remap-path-scope` scopes may be
added in the future, and that the `all` scope always represent all the
scopes.
Co-authored-by: David Wood <agile.lion3441@fuligin.ink >
2025-12-13 21:21:59 +01:00
bors
4ad239f415
Auto merge of #142821 - cjgillot:jump-threading-single, r=saethlin
...
Compute jump threading opportunities in a single pass
The current implementation of jump threading walks MIR CFG backwards from each `SwitchInt` terminator. This PR replaces this by a single postorder traversal of MIR. In theory, we could do a full fixpoint dataflow analysis, but this has low returns as we forbid threading through a loop header.
The second commit in this PR modifies the carried state to a lighter data structure. The current implementation uses some kind of `IndexVec<ValueIndex, &[Condition]>`. This is needlessly heavy, as the state rarely ever carries more than a few `Condition`s. The first commit replaces this state with a simpler `&[Condition]`, and puts the corresponding `ValueIndex` inside `Condition`.
The three later commits are perf tweaks.
The sixth commit is the main change. Instead of carrying the goto target inside the condition, we maintain a set of conditions associated with each block, and their consequences in following blocks. Think: if this condition is fulfilled in this block, then that condition is fulfilled in that block. This makes the threading algorithm much easier to implement, without the extra bookkeeping of `ThreadingOpportunity` we had.
Later commits modify that algorithm to shrink the set of duplicated blocks. By propagating fulfilled conditions down the CFG, and trimming costly threads.
2025-12-01 23:44:49 +00:00
Zalathar
a3bf870441
coverage: Test some edge cases involving macro expansion
2025-11-30 18:31:54 +11:00
Camille GILLOT
d67e3e6c5a
Use a simpler condition set in jump threading.
2025-11-16 01:38:11 +00:00
Mara Bos
9b4843196c
Bless coverage tests.
2025-11-12 12:48:45 +01:00
Mara Bos
7b42543f81
Bless tests.
2025-11-12 12:48:27 +01:00
Jason Newcomb
76067c446c
Adjust spans into the for loops context before creating the pattern and into_iter call spans.
2025-11-11 19:18:19 -05:00
Urgau
94c893ee2e
Add coverage scope for controlling paths in code coverage
2025-10-27 12:54:24 +01:00
bors
40ace17fc3
Auto merge of #145882 - m-ou-se:format-args-extend-1-arg, r=petrochenkov
...
Extended temporary argument to format_args!() in all cases
Fixes https://github.com/rust-lang/rust/issues/145880 by removing the special case.
2025-09-26 04:34:09 +00:00
bors
c0bb3b98bb
Auto merge of #143290 - azhogin:azhogin/link-pub-async-impls, r=oli-obk
...
pub async fn impl is monomorphized when func itself is monomorphized
Implentation coroutine (`func::{closure#0}`) is monomorphized, when func itself is monomorphized.
Currently, when `pub async fn foo(..)` is exported from lib and used in several dependent crates, only 'header' function is monomorphized in the defining crate. 'header' function, returning coroutine object, is monomorphized, but the coroutine's poll function (which actually implements all the logic for the function) is not. In such situation, `func::{closure#0}` will be monomorphized in every dependency.
This PR adds monomorphization for `func::{closure#0}` (coroutine poll function), when func itself is monomorphized.
Simple test with one lib async function and ten dependent crates (executable) that use the function, shows 5-7% compilation time improvement (single-threaded).
2025-09-01 10:54:40 +00:00
Andrew Zhogin
c2c58cbc65
pub async fn implementation coroutine (func::{closure#0}) is monomorphized, when func itself is monomorphized
2025-09-01 13:45:00 +07:00
Mara Bos
bc13565de8
Update tests.
2025-08-26 14:46:11 +02:00
Zalathar
c2eb45b4a1
coverage: Build an "expansion tree" and use it to unexpand raw spans
2025-08-24 20:29:34 +10:00
Zalathar
bd8e3db94d
coverage: Add a specific test for #[rustfmt::skip]
2025-08-24 20:29:34 +10:00
Zalathar
81ed042c8c
coverage: Remove all unstable support for MC/DC instrumentation
2025-08-06 22:38:52 +10:00
Zalathar
51e62a09a3
coverage: Remove -Zcoverage-options=no-mir-spans
...
This flag turned out to be less useful than anticipated, and interferes with
work towards expansion support.
2025-08-04 13:48:40 +10:00
Zalathar
2e6f4a5922
coverage: Re-land "Enlarge empty spans during MIR instrumentation"
...
This allows us to assume that coverage spans will only be discarded during
codegen in very unusual situations.
2025-07-30 13:17:05 +10:00
Zalathar
682f744f89
coverage: Treat #[automatically_derived] as #[coverage(off)]
2025-07-29 19:56:31 +10:00
Zalathar
2761034176
coverage: Test how #[automatically_derived] affects instrumentation
2025-07-29 19:55:54 +10:00
Zalathar
7ca4d1f6a1
coverage: Regression test for "function name is empty" bug
...
The bug was triggered by a particular usage of the `?` try operator in a
proc-macro expansion.
Thanks to lqd for the minimization.
Co-authored-by: Rémy Rakic <remy.rakic+github@gmail.com >
2025-07-29 11:36:43 +10:00
Zalathar
2b17897092
Revert "coverage: Enlarge empty spans during MIR instrumentation, not codegen"
...
This reverts commit f877aa7d14 .
2025-07-26 11:14:40 +10:00
Zalathar
f877aa7d14
coverage: Enlarge empty spans during MIR instrumentation, not codegen
...
This allows us to assume that coverage spans will only be discarded during
codegen in very unusual situations.
2025-07-22 19:49:54 +10:00
Cameron Steffen
dc9879cb3d
Remove let_chains feature
2025-06-30 07:49:20 -05:00
Zalathar
3f526eeec4
coverage: Revert "unused local file IDs" due to empty function names
...
This reverts commit 3b22c21dd8 , reversing
changes made to 5f292eea6d .
2025-05-27 23:33:29 +10:00
Zalathar
078144fdfa
coverage: Detect unused local file IDs to avoid an LLVM assertion
...
This case can't actually happen yet (other than via a testing flag), because
currently all of a function's spans must belong to the same file and expansion.
But this will be an important edge case when adding expansion region support.
2025-05-10 00:24:03 +10:00
Zalathar
339556eb02
coverage: Enlarge empty spans during MIR instrumentation, not codegen
...
This allows us to assume that coverage spans will only be discarded during
codegen in very unusual situations.
2025-05-10 00:24:01 +10:00
Zalathar
4d5a1acebf
coverage: Only merge adjacent coverage spans
...
This also removes some manipulation of the function signature span that only
made sense in the context of merging non-adjacent spans.
2025-05-06 20:42:25 +10:00
Zalathar
c53a76743c
coverage-dump: Dump filenames instead of global file IDs (and bless)
2025-05-06 11:58:58 +10:00
Josh Stone
12167d7064
Update the minimum external LLVM to 19
2025-04-05 11:44:38 -07:00
dianqk
1787789fe5
Bless tests
2025-04-02 19:59:26 +08:00
dianqk
7e0463fe93
Revert "comment out the old tests instead of adjusting them"
...
This reverts commit 906f66fb4c .
2025-04-02 19:59:26 +08:00
Zalathar
26cea8a286
coverage: Don't split bang-macro spans, just truncate them
2025-04-01 13:13:21 +11:00
Zalathar
62a533ce78
coverage: Instead of splitting, just discard any span that overlaps a hole
2025-04-01 13:13:20 +11:00
Zalathar
577272eede
coverage: Shrink call spans to just the function name
...
This is a way to shrink call spans that doesn't involve mixing different spans,
and avoids overlap with argument spans.
This patch also removes some low-value comments that were causing rustfmt to
ignore the match arms.
2025-04-01 13:07:33 +11:00
Zalathar
e80a3e2232
coverage: Tweak tests/coverage/assert-ne.rs
...
This test is intended to demonstrate that a particular macro-argument span
doesn't get lost during span-refinement, but it turns out that span-extraction
currently doesn't yield any MIR spans for this position.
This patch therefore tweaks the test to add a function call in that position,
so that it still remains relevant to span refinement.
2025-04-01 13:07:33 +11:00
Michael Goulet
897acc3e5d
Encode synthetic by-move coroutine body with a different DefPathData
2025-03-30 22:53:21 +00:00
Zalathar
d9b91de00c
coverage: Add some more cases to tests/coverage/holes.rs
2025-02-19 13:56:20 +11:00
Zalathar
ab786d3b98
coverage: Eliminate more counters by giving them to unreachable nodes
...
When preparing a function's coverage counters and metadata during codegen, any
part of the original coverage graph that was removed by MIR optimizations can
be treated as having an execution count of zero.
Somewhat counter-intuitively, if we give those unreachable nodes a _higher_
priority for receiving physical counters (instead of counter expressions), that
ends up reducing the total number of physical counters needed.
This works because if a node is unreachable, we don't actually create a
physical counter for it. Instead that node gets a fixed zero counter, and any
other node that would have relied on that physical counter in its counter
expression can just ignore that term completely.
2025-02-13 13:45:53 +11:00
Zalathar
bf1f254b13
coverage: Don't create counters for code that was removed by MIR opts
2025-02-06 21:44:31 +11:00
Zalathar
f1300c860e
coverage: Completely overhaul counter assignment, using node-flow graphs
2025-01-16 22:07:18 +11:00
lcnr
b85b2c60f9
add comment to test
2025-01-09 13:55:50 +01:00
Michael Goulet
39daadc76e
Account for identity substituted items in symbol mangling
2025-01-09 13:55:40 +01:00
Eric Huss
0efa90f246
Add a test for coverage attr on trait function
2024-12-24 00:09:38 +11:00
Zalathar
87c2f9a5be
Revert "Auto merge of #130766 - clarfonthey:stable-coverage-attribute, r=wesleywiser"
...
This reverts commit 1d35638dc3 , reversing
changes made to f23a80a4c2 .
2024-12-23 12:30:37 +11:00