mir: begin documenting user variable debuginfo. (#571)
This commit is contained in:
parent
5bd60bc51e
commit
e69b987357
|
|
@ -84,11 +84,7 @@ with a bunch of variable declarations. They look like this:
|
||||||
|
|
||||||
```mir
|
```mir
|
||||||
let mut _0: (); // return place
|
let mut _0: (); // return place
|
||||||
scope 1 {
|
let mut _1: std::vec::Vec<i32>; // in scope 0 at src/main.rs:2:9: 2:16
|
||||||
let mut _1: std::vec::Vec<i32>; // "vec" in scope 1 at src/main.rs:2:9: 2:16
|
|
||||||
}
|
|
||||||
scope 2 {
|
|
||||||
}
|
|
||||||
let mut _2: ();
|
let mut _2: ();
|
||||||
let mut _3: &mut std::vec::Vec<i32>;
|
let mut _3: &mut std::vec::Vec<i32>;
|
||||||
let mut _4: ();
|
let mut _4: ();
|
||||||
|
|
@ -97,11 +93,27 @@ let mut _5: &mut std::vec::Vec<i32>;
|
||||||
|
|
||||||
You can see that variables in MIR don't have names, they have indices,
|
You can see that variables in MIR don't have names, they have indices,
|
||||||
like `_0` or `_1`. We also intermingle the user's variables (e.g.,
|
like `_0` or `_1`. We also intermingle the user's variables (e.g.,
|
||||||
`_1`) with temporary values (e.g., `_2` or `_3`). You can tell the
|
`_1`) with temporary values (e.g., `_2` or `_3`). You can tell apart
|
||||||
difference between user-defined variables have a comment that gives
|
user-defined variables because they have debuginfo associated to them (see below).
|
||||||
you their original name (`// "vec" in scope 1...`). The "scope" blocks
|
|
||||||
(e.g., `scope 1 { .. }`) describe the lexical structure of the source
|
**User variable debuginfo.** Below the variable declarations, we find the only
|
||||||
program (which names were in scope when).
|
hint that `_1` represents a user variable:
|
||||||
|
```mir
|
||||||
|
scope 1 {
|
||||||
|
debug vec => _1; // in scope 1 at src/main.rs:2:9: 2:16
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Each `debug <Name> => <Place>;` annotation describes a named user variable,
|
||||||
|
and where (i.e. the place) a debugger can find the data of that variable.
|
||||||
|
Here the mapping is trivial, but optimizations may complicate the place,
|
||||||
|
or lead to multiple user variables sharing the same place.
|
||||||
|
Additionally, closure captures are described using the same system, and so
|
||||||
|
they're complicated even without optimizations, e.g.: `debug x => (*((*_1).0: &T));`.
|
||||||
|
|
||||||
|
The "scope" blocks (e.g., `scope 1 { .. }`) describe the lexical structure of
|
||||||
|
the source program (which names were in scope when), so any part of the program
|
||||||
|
annotated with `// in scope 0` would be missing `vec`, if you were stepping
|
||||||
|
through the code in a debugger, for example.
|
||||||
|
|
||||||
**Basic blocks.** Reading further, we see our first **basic block** (naturally
|
**Basic blocks.** Reading further, we see our first **basic block** (naturally
|
||||||
it may look slightly different when you view it, and I am ignoring some of the
|
it may look slightly different when you view it, and I am ignoring some of the
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue