mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Rollup merge of #97385 - oli-obk:smir-tool-lib, r=pnkfelix
Add WIP stable MIR crate r? ``@pnkfelix`` Discussion about this happend in the SMIR meeting yesterday. Some info can be found at https://rust-lang.zulipchat.com/#narrow/stream/320896-project-stable-mir/topic/dev.20plan.20mtg/near/283774691
This commit is contained in:
commit
9688594d00
16
Cargo.lock
16
Cargo.lock
@ -3440,6 +3440,7 @@ dependencies = [
|
|||||||
"jemalloc-sys",
|
"jemalloc-sys",
|
||||||
"rustc_codegen_ssa",
|
"rustc_codegen_ssa",
|
||||||
"rustc_driver",
|
"rustc_driver",
|
||||||
|
"rustc_smir",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -4437,6 +4438,21 @@ dependencies = [
|
|||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustc_smir"
|
||||||
|
version = "0.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"rustc_borrowck",
|
||||||
|
"rustc_driver",
|
||||||
|
"rustc_hir",
|
||||||
|
"rustc_interface",
|
||||||
|
"rustc_middle",
|
||||||
|
"rustc_mir_dataflow",
|
||||||
|
"rustc_mir_transform",
|
||||||
|
"rustc_serialize",
|
||||||
|
"rustc_trait_selection",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc_span"
|
name = "rustc_span"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
|
@ -9,6 +9,9 @@ rustc_driver = { path = "../rustc_driver" }
|
|||||||
# Make sure rustc_codegen_ssa ends up in the sysroot, because this
|
# Make sure rustc_codegen_ssa ends up in the sysroot, because this
|
||||||
# crate is intended to be used by codegen backends, which may not be in-tree.
|
# crate is intended to be used by codegen backends, which may not be in-tree.
|
||||||
rustc_codegen_ssa = { path = "../rustc_codegen_ssa" }
|
rustc_codegen_ssa = { path = "../rustc_codegen_ssa" }
|
||||||
|
# Make sure rustc_smir ends up in the sysroot, because this
|
||||||
|
# crate is intended to be used by stable MIR consumers, which are not in-tree
|
||||||
|
rustc_smir = { path = "../rustc_smir" }
|
||||||
|
|
||||||
[dependencies.jemalloc-sys]
|
[dependencies.jemalloc-sys]
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
|
1
compiler/rustc_smir/.gitignore
vendored
Normal file
1
compiler/rustc_smir/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
target
|
28
compiler/rustc_smir/Cargo.toml
Normal file
28
compiler/rustc_smir/Cargo.toml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
[package]
|
||||||
|
name = "rustc_smir"
|
||||||
|
version = "0.0.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rustc_borrowck = { path = "../rustc_borrowck", optional = true }
|
||||||
|
rustc_driver = { path = "../rustc_driver", optional = true }
|
||||||
|
rustc_hir = { path = "../rustc_hir", optional = true }
|
||||||
|
rustc_interface = { path = "../rustc_interface", optional = true }
|
||||||
|
rustc_middle = { path = "../rustc_middle", optional = true }
|
||||||
|
rustc_mir_dataflow = { path = "../rustc_mir_dataflow", optional = true }
|
||||||
|
rustc_mir_transform = { path = "../rustc_mir_transform", optional = true }
|
||||||
|
rustc_serialize = { path = "../rustc_serialize", optional = true }
|
||||||
|
rustc_trait_selection = { path = "../rustc_trait_selection", optional = true }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = [
|
||||||
|
"rustc_borrowck",
|
||||||
|
"rustc_driver",
|
||||||
|
"rustc_hir",
|
||||||
|
"rustc_interface",
|
||||||
|
"rustc_middle",
|
||||||
|
"rustc_mir_dataflow",
|
||||||
|
"rustc_mir_transform",
|
||||||
|
"rustc_serialize",
|
||||||
|
"rustc_trait_selection",
|
||||||
|
]
|
75
compiler/rustc_smir/README.md
Normal file
75
compiler/rustc_smir/README.md
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
This crate is regularly synced with its mirror in the rustc repo at `compiler/rustc_smir`.
|
||||||
|
|
||||||
|
We use `git subtree` for this to preserve commits and allow the rustc repo to
|
||||||
|
edit these crates without having to touch this repo. This keeps the crates compiling
|
||||||
|
while allowing us to independently work on them here. The effort of keeping them in
|
||||||
|
sync is pushed entirely onto us, without affecting rustc workflows negatively.
|
||||||
|
This may change in the future, but changes to policy should only be done via a
|
||||||
|
compiler team MCP.
|
||||||
|
|
||||||
|
## Instructions for working on this crate locally
|
||||||
|
|
||||||
|
Since the crate is the same in the rustc repo and here, the dependencies on rustc_* crates
|
||||||
|
will only either work here or there, but never in both places at the same time. Thus we use
|
||||||
|
optional dependencies on the rustc_* crates, requiring local development to use
|
||||||
|
|
||||||
|
```
|
||||||
|
cargo build --no-default-features -Zavoid-dev-deps
|
||||||
|
```
|
||||||
|
|
||||||
|
in order to compile successfully.
|
||||||
|
|
||||||
|
## Instructions for syncing
|
||||||
|
|
||||||
|
### Updating this repository
|
||||||
|
|
||||||
|
In the rustc repo, execute
|
||||||
|
|
||||||
|
```
|
||||||
|
git subtree push --prefix=compiler/rustc_smir url_to_your_fork_of_project_stable_mir some_feature_branch
|
||||||
|
```
|
||||||
|
|
||||||
|
and then open a PR of your `some_feature_branch` against https://github.com/rust-lang/project-stable-mir
|
||||||
|
|
||||||
|
### Updating the rustc library
|
||||||
|
|
||||||
|
First we need to bump our stack limit, as the rustc repo otherwise quickly hits that:
|
||||||
|
|
||||||
|
```
|
||||||
|
ulimit -s 60000
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Maximum function recursion depth (1000) reached
|
||||||
|
|
||||||
|
Then we need to disable `dash` as the default shell for sh scripts, as otherwise we run into a
|
||||||
|
hard limit of a recursion depth of 1000:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo dpkg-reconfigure dash
|
||||||
|
```
|
||||||
|
|
||||||
|
and then select `No` to disable dash.
|
||||||
|
|
||||||
|
|
||||||
|
#### Patching your `git worktree`
|
||||||
|
|
||||||
|
The regular git worktree does not scale to repos of the size of the rustc repo.
|
||||||
|
So download the `git-subtree.sh` from https://github.com/gitgitgadget/git/pull/493/files and run
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo cp --backup /path/to/patched/git-subtree.sh /usr/lib/git-core/git-subtree
|
||||||
|
sudo chmod --reference=/usr/lib/git-core/git-subtree~ /usr/lib/git-core/git-subtree
|
||||||
|
sudo chown --reference=/usr/lib/git-core/git-subtree~ /usr/lib/git-core/git-subtree
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Actually doing a sync
|
||||||
|
|
||||||
|
In the rustc repo, execute
|
||||||
|
|
||||||
|
```
|
||||||
|
git subtree pull --prefix=compiler/rustc_smir https://github.com/rust-lang/project-stable-mir smir
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: only ever sync to rustc from the project-stable-mir's `smir` branch. Do not sync with your own forks.
|
||||||
|
|
||||||
|
Then open a PR against rustc just like a regular PR.
|
3
compiler/rustc_smir/rust-toolchain.toml
Normal file
3
compiler/rustc_smir/rust-toolchain.toml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[toolchain]
|
||||||
|
channel = "nightly-2022-06-01"
|
||||||
|
components = [ "rustfmt", "rustc-dev" ]
|
17
compiler/rustc_smir/src/lib.rs
Normal file
17
compiler/rustc_smir/src/lib.rs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
//! The WIP stable interface to rustc internals.
|
||||||
|
//!
|
||||||
|
//! For more information see https://github.com/rust-lang/project-stable-mir
|
||||||
|
//!
|
||||||
|
//! # Note
|
||||||
|
//!
|
||||||
|
//! This API is still completely unstable and subject to change.
|
||||||
|
|
||||||
|
#![doc(
|
||||||
|
html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/",
|
||||||
|
test(attr(allow(unused_variables), deny(warnings)))
|
||||||
|
)]
|
||||||
|
#![cfg_attr(not(feature = "default"), feature(rustc_private))]
|
||||||
|
|
||||||
|
pub mod mir;
|
||||||
|
|
||||||
|
pub mod very_unstable;
|
10
compiler/rustc_smir/src/mir.rs
Normal file
10
compiler/rustc_smir/src/mir.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
pub use crate::very_unstable::middle::mir::{
|
||||||
|
visit::MutVisitor, AggregateKind, AssertKind, BasicBlock, BasicBlockData, BinOp, BindingForm,
|
||||||
|
BlockTailInfo, Body, BorrowKind, CastKind, ClearCrossCrate, Constant, ConstantKind,
|
||||||
|
CopyNonOverlapping, Coverage, FakeReadCause, Field, GeneratorInfo, ImplicitSelfKind,
|
||||||
|
InlineAsmOperand, Local, LocalDecl, LocalInfo, LocalKind, Location, MirPhase, MirSource,
|
||||||
|
NullOp, Operand, Place, PlaceRef, ProjectionElem, ProjectionKind, Promoted, RetagKind, Rvalue,
|
||||||
|
Safety, SourceInfo, SourceScope, SourceScopeData, SourceScopeLocalData, Statement,
|
||||||
|
StatementKind, UnOp, UserTypeProjection, UserTypeProjections, VarBindingForm, VarDebugInfo,
|
||||||
|
VarDebugInfoContents,
|
||||||
|
};
|
27
compiler/rustc_smir/src/very_unstable.rs
Normal file
27
compiler/rustc_smir/src/very_unstable.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
//! This module reexports various crates and modules from unstable rustc APIs.
|
||||||
|
//! Add anything you need here and it will get slowly transferred to a stable API.
|
||||||
|
//! Only use rustc_smir in your dependencies and use the reexports here instead of
|
||||||
|
//! directly referring to the unstable crates.
|
||||||
|
|
||||||
|
macro_rules! crates {
|
||||||
|
($($rustc_name:ident -> $name:ident,)*) => {
|
||||||
|
$(
|
||||||
|
#[cfg(not(feature = "default"))]
|
||||||
|
pub extern crate $rustc_name as $name;
|
||||||
|
#[cfg(feature = "default")]
|
||||||
|
pub use $rustc_name as $name;
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
crates! {
|
||||||
|
rustc_borrowck -> borrowck,
|
||||||
|
rustc_driver -> driver,
|
||||||
|
rustc_hir -> hir,
|
||||||
|
rustc_interface -> interface,
|
||||||
|
rustc_middle -> middle,
|
||||||
|
rustc_mir_dataflow -> dataflow,
|
||||||
|
rustc_mir_transform -> transform,
|
||||||
|
rustc_serialize -> serialize,
|
||||||
|
rustc_trait_selection -> trait_selection,
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user