Fix --remap-path-prefix
not correctly remapping rust-src
component paths and unify handling of path mapping with virtualized paths by cbeuw · Pull Request #83813 · rust-lang/rust (original) (raw)
This PR fixes #73167 ("Binaries end up containing path to the rust-src component despite --remap-path-prefix
") by preventing real local filesystem paths from reaching compilation output if the path is supposed to be remapped.
RealFileName::Named
introduced in #72767 is now renamed as LocalPath
, because this variant wraps a (most likely) valid local filesystem path.
RealFileName::Devirtualized
is renamed as Remapped
to be used for remapped path from a real path via --remap-path-prefix
argument, as well as real path inferred from a virtualized (during compiler bootstrapping) /rustc/...
path. The local_path
field is now an Option<PathBuf>
, as it will be set to None
before serialisation, so it never reaches any build output. Attempting to serialise a non-None
local_path
will cause an assertion faliure.
When a path is remapped, a RealFileName::Remapped
variant is created. The original path is preserved in local_path
field and the remapped path is saved in virtual_name
field. Previously, the local_path
is directly modified which goes against its purpose of "suitable for reading from the file system on the local host".
rustc_span::SourceFile
's fields unmapped_path
(introduced by #44940) and name_was_remapped
(introduced by #41508 when --remap-path-prefix
feature originally added) are removed, as these two pieces of information can be inferred from the name
field: if it's anything other than a FileName::Real(_)
, or if it is a FileName::Real(RealFileName::LocalPath(_))
, then clearly name_was_remapped
would've been false and unmapped_path
would've been None
. If it is a FileName::Real(RealFileName::Remapped{local_path, virtual_name})
, then name_was_remapped
would've been true and unmapped_path
would've been Some(local_path)
.
cc @eddyb who implemented /rustc/...
path devirtualisation